子代理程式
子代理是在既有代理執行期間所產生的背景代理執行。它們在自己的工作階段(agent:<agentId>:subagent:<uuid>)中運行,完成後會將結果公告回請求者的聊天頻道。
Slash command
使用/subagents 來檢視或控制目前工作階段的子代理執行:
/subagents list/subagents kill <id|#|all>/subagents log <id|#> [limit] [tools]/subagents info <id|#>/subagents send <id|#> <message>
/subagents info 會顯示執行中繼資料(狀態、時間戳記、工作階段 id、逐字稿路徑、cleanup)。
主要目標:
- 在不阻塞主執行的情況下,平行化「研究/長時間任務/慢速工具」工作。
- 預設讓子代理彼此隔離(工作階段分離 + 可選沙箱)。
- 讓工具介面難以被誤用:子代理預設不會取得工作階段工具。
- 支援可設定的巢狀深度,以實現 orchestrator 模式。
你可以透過
agents.defaults.subagents.model 或每個代理的覆寫設定來配置。
Tool
使用sessions_spawn:
- 啟動子代理執行(
deliver: false,全域 lane:subagent) - 接著執行公告步驟,並將公告回覆張貼到請求者聊天頻道
- 預設模型:繼承呼叫者,除非你設定
agents.defaults.subagents.model(或每個代理的agents.list[].subagents.model);若明確提供sessions_spawn.model,則以其為準。 - 預設 thinking:繼承呼叫者,除非你設定
agents.defaults.subagents.thinking(或每個代理的agents.list[].subagents.thinking);若明確提供sessions_spawn.thinking,則以其為準。
task(必填)label?(選填)agentId?(選填;若允許,可在其他 agent id 之下產生)model?(選填;覆寫子代理模型;若為無效值將被跳過,子代理會以預設模型執行,並在工具結果中顯示警告)thinking?(選填;覆寫子代理的 thinking 等級)runTimeoutSeconds?(預設0;設定後,子代理執行會在 N 秒後中止)cleanup?(delete|keep,預設keep)
agents.list[].subagents.allowAgents:可透過agentId指定的 agent id 清單(["*"]代表允許任何)。預設:僅限請求者代理。
- 使用
agents_list來查看目前哪些 agent id 允許sessions_spawn。
- 子代理工作階段會在
agents.defaults.subagents.archiveAfterMinutes(預設:60)後自動封存。 - 封存使用
sessions.delete,並將逐字稿重新命名為*.deleted.<timestamp>(相同資料夾)。 cleanup: "delete"會在公告後立即封存(仍會透過重新命名保留逐字稿)。- 自動封存為盡力而為;若 gateway 重新啟動,尚未觸發的計時器將會遺失。
runTimeoutSeconds不會 自動封存;它只會停止執行。工作階段會保留,直到自動封存。- 自動封存同樣適用於 depth-1 與 depth-2 工作階段。
Nested Sub-Agents
預設情況下,子代理不能再產生自己的子代理(maxSpawnDepth: 1)。你可以將 maxSpawnDepth 設為 2 來啟用一層巢狀,允許 orchestrator 模式:主代理 → orchestrator 子代理 → worker 子子代理。
How to enable
Depth levels
| Depth | Session key shape | Role | Can spawn? |
|---|---|---|---|
| 0 | agent:<id>:main | 主代理 | Always |
| 1 | agent:<id>:subagent:<uuid> | 子代理(當允許 depth 2 時為 orchestrator) | Only if maxSpawnDepth >= 2 |
| 2 | agent:<id>:subagent:<uuid>:subagent:<uuid> | 子子代理(leaf worker) | Never |
Announce chain
結果會沿著鏈向上回傳:- Depth-2 worker 完成 → 向其父層(depth-1 orchestrator)公告
- Depth-1 orchestrator 接收公告、整合結果、完成 → 向主代理公告
- 主代理接收公告並回覆給使用者
Tool policy by depth
- Depth 1(orchestrator,當
maxSpawnDepth >= 2):取得sessions_spawn、subagents、sessions_list、sessions_history以管理其子代理。其他工作階段/系統工具仍被拒絕。 - Depth 1(leaf,當
maxSpawnDepth == 1):沒有工作階段工具(目前預設行為)。 - Depth 2(leaf worker):沒有工作階段工具 — 在 depth 2 永遠拒絕
sessions_spawn,不能再產生子代理。
Per-agent spawn limit
每個代理工作階段(任何深度)同時間最多只能有maxChildrenPerAgent(預設:5)個活躍子代理。這可防止單一 orchestrator 失控式擴散。
Cascade stop
停止 depth-1 orchestrator 會自動停止其所有 depth-2 子代理:- 在主聊天中輸入
/stop會停止所有 depth-1 代理,並級聯停止其 depth-2 子代理。 /subagents kill <id>會停止特定子代理,並級聯停止其子代理。/subagents kill all會停止請求者的所有子代理,並級聯停止。
Authentication
子代理的驗證是依據 agent id 解析,而非依據工作階段類型:- 子代理的工作階段金鑰為
agent:<agentId>:subagent:<uuid>。 - 驗證存放區會從該代理的
agentDir載入。 - 主代理的驗證設定檔會作為備援合併進來;若發生衝突,以子代理所屬代理的設定為準。
Announce
子代理透過公告步驟回報結果:- 公告步驟在子代理工作階段內執行(不是在請求者工作階段)。
- 若子代理精確回覆
ANNOUNCE_SKIP,則不會張貼任何內容。 - 否則,公告回覆會透過後續的
agent呼叫(deliver=true)張貼到請求者聊天頻道。 - 在可用時,公告回覆會保留執行緒/主題路由(Slack 執行緒、Telegram 主題、Matrix 執行緒)。
- 公告訊息會被標準化為穩定範本:
Status:來自執行結果(success、error、timeout或unknown)。Result:公告步驟中的摘要內容(若缺少則為(not available))。Notes:錯誤細節與其他有用資訊。
Status並非從模型輸出推斷,而是來自執行階段結果訊號。
- 執行時間(例如
runtime 5m12s) - Token 使用量(input/output/total)
- 當模型定價透過
models.providers.*.models[].cost設定時的預估成本 sessionKey、sessionId與逐字稿路徑(主代理可透過sessions_history取得歷史或直接檢視檔案)
Tool Policy (sub-agent tools)
預設情況下,子代理可使用所有工具,除了工作階段工具與系統工具:sessions_listsessions_historysessions_sendsessions_spawn
maxSpawnDepth >= 2 時,depth-1 的 orchestrator 子代理還會額外取得 sessions_spawn、subagents、sessions_list 與 sessions_history 以管理其子代理。
可透過設定覆寫:
Concurrency
子代理使用專用的 in-process 佇列 lane:- Lane 名稱:
subagent - 併發數:
agents.defaults.subagents.maxConcurrent(預設8)
Stopping
- 在請求者聊天中輸入
/stop會中止請求者工作階段,並停止其所產生的所有活躍子代理執行(包含巢狀子代理)。 /subagents kill <id>會停止特定子代理,並級聯停止其子代理。
Limitations
- 子代理公告為盡力而為。若 gateway 重新啟動,尚未完成的「回傳公告」工作將會遺失。
- 子代理仍與主代理共用同一個 gateway 行程資源;請將
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)。多數使用情境建議使用 depth 2。 maxChildrenPerAgent會限制每個工作階段的活躍子代理數(預設:5,範圍:1–20)。