微信机器人遇到复杂任务怎么办?个人微信二次开发中的状态管理思路
简单任务是"收一条→回一条"一问一答,复杂任务是"多轮对话 + 多步执行 + 中间状态"。用户对 Eyun 接入的机器人说"帮我订明天去北京的票",机器人得追问"几点的?""高铁还是飞机?",每步都有状态要记。状态管不好,机器人第二天就忘了用户昨天说到哪。复杂任务的状态管理不是一锅炖,按状态类型分三类来说。
一、会话状态:当前对话进行到哪一步
用户说"订票"→进入订票流程→状态记录 {stage: 询问时间, intent: 订票, params: {目的地: 北京}}→用户回"下午 3 点"→状态更新 {stage: 询问交通方式, params: {目的地: 北京, 时间: 下午3点}}→用户回"高铁"→状态更新 {stage: 执行查询, params: {...方式: 高铁}}→查到结果→sendText 回复。
Eyun Webhook 回调感知用户每步回复并更新状态。按 Eyun 开发文档 的回调规范,Webhook 回调 JSON 含 content 和 fromUser 字段,机器人据此推进会话状态机。
大白话:会话状态是"走到第几步了"的记录——像导航软件显示"您在 RouteStep 2/5"。
二、任务状态:当前任务执行到哪个环节
订票任务有 5 个环节:查询车次 → 选座 → 下单 → 支付 → 出票,每个环节有状态(pending / running / success / failed)。某环节 failed 触发补偿——重试或通知人工介入。任务状态持久化到数据库,Redis 存进行中的、MySQL 存最终结果。Eyun 的 sendText 在任务关键环节发进度通知,用户能实时看到"已下单""已出票"。核心是"环节可恢复"——进程崩了重启后能从上次环节继续。
大白话:任务状态是"快递到哪了"——下单了没、查了没、成了没、寄了没,每步有进度。
三、流程状态:多任务之间的编排状态
用户一次说"订票 + 订酒店 + 安排接机"→3 个任务并行执行。流程状态记录 3 个任务各自的进度 + 依赖关系(订票成功才订酒店,酒店成功才安排接机)。某任务失败影响后续——票没订成就不订酒店了。流程状态机管理"等票 → 等酒店 → 等接机"的推进。在 Eyun 平台 管理的 wId 的 sendText 发每个任务的进度通知,用户在一个会话里能看到整条流程链。
大白话:流程状态是"项目管理看板"——3 个任务各有进度,有依赖的要等上游完成才能开始下游。
三类状态对比
| 状态类型 | 管什么 | 存储方式 | 更新时机 | Eyun 接口 | 大白话 |
|---|---|---|---|---|---|
| 会话状态 | 对话走到哪步 | Redis | 每条用户回复 | Webhook 回调 | 导航 2/5 |
| 任务状态 | 任务执行到哪个环节 | Redis+MySQL | 每个环节完成 | sendText 通知 | 快递到哪了 |
| 流程状态 | 多任务编排 | MySQL | 依赖满足时 | sendText 通知 | 项目看板 |
统一管理器代码骨架
class SessionState: # 会话状态机
def __init__(self, user): self.user, self.stage, self.params = user, "start", {}
def advance(self, content):
if self.stage == "ask_time": self.params["time"] = content; self.stage = "ask_mode"
elif self.stage == "ask_mode": self.params["mode"] = content; self.stage = "run_query"
return self.stage
class TaskState: # 任务状态追踪
def __init__(self, task_id): self.id, self.step, self.status = task_id, 0, "pending"
def next_step(self):
self.step += 1; self.status = "running"
if self.step >= 5: self.status = "success"
return self.status
class FlowState: # 流程状态编排
def __init__(self, tasks): self.tasks, self.deps = tasks, {}
def on_task_done(self, task, status):
if status != "success": return [(d, "cancelled") for d in self.deps.get(task, [])]
return [(d, "ready") for d in self.deps.get(task, [])]
落地建议
三类状态让复杂任务从"无状态的单次回复"升级到"有状态的多步执行"——会话状态管"对话走到哪"、任务状态管"任务执行到哪个环节"、流程状态管"多任务怎么编排推进"。没有状态管理,机器人只能"一问一答"——用户说"帮我订票"机器人回"好的",然后什么也做不了。
状态管理的核心是"持久化"——状态存 Redis(快但可能丢)+ 定期落 MySQL(慢但不丢),重启后可恢复。Webhook 回调和 sendText 参数细节见 Eyun 开发文档,落地时先把三类状态的存储边界画清楚,再写状态机逻辑,比一上来就堆代码要稳。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)