跳轉到主要內容
子代理是您的主代理可以生成的獨立代理實例,用於處理專注的子任務。 使用子代理來隔離專注子任務的上下文、並行運行多個分析,以及應用專門化指令,而不會使主代理的提示詞變得臃腫。 本指南說明如何使用 agents 參數在 SDK 中定義和使用子代理。

概述

您可以通過三種方式建立子代理:
  • 以程式方式:在您的 query() 選項中使用 agents 參數。請參閱 TypeScriptPython 參考資料
  • 基於檔案系統:在 .claude/agents/ 目錄中將代理定義為 markdown 檔案。請參閱將子代理定義為檔案
  • 內置通用代理:Claude 可以隨時通過 Agent 工具呼叫內置的 general-purpose 子代理,無需您定義任何內容
本指南重點介紹程式化方法,這是 SDK 應用程式的推薦方法。 定義子代理時,Claude 根據每個子代理的 description 欄位確定是否呼叫它。編寫清晰的描述,說明何時應使用子代理,Claude 將自動委派適當的任務。您也可以在提示詞中按名稱明確請求子代理,例如「使用代碼審查員代理來…」。

使用子代理的好處

上下文隔離

每個子代理在其自己的新對話中運行。中間工具調用和結果保留在子代理內;只有其最終消息返回到父代理。請參閱子代理繼承的內容以了解子代理上下文中的確切內容。 示例: research-assistant 子代理可以探索數十個檔案,而無需任何該內容在主對話中累積。父代理接收簡潔的摘要,而不是子代理讀取的每個檔案。

並行化

多個子代理可以並發運行,因此獨立的子任務在最慢的一個的時間內完成,而不是所有任務時間的總和。 示例: 在代碼審查期間,您可以同時運行 style-checkersecurity-scannertest-coverage 子代理,而不是按順序運行。

專門化指令和知識

每個子代理可以有具有特定專業知識、最佳實踐和約束的定製系統提示詞。 示例: database-migration 子代理可以具有有關 SQL 最佳實踐、回滾策略和資料完整性檢查的詳細知識,這些在主代理的指令中將是不必要的噪音。

工具限制

子代理可以限制為特定工具,降低意外操作的風險。 示例: doc-reviewer 子代理可能只能訪問 Read 和 Grep 工具,確保它可以分析但永遠不會意外修改您的文檔檔案。

創建子代理

使用 agents 參數直接在代碼中定義子代理。Claude 通過 Agent 工具調用子代理,因此請在 allowedTools 中包含 Agent 以自動批准子代理調用,無需權限提示。 本頁面上的大多數示例僅列印最終結果。若要確認 Claude 委派給子代理而不是直接回答,請參閱檢測子代理調用 此示例創建兩個子代理:一個具有唯讀訪問權限的代碼審查員和一個可以執行命令的測試運行器。

AgentDefinition 配置

在 Python SDK 中,多字欄位名稱(例如 disallowedToolsmcpServers)保持其 camelCase 拼寫以匹配線路格式,而不是遵循 Python 的 snake_case 慣例。有關詳細信息,請參閱 AgentDefinition 參考 Claude Code v2.1.198 中的兩個子代理行為已更改:
  • 子代理預設在背景中運行。省略 run_in_background 輸入的 Agent 工具調用會啟動背景子代理,當 Claude 需要結果才能繼續時,它會設定 run_in_background: false。在 v2.1.198 之前,省略 run_in_background 會同步運行子代理。設定 background 欄位為 true 以強制特定代理進行背景執行,無論 Claude 請求什麼。
  • 子代理繼承主會話的擴展思考配置。在較早的版本中,無論主會話的設定如何,擴展思考在子代理內被禁用。
自 Claude Code v2.1.172 起,子代理可以生成自己的子代理。位於主代理下方五個級別的子代理無法生成進一步的子代理,無論其是否在前景或背景中運行。若要防止子代理生成其他子代理,請從其 tools 陣列中省略 Agent 或將其添加到 disallowedTools。有關完整的深度規則,請參閱嵌套子代理

