Subagents 在單一工作階段內工作。若要執行許多獨立工作階段並行並從一個地方監控它們,請參閱 background agents。對於相互通訊的工作階段,請參閱 cross-session messaging。對於 Claude 產生和監督的協調團隊工作階段,請參閱 agent teams。
- 保留上下文,將探索和實現保持在主要對話之外
- 強制執行約束,限制 subagent 可以使用的工具
- 跨專案重複使用配置,使用使用者層級的 subagents
- 專門化行為,針對特定領域使用專注的系統提示
- 控制成本,將任務路由到更快、更便宜的模型,如 Haiku
description 欄位,並將詳細資訊移至每個 subagent 的系統提示中,該提示僅在該 subagent 執行時載入。
內建 subagents
Claude Code 包括內建 subagents,Claude 在適當時會自動使用。每個都繼承父對話的權限規則;大多數以受限的工具集執行。 Explore 和 Plan 會跳過您的 CLAUDE.md 檔案和 git status 快照,以保持研究快速且經濟高效。其他所有內建和自訂 subagent 都會載入兩者,除非其定義設定omitClaudeMd 欄位以跳過使用者、專案和本機 CLAUDE.md 檔案。如需了解到達 subagent 的完整詳細資訊,請參閱啟動時載入的內容。
- Explore
- Plan
- General-purpose
- Other
一個快速、唯讀的代理,針對搜尋和分析程式碼庫進行最佳化。
- Model:主要對話的模型。當主要對話在 Fable 上執行時,Explore 的模型取決於您的連線方式:
- 使用 Claude 訂閱、Anthropic Console 帳戶,或透過
ANTHROPIC_BASE_URL連線的 LLM 閘道時,Explore 會在opus別名所解析的 Opus 模型上執行。 - 在 Amazon Bedrock、Google Cloud 的 Agent Platform、Microsoft Foundry、AWS 上的 Claude Platform 或 Claude apps 閘道上,Explore 會維持使用主要對話的模型。
- 使用 Claude 訂閱、Anthropic Console 帳戶,或透過
- Tools:唯讀工具;Write 和 Edit 被拒絕
- Purpose:檔案發現、程式碼搜尋、程式碼庫探索
Explore 的使用者或專案 subagent 會覆寫內建的,並保留其自己的 model 欄位,因此定義一個具有 model: haiku 的 subagent,即可在較低成本的模型上執行探索。若要將單一模型強制套用至每個 subagent(包括 Explore),請參閱在一個模型上執行每個 subagent。當 Claude 需要搜尋或理解程式碼庫而不進行更改時,它會委派給 Explore。這樣可以將探索結果保持在主要對話上下文之外。當呼叫 Explore 時,Claude 指定一個徹底程度:quick 用於目標查詢,medium 用於平衡探索,或 very thorough 用於全面分析。- 若要封鎖特定的內建類型,請將其新增至
permissions.deny,如停用特定 subagents 中所示。 - 若要防止 Claude 委派給任何 subagent,請使用
permissions.deny拒絕Agent工具本身。 - 若要僅移除內建的
Explore和Plansubagents,請設定CLAUDE_CODE_DISABLE_EXPLORE_PLAN_AGENTS=1。Claude 會直接讀取和探索檔案,而不是委派給它們。需要 Claude Code v2.1.198 或更新版本。 - 在非互動式模式和 Agent SDK 中,設定
CLAUDE_AGENT_SDK_DISABLE_BUILTIN_AGENTS=1以移除所有內建類型,並僅提供您自己的。
general-purpose subagent 可回退時,省略 subagent_type 的 Agent 工具呼叫會失敗,並出現 subagent_type is required 錯誤。
除了這些內建 subagents 之外,您可以建立自己的 subagents,具有自訂提示、工具限制、權限模式、hooks 和 skills。以下部分展示如何開始和自訂 subagents。
快速入門:建立您的第一個 subagent
Subagents 是具有 YAML frontmatter 的 Markdown 檔案。若要建立一個,請要求 Claude 為您撰寫,或 自行撰寫檔案。 自 v2.1.198 起,/agents 命令不再開啟互動式建立精靈;執行它會列印提醒,要求您詢問 Claude 或直接編輯 .claude/agents/。Subagent 檔案、frontmatter 欄位以及 .claude/agents/ 和 ~/.claude/agents/ 位置保持不變;只有終端精靈被移除。
本逐步指南建立一個使用者層級的 subagent,用於審查程式碼並提出改進建議。
1
要求 Claude 建立 subagent
在 Claude Code 中,描述您想要的 subagent 及其儲存位置:Claude 會撰寫包含
name、description、tools 清單、model 和系統提示的檔案。2
檢查檔案
開啟 因為檔案位於
~/.claude/agents/code-improver.md 並確認 frontmatter 符合您的要求。結果如下所示:~/.claude/agents/,所以 subagent 在您機器上的每個專案中都可用。若要改為將其範圍限制在一個專案,請將其移至該專案的 .claude/agents/ 目錄。選擇 subagent 範圍 比較了兩者。3
試試看
要求 Claude 委派給新的 subagent:Claude 委派給您的新 subagent,它掃描程式碼庫並返回改進建議。在文字記錄中,委派會顯示為工具呼叫列,顯示 subagent 的名稱,後面跟著簡短的工作描述,例如
code-improver(Suggest code improvements)。如果 Claude 找不到新的 subagent,請重新啟動 Claude Code 並再試一次。這只在 ~/.claude/agents/ 在工作階段開始前不存在時發生,因為執行中的工作階段不會偵測到新建立的 agents 目錄。在 Claude Code v2.1.197 及更早版本上,
/agents 開啟一個互動式精靈,其中包含列出即時 subagents 的 Running 標籤和用於建立、編輯和刪除它們的 Library 標籤。設定子代理
子代理的檔案位置決定了誰可以使用它,其 frontmatter 決定了它可以做什麼。本節涵蓋子代理檔案的位置以及它們支援的每個欄位。選擇子代理範圍
根據範圍將子代理檔案儲存在不同位置。當多個子代理共享相同名稱時,Claude Code 會使用來自優先級較高位置的子代理。
專案子代理(
.claude/agents/)最適合特定於程式碼庫的子代理。將它們簽入版本控制,以便您的團隊可以協作使用和改進它們。
專案子代理是透過從目前工作目錄向上走來發現的,因此會掃描該處和儲存庫根目錄之間的每個 .claude/agents/。當這些巢狀目錄中的多個定義相同的 name 時,Claude Code 會使用最接近工作目錄的定義。
當您使用 --add-dir 或 /add-dir 新增目錄時,Claude Code 也會載入其 .claude/agents/ 資料夾,以及您的專案子代理。請參閱其他目錄以了解哪些其他設定類型從 --add-dir 載入。若要在不使用 --add-dir 的情況下跨專案共享子代理,請使用 ~/.claude/agents/ 或 plugin。
使用者子代理(~/.claude/agents/)是在您的所有專案中可用的個人子代理。
Claude Code 會遞迴掃描 .claude/agents/ 和 ~/.claude/agents/,因此您可以將定義組織到子資料夾中,例如 agents/review/ 或 agents/research/。子目錄路徑不會影響子代理的識別或叫用方式,因為身份僅來自 name frontmatter 欄位。
在整個樹中保持 name 值唯一:如果同一 .claude/agents/ 目錄下的兩個檔案(包括其子資料夾)宣告相同的名稱,Claude Code 只會載入其中一個,由檔案系統讀取順序選擇,而不是文件化的優先級。在巢狀專案目錄中,最接近工作目錄的定義獲勝,如上所述。/doctor設定檢查會報告同一目錄中共享名稱的檔案,並建議重新命名或移除除一個以外的所有檔案。在 v2.1.205 之前,/doctor 開啟診斷畫面,列出重複項並顯示哪個定義處於活動狀態。
Plugin agents/ 目錄也會遞迴掃描。與專案和使用者範圍不同,plugin 的 agents/ 目錄內的子資料夾成為範圍識別碼的一部分:plugin my-plugin 中位於 agents/review/security.md 的檔案註冊為 my-plugin:review:security。
CLI 定義的子代理在啟動 Claude Code 時作為 JSON 傳遞。它們僅存在於該工作階段,不會儲存到磁碟,使其適合快速測試或自動化指令碼。您可以在單個 --agents 呼叫中定義多個子代理:
- macOS, Linux, WSL
- Windows PowerShell
--agents 也接受保存相同物件的 JSON 檔案的路徑,用於定義太大而無法在命令列上傳遞的情況。例如,claude -p --agents ./agents.json "Review my changes" 從該檔案讀取定義。在互動工作階段中,Claude Code 拒絕檔案路徑。檔案形式需要 Claude Code v2.1.281 或更新版本。
JSON 中的每個頂級鍵是代理的名稱,其值是該代理的定義。不要以 - 開頭的名稱。定義採用這些欄位:
prompt:代理的系統提示,等同於檔案型子代理中的 markdown 主體。prompt可能為空。如果您使用--agent選擇一個具有空prompt且沒有memory欄位的代理作為工作階段的代理,工作階段的系統提示保持不變。空prompt需要 Claude Code v2.1.281 或更新版本。- Frontmatter 欄位:
description、tools、disallowedTools、model、permissionMode、mcpServers、hooks、maxTurns、skills、initialPrompt、memory、effort、background、omitClaudeMd和isolation。 - 忽略的欄位:
color和experimental在此不被接受,被忽略而不是拒絕。
Invalid --agents configuration。
受管子代理由組織管理員部署。將 markdown 檔案放在受管設定目錄內的 .claude/agents/ 中,使用與專案和使用者子代理相同的 frontmatter 格式。受管定義優先於具有相同名稱的專案和使用者子代理。
Plugin 子代理來自您已安裝的 plugins。它們會自動與您的自訂子代理一起載入,並在 @-mention 預輸入中以其範圍名稱出現。有關建立 plugin 子代理的詳細資訊,請參閱 plugin 元件參考。
基於安全考量,外掛 subagent 不支援
hooks、mcpServers 或 permissionMode frontmatter 欄位。從外掛載入 agent 時,這些欄位會被忽略。如果您需要它們,請將 agent 檔案複製到 .claude/agents/ 或 ~/.claude/agents/。您也可以在 settings.json 或 settings.local.json 中將規則新增到 permissions.allow,但這些規則會套用於整個工作階段,而不僅是外掛 subagent。如果您是該外掛的作者,請改為將 hook 放在外掛的 hooks/hooks.json 中,並將 MCP 伺服器放在其 .mcp.json 中一併發布。只要外掛處於啟用狀態,它們就會套用,而不僅限於 subagent 內部。編寫子代理檔案
子代理檔案使用 YAML frontmatter 進行設定,後面是 Markdown 中的系統提示:Claude Code 監視
~/.claude/agents/ 和 .claude/agents/。當您在磁碟上新增或編輯子代理檔案,或要求 Claude 為您編寫一個時,Claude Code 會在幾秒內偵測到變更,下一次委派會使用更新的定義,無需重新啟動。三種情況仍需要重新啟動:- 監視程式僅涵蓋工作階段開始時存在的目錄,因此在新
agents目錄中建立範圍的第一個代理檔案後,重新啟動以載入它。 - Claude Code 不監視透過
--add-dir或/add-dir新增的目錄內的.claude/agents/,因此在那裡新增或編輯子代理後,重新啟動以載入變更。 - 使用
--disable-slash-commands啟動的工作階段根本不監視這些目錄。
.claude/agents/code-reviewer.md
--append-subagent-system-prompt 以將您的文字附加到每個子代理的系統提示末尾,包括巢狀子代理,除了分叉子代理,它重複使用對話自己的提示。需要 Claude Code v2.1.205 或更新版本。如果您的文字太長而無法在命令列上傳遞,請將其儲存到檔案並改為使用 --append-subagent-system-prompt-file 傳遞路徑。檔案旗標需要 Claude Code v2.1.261 或更新版本。
子代理在主對話的目前工作目錄中啟動。在子代理內,cd 命令不會在 Bash 或 PowerShell 工具呼叫之間持續,也不會影響主對話的工作目錄。若要改為給子代理儲存庫的隔離副本,請設定 isolation: worktree。
具有 isolation: worktree 的子代理在其 worktree 內執行其 Bash 和 PowerShell 命令。其工作目錄解析到您的主簽出的命令(例如,因為 worktree 目錄在子代理執行時被移除)會失敗並出現錯誤。在 v2.1.203 之前,此類命令可以在主簽出中執行。
此工作目錄檢查涵蓋包含您啟動 Claude Code 的目錄的整個儲存庫。當您的工作階段在其自己的連結 worktree 中執行時,檢查也涵蓋該 worktree 連結的主簽出。在 v2.1.210 之前,檢查僅涵蓋啟動目錄本身。其工作目錄解析到同一儲存庫中其他位置的命令(例如,當您從 monorepo 子目錄啟動 Claude Code 時的儲存庫根目錄)在那裡執行,而不是失敗。
對於 Bash 命令,Claude Code 也以兩種方式檢查命令本身:
- 它阻止將 git 重定向到主簽出的命令。
- 當它無法從命令文字驗證命令執行的任何 git 都保留在 worktree 內時,它拒絕命令,例如當命令名稱在執行時計算時。
isolation: worktree 的子代理;請參閱Claude Code 如何強制隔離。
Frontmatter 參考
使用 YAML frontmatter 在檔案頂部的--- 標記之間設定子代理,並在結束 --- 之後將其系統提示寫為 Markdown。只有 name 和 description 是必需的。
多字欄位名稱使用 camelCase,例如 maxTurns 和 disallowedTools,必須與表格完全匹配:Claude Code 忽略它不識別的欄位而不報告錯誤。若要找出子代理檔案未載入的原因,請參閱Claude Code 跳過的子代理檔案。
在
experimental 對應內寫入 cacheTtl,而不是在 frontmatter 的頂級。
Claude Code 跳過的子代理檔案
Claude Code 在專案、使用者或受管agents 目錄中跳過檔案,或在您使用 --add-dir 新增的目錄下的檔案,而不在工作階段中報告它,當 frontmatter 有以下任何問題時:
- 沒有
name:Claude Code 將檔案視為保存在代理旁邊的文件。 - 不是檔案第一行的開啟
---:Claude Code 讀取檔案為沒有 frontmatter,並將其視為文件。 - 以
-開頭或包含:的name:Claude Code 跳過檔案並將錯誤寫入偵錯日誌。請參閱上表中的name列。 - 有
name但沒有description:Claude Code 跳過檔案並將原因寫入偵錯日誌。 - 不解析的 YAML:Claude Code 不從檔案讀取任何欄位,跳過它,並將解析錯誤寫入偵錯日誌。
--debug 執行 Claude Code。
plugin 子代理的 frontmatter 沒有 name 或不解析仍然載入,在其檔案名稱下。
若要找出 agents 目錄中 frontmatter 不解析的檔案,請針對目錄執行 claude plugin validate,例如 .claude/agents 或 ~/.claude/agents。Claude Code 僅檢查您命名的目錄,不標記 frontmatter 解析但沒有 name 的檔案。需要 Claude Code v2.1.233 或更新版本。
選擇模型
model 欄位控制子代理使用的模型:
- 模型別名:使用可用別名之一:
sonnet、opus、haiku或fable - 完整模型 ID:使用完整模型 ID,例如
claude-opus-5-5或claude-sonnet-5。接受與--model旗標相同的值 - inherit:使用與主對話相同的模型
model 參數。Claude Code 按此順序解析子代理的模型:
- 每次叫用
model參數 - 子代理定義的
modelfrontmatter,其中inherit選擇主對話的模型 CLAUDE_CODE_SUBAGENT_MODEL環境變數,當您將其設定為模型別名或模型 ID 時- 主對話的模型
opus)解析為主對話的模型,而不是別名指向的版本:
- 主對話的模型屬於該家族:子代理在主對話的確切模型上執行,包括任何
[1m]尾碼,因此它獲得與主對話相同的擴展上下文視窗。 - Claude Code 無法判斷主對話的模型家族,在Anthropic API 以外的提供者上:這可能發生在 Amazon Bedrock 上的應用程式推論設定檔 ARN,Claude Code 尚未解析為支援模型。此情況僅涵蓋
opus別名,當您設定ANTHROPIC_DEFAULT_OPUS_MODEL時不適用,因為opus然後解析為您設定的模型。
CLAUDE_CODE_SUBAGENT_MODEL 中的別名始終解析為別名指向的版本,即使它命名主對話的家族。
單獨設定 CLAUDE_CODE_SUBAGENT_MODEL 不會改變內建 Explore 和 Plan 子代理執行的模型。若要改變它,請參閱在一個模型上執行每個子代理。
在 v2.1.251 之前,CLAUDE_CODE_SUBAGENT_MODEL 在此順序中排在第一位,並覆蓋每次叫用參數和 frontmatter,包括 model: inherit。
將變數設定為 inherit 與不設定它相同。在 v2.1.196 之前,該值強制子代理進入主對話的模型並忽略其他來源。
Claude Code 根據您組織的 availableModels 允許清單檢查每次叫用參數、frontmatter 和環境變數值。對於被阻止的值,它替換另一個模型:
- 當被阻止的值是家族別名(例如
opus)時,Claude Code 在允許清單允許的該家族的最新版本上執行子代理,遵循與/model相同的替換規則和提供者範圍。在 v2.1.222 之前,Claude Code 也在被阻止的家族別名的繼承模型上執行子代理。 - 對於任何其他被阻止的值,在該替換不操作的提供者上,或當允許清單允許該家族的沒有版本時,Claude Code 改為在繼承模型上執行子代理。如果您設定
CLAUDE_CODE_SUBAGENT_MODEL,Claude Code 首先嘗試該模型,在這些相同的規則下。
/tasks。Claude Code 在子代理的列上命名模型,並在子代理的定義或它分叉的技能設定 effort 時新增努力級別。需要 Claude Code v2.1.242 或更新版本。
每次叫用 model 參數也適用於子代理恢復或發送後續訊息時,因此子代理保持在該模型上。在 v2.1.211 之前,恢復會丟棄每次叫用值,子代理恢復為其定義的 model 欄位或沒有時的主對話的模型。
從 v2.1.198 開始,子代理也繼承主對話的擴展思考設定:如果思考在您的工作階段中開啟,它對子代理開啟,如果關閉,它保持關閉。沒有每個子代理思考設定。在 v2.1.198 之前,子代理執行時禁用擴展思考,無論主對話的設定如何。
在一個模型上執行每個子代理
CLAUDE_CODE_SUBAGENT_MODEL 是預設值,因此子代理的定義或 Claude 傳遞的模型仍然優先於它。若要將一個模型應用於每個子代理、隊友 和工作流代理,也設定 CLAUDE_CODE_SUBAGENT_MODEL_FORCE 為 1。需要 Claude Code v2.1.257 或更新版本。
- 如果您設定兩個變數,子代理在
CLAUDE_CODE_SUBAGENT_MODEL中的模型上執行。 - 如果您只設定
CLAUDE_CODE_SUBAGENT_MODEL_FORCE,subagent 會在主對話的模型上執行,但內建的 Explore subagent 例外,它會在內建 subagent 中為其列出的模型上執行。
env 區塊中設定兩個變數:
/tasks。子代理的列顯示它執行的模型。
當 CLAUDE_CODE_SUBAGENT_MODEL_FORCE 開啟時,Claude Code 會忽略 subagent 定義中的 model 欄位,且 Claude 在啟動 subagent 時無法傳遞模型。以下 subagent 仍會在主對話的模型上執行:
- 分叉
- 在子代理中執行的技能,具有
model: inherit
控制子代理功能
您可以透過工具存取、權限模式和條件規則控制子代理可以做什麼。可用工具
子代理繼承內建工具和主對話中可用的 MCP 工具,由兩個篩選器縮小:第一個從每個子代理移除工具的簡短列表,第二個減少在背景中執行的子代理的內建工具集,這是預設值。在 macOS、Linux 和 WSL 上,當主對話沒有時,子代理也可以接收 Glob 和 Grep 工具,如Glob 工具行為下所述。分叉跳過兩個篩選器並接收主對話的確切工具池。第一個篩選器移除這些工具,即使在tools 欄位中列出:
Agent,當子代理在深度限制時;在分叉中工具保持列出但返回錯誤而不是生成AskUserQuestionEndConversation,只能結束主對話;請參閱EndConversation 工具行為EnterPlanModeExitPlanMode,除非子代理的permissionMode是planScheduleWakeupWaitForMcpServersWorkflow
Agent 和 ExitPlanMode,它們遵循第一個篩選器的條件,無論子代理在哪裡執行,背景子代理保持每個 MCP 工具,但只有這些內建工具:Read、Grep、Glob、LSP、Bash、PowerShell、Edit、Write、NotebookEdit、WebFetch、WebSearch、TodoWrite、Skill、ToolSearch、EnterWorktree、ExitWorktree、Monitor、TaskStop、SendMessage 和 Artifact,加上SubagentHandback用於透過它報告的子代理。Claude Code 從背景子代理移除每個其他內建工具,無論繼承或在 tools 欄位中列出,因此相同定義可以在前景和背景中解析為不同的工具。移除報告沒有錯誤,除非它使 tools 列表解析為無。
在 v2.1.280 之前,背景子代理無法使用 LSP。
ListAgents遵循這些篩選器,如任何內建工具:前景子代理在啟用跨工作階段訊息的工作階段中繼承它,背景子代理不保持它。
代理團隊中的隊友另外保持任務工具和 cron 工具:TaskCreate、TaskGet、TaskList、TaskUpdate、CronCreate、CronDelete 和 CronList。
在沒有 Task 工具的工作階段中,Claude Code 也不向子代理提供任務工具,即使子代理執行不同的模型。進程內隊友遵循您的工作階段相同方式,而在其自己的分割窗格中的隊友作為單獨的 Claude Code 程序執行,因此其自己的模型決定。
若要限制工具,使用 tools 欄位作為允許清單或 disallowedTools 欄位作為拒絕清單。此範例使用 tools 僅允許 Read、Grep、Glob 和 Bash。子代理無法編輯檔案、寫入檔案或使用任何 MCP 工具:
disallowedTools 繼承子代理的工具池,除了 Write 和 Edit。子代理保持 Bash、MCP 工具和其池的其餘部分:
disallowedTools 首先應用,然後 tools 針對剩餘池解析。在兩者中列出的工具被移除。
當 tools 列表中沒有內容解析為工具時,例如因為每個條目拼寫錯誤或命名子代理無法使用的工具,Claude Code 通常拒絕啟動子代理,Agent 工具返回命名未解析條目的錯誤;請參閱代理將以零個工具生成以了解訊息以及如何修復每個條目。在 v2.1.208 之前,該子代理以沒有工具啟動,可能返回空或令人困惑的結果。
兩個欄位除了確切工具名稱外還接受 MCP 伺服器級別的模式:mcp__<server> 或 mcp__<server>__* 授予或移除來自命名伺服器的每個工具。在 disallowedTools 中,mcp__* 也移除來自任何伺服器的每個 MCP 工具。此範例移除來自 github MCP 伺服器的每個工具,同時保持來自其他伺服器和其池中內建工具的工具:
disallowedTools 條目(例如 Bash(git push *))仍然從子代理移除整個工具,而不僅僅是匹配的命令。若要保持 Bash 並阻止特定命令,在您的設定中新增Bash 拒絕規則,例如 Bash(git push *) 到 permissions.deny。規則適用於主對話和子代理。
限制可以生成的子代理
當代理使用claude --agent 作為主執行緒執行時,它可以使用 Agent 工具生成子代理。若要限制它可以生成的子代理類型,在 tools 欄位中使用 Agent(agent_type) 語法。
在版本 2.1.63 中,Task 工具被重新命名為 Agent。設定和代理定義中的現有
Task(...) 參考仍然作為別名工作。worker 和 researcher 子代理可以生成。如果代理嘗試生成任何其他類型,請求失敗,代理僅看到其提示中允許的類型。若要在允許所有其他類型時阻止特定代理,改為使用 permissions.deny。
若要允許生成任何子代理而不受限制,使用 Agent 不帶括號:
tools 列表中省略 Agent,代理無法使用 Agent 工具生成任何子代理。
Agent(agent_type) 允許清單語法僅適用於使用 claude --agent 作為主執行緒執行的代理。在子代理定義中,在 tools 中列出 Agent 讓該子代理在深度限制允許時生成自己的子代理,但括號內的任何類型列表被忽略。
將 MCP 伺服器範圍限於子代理
使用mcpServers 欄位給子代理存取在主對話中不可用的 MCP 伺服器。此處定義的內聯伺服器在子代理啟動時連接,受代理檔案資料夾的信任規則約束,並在完成時斷開連接。字串參考共享父工作階段的連接。
mcpServers 欄位適用於代理檔案可以執行的兩個上下文:- 作為子代理,透過 Agent 工具或 @-mention 生成
- 作為主工作階段,使用
--agent或agent設定啟動
.mcp.json 和設定檔的伺服器一起,在代理檔案資料夾的信任規則下。在 /mcp 中,您之前使用過的遠端(HTTP 或 SSE)伺服器可以顯示cached 狀態;Claude Code 在 Claude 首次呼叫其工具之一時連接它。.mcp.json 伺服器條目相同的架構,由伺服器名稱鍵入,並支援 stdio、http、sse 和 ws 類型。
若要將 MCP 伺服器完全保留在主對話之外,並避免其工具描述在那裡消耗上下文,在此處內聯定義它,而不是在 .mcp.json 中。子代理獲得工具;父對話不。
Claude Code 從您專案的 .claude/agents/ 目錄中的代理檔案,或在 --add-dir 目錄的 .claude/agents/ 中載入內聯伺服器,僅在您信任代理檔案來自的資料夾後。在 v2.1.238 之前,Claude Code 載入這些伺服器而不檢查信任。
- 不計算的信任:父資料夾的信任,以及
-p或 SDK 工作階段為設定檔中的 hooks獲得的自動信任 - 直到那時:Claude Code 跳過該代理檔案中的每個內聯伺服器,並將
~/.claude.json的確切projects["<path>"].hasTrustDialogAccepted鍵寫入偵錯日誌 --add-dir目錄:您受信任工作區儲存庫外的目錄需要自己的信任條目,因為其.claude/agents/檔案不繼承您工作區的信任
- 參考您已設定的伺服器的名稱
- 來自
~/.claude/agents/中代理檔案的內聯伺服器,在您使用--agents或 SDKagents選項傳遞的檔案中,或受管設定提供的檔案中
--strict-mcp-config 不篩選您透過 --agents 或 SDK agents 選項內聯傳遞的伺服器,因為那些是明確呼叫者輸入。
權限模式
設定permissionMode 以選擇子代理執行的權限模式。使用模式的設定值,因此手動模式是 default。如果您不設定它,子代理繼承主對話的權限模式。
主對話的權限模式決定 Claude Code 是否使用您設定的值:
- 當主對話在
bypassPermissions、acceptEdits或自動模式中時,子代理在該相同模式中執行,Claude Code 忽略您設定的permissionMode。在自動模式下,分類器使用主對話的阻止和允許規則評估子代理的工具呼叫。當子代理完成時,分類器也在報告被傳遞之前檢查其工作和最終報告,如自動模式如何處理子代理所述。 - 當主對話在
default、dontAsk或plan模式中時,子代理在您設定的權限模式中執行,除了bypassPermissions。宣告bypassPermissions的子代理保持主對話的模式。bypassPermissions例外需要 Claude Code v2.1.267 或更新版本。
permissionMode 接受這些值,以及 manual 作為 default 的別名:
將技能預載入子代理
使用skills 欄位在啟動時將技能內容注入子代理的上下文。這給子代理領域知識,而不需要它在執行期間發現和載入技能。
tools 列表中省略 Skill 或將其新增到 disallowedTools。
您無法預載入設定 disable-model-invocation: true 的技能,因為預載入來自 Claude 可以叫用的相同技能集。這包括捆綁的 /verify 技能:只有您可以執行它,因此它也無法被預載入。
如果列出的技能遺失或被禁用,例如由您組織的原則,Claude Code 跳過它並將警告記錄到偵錯日誌。
這與在子代理中執行技能相反。在子代理中使用
skills 時,子代理控制系統提示並載入技能內容。在技能中使用 context: fork 時,技能內容被注入您指定的代理。在兩種情況下,子代理啟動時沒有您的對話歷史。啟用持久記憶
memory 欄位給子代理一個在對話中存活的持久目錄。子代理使用此目錄隨著時間建立知識,例如程式碼庫模式、偵錯見解和架構決策。
子代理記憶是自動記憶的一部分:如果您關閉自動記憶,使用
autoMemoryEnabled 設定或 CLAUDE_CODE_DISABLE_AUTO_MEMORY,memory 欄位無效,子代理啟動時沒有記憶指示或下面描述的記憶工具存取。
當記憶啟用時:
- 子代理的系統提示包括讀取和寫入記憶目錄的指示。
- 子代理的系統提示也包括記憶目錄中
MEMORY.md的前 200 行或 25KB(以先到者為準),以及如果超過該限制則策劃MEMORY.md的指示。 - Read、Write 和 Edit 工具自動啟用,以便子代理可以管理其記憶檔案。
-
project是推薦的預設範圍。它使子代理知識可透過版本控制共享。 - 要求子代理在開始工作前查詢其記憶:“檢查此 PR,並檢查您的記憶以了解您之前看到的模式。”
- 要求子代理在完成任務後更新其記憶:“既然您已完成,將您學到的內容儲存到您的記憶。” 隨著時間推移,這建立了一個知識庫,使子代理更有效。
-
直接在子代理的 markdown 檔案中包括記憶指示,以便它主動維護自己的知識庫:
使用 hooks 的條件規則
為了更動態地控制工具使用,使用PreToolUse hooks 在執行前驗證操作。當您需要允許工具的某些操作同時阻止其他操作時,這很有用。
此範例建立一個僅允許唯讀資料庫查詢的子代理。PreToolUse hook 在每個 Bash 命令執行前執行 command 中指定的指令碼:
UPDATE 陳述式:指令碼以代碼 2 退出,Claude Code 阻止命令,子代理看到 Blocked: Only SELECT queries are allowed 訊息。
請參閱Hook 輸入以了解完整輸入架構,以及退出代碼以了解退出代碼如何影響行為。在 Windows 上,在 PowerShell 中編寫 hook 指令碼,並在 hook 條目中新增 shell: powershell,如在 PowerShell 中執行 hooks所示。
禁用特定子代理
您可以透過在設定中的deny 陣列中新增子代理來防止 Claude 使用特定子代理。使用格式 Agent(subagent-name),其中 subagent-name 符合子代理的 name 欄位。
--disallowedTools CLI 旗標:
為子代理定義 hooks
子代理可以定義在子代理的生命週期期間執行的 hooks。有兩種方式設定 hooks:- 在子代理的 frontmatter 中:定義僅在該子代理活動時執行的 hooks
- 在
settings.json中:定義也在子代理內觸發的工作階段範圍 hooks。工具事件(例如PreToolUse和PostToolUse)對子代理的工具呼叫觸發,與它們在主對話中的方式相同,SubagentStart和SubagentStop在子代理啟動或完成時觸發
settings.json 中的 PreToolUse hook 也在子代理使用的每個工具之前執行。
子代理 frontmatter 中的 Hooks
直接在子代理的 markdown 檔案中定義 hooks。這些 hooks 僅在該特定子代理活動時執行,並在完成時清理。Frontmatter hooks 在代理透過 Agent 工具或 @-mention 生成為子代理時觸發,以及當代理透過
--agent 或 agent 設定作為主工作階段執行時。在主工作階段情況下,它們與 settings.json 中定義的任何 hooks 一起執行。~/.claude/agents/ 中使用者級子代理的 Hooks 和來自您使用 --agents 傳遞的定義的 Hooks 無需此步驟即可執行。如果您從受信任工作區儲存庫外使用 --add-dir 新增資料夾,單獨信任該資料夾:其 .claude/agents/ hooks 不繼承工作區的授予。
直到您信任資料夾,子代理仍然執行,但 Claude Code 跳過其 frontmatter hooks 並將錯誤記錄到偵錯日誌,解釋如何信任資料夾。這是比設定檔中 hooks 的規則更嚴格的規則:信任父資料夾不夠,-p 工作階段不計為受信任。在您信任資料夾前執行的內容比較兩者。在 v2.1.218 之前,frontmatter hooks 可以從您未信任的資料夾執行,包括在非互動工作階段中。
所有hook 事件都被支援。子代理最常見的事件是:
此範例使用
PreToolUse hook 驗證 Bash 命令,並使用 PostToolUse 在檔案編輯後執行 linter:
Stop hooks 自動轉換為 SubagentStop 事件。
子代理事件的專案級 Hooks
在settings.json 中設定 hooks,以回應主工作階段中的子代理生命週期事件。
兩個事件都支援 matchers 以按名稱針對特定代理類型。matcher 值是專案級和使用者級子代理的代理 frontmatter
name,或 plugin 子代理的 plugin 範圍識別碼,例如 my-plugin:db-agent。範圍名稱包含冒號,因此它被評估為未錨定的正規表達式;使用 ^ 和 $ 錨定它,如 ^my-plugin:db-agent$,以僅符合該代理。
此範例僅在 db-agent 子代理啟動時執行設定指令碼,並在任何子代理停止時執行清理指令碼:
使用 subagents
理解自動委派
Claude 根據您請求中的任務描述、subagent 配置中的description 欄位和目前上下文自動委派任務。為了鼓勵主動委派,在 subagent 的 description 欄位中包括「use proactively」之類的短語。
保持描述簡潔:當您的 subagents 的合併描述超過 15,000 個 token 限制 時,Claude Code 會顯示啟動警告,但仍會載入每個 subagent。
如果 subagent 隨附於 plugin,您可以測量 Claude 在現實提示中委派給它的可靠性,而不是一次檢查一個:claude plugin eval 會在有和沒有 plugin 的情況下執行每個提示,並對結果進行評分。
明確呼叫 subagents
當自動委派不夠時,您可以自己要求 subagent。三種模式從一次性建議升級到工作階段範圍的預設:- 自然語言:在提示中命名 subagent;Claude 決定是否委派
- @-mention:保證 subagent 為一個任務執行
- 工作階段範圍:整個工作階段使用該 subagent 的系統提示、工具限制和模型,透過
--agent標誌或agent設定
@ 並從預輸入中選擇 subagent,就像您 @-mention 檔案一樣。這確保該特定 subagent 執行,而不是將選擇留給 Claude:
my-plugin:code-reviewer 或 my-plugin:review:security(當 plugin 將 agents 組織到子資料夾 時)。名為背景 subagents 目前在工作階段中執行也出現在預輸入中,在名稱旁邊顯示其狀態。
您也可以手動輸入提及而不使用選擇器:@agent-<name> 用於本地 subagents,或 @agent- 後跟外掛程式 subagents 的限定名稱,例如 @agent-my-plugin:code-reviewer。當您輸入此形式時,預輸入會顯示檔案符合而不是代理。代理提及在您提交時仍會解析。
將整個工作階段作為 subagent 執行。 傳遞 --agent <name> 以啟動一個工作階段,其中主執行緒本身採用該 subagent 的系統提示、工具限制和模型:
--system-prompt 一樣。CLAUDE.md 檔案和專案記憶仍然透過正常訊息流載入,即使代理的定義設定 omitClaudeMd。
代理名稱在啟動標題中顯示為 @<name>,以便您可以確認它是活動的。
這適用於內建和自訂 subagents,選擇在您恢復工作階段時持續:Claude Code 會恢復代理的工具限制和模型以及對話。如果代理在您恢復時不再存在,工作階段會繼續使用預設工具,並顯示 警告命名代理。對於任一情況下的系統提示,請參閱 已恢復對話中的系統提示標誌。
對於外掛程式提供的 subagent,您可以只傳遞代理名稱,Claude Code 會找到它:
agents/ 目錄的子資料夾中,請在限定名稱中包括子資料夾,例如 claude --agent my-plugin:review:security。
若要使其成為專案中每個工作階段的預設值,請在 .claude/settings.json 中設定 agent:
在前景或背景中執行 subagents
Subagents 可以在前景或背景中執行:- 前景 subagents 阻止主要對話直到完成。權限提示會在出現時傳遞給您。
- 背景 subagents 在您繼續工作時並行執行。當背景 subagent 到達需要權限的工具呼叫時,Claude Code 會在您的主要工作階段中出現提示,並命名要求的 subagent。批准以讓 subagent 繼續,或按 Esc 拒絕該單一工具呼叫而不停止 subagent。
- 如果進行中的 agent team 隊友產生了 subagent,Claude Code 會在前景中執行它。Claude Code 會拒絕並出現錯誤以產生隊友的 subagent,當隊友的定義設定
background: true時。當 fork 模式 關閉且您未 關閉背景任務 時,Claude Code 也會在隊友設定run_in_background: true時拒絕並出現錯誤。 - 如果您將
CLAUDE_CODE_DISABLE_BACKGROUND_TASKS設定為1,Claude Code 會在前景中執行 subagent,在每種工作階段中以及無論 fork 模式是否開啟。 - 當 fork 模式 開啟時(在互動式工作階段中預設開啟),Claude Code 會在背景中執行 subagent,fork 和非 fork subagents 都是如此,Claude 無法要求前景。
- 當 fork 模式關閉時,Claude 預設在背景中執行 subagent,在需要結果才能繼續時在前景中執行。Fork 模式在 非互動模式 中使用
-p和在 Agent SDK 中關閉,除非您開啟它。若要在 Claude 需要結果時將特定 subagent 保持在背景中,請將其 frontmatterbackground欄位設定為true。
context: fork 的技能,Claude Code 會遵循 在 subagent 中執行技能 中的規則,無論 fork 模式是否開啟。
背景 subagents 執行時使用的 內建工具集 比前景 subagents 更小,除了對話 forks 和 已恢復 的前景 subagents。
背景 subagents 在您的主要工作階段中出現每個權限提示。當您使用持續超過該單一工具呼叫的選擇(例如持續整個工作階段的授予)回答其中一個提示時,Claude Code 會將您的答案應用於整個工作階段,包括您的主要對話。
背景 subagent 可以留下背景 Bash 或 PowerShell 命令 在其回合結束後執行。當該命令結束時,Claude Code 會向 subagent 發送通知。
背景 subagent 的結果在稍後的回合中作為完成通知到達 Claude。Claude 在報告 subagent 的結果之前等待該通知,如果您先詢問進度,它會報告 subagent 仍在執行。在 v2.1.211 之前,Claude 有時會報告尚未完成的背景 subagent 的結果。
您也可以自己引導這個:
- 當 fork 模式關閉時,要求 Claude 在背景或前景中執行任務
- 按 Ctrl+B 將執行中的任務放在背景中
- 當 subagent 成功完成時,Claude Code 會立即移除其列,除了在 螢幕閱讀器模式 中,在頁腳中顯示
/tasks to see subagents30 秒。在這 30 秒內,執行/tasks並在 subagent 上按Enter以開啟其文字。在 v2.1.232 之前,Claude Code 在 subagent 完成後保持列 30 秒,與失敗的相同,並顯示無頁腳提示。 - 當 subagent 失敗或您停止它時,Claude Code 會保持其列 30 秒。若要更快清除列,請選擇它並按
x。
/tasks 中,標記為完成並排序在執行中的工作下方,與頁腳提示相同的 30 秒。其詳細檢視在 subagent 完成時保持開啟。失敗或您停止的 Subagents 會離開列表。在 v2.1.208 之前,完成的 subagent 在完成時立即離開列表,其詳細檢視關閉。
Subagent 名稱
Claude 可以透過在 Agent 工具呼叫上傳遞name 參數來給 subagent 命名,並可能自行執行此操作,而不先詢問您。該名稱使 subagent 可定址:Claude 可以在完成後 按名稱訊息或恢復它。
在啟用 agent teams 的互動式工作階段中,Claude 從主要對話產生的具有 name 的 subagent 會作為隊友啟動,除非呼叫是 fork 或在呼叫本身上傳遞 isolation。subagent 的 frontmatter 中的 isolation 值不會阻止它,隊友然後在主要工作階段的工作目錄中執行。請參閱 Claude 如何啟動 agent teams。
Subagents 中的 API 錯誤
當某些東西 在中途切斷 subagent 的回應,且部分回應包含文字但沒有工具呼叫時,Claude Code 會提示 subagent 繼續而不是結束執行。這也發生在互動式工作階段中。執行僅在這些延續用完時才在錯誤上結束。 自 v2.1.199 起,subagent 的執行因 API 錯誤(例如使用限制或重複的伺服器錯誤)而結束時,會將該失敗報告回 Claude,而不是將錯誤文字作為 subagent 的發現返回。Claude 接收的內容取決於 subagent 執行的位置:- 前景:如果速率限制、過載或伺服器錯誤切斷已經產生文字輸出的 subagent,Agent 工具會返回該部分輸出,並附註 subagent 被切斷且未完成其任務。未產生任何內容或其唯一輸出為工具呼叫的 subagent 會失敗,並顯示
Agent terminated early due to an API error,後跟錯誤詳細資訊。在 v2.1.199 中,切斷工具呼叫專用形狀的速率限制、過載或伺服器錯誤返回了只包含切斷注記的空部分結果。 - 背景:subagent 被標記為失敗,Claude 在其結束時接收的訊息命名 API 錯誤並包括 subagent 的最後輸出,所以部分工作不會丟失。
Subagent 輸出掃描
Claude Code 在 Claude 讀取 subagent 的最終報告之前掃描它。Subagent 可能已讀取您從未審查過的檔案、網頁或命令輸出,這些來源的文字可能包含針對主要對話的指令。掃描永遠不會移除或改寫任何內容;它會進行您可能在報告中注意到的兩種更改:- 反斜線插入:掃描會在模仿 Claude Code 自己輸出的文字中插入反斜線,例如
<system-reminder>標籤或以Human:或Assistant:開頭的行,以便模仿讀作普通文字而不是被誤認為是對話的一部分。 - 標記行:當報告模仿
<system-reminder>之類的標籤或提及bypassPermissions或--dangerously-skip-permissions之類的權限設定時,掃描會前置以[harness: subagent output matched instruction-shaped pattern(s):開頭的行。權限設定提及會獲得標記行,但文字本身保持原樣。
Subagent 輸出掃描需要 Claude Code v2.1.210 或更新版本。
常見模式
隔離高容量操作
subagents 最有效的用途之一是隔離產生大量輸出的操作。執行測試、獲取文件或處理日誌檔案可能會消耗大量上下文。透過將這些委派給 subagent,詳細輸出保留在 subagent 的上下文中,而只有相關摘要返回到主要對話。執行並行研究
對於獨立調查,產生多個 subagents 以同時工作:鏈接 subagents
對於多步驟工作流程,要求 Claude 按順序使用 subagents。每個 subagent 完成其任務並將結果返回給 Claude,然後將相關上下文傳遞給下一個 subagent。在 subagents 和主要對話之間選擇
在以下情況下使用 主要對話:- 任務需要頻繁的來回或反覆改進
- 多個階段共享重要上下文,例如規劃、實現和測試
- 您正在進行快速、有針對性的更改
- 延遲很重要。不是 fork 的 subagent 從頭開始,可能需要時間收集上下文
- 任務產生您不需要在主要上下文中的詳細輸出
- 您想強制執行特定的工具限制或權限
- 工作是自包含的,可以返回摘要
/btw 而不是 subagent。它看到您的完整上下文,但沒有工具存取,答案不會新增到歷史記錄。
讓 subagents 產生自己的 subagents
預設情況下,subagent 可以產生自己的 subagents,最多在主要對話下方三層。在深度限制處,Claude Code 會從除 fork 外的每個 subagent 中扣留Agent 工具,所以限制處的 subagent 會自行執行委派的工作並返回一個摘要。fork 在限制處保持其繼承的工具列表中的 Agent,但工具會返回錯誤而不是產生。
嵌套 subagents 適合委派的任務本身分裂成並行子任務,例如審查者 subagent 為每個發現分派驗證者。在互動式工作階段中,只有頂級 subagent 的摘要返回給您,中間輸出保留在 subagent 的上下文中,而不會到達主要對話:產生背景 subagents 的 subagent 在完成之前等待其結果。在 非互動模式 和 Agent SDK 中,啟動 subagent 不等待,所以在其啟動器結束後完成的嵌套背景 subagent 會報告到您的主要對話。
若要改變限制,請將 CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH 設定為您想要在主要對話下方的 subagent 層數。例如,settings.json 中的此項目將嵌套限制為兩層:
1 以關閉嵌套。
嵌套 subagent 的配置方式與頂級 subagent 相同,並從相同的 scopes 解析。若要防止一個 subagent 在嵌套開啟時產生,例如應保持唯讀的審查者,請從其 tools 列表中省略 Agent 或將其新增到 disallowedTools。
Claude Code 在提示輸入下方的 subagent 面板中將嵌套 subagents 顯示為樹,並用 (+N) 計數標記面板中仍有後代的每一列。打開一列以查看該 subagent 的同級和直接子代,以及返回到 main 的路徑。
較早的版本使用了不同的預設值:
- v2.1.172 至 v2.1.216:subagents 預設可以嵌套,最多五層深,限制無法改變。
- v2.1.217 至 v2.1.218:限制預設為一,所以 subagent 無法產生自己的,除非您提高它;v2.1.219 將預設提高到三。
並行 subagent 限制
兩個限制控制 subagent 使用,每個都有自己的變數:這個限制阻止 Claude 在太多執行時產生更多 subagents,深度限制 限制 subagents 嵌套的深度。對於 Claude 在工作階段中可以產生的 subagents 總數沒有限制。 預設情況下,當 20 個 subagents 在工作階段中執行時,使用 Agent 工具產生另一個會失敗,並顯示Concurrent subagent limit reached,錯誤告訴 Claude 不要重試。當執行計數降至限制以下時,產生再次成功。若要改變限制,請將 CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS 設定為任何正整數。啟用 ultracode 的工作階段被豁免:限制在那裡不被強制執行。需要 Claude Code v2.1.217 或更新版本。
限制僅阻止 Claude 使用 Agent 工具產生的 subagents,但其他執行佔用相同的插槽:
- 您使用
/subtask啟動的進行中 fork 在執行時佔用一個插槽,永遠不會被限制阻止。 - 恢復已完成的 subagent 會佔用一個新插槽而不檢查限制,所以恢復可以將執行計數推過限制。
管理 subagent 上下文
啟動時載入的內容
每個 subagent 都以新鮮、隔離的上下文視窗開始。它看不到您的對話歷史記錄、您已經呼叫的技能或 Claude 已經讀取的檔案。Claude 撰寫一條委派訊息來總結任務,subagent 從那裡開始工作。例外是 fork,它繼承父對話而不是從頭開始。 非 fork subagent 的初始上下文包含:- 系統提示:代理自己的提示加上 Claude Code 附加的環境詳細資訊,而不是 Claude Code 系統提示。自訂 subagents 在 markdown 正文 或
prompt欄位中定義它們。內建代理有預定義的提示。 - 任務訊息:Claude 在交接工作時編寫的委派提示。
- CLAUDE.md 檔案:主要對話載入的 CLAUDE.md 層級 的每個級別,包括
~/.claude/CLAUDE.md、專案規則、CLAUDE.local.md、受管理的政策檔案和任何AGENTS.md檔案 作為專案指令載入。內建的 Explore 和 Plan 代理跳過這個。subagent 的定義設定omitClaudeMd時,只載入受管理的政策檔案,或當定義來自 受管理設定 時完全不載入。 - Git 狀態:在 subagent 啟動時拍攝的快照。當工作目錄不是 Git 儲存庫或當
includeGitInstructions為false時不存在。Explore 和 Plan 無論如何都跳過它。 - 預載入的技能:代理的
skills欄位 中命名的任何技能的完整內容。內建代理不預載入技能。 - 同級名單:系統提醒,列出
main和工作階段中的每個其他命名代理,每個都是SendMessage的有效to值。需要 Claude Code v2.1.206 或更新版本。名單僅在 subagent 的工具包括SendMessage且至少有一個其他代理有名稱時出現,無論 Claude 在產生時命名它還是它作為 agent teams 隊友執行。它是在 subagent 啟動時拍攝的快照,所以稍後命名的代理不會出現。
omitClaudeMd: true 或 --agents JSON。
主要對話仍然有您的完整 CLAUDE.md 當它讀取這些 subagents 的結果時,所以大多數規則不需要到達 subagent 本身。如果規則必須,例如「忽略 vendor/ 目錄」,在您委派時給 Claude 的提示中重新陳述它。
您無法改變哪些 subagents 接收 git 狀態。只有 Explore 和 Plan 跳過它。
某些主要對話狀態永遠不會到達非 fork subagent:
- 輸出風格:subagent 執行自己的系統提示,所以您的 輸出風格 不會塑造其回應,除了在 fork 中。
- 自動記憶:主要對話的 自動記憶 不會被載入。若要給 subagent 自己的持久記憶,請使用
memory欄位。 - 上下文視窗大小:subagent 的上下文視窗由其自己的模型調整大小,而不是父級的。委派給具有較小視窗的模型會給該 subagent 較小的視窗。
恢復 subagents
每個 subagent 呼叫都會建立一個新實例而不是繼續較早的實例。若要繼續現有 subagent 的工作而不是重新開始,請要求 Claude 恢復它。 恢復的 subagents 保留其完整對話歷史記錄,包括所有先前的工具呼叫、結果和推理。如果 subagent 產生了 自己的背景 subagents,該歷史記錄包括它執行時它們傳遞的結果。Subagent 從停止的地方精確繼續,而不是從頭開始。- 當 subagent 完成時,Claude 接收其代理 ID。
- 內建的 Explore 和 Plan 代理是一次性的,不返回代理 ID,所以 Claude 無法恢復它們。當您需要繼續工作時,請使用
general-purpose或自訂 subagent。 - 當 subagent 在其
maxTurns限制處停止時,Claude Code 會將返回的輸出標記為部分。對於返回代理 ID 的 subagents,Claude Code 也會在結果中注意 Claude 可以訊息 subagent 以從停止的地方繼續。
SendMessage 工具,將代理的 ID 或名稱作為 to 欄位來恢復它。SendMessage 不需要啟用 agent teams;只有結構化的團隊協議訊息,例如 shutdown_request 和 plan_approval_response,才需要啟用。除了 subagents 和隊友,在啟用跨工作階段訊息的工作階段中,Claude 可以使用相同的工具訊息 您的其他 Claude Code 工作階段,在此機器上或 超越它。
若要恢復 subagent,請要求 Claude 繼續先前的工作:
SendMessage 工具向已完成的 subagent 發送訊息時,subagent 在背景中恢復,無需新的 Agent 呼叫。同樣適用於 Claude 使用 TaskStop 工具停止的 subagent,一旦其停止的執行已退出。恢復的執行保持 subagent 首次執行時的工具集,並可以繼續讀取 原始執行預熱的提示快取。
具有 SendMessage 工具的 subagent 也可以發送該訊息。在互動式工作階段中,恢復的代理然後報告回恢復它的 subagent,而不是您的主要對話。該 subagent 在完成自己的工作之前等待結果。當 subagent 訊息它報告給的代理(例如自己的啟動器)時,Claude Code 會恢復該代理而不重定向其結果。
您自己停止的 subagent,使用 /tasks 中的 x 或 SDK stop_task 請求,不會自動恢復。如果 Claude 向它發送訊息,訊息會被拒絕,Claude 會被告知代理已被取消。
當 該 subagent 的列仍在 subagent 面板中 時,輸入到其文字中以自己恢復它。之後,來自 Claude 的訊息可以再次自動恢復它。
恢復在相同 ID 下啟動代理的新執行,所以已經失敗或完成的 subagent 在任務列表和 Agent SDK 的任務事件中再次顯示為執行中。在 v2.1.205 之前,它在恢復的執行工作時保持顯示其較早的失敗或完成狀態。
自 v2.1.199 起,SendMessage 檢查名稱是否仍然指向它在對話中較早時到達的同一代理。如果較新的代理已取得該名稱,例如重新產生的背景代理重複使用了它,Claude Code 會拒絕發送,而不是將其傳遞給錯誤的代理,錯誤會報告該名稱現在到達的代理,以便 Claude 可以重新定位。若要在較早的代理仍在執行時到達它,Claude 會透過其產生結果中的代理 ID 來定址它。檢查的範圍是目前對話,並在 /clear 時重置。
自 v2.1.198 起,subagent 將來自啟動它的代理的訊息視為正常任務方向,包括中途任務課程更正,並在其自己的權限設定內對其進行操作。無論誰發送訊息,兩個限制仍然成立:來自任何代理的任何訊息都不計為您對待處理權限提示的批准,任何代理訊息都無法改變 subagent 的權限設定、CLAUDE.md 或配置。只有權限系統或您自己的訊息可以授予批准。
您也可以要求 Claude 提供代理 ID,如果您想明確參考它,或在 ~/.claude/projects/{project}/{sessionId}/subagents/ 的文字檔案中找到 ID。每個文字都儲存為 agent-{agentId}.jsonl。
Subagent 文字獨立於主要對話持續存在:
- 主要對話壓縮:當主要對話壓縮時,subagent 文字不受影響。它們儲存在單獨的檔案中。
- 工作階段持續性:Subagent 文字在其工作階段內持續存在。您可以透過恢復相同工作階段在重新啟動 Claude Code 後 恢復 subagent。
- 自動清理:Claude Code 在
cleanupPeriodDays保留期後刪除 subagent 文字,預設為 30 天,遵循 保留掃描規則。
自動壓縮
Subagents 支援使用與主要對話相同的邏輯進行自動壓縮。壓縮在相同條件下觸發,CLAUDE_AUTOCOMPACT_PCT_OVERRIDE 也適用於 subagents。請參閱 environment variables 以了解何時覆蓋生效。
壓縮事件記錄在 subagent 文字檔案中:
preTokens 值顯示壓縮發生前使用了多少個 tokens。
Fork 目前的對話
Fork 是一個 subagent,它繼承到目前為止的整個對話,而不是從頭開始。這會放棄 subagents 否則提供的輸入隔離:fork 看到與主工作階段相同的系統提示、工具、模型和訊息歷史記錄,因此您可以將側面任務交給它,而無需重新解釋情況。Fork 自己的工具呼叫仍然保持在您的對話之外,只有其最終結果返回,因此您的主要上下文視窗保持乾淨。當任何其他 subagent 需要太多背景才能有用時,或當您想從相同的起點並行嘗試多種方法時,使用 fork。
Claude 透過 Agent 工具要求
fork subagent 類型來啟動 fork。您可以透過fork 模式控制是否可以啟動,預設在互動式工作階段中啟用。
您可以使用 /subtask 後跟任務自己啟動 fork,無論 fork 模式是否啟用。在 v2.1.161 到 v2.1.211 版本中,命令是 /fork。Claude Code 從任務的前幾個詞命名 fork。以下範例 forks 對話以在您在主工作階段中繼續實現時草擬測試案例:
觀察和引導執行中的 forks
執行中的 forks 出現在提示輸入下方的面板中,主工作階段有一行,每個 fork 有一行。 當 fork 成功完成時,Claude Code 會移除其行。Claude Code 會保留失敗或您停止的 fork 的行 30 秒,與任何其他背景 subagent 相同。在 v2.1.232 之前,Claude Code 也會將完成的 fork 的行保留 30 秒。 使用這些鍵與面板互動:
開啟 fork 或 subagent 的逐字稿時,後續訊息和 skills 會傳送到該 agent,內建命令則會傳送到您的主要對話,並具有以下保護措施:
/compact、/clear和/rewind會作用於主要對話,因此從此檢視執行其中任一命令之前,Claude Code 會要求您確認。/model和/fast會設定主要對話的模型和快速模式,而不是所檢視 agent 的,因此無法從此檢視執行。系統會顯示通知說明原因。
Ctrl+Enter 或 Ctrl+X Ctrl+S 傳送。該 agent 正在等待的任何可移至背景的 shell 命令或 subagent 都會移至背景並繼續執行。當 agent 正在撰寫回應,或正在等待無法移至背景的工作時,它會繼續進行,並在該工作完成後讀取您的訊息。需要 Claude Code v2.1.286 或更新版本。
Forks 與其他 subagents 的區別
Fork 繼承主工作階段在產生時擁有的所有內容。任何其他 subagent 從其定義開始新鮮。
因為 fork 的系統提示和工具定義與父級相同,其第一個請求重複使用父級的 prompt cache。這使得 forking 比為需要相同上下文的任務產生新 subagent 更便宜。
當 Claude 透過 Agent 工具產生 fork 時,它可以傳遞
isolation: "worktree",以便 fork 的檔案編輯被寫入單獨的 git worktree 而不是您的簽出。Fork 無法產生進一步的 forks。
開啟或關閉 fork 模式
Claude Code 在互動式工作階段中預設開啟 fork 模式,在非互動模式中預設關閉,使用-p 和在 Agent SDK 中。互動式預設需要 Claude Code v2.1.232 或更新版本。在較早版本中,設定 CLAUDE_CODE_FORK_SUBAGENT 為 1 以開啟 fork 模式。
您可以從 Claude Code 如何處理 Agent 工具來判斷 fork 模式是否開啟:
- Claude 可以透過要求
forksubagent 類型來產生 fork。當 Claude 不要求類型時,如果工作階段仍有該類型,它會取得通用 subagent。從定義產生的 subagents,例如 Explore,照常工作。 - Claude Code 在背景中執行 Claude 產生的 subagents,forks 和非 fork subagents 都是如此,除了保持在前景的情況。Claude Code 也會移除 Agent 工具的
run_in_background參數,因此 Claude 無法要求前景。
CLAUDE_CODE_FORK_SUBAGENT 環境變數以覆蓋預設值:
1在非互動模式和 Agent SDK 中也開啟 fork 模式0在每種工作階段中關閉 fork 模式
Agent(fork) 規則拒絕 fork subagent 類型。Claude Code 仍在背景中執行 Claude 產生的 subagents,除了相同的保持在前景的情況。
範例 subagents
這些範例展示了建立 subagents 的有效模式。將它們用作起點,或使用 Claude 生成自訂版本。程式碼審查者
一個唯讀 subagent,審查程式碼而不修改它。此範例展示如何設計一個具有有限工具存取(無 Edit 和 Write)和詳細提示的專注 subagent,該提示明確指定要查找的內容以及如何格式化輸出。除錯器
一個可以分析和修復問題的 subagent。與程式碼審查者不同,這個包括 Edit,因為修復錯誤需要修改程式碼。提示提供了從診斷到驗證的清晰工作流程。資料科學家
一個用於資料分析工作的特定領域 subagent。此範例展示如何為典型編碼任務之外的專門工作流程建立 subagents。它明確設定model: sonnet 以進行更有能力的分析。
資料庫查詢驗證器
一個允許 Bash 存取但驗證命令以僅允許唯讀 SQL 查詢的 subagent。此範例展示如何在需要比tools 欄位提供的更精細控制時使用 PreToolUse hooks。
command 欄位相符:
shell: powershell 新增至 hook 項目。請參閱 在 PowerShell 中執行 hooks。
Hook 透過 stdin 接收 JSON,Bash 命令在 tool_input.command 中。退出代碼 2 阻止操作並將錯誤訊息反饋給 Claude。請參閱 Hooks 以了解退出代碼和 Hook input 以了解完整的輸入架構。
系統提示告訴 subagent 拒絕寫入請求,因此 hook 是一個後備:如果 subagent 嘗試寫入,Claude Code 會阻止命令,subagent 會看到 Blocked: Write operations not allowed. Use SELECT queries only. 訊息。
後續步驟
現在您理解了 subagents,請探索這些相關功能:- 使用外掛程式分發 subagents 以跨團隊或專案共享 subagents
- 以程式方式執行 Claude Code 使用 Agent SDK 進行 CI/CD 和自動化
- 使用 MCP 伺服器 為 subagents 提供對外部工具和資料的存取