OpenClaw 源码解析系列·第2篇:Agent 引擎——消息循环与状态管理
一、从一条消息说起
当用户在微信公众号里发来一条消息,这条消息经历怎样的旅程,最终变成一条有意义的回复?
答案是:Agent 引擎——OpenClaw 架构的心脏。它负责接收消息、理解意图、调用 Skill、生成回复、管理状态……全部在这一层完成。
二、消息循环的六个步骤
OpenClaw 的消息循环遵循经典的 ReAct(Reasoning + Acting)模式,整个循环分为六个阶段:
🔄 Agent 消息处理循环
- ① 消息接收
— 从 Channel 层获取原始消息,解析为统一的数据结构 - ② 上下文构建
— 从 Memory 层加载历史消息、系统提示,构建本次请求上下文 - ③ LLM 推理
— 将上下文发送给 LLM,获取结构化 JSON 输出 - ④ 技能调度
— 解析 LLM 输出,调用对应的 Skill / 工具 - ⑤ 结果聚合
— 将 Skill 执行结果追加回上下文,继续循环或进入回复生成 - ⑥ 回复发送
— 将最终回复通过 Channel 层发回给用户
下图展示了消息在各个模块之间的流动路径:

▲ Agent 消息处理循环:消息进入 → 上下文构建 → LLM 推理 → 技能调度 → 结果聚合 → 回复发送
三、Session:状态的容器
Session 是 OpenClaw 状态管理的核心抽象。每个用户(每个 OpenID)在每个渠道下,对应一个独立的 Session。
3.1 Session 的数据结构
- sessionId
— 全局唯一标识符,定位每一次对话 - messages[]
— 消息历史,支持追加和截断压缩 - agentConfig
— 当前 Agent 的配置(模型、temperature、system prompt) - memory
— 关联的长期记忆引用(MEMORY.md 等) - metadata
— 用户标签、渠道信息、最后活跃时间等
3.2 状态转换
Session 在生命周期中会在多个状态之间转换:

▲ Session 状态机:Active(正常处理)→ Paused(等待人类回复)→ Closed(会话结束)
为什么 Session 要设计成可序列化的? ① 断点恢复:当 Agent 处理长任务时意外中断,可以从最近的 checkpoint 恢复 ② 分叉调试:复制一份 Session,就能开一个新分支做并行实验 ③ 调试友好:Session dump 出来,可以直接在代码里重放,定位 bug
3.3 上下文窗口压缩
当 messages 列表越来越长,OpenClaw 会触发上下文压缩:
- 摘要压缩
— 用 LLM 将历史消息摘要成一段短文本,替代原始消息 - 滑动窗口
— 只保留最近 N 轮对话 + 系统提示 - 重要消息保留
— 标记为重要的消息(如用户明确表达的偏好)永不压缩
四、Agent 循环的实现细节
来看核心循环的简化版逻辑:

4.1 工具调用的确定性
LLM 只负责决定「做什么」,执行是确定性代码完成的。decision.json 输出后,框架通过 switch 语句路由到对应的工具函数:数据库查询、HTTP 请求、文件读写——全部是确定性操作,不依赖 LLM。这种设计让系统行为可预测、可测试。
4.2 Human-in-the-Loop
当 LLM 判断需要人类介入时(如高风险操作),循环会暂停,等待人类通过外部渠道回复后,再注入 Session 继续循环。
五、多 Agent 调度
OpenClaw 支持在同一进程内运行多个 Agent 实例,调度逻辑由 Router 完成:

▲ 多 Agent 调度:Router 根据标签/意图将请求分发到对应 Agent 实例
🧭 OpenClaw Router 调度策略
- 标签路由
— 根据用户标签(如 VIP/普通用户)路由到不同的 Agent - 意图路由
— 根据消息内容判断属于哪个业务域,路由到对应 Agent - 负载均衡
— 多个 Agent 实例间,分发请求避免单点过载 - 兜底 Agent
— 所有路由规则都未命中时,交由默认 Agent 处理
六、与 12-Factor Agents 的对应
Factor 04:工具就是结构化输出LLM 输出 JSON → switch 路由 → 确定性执行。OpenClaw 完整实现了这一原则。
Factor 05:统一执行状态与业务状态Session 是唯一的真实来源,既是执行状态容器,也是业务状态容器。
Factor 06:简单 API 启动/暂停/恢复pauseSession / resumeSession 是 OpenClaw 内置能力,原生支持。
Factor 12:把 Agent 写成无状态 ReducerAgent 循环是纯函数式逻辑,给定相同的事件序列,总是产生相同的状态变化。
七、第2篇小结
这一篇深入了 Agent 引擎的核心设计:
-
消息循环的六个阶段——接收→推理→调度→聚合→回复 -
Session 作为状态容器的设计——可序列化、可压缩、可恢复 -
多 Agent 调度——标签路由、意图路由、多实例并行 -
与 12-Factor Agents 原则的对应关系
预告:第3篇《Skills 系统:框架的扩展机制》,深入解析 Skill 接口、生命周期管理、以及内置 Skills 的实现。
夜雨聆风