代理式迴圈是代理的完整「真實」執行流程:接收 → 組裝脈絡 → 模型推論 → 工具執行 → 串流回覆 → 持久化。它是將訊息轉換成動作與最終回覆的權威路徑, 同時保持工作階段狀態一致。 在 OpenClaw 中,迴圈是每個工作階段一次單一、序列化的執行,會在模型思考、 呼叫工具並串流輸出時發出生命週期與串流事件。本文件說明這個真實迴圈如何 端到端串接。Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
進入點
- Gateway RPC:
agent與agent.wait。 - CLI:
agent指令。
運作方式(高階)
agentRPC 會驗證參數、解析工作階段(sessionKey/sessionId)、持久化工作階段中繼資料,並立即回傳{ runId, acceptedAt }。agentCommand執行代理:- 解析模型 + thinking/verbose/trace 預設值
- 載入 Skills 快照
- 呼叫
runEmbeddedPiAgent(pi-agent-core 執行階段) - 如果內嵌迴圈未發出生命週期結束/錯誤,則發出 lifecycle end/error
runEmbeddedPiAgent:- 透過每工作階段 + 全域佇列序列化執行
- 解析模型 + 驗證設定檔並建立 pi 工作階段
- 訂閱 pi 事件並串流 assistant/tool 增量
- 強制執行逾時 -> 若超過則中止執行
- 回傳 payload + 用量中繼資料
subscribeEmbeddedPiSession將 pi-agent-core 事件橋接到 OpenClawagent串流:- 工具事件 =>
stream: "tool" - 助理增量 =>
stream: "assistant" - 生命週期事件 =>
stream: "lifecycle"(phase: "start" | "end" | "error")
- 工具事件 =>
agent.wait使用waitForAgentRun:- 等待
runId的 lifecycle end/error - 回傳
{ status: ok|error|timeout, startedAt, endedAt, error? }
- 等待
佇列 + 並行
- 執行會依工作階段金鑰(工作階段通道)序列化,並可選擇經由全域通道。
- 這可防止工具/工作階段競態,並保持工作階段歷史一致。
- 訊息通道可以選擇佇列模式(collect/steer/followup),以輸入這套通道系統。 請參閱指令佇列。
- 轉錄寫入也會受到工作階段檔案上的工作階段寫入鎖保護。該鎖具有程序感知能力且以檔案為基礎, 因此能捕捉到繞過程序內佇列或來自其他程序的寫入者。
- 工作階段寫入鎖預設不可重入。如果某個輔助程式刻意在保留單一邏輯寫入者的同時,
巢狀取得相同鎖,則必須以
allowReentrant: true明確選擇加入。
工作階段 + 工作區準備
- 工作區會被解析並建立;沙盒化執行可能會重新導向到沙盒工作區根目錄。
- Skills 會被載入(或從快照重用),並注入到環境與提示中。
- Bootstrap/脈絡檔案會被解析,並注入到系統提示報告中。
- 會取得工作階段寫入鎖;
SessionManager會在串流前開啟並準備好。任何 後續轉錄重寫、Compaction 或截斷路徑,都必須在開啟或變更轉錄檔前取得相同鎖。
提示組裝 + 系統提示
- 系統提示會由 OpenClaw 的基礎提示、Skills 提示、bootstrap 脈絡與每次執行覆寫建立。
- 會強制套用模型特定限制與 Compaction 保留 token。
- 請參閱系統提示,了解模型會看到什麼。
掛鉤點(可攔截的位置)
OpenClaw 有兩套掛鉤系統:- 內部掛鉤(Gateway 掛鉤):用於指令與生命週期事件的事件驅動腳本。
- Plugin 掛鉤:代理/工具生命週期與 Gateway 管線內的擴充點。
內部掛鉤(Gateway 掛鉤)
agent:bootstrap:在系統提示完成前,建立 bootstrap 檔案時執行。 使用這個掛鉤新增/移除 bootstrap 脈絡檔案。- 指令掛鉤:
/new、/reset、/stop,以及其他指令事件(請參閱 Hooks 文件)。
Plugin 掛鉤(代理 + Gateway 生命週期)
這些掛鉤會在代理迴圈或 Gateway 管線內執行:before_model_resolve:在工作階段前執行(沒有messages),以便在模型解析前以決定性方式覆寫供應商/模型。before_prompt_build:在工作階段載入後執行(含messages),以便在提交提示前注入prependContext、systemPrompt、prependSystemContext或appendSystemContext。將prependContext用於每回合動態文字,將系統脈絡欄位用於應位於系統提示空間中的穩定指引。before_agent_start:舊版相容掛鉤,可能在任一階段執行;建議使用上方明確的掛鉤。before_agent_reply:在行內動作之後、LLM 呼叫之前執行,讓 Plugin 可接管該回合並回傳合成回覆,或完全靜默該回合。agent_end:在完成後檢查最終訊息清單與執行中繼資料。before_compaction/after_compaction:觀察或註記 Compaction 週期。before_tool_call/after_tool_call:攔截工具參數/結果。before_install:檢查內建掃描發現項目,並可選擇封鎖 Skill 或 Plugin 安裝。tool_result_persist:在工具結果寫入 OpenClaw 擁有的工作階段轉錄前,同步轉換工具結果。message_received/message_sending/message_sent:傳入 + 傳出訊息掛鉤。session_start/session_end:工作階段生命週期邊界。gateway_start/gateway_stop:Gateway 生命週期事件。
before_tool_call:{ block: true }是終止性決策,會停止較低優先順序的處理常式。before_tool_call:{ block: false }是無操作,且不會清除先前的封鎖。before_install:{ block: true }是終止性決策,會停止較低優先順序的處理常式。before_install:{ block: false }是無操作,且不會清除先前的封鎖。message_sending:{ cancel: true }是終止性決策,會停止較低優先順序的處理常式。message_sending:{ cancel: false }是無操作,且不會清除先前的取消。
串流 + 部分回覆
- 助理增量會從 pi-agent-core 串流,並作為
assistant事件發出。 - 區塊串流可在
text_end或message_end發出部分回覆。 - 推理串流可作為獨立串流或區塊回覆發出。
- 請參閱串流,了解分塊與區塊回覆行為。
工具執行 + 訊息工具
- 工具 start/update/end 事件會在
tool串流上發出。 - 工具結果會在記錄/發出前,依大小與圖片 payload 進行清理。
- 會追蹤訊息工具傳送,以抑制重複的助理確認。
回覆塑形 + 抑制
- 最終 payload 由以下內容組裝:
- 助理文字(以及可選的推理)
- 行內工具摘要(當 verbose + 允許時)
- 模型出錯時的助理錯誤文字
- 精確靜默 token
NO_REPLY/no_reply會從傳出 payload 中過濾。 - 訊息工具重複項會從最終 payload 清單中移除。
- 如果沒有剩餘可渲染的 payload 且工具出錯,則會發出備援工具錯誤回覆 (除非訊息工具已經傳送使用者可見的回覆)。
Compaction + 重試
- 自動 Compaction 會發出
compaction串流事件,且可觸發重試。 - 重試時,記憶體內緩衝區與工具摘要會重設,以避免重複輸出。
- 請參閱 Compaction 了解 Compaction 管線。
事件串流(目前)
lifecycle:由subscribeEmbeddedPiSession發出(並由agentCommand作為備援發出)assistant:來自 pi-agent-core 的串流增量tool:來自 pi-agent-core 的串流工具事件
聊天通道處理
- 助理增量會緩衝成聊天
delta訊息。 - 聊天
final會在 lifecycle end/error 時發出。
逾時
agent.wait預設:30 秒(僅等待)。timeoutMs參數可覆寫。- 代理執行階段:
agents.defaults.timeoutSeconds預設為 172800 秒(48 小時);由runEmbeddedPiAgent中止計時器強制執行。 - Cron 執行階段:隔離的代理回合
timeoutSeconds由 cron 擁有。排程器在執行開始時啟動該計時器,在設定的期限中止底層執行,接著執行有界清理,再記錄逾時,避免過時的子工作階段讓通道卡住。 - 卡住工作階段復原:啟用診斷後,
diagnostics.stuckSessionWarnMs會偵測長時間processing的工作階段。作用中的內嵌執行、作用中的回覆操作,以及作用中的工作階段通道任務,預設只會警告;如果診斷顯示該工作階段沒有作用中的工作,監視器會釋放受影響的工作階段通道,讓已排入佇列的啟動工作可以清空。 - 模型閒置逾時:當閒置視窗內沒有回應區塊抵達時,OpenClaw 會中止模型請求。
models.providers.<id>.timeoutSeconds會為較慢的本機/自架供應商延長這個閒置監視器;否則 OpenClaw 會在已設定時使用agents.defaults.timeoutSeconds,預設上限為 120 秒。沒有明確模型或代理逾時的 Cron 觸發執行會停用閒置監視器,並依賴 cron 外層逾時。 - 供應商 HTTP 請求逾時:
models.providers.<id>.timeoutSeconds會套用到該供應商的模型 HTTP 擷取,包括連線、標頭、本文、SDK 請求逾時、總體受防護 fetch 中止處理,以及模型串流閒置監視器。對於 Ollama 這類較慢的本機/自架供應商,請先使用此設定,再提高整個代理執行階段逾時。
可能提早結束的位置
- 代理逾時(中止)
- AbortSignal(取消)
- Gateway 中斷連線或 RPC 逾時
agent.wait逾時(僅等待,不會停止代理)
相關
- 工具 — 可用的代理工具
- 掛鉤 — 由代理生命週期事件觸發的事件驅動腳本
- Compaction — 長對話如何被摘要
- Exec 核准 — shell 指令的核准閘門
- Thinking — thinking/reasoning 層級設定