基於檔案系統的定義(替代方案)

您也可以在 .claude/agents/ 目錄中將子代理定義為 markdown 檔案。有關此方法的詳細信息,請參閱 Claude Code 子代理文檔。以程式方式定義的代理優先於具有相同名稱的基於檔案系統的代理。
即使不定義自訂子代理,Claude 也可以生成內置的 general-purpose 子代理。這對於委派研究或探索任務而無需創建專門代理很有用。請在 allowedTools 中包含 Agent,以便這些調用自動批准,無需權限提示。

子代理繼承的內容

子代理的上下文窗口從新開始(無父對話),但並非空的。從父代理到子代理的唯一通道是 Agent 工具的提示詞字符串,因此請直接在該提示詞中包含子代理需要的任何檔案路徑、錯誤消息或決策。 具有 SendMessage 工具的子代理會在開始時獲得在該會話中運行的其他命名代理的列表,因此它知道可以向哪些名稱發送消息。Claude Code 會自動在子代理的第一輪中添加該列表。分叉不會獲得該列表,因為它繼承了父對話。該列表需要 Claude Code v2.1.206 或更高版本。
父代理逐字接收子代理的最終消息作為 Agent 工具結果,但可能在其自己的回應中進行摘要。要在面向用戶的回應中逐字保留子代理輸出,請在您傳遞給主 query() 調用的提示詞或 systemPrompt 選項中包含執行此操作的指令。
結束子代理早期的 API 錯誤(例如速率限制)永遠不會作為其結果傳遞。如果速率限制、過載或伺服器錯誤中斷已經產生文本輸出的前景子代理,Agent 工具會返回該部分輸出並附註子代理未完成。未產生任何內容的子代理,或其唯一輸出是沒有文本的工具調用,會失敗並顯示錯誤消息 Agent terminated early due to an API error,後跟錯誤詳情。請參閱子代理中的 API 錯誤以了解前景和背景行為。 此部分輸出處理需要 Claude Code v2.1.199 或更高版本。在 v2.1.199 中,速率限制、過載或伺服器錯誤使僅工具調用的形狀保留為空的部分結果,僅包含截斷注釋。

調用子代理

自動調用

Claude 根據任務和每個子代理的 description 自動決定何時調用子代理。例如,如果您定義了一個 performance-optimizer 子代理,其描述為「查詢調優的性能優化專家」,當您的提示詞提到優化查詢時,Claude 將調用它。 編寫清晰、具體的描述,以便 Claude 可以將任務匹配到正確的子代理。

明確調用

要保證 Claude 使用特定的子代理,請在提示詞中按名稱提及它:
這繞過自動匹配並直接調用命名的子代理。

動態代理配置

您可以根據運行時條件動態創建代理定義。此示例創建一個安全審查員,具有不同的嚴格級別,對嚴格審查使用更強大的模型。

檢測子代理調用

Claude 通過 Agent 工具調用子代理。要檢測何時調用子代理,請檢查 tool_use 塊,其中 name"Agent"。來自子代理上下文內的訊息包括 parent_tool_use_id 欄位。
工具名稱在 Claude Code v2.1.63 中從 "Task" 重新命名為 "Agent"。目前 SDK 版本在 tool_use 塊中發出 "Agent",但在 system:init 工具清單和 result.permission_denials[].tool_name 中仍使用 "Task"。檢查 block.name 中的兩個值可確保跨 SDK 版本的相容性。
訊息結構在 SDK 之間有所不同。在 Python 中,內容塊直接通過 message.content 存取。在 TypeScript 中,SDKAssistantMessage 包裝 Claude API 訊息,因此內容通過 message.message.content 存取。 此範例遍歷串流訊息,記錄何時調用子代理以及後續訊息何時源自該子代理的執行上下文。

恢復子代理

