子代理
子代理是從現有代理執行中衍生的背景代理執行。它們在獨立的工作階段(agent:<agentId>:subagent:<uuid>)中運行,完成後將結果公告回請求者的聊天頻道。
斜線指令
使用 /subagents 檢視或控制當前工作階段的子代理執行:
/subagents list/subagents kill <id|#|all>/subagents log <id|#> [limit] [tools]/subagents info <id|#>/subagents send <id|#> <message>/subagents steer <id|#> <message>/subagents spawn <agentId> <task> [--model <model>] [--thinking <level>]
執行緒綁定控制:
以下指令適用於支援持久執行緒綁定的頻道。參閱下方支援執行緒的頻道。
/focus <subagent-label|session-key|session-id|session-label>/unfocus/agents/session idle <duration|off>/session max-age <duration|off>
/subagents info 顯示執行中繼資料(狀態、時間戳記、工作階段 id、對話紀錄路徑、清理方式)。
衍生行為
/subagents spawn 以使用者指令(而非內部轉發)啟動背景子代理,執行完成後傳送一則最終完成更新回請求者聊天。
- 衍生指令是非阻塞的;立即回傳執行 id。
- 完成時,子代理向請求者聊天頻道公告摘要/結果訊息。
- 手動衍生的傳遞具有容錯機制:
- OpenClaw 先嘗試以穩定冪等鍵值直接
agent傳遞。 - 直接傳遞失敗時,後備至佇列路由。
- 佇列路由仍不可用時,以短指數退避重試後放棄。
- OpenClaw 先嘗試以穩定冪等鍵值直接
- 傳遞給請求者工作階段的完成交接是執行時產生的內部上下文(非使用者撰寫的文字),包含:
Result(assistant回覆文字,如果助理回覆為空則使用最新的toolResult)Status(completed successfully/failed/timed out/unknown)- 精簡的執行時/token 統計
- 告知請求者代理以正常助理語氣改寫的傳遞指示(不轉發原始內部中繼資料)
--model和--thinking覆寫該次特定執行的預設值。- 完成後使用
info/log檢視詳細資訊與輸出。 /subagents spawn是一次性模式(mode: "run")。持久式執行緒綁定工作階段請使用sessions_spawn搭配thread: true和mode: "session"。- ACP 工具箱工作階段(Codex、Claude Code、Gemini CLI)請使用
sessions_spawn搭配runtime: "acp",參閱 ACP 代理。
主要目標:
- 將「研究/長時間任務/慢速工具」工作並行化,不阻塞主執行。
- 預設隔離子代理(工作階段分離 + 選用沙箱化)。
- 讓工具介面難以被誤用:子代理預設不會取得工作階段工具。
- 支援可設定的巢狀深度,實現協調器模式。
成本提示:每個子代理有獨立的上下文與 token 用量。對於繁重或重複的
任務,為子代理設定較便宜的模型,主代理使用較高品質的模型。
透過 agents.defaults.subagents.model 或每個代理的覆寫設定。
工具
使用 sessions_spawn:
- 啟動子代理執行(
deliver: false,全域通道:subagent) - 接著執行公告步驟,將公告回覆發送到請求者聊天頻道
- 預設模型:繼承呼叫者,除非設定
agents.defaults.subagents.model(或每個代理的agents.list[].subagents.model);明確的sessions_spawn.model仍然優先。 - 預設思考層級:繼承呼叫者,除非設定
agents.defaults.subagents.thinking(或每個代理的agents.list[].subagents.thinking);明確的sessions_spawn.thinking仍然優先。 - 預設執行超時:如果省略
sessions_spawn.runTimeoutSeconds,OpenClaw 使用agents.defaults.subagents.runTimeoutSeconds(若有設定);否則後備至0(無超時)。
工具參數:
task(必填)label?(選填)agentId?(選填;在允許的情況下衍生到另一個代理 id)model?(選填;覆寫子代理模型;無效值會被跳過,子代理以預設模型執行並在工具結果中附帶警告)thinking?(選填;覆寫子代理執行的思考層級)runTimeoutSeconds?(預設為agents.defaults.subagents.runTimeoutSeconds(若有設定),否則0;設定後子代理執行在 N 秒後中止)thread?(預設false;為true時請求此子代理工作階段的頻道執行緒綁定)mode?(run|session)- 預設為
run - 如果
thread: true且省略mode,預設變為session mode: "session"需要thread: true
- 預設為
cleanup?(delete|keep,預設keep)sandbox?(inherit|require,預設inherit;require在目標子執行環境未沙箱化時拒絕衍生)sessions_spawn不接受頻道傳遞參數(target、channel、to、threadId、replyTo、transport)。如需傳遞,從衍生的執行中使用message/sessions_send。
執行緒綁定工作階段
啟用頻道的執行緒綁定時,子代理可以保持綁定到某個執行緒,讓該執行緒中的後續使用者訊息繼續路由到同一個子代理工作階段。
支援執行緒的頻道
- Discord(目前唯一支援的頻道):支援持久式執行緒綁定的子代理工作階段(
sessions_spawn搭配thread: true)、手動執行緒控制(/focus、/unfocus、/agents、/session idle、/session max-age),以及轉接器鍵值channels.discord.threadBindings.enabled、channels.discord.threadBindings.idleHours、channels.discord.threadBindings.maxAgeHours和channels.discord.threadBindings.spawnSubagentSessions。
快速流程:
- 使用
sessions_spawn搭配thread: true(可選mode: "session")衍生。 - OpenClaw 在活躍頻道中建立或綁定一個執行緒到該工作階段目標。
- 該執行緒中的回覆和後續訊息路由到綁定的工作階段。
- 使用
/session idle檢視/更新閒置自動解除聚焦,/session max-age控制硬性上限。 - 使用
/unfocus手動解除綁定。
手動控制:
/focus <target>將當前執行緒(或建立新的)綁定到子代理/工作階段目標。/unfocus移除當前綁定執行緒的綁定。/agents列出活躍的執行與綁定狀態(thread:<id>或unbound)。/session idle和/session max-age僅適用於已聚焦的綁定執行緒。
設定開關:
- 全域預設:
session.threadBindings.enabled、session.threadBindings.idleHours、session.threadBindings.maxAgeHours - 頻道覆寫和衍生自動綁定鍵值是轉接器專屬的。參閱上方支援執行緒的頻道。
允許清單:
agents.list[].subagents.allowAgents:可透過agentId指定的代理 id 清單(["*"]允許任意)。預設:僅限請求者代理。- 沙箱繼承防護:如果請求者工作階段在沙箱中,
sessions_spawn會拒絕將要在未沙箱化環境中執行的目標。
探索:
- 使用
agents_list查看sessions_spawn目前允許的代理 id。
自動封存:
- 子代理工作階段在
agents.defaults.subagents.archiveAfterMinutes(預設:60)後自動封存。 - 封存使用
sessions.delete並將對話紀錄重新命名為*.deleted.<timestamp>(同一資料夾)。 cleanup: "delete"在公告後立即封存(仍透過重新命名保留對話紀錄)。- 自動封存為盡力而為;閘道重啟時待處理的計時器會遺失。
runTimeoutSeconds不會自動封存;它只停止執行。工作階段保留到自動封存為止。- 自動封存同樣適用於深度 1 和深度 2 的工作階段。
巢狀子代理
預設情況下,子代理無法衍生自己的子代理(maxSpawnDepth: 1)。將 maxSpawnDepth 設為 2 可啟用一層巢狀,實現協調器模式:主代理 → 協調器子代理 → 工作者子子代理。
啟用方式
{
agents: {
defaults: {
subagents: {
maxSpawnDepth: 2, // 允許子代理衍生子項(預設:1)
maxChildrenPerAgent: 5, // 每個代理工作階段的最大活躍子項數(預設:5)
maxConcurrent: 8, // 全域併發通道上限(預設:8)
runTimeoutSeconds: 900, // 省略 sessions_spawn 時的預設超時(0 = 無超時)
},
},
},
}
深度層級
| 深度 | 工作階段鍵值格式 | 角色 | 可衍生? |
|---|---|---|---|
| 0 | agent:<id>:main | 主代理 | 總是 |
| 1 | agent:<id>:subagent:<uuid> | 子代理(深度 2 允許時為協調器) | 僅 maxSpawnDepth >= 2 時 |
| 2 | agent:<id>:subagent:<uuid>:subagent:<uuid> | 子子代理(葉節點工作者) | 永不 |
公告鏈
結果沿鏈向上傳遞:
- 深度 2 工作者完成 → 公告給其父項(深度 1 協調器)
- 深度 1 協調器收到公告、整合結果、完成 → 公告給主代理
- 主代理收到公告並傳遞給使用者
每一層只看到來自直接子項的公告。
各深度的工具策略
- 角色和控制範圍在衍生時寫入工作階段中繼資料。這防止扁平化或還原的工作階段鍵值意外重獲協調器權限。
- 深度 1(協調器,當
maxSpawnDepth >= 2時):取得sessions_spawn、subagents、sessions_list、sessions_history以管理其子項。其他工作階段/系統工具仍被禁止。 - 深度 1(葉節點,當
maxSpawnDepth == 1時):無工作階段工具(目前的預設行為)。 - 深度 2(葉節點工作者):無工作階段工具 —
sessions_spawn在深度 2 永遠被禁止。無法衍生更多子項。
每代理衍生上限
每個代理工作階段(任何深度)同時最多有 maxChildrenPerAgent(預設:5)個活躍子項。這防止單一協調器失控扇出。
級聯停止
停止深度 1 的協調器會自動停止其所有深度 2 子項:
- 在主聊天中
/stop停止所有深度 1 代理並級聯到其深度 2 子項。 /subagents kill <id>停止特定子代理並級聯到其子項。/subagents kill all停止請求者的所有子代理並級聯。
認證
子代理認證按代理 id 解析,不按工作階段類型:
- 子代理工作階段鍵值為
agent:<agentId>:subagent:<uuid>。 - 認證儲存從該代理的
agentDir載入。 - 主代理的認證設定檔作為後備合併;代理設定檔在衝突時覆寫主設定檔。
注意:合併是加法式的,主設定檔始終可作為後備使用。目前尚不支援每個代理完全隔離的認證。
公告
子代理透過公告步驟回報:
- 公告步驟在子代理工作階段(非請求者工作階段)內執行。
- 如果子代理回覆
ANNOUNCE_SKIP,則不會發布任何內容。 - 否則傳遞取決於請求者深度:
- 頂層請求者工作階段使用後續
agent呼叫進行外部傳遞(deliver=true) - 巢狀請求者子代理工作階段收到內部後續注入(
deliver=false),讓協調器在工作階段內整合子項結果 - 如果巢狀請求者子代理工作階段已不存在,OpenClaw 會在可用時後備至該工作階段的請求者
- 頂層請求者工作階段使用後續
- 建構巢狀完成結果時,子項完成聚合限定於當前請求者執行,防止舊版先前執行的子項輸出洩漏到當前公告。
- 公告回覆在頻道轉接器可用時保留執行緒/主題路由。
- 公告上下文正規化為穩定的內部事件區塊:
- 來源(
subagent或cron) - 子工作階段鍵值/id
- 公告類型 + 任務標籤
- 從執行時結果衍生的狀態行(
success、error、timeout或unknown) - 公告步驟的結果內容(缺少時為
(no output)) - 描述何時回覆與何時保持沉默的後續指示
- 來源(
Status不從模型輸出推斷;而是來自執行時結果信號。
公告酬載末尾包含統計行(即使被包裝):
- 執行時間(例如
runtime 5m12s) - Token 用量(輸入/輸出/總計)
- 設定模型定價(
models.providers.*.models[].cost)時的預估成本 sessionKey、sessionId和對話紀錄路徑(讓主代理可透過sessions_history取得歷史或在磁碟上檢視檔案)- 內部中繼資料僅用於協調;面向使用者的回覆應以正常助理語氣改寫。
工具策略(子代理工具)
預設情況下,子代理取得除工作階段工具和系統工具外的所有工具:
sessions_listsessions_historysessions_sendsessions_spawn
當 maxSpawnDepth >= 2 時,深度 1 的協調器子代理額外取得 sessions_spawn、subagents、sessions_list 和 sessions_history 以管理其子項。
透過設定覆寫:
{
agents: {
defaults: {
subagents: {
maxConcurrent: 1,
},
},
},
tools: {
subagents: {
tools: {
// deny 優先
deny: ["gateway", "cron"],
// 如果設定 allow,變為僅允許模式(deny 仍然優先)
// allow: ["read", "exec", "process"]
},
},
},
}
併發
子代理使用專用的程序內佇列通道:
- 通道名稱:
subagent - 併發數:
agents.defaults.subagents.maxConcurrent(預設8)
停止
- 在請求者聊天中傳送
/stop會中止請求者工作階段,並停止從中衍生的任何活躍子代理執行,級聯到巢狀子項。 /subagents kill <id>停止特定子代理並級聯到其子項。
限制
- 子代理公告為盡力而為。如果閘道重啟,待處理的「公告回報」工作會遺失。
- 子代理仍共享相同的閘道程序資源;將
maxConcurrent視為安全閥。 sessions_spawn始終為非阻塞:立即回傳{ status: "accepted", runId, childSessionKey }。- 子代理上下文僅注入
AGENTS.md+TOOLS.md(不含SOUL.md、IDENTITY.md、USER.md、HEARTBEAT.md或BOOTSTRAP.md)。 - 最大巢狀深度為 5(
maxSpawnDepth範圍:1–5)。大多數使用情境建議深度 2。 maxChildrenPerAgent限制每個工作階段的活躍子項數(預設:5,範圍:1–20)。