Concepts 导读

一次 Agent 调用背后:从消息到回复的完整链路

Agent Loop 是 OpenClaw 中一次真实 Agent 运行的完整路径,包含消息接收、上下文组装、模型推理、工具执行、流式回复和持久化。理解这条链路,才能看懂 session 状态如何保持、工具调用如何串行、以及队列如何防止竞态。

先讲这一页到底在解决什么

一次 Agent 调用背后:从消息到回复的完整链路

Agent Loop 是 OpenClaw 中一次真实 Agent 运行的完整路径,包含消息接收、上下文组装、模型推理、工具执行、流式回复和持久化。理解这条链路,才能看懂 session 状态如何保持、工具调用如何串行、以及队列如何防止竞态。

原文共 18 节,先看 Start Here 路径:/concepts/agent-loop 查看官方原文

第一幕

📩 入口像前台收件,不是直接把消息扔给模型

官方一开头就把入口点点出来了:Gateway RPC 的 agent / agent.wait,还有 CLI 的 agent 命令。

agent

像前台收下任务,先登记 runId 和时间,再把任务送去后场排队。

agent.wait

像有人站在前台问:“那张工单现在做完没?”它负责等结果,不负责替你干活。

CLI 的 agent

像你不是从网页前台递单,而是从命令行窗口直接敲门。

📌 一句话

入口的工作是收件、编号、排队,不是立刻神奇地产生答案。

第二幕

🎞 高层 5 步,其实就是一条工单在车间里的流转

官方列了 5 步。翻成人话后,会非常顺。

1. 收件登记

agent RPC 先验一下参数、找对会话、把元数据存好,然后立刻回你一个 { runId, acceptedAt }。像前台先给你领号单。

2. 把工单送进后场

agentCommand 开始真正干活:挑模型、带上默认 thinking/verbose、加载技能快照,再把工单交给嵌入式 agent runtime。

3. 真工人开始跑

runEmbeddedPiAgent 负责排队、建会话、订阅事件、超时中止。像车间主管在盯整条流水线。

4. 边干边对外播报

subscribeEmbeddedPiSession 会把工具事件、assistant 文本、生命周期状态一路翻成 OpenClaw 自己的流事件。

5. agent.wait 只等“结束铃声”

它等的是 lifecycle 里的 enderror。所以它像前台屏幕上的“已完成 / 出错 / 超时”,不是替车间再造一遍产品。

最关键的规矩

🚦 为什么官方一直强调 serialized?因为同一本会话本子不能同时被两个人乱写

这部分特别重要。OpenClaw 会按 session key 串行跑,同一会话一次只跑一条真实 loop。

🛤

Per-session lane

像每个会话都有自己的单行轨道,同一时间只能让一辆车过去。

🚉

Global lane

必要时还会再经过总闸口,避免整座站台同时挤爆。

📓

为什么要这样

不然工具调用和会话写入会互相踩脚,最后聊天记录像两支笔同时在同一页乱画。

🎈

一句话

一次一轮,慢一点,但账本不乱。

开跑前

🧳 真正开跑前,它会先收拾书包

模型还没开始想之前,官方会先准备工作区、skills、bootstrap 文件和 session lock。这很像小工人出门前先把装备装包。

工作区准备

像确认今天到底在哪张桌子上工作。沙箱模式时,可能换到另一张受控桌子。

Skills snapshot

像把今天可能要翻的小册子先放进包里,别到一半临时乱找。

Bootstrap/context 注入

像把桌上的身份卡、规则卡、用户卡、工具卡先扫一遍。

Session write lock

像先把这本会话工作本锁在自己手边,别让别的工人同时来抢笔。

命令与事件

📣 streaming 不是装饰,它像“边做边报进度”

很多人以为 streaming 只是打字机效果。其实它更像车间在不停往外喊:“我开始了,我在调工具,我这里有中间结果,我结束了。”

stream: "assistant"

像工人边想边把能展示的文字片段往外递。

stream: "tool"

像工人一边拿工具干活,一边告诉你“我正在敲哪颗钉子”。

stream: "lifecycle"

像值班牌从“开始”翻到“结束”或“出错”。

聊天通道里的 delta / final

像先不断收到草稿纸条,最后再收到一张正式盖章版。

插手点

🪝 Hooks 像流水线旁边的一排插手按钮

官方列了很多 hook。别硬背名字,先记住它们是在不同环节给你“插手一下”的机会。

before_model_resolve

像在工人开工前,先把今天要用的脑子换掉。

before_prompt_build

像在工人真正读题前,再塞一张额外说明卡进它手里。

before_tool_call / after_tool_call

像工具拿起来前先查一下,放下后再验一下。

message_sending

像回信要出门前,门口最后再看一眼:这封信到底让不让寄。

结束方式

⏳ 提前结束,不只一种死法

官方最后把“哪里会提前结束”写得很实在。这种地方最适合翻成人话。

Agent timeout

像车间闹钟响了,时间到了,必须停工。

AbortSignal

像外面有人举手喊停,这一轮就收住。

🌉

Gateway disconnect

像桥断了,前台和后场暂时说不上话。

agent.wait timeout

只是等的人等烦了,不等了。并不代表后场那位工人一定已经停工。

最后总结

🎈 把这页压成一句最短的话

Agent Loop 就是一张工单完整跑过一条流水线:先收件编号,再串行排队,带上书包开工,边调工具边播报,最后把结果、日志和状态稳稳收尾。

如果你想看“开工前到底塞了哪些固定提示给模型”,下一页就去 /concepts/system-prompt