您可以恢復子代理以繼續中斷的地方,而不是從頭開始。恢復的子代理保留其完整的對話歷史,包括所有先前的工具調用、結果和推理。 當子代理完成時,Agent 工具結果包含一個文字區塊,其中包含 agentId: <id>。內置的 ExplorePlan 代理 是一次性的,不會返回 agentId,因此當您需要恢復時,請使用自訂代理或 general-purpose。要以程式方式恢復子代理:
  1. 捕獲會話 ID:在第一個查詢期間從訊息中提取 session_id
  2. 提取代理 ID:從 Agent 工具結果文字中解析 agentId
  3. 恢復會話:在第二個查詢的選項中傳遞 resume: sessionId,並在提示詞中包含代理 ID
您必須恢復相同的會話以訪問子代理的記錄。默認情況下,每個 query() 調用都會啟動一個新會話,因此傳遞 resume: sessionId 以在相同會話中繼續。使用自訂代理時,在兩個查詢的 agents 參數中傳遞相同的代理定義。
下面的示例定義了一個自訂的 endpoint-finder 代理。第一個查詢運行它並從 Agent 工具結果中捕獲會話 ID 和代理 ID,然後第二個查詢恢復會話以提出需要來自第一個分析的上下文的後續問題。
子代理記錄獨立於主對話而持續存在:
  • 主對話壓縮:當主對話壓縮時,子代理記錄不受影響。它們存儲在單獨的檔案中。
  • 會話持久性:子代理記錄在其會話內持續存在。您可以通過恢復相同會話在重新啟動 Claude Code 後恢復子代理。
  • 自動清理:記錄根據 cleanupPeriodDays 設定進行清理,預設為 30 天。

工具限制

子代理可以通過 tools 欄位具有受限的工具訪問:
  • 省略欄位:代理繼承所有可用工具(預設)
  • 指定工具:代理只能使用列出的工具
此示例創建一個唯讀分析代理,可以檢查代碼但無法修改檔案或運行命令。

常見工具組合

使用動態工作流程進行擴展

子代理適用於每轉委派幾個任務。對於協調數十到數百個代理的運行,請使用 Workflow 工具,它將編排移到運行時在對話上下文外執行的腳本中。請參閱動態工作流程以了解工作流程與逐轉子代理委派的區別。 Workflow 工具在 TypeScript Agent SDK v0.3.149 及更高版本中可用。在 allowedTools 中包含 Workflow 以自動批准工作流程運行。工具輸入和輸出架構列在 TypeScript 參考中。

故障排除

Claude 不委派給子代理

如果 Claude 直接完成任務而不是委派給您的子代理:
  • 檢查 Agent 調用已獲批准:在 allowedTools 中包含 Agent 以自動批准子代理調用。沒有它,Agent 調用會轉到您的 canUseTool 回調,或在 dontAsk 模式下被拒絕
  • 使用明確提示:在您的提示詞中按名稱提及子代理,例如「使用代碼審查員代理來…」
  • 編寫清晰的描述:準確解釋何時應使用子代理,以便 Claude 可以適當地匹配任務

基於檔案系統的代理未加載

Claude Code 監視 ~/.claude/agents/.claude/agents/,並在幾秒內拾取新的或編輯的代理檔案,無需重新啟動。如果定義從未出現,請檢查這些原因:
  • 新的 agents 目錄:監視程式僅涵蓋會話啟動時存在的目錄,因此新目錄中的第一個檔案需要會話重新啟動。這是最常見的原因。
  • 無效的 frontmatter 或重複的 name:檢查檔案的 YAML,以及現有代理是否已使用該 name
  • --disable-slash-commands:使用此旗標啟動的會話不監視這些目錄,並且始終需要重新啟動以加載新檔案。
  • 具有相同名稱的程式化代理:傳遞給 query()agents 會覆蓋具有相同名稱的檔案系統代理。
有關檔案格式,請參閱如何編寫子代理檔案

Windows 上的長提示詞失敗

在 Windows 上,具有非常長提示詞的子代理可能因命令行長度限制(8191 個字符)而失敗。保持提示詞簡潔或使用基於檔案系統的代理來處理複雜指令。