Agent Loop(OpenClaw)
Agentic loop 是代理程式一次完整且「真實」的執行流程:輸入接收 → 情境組裝 → 模型推論 → 工具執行 → 串流回覆 → 持久化。這是一條權威路徑,將一則訊息轉化為行動與最終回覆,同時維持工作階段狀態的一致性。 It’s the authoritative path that turns a message into actions and a final reply, while keeping session state consistent. It’s the authoritative path that turns a message into actions and a final reply, while keeping session state consistent. 在 OpenClaw 中,一個 loop 是每個工作階段一次、序列化的執行,會在模型思考、呼叫工具與串流輸出時發出生命週期與串流事件。本文件說明這個真實 loop 如何端到端地連接運作。 This doc explains how that authentic loop is wired end-to-end. This doc explains how that authentic loop is wired end-to-end.Entry points
- Gateway RPC:
agent與agent.wait。 - CLI:
agent指令。
運作方式(高層)
agentRPC 會驗證參數、解析工作階段(sessionKey/sessionId)、持久化工作階段中繼資料,並立即回傳{ runId, acceptedAt }。agentCommand會執行 agent:- 解析模型與 thinking/verbose 的預設值
- 載入 Skills 快照
- 呼叫
runEmbeddedPiAgent(pi-agent-core runtime) - 若內嵌 loop 未發出事件,則送出 lifecycle end/error
runEmbeddedPiAgent:- serializes runs via per-session + global queues
- resolves model + auth profile and builds the pi session
- 訂閱 pi 事件並串流 assistant/tool 的增量
- enforces timeout -> aborts run if exceeded
- returns payloads + usage metadata
subscribeEmbeddedPiSession將 pi-agent-core 事件橋接到 OpenClaw 的agent串流:- 工具事件 ⇒
stream: "tool" - assistant 增量 ⇒
stream: "assistant" - 生命週期事件 ⇒
stream: "lifecycle"(phase: "start" | "end" | "error")
- 工具事件 ⇒
agent.wait使用waitForAgentJob:- 等待 lifecycle end/error 以取得
runId - 回傳
{ status: ok|error|timeout, startedAt, endedAt, error? }
- 等待 lifecycle end/error 以取得
Queueing + concurrency
- 每個工作階段鍵(session lane)的執行會被序列化,並可選擇性地透過全域 lane 進行序列化。
- This prevents tool/session races and keeps session history consistent.
- 訊息頻道可選擇佇列模式(collect/steer/followup)以餵入此 lane 系統。 請參見 Command Queue。 See Command Queue. See Command Queue.
工作階段與工作空間準備
- 解析並建立工作空間;沙箱隔離的執行可能會重新導向至沙箱工作空間根目錄。
- 技能會被載入(或從快照中重用),並注入至 env 與提示中。
- Bootstrap/context files are resolved and injected into the system prompt report.
- 取得工作階段寫入鎖;在開始串流前會開啟並準備
SessionManager。
Prompt assembly + system prompt
- 系統提示詞由 OpenClaw 的基礎提示詞、Skills 提示詞、啟動情境與每次執行的覆寫所組成。
- Model-specific limits and compaction reserve tokens are enforced.
- 模型實際看到的內容請參見 System prompt。
掛鉤點(可攔截的位置)
OpenClaw 有兩套掛鉤系統:- Internal hooks (Gateway hooks): event-driven scripts for commands and lifecycle events.
- Plugin hooks: extension points inside the agent/tool lifecycle and gateway pipeline.
內部掛鉤(Gateway 掛鉤)
agent:bootstrap:在系統提示詞最終確定前、建立啟動檔案期間執行。 可用於新增/移除啟動情境檔案。 Use this to add/remove bootstrap context files. Use this to add/remove bootstrap context files.- Command 掛鉤:
/new、/reset、/stop,以及其他指令事件(見 Hooks 文件)。
外掛掛鉤(agent + Gateway 生命週期)
這些會在 agent loop 或 Gateway 管線內執行:before_agent_start:在執行開始前注入情境或覆寫系統提示詞。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_stop:Gateway 生命週期事件。
串流與部分回覆
- assistant 增量由 pi-agent-core 串流並以
assistant事件發出。 - 區塊串流可在
text_end或message_end上發出部分回覆。 - Reasoning streaming can be emitted as a separate stream or as block replies.
- See Streaming for chunking and block reply behavior.
工具執行與訊息工具
- 工具的開始/更新/結束事件會在
tool串流上發出。 - Tool results are sanitized for size and image payloads before logging/emitting.
- 會追蹤訊息工具的送出,以抑制重複的 assistant 確認訊息。
Reply shaping + suppression
- 最終負載由以下組成:
- assistant 文字(與可選的推理)
- 內嵌工具摘要(在 verbose 且允許時)
- 模型出錯時的 assistant 錯誤文字
NO_REPLYis treated as a silent token and filtered from outgoing payloads.- 訊息工具的重複項會從最終負載清單中移除。
- If no renderable payloads remain and a tool errored, a fallback tool error reply is emitted (unless a messaging tool already sent a user-visible reply).
Compaction + retries
- Auto-compaction emits
compactionstream events and can trigger a retry. - 重試時,會重設記憶體中的緩衝區與工具摘要,以避免重複輸出。
- See Compaction for the compaction pipeline.
事件串流(目前)
lifecycle:由subscribeEmbeddedPiSession發出(並由agentCommand作為後備)assistant:來自 pi-agent-core 的串流增量tool:來自 pi-agent-core 的串流工具事件
聊天頻道處理
- assistant 增量會緩衝為聊天
delta訊息。 - 在 lifecycle end/error 時會送出聊天
final。
逾時
agent.waitdefault: 30s (just the wait).timeoutMsparam overrides.- Agent runtime:
agents.defaults.timeoutSeconds預設 600 秒;由runEmbeddedPiAgent的中止計時器強制執行。
Where things can end early
- Agent 逾時(中止)
- AbortSignal(取消)
- Gateway 斷線或 RPC 逾時
agent.wait逾時(僅等待,不會停止 agent)