🔄 Agent Loop 代理循环

从消息到行动,AI 是如何思考和干活的

世界上有一种过程叫 Agent Loop,它就像 AI 的「一圈生命」。从你发出消息的那一刻起,AI 就开始了一圈奇妙的旅程:接收消息 → 组装上下文 → 调用模型 → 执行工具 → 流式输出 → 保存状态。这就是一个完整的「代理循环」。

🤔 什么是 Agent Loop?

代理循环是 AI 代理的完整「真实」运行过程:输入 → 上下文组装 → 模型推理 → 工具执行 → 流式回复 → 持久化。这是将消息转换为行动和最终回复的权威路径,同时保持会话状态的一致性。

在 OpenClaw 中,循环是每个会话的单个序列化运行,发出生命周期和流事件,因为模型在思考、调用工具和流式输出。

🚀 入口点

🔄 工作流程(高级)

  1. agent RPC 验证参数、解析会话、持久化会话元数据,立即返回 { runId, acceptedAt }
  2. agentCommand 运行代理:
    • 解析模型 + thinking/verbose 默认值
    • 加载技能快照
    • 调用 runEmbeddedPiAgent
    • 如果嵌入式循环未发出,则发出生命周期结束/错误
  3. runEmbeddedPiAgent
    • 通过每会话 + 全局队列序列化运行
    • 解析模型 + 认证配置并构建 Pi 会话
    • 订阅 Pi 事件并流式传输助手/工具增量
    • 强制超时 → 超时则中止运行
    • 返回 payloads + 使用元数据
  4. subscribeEmbeddedPiSession 将 Pi 事件桥接到 OpenClaw agent 流:
    • 工具事件 → stream: "tool"
    • 助手增量 → stream: "assistant"
    • 生命周期事件 → stream: "lifecycle" (phase: "start" | "end" | "error")
  5. agent.wait 使用 waitForAgentJob:等待 runId生命周期结束/错误

⏳ 队列与并发

📂 会话与工作区准备

💬 提示组装与系统提示

🪝 钩子点(你可以拦截的地方)

OpenClaw 有两个钩子系统

内部钩子(Gateway Hooks)

插件钩子(代理 + Gateway 生命周期)

钩子说明
before_model_resolve会话前运行,确定性覆盖提供者/模型
before_prompt_build会话加载后运行,注入上下文
agent_end检查最终消息列表和运行元数据
before_compaction / after_compaction观察或注释压缩周期
before_tool_call / after_tool_call拦截工具参数/结果
tool_result_persist同步转换工具结果后再写入会话转录
message_received / message_sending / message_sent入站 + 出站消息钩子
session_start / session_end会话生命周期边界
gateway_start / gateway_stopGateway 生命周期事件
钩子决策规则
  • before_tool_call: { block: true } 是终止性的,停止低优先级处理程序
  • message_sending: { cancel: true } 是终止性的,停止低优先级处理程序

🌊 流式传输与部分回复

🔧 工具执行与消息工具

✏️ 回复塑形与抑制

📦 压缩与重试

📡 事件流(当前)

⏱️ 超时

🛑 可能提前结束的地方

🔗 相关链接