examhub .cc 用最有效率的方法,考取最有價值的認證
Vol. I
本篇導覽 約 27 分鐘

Subagent 呼叫、Context 傳遞與 Spawning

5,400 字 · 約 27 分鐘閱讀

Subagent 呼叫、context passing 與 spawning 是 Claude Certified Architect — Foundations(CCA-F)考試中架構密度最高的任務說明。任務 1.3 位於 Domain 1(Agentic 架構與 Orchestration,佔比 27%,全場最重)的核心,直接決定考生能否設計「多 agent 研究系統」和「開發者生產力與 Claude」兩大情境——這兩個情境最直接地考驗你對一個 agent 如何 spawn 另一個 agent、哪些 context 會跨越這條邊界傳遞,以及子代繼承或被拒用哪些工具的理解。

這份學習筆記以 CCA-F 要求的深度完整說明 subagent 呼叫、context passing 與 spawning:Task tool 作為具體的 spawning 機制、宣告 subagent 的 AgentDefinition 結構、限定子代可用工具範圍的 allowedTools 白名單、subagent 不會自動繼承 coordinator context 的硬規則、用於分岔探索的 fork_session 語義、單一 coordinator 回應中的並行 Task 呼叫,以及讓多 agent 系統可除錯的結構化元資料分離模式。每個章節都錨定在 Anthropic 官方文件,以及考試所引用的六大情境叢集。最後的白話文類比將所有內容整合成在 120 分鐘、60 題的實際考試壓力下可快速提取的記憶框架。

什麼是 Subagent 呼叫?Spawn 子代 Agent 的機制

Subagent 呼叫、context passing 與 spawning 涵蓋三個截然不同卻緊密耦合的責任。「呼叫(Invocation)」是要求一個正在執行的 agent 將一段工作移交給新的 agent 實例的動作。「context passing」是決定哪些資訊隨著這次移交一起傳遞的紀律。「spawning」是在執行期建立子代 agent——擁有其自身獨立的對話歷史、自身的工具白名單、自身的迴圈——的事件。

在 Claude Agent SDK 中,主要的呼叫介面是 Task tool。當 coordinator agent 呼叫 Task 時,SDK 會以 coordinator 提供的 prompt 實例化一個全新的 agent session,並連結到特定的 AgentDefinition(宣告 subagent 的系統提示、工具白名單,以及可選的 model 覆寫),然後執行其自身獨立的 agentic loop,直到產出最終結果。該結果以 tool_result 訊息的形式回傳到 coordinator 的迴圈中,coordinator 隨即以這個結果為輸入繼續執行。

這個 subagent 呼叫、context passing 與 spawning 模型和單純的 prompt chain 有本質上的差異:coordinator 並不是簡單地拼接一條後續 user 訊息並繼續自己的對話,而是將執行 分岔 到由子代 agent 擁有的獨立 context window 中。子代所知道的一切,都必須透過 Task prompt 或預先登錄的 AgentDefinition 系統提示來明確告知。

Task tool 是 Claude Agent SDK 和 Claude Code 中內建的 spawning 機制,可在正在執行的 coordinator agent 內部建立新的 subagent 實例。呼叫 Task tool 需提供 subagent_type(指向一個已登錄的 AgentDefinition)、description(subagent 應執行的工作說明),以及 prompt(完整的指令內容)。SDK 在隔離的 context 中將 subagent 的 agentic loop 執行至完成,並將 subagent 的最終答案以 tool_result 訊息的形式回傳給 coordinator。Task tool 必須 出現在 coordinator 的 allowedTools 清單中,spawning 才能成立。 Source ↗

為什麼架構師需要這套詞彙

社群的考試通過報告與 CCA-F 考試指南,都將「subagent context 隔離」列為前三大常見誤解。假設 context 沿著階層向下流動——就像語言執行環境中的堆疊框架繼承變數那樣——的考生,會設計出有缺陷的多 agent 系統,並在「subagent 啟動時知道什麼?」的情境題上選錯答案。答案是:只有 AgentDefinition 系統提示所宣告的內容,加上 Task tool 的 prompt 參數所明確傳入的內容。僅此而已。

Task Tool 作為主要的 Spawning 機制

Task tool 是將 coordinator-subagent 架構從圖表變成執行時期現實的具體動詞。CCA-F 考生必須認識它作為 spawning 機制的角色——不是通用工具,不是自訂的 MCP 工具——並理解這個角色的含義。

Task Tool 呼叫的結構

一個來自 coordinator 的典型 Task tool 呼叫包含三個關鍵參數:

  • subagent_type — 一個字串識別碼,對應到一個已登錄的 AgentDefinition。在 Claude Code agent teams 中常見的值包括 researchercriticplannercoder,或任何登錄在 .claude/agents/ 下的自訂名稱。
  • description — 簡短、易讀的標籤,用於日誌、追蹤和介面顯示。不會被 subagent 本身讀取。
  • prompt — subagent 將作為開頭 user 訊息接收的完整指令內容。subagent 在當前任務中需要知道的所有事情,都必須在這裡或 subagent 的系統提示中提供。

在底層,SDK 接收這三個輸入後,以對應的 AgentDefinition 建構一個全新的 session,將 prompt 作為第一條 user 訊息送入,並執行子代的 agentic loop。當子代到達 stop_reason: end_turn 時,其最終訊息內容會被捕捉,並以 coordinator 訊息歷史中 Task 呼叫的 tool_result 形式回傳。

Task 必須被明確允許

Task tool 本身是 SDK 提供的工具,與 Read、Write、Edit、Bash、Grep 以及自訂 MCP 工具位於同一個 allowedTools 層面。若 AgentDefinition 的 allowedTools 清單中未包含 "Task",該 agent 就完全無法 spawn subagent。這是一個常見的考試陷阱:考生以為 coordinator 天生具有 subagent spawning 的能力,但實際上 spawning 能力需要透過與其他工具完全相同的明確白名單機制來授予。

coordinator 只有在自身的 allowedTools 清單中包含 Task tool 時,才能 spawn subagent。若從 coordinator 的 allowedTools 中省略 "Task",coordinator 就會退化為單一 agent 系統,可以呼叫 Read、Write、Grep 等工具,但無法將工作委派給子代 agent。這是刻意設計的——它讓 spawning 能力與其他所有破壞性或擴展性的行動受到相同的權限層面管控。 Source ↗

Task Tool vs MCP Tools vs 內建檔案工具

三種截然不同的工具類別可以同時出現在單一 agent 的 allowedTools 中,CCA-F 會測試你區分它們的能力:

  • Task tool — spawn subagent;由 Agent SDK 執行期提供。非使用者撰寫。
  • 內建工具 — Read、Write、Edit、Bash、Grep、Glob。由 Claude Code 提供;操作本地工作區。
  • MCP 工具 — 透過 Model Context Protocol 伺服器暴露的使用者登錄工具。操作伺服器所包裝的外部能力(GitHub、Slack、資料庫等)。

Task tool 不是自訂的 MCP 工具,無法由 MCP 伺服器重新實作,也無法重新命名。任何把 Task 與「你自己撰寫的工具」混為一談的答案選項都是錯的。

AgentDefinition — Subagent 的宣告式結構

每個 Task tool 能夠 spawn 的 subagent,都必須宣告為一個 AgentDefinition。這是 CCA-F 測試的第二個核心產物。考試要求認識 AgentDefinition 的欄位,以及能夠推論這些欄位如何塑造 subagent 的行為。

AgentDefinition 的欄位

Agent SDK 中的 AgentDefinition,或作為 Claude Code subagent 檔案(.claude/agents/<name>.md)時,包含以下欄位:

  • description — 描述 subagent 用途的自然語言說明。Claude 使用這個 description 來決定,在多個 subagent 已登錄的情況下,是否將某個 Task 呼叫路由到這個特定的 subagent type。把 description 當作工具描述看待:它是路由訊號。
  • 系統提示(system prompt) — subagent 完整的行為憲章。宣告聲調、限制、偏好的輸出格式、禁止的動作,以及無論個別 Task 呼叫傳入什麼,subagent 都需要具備的領域知識。
  • tools(allowedTools) — subagent 可呼叫工具的明確白名單。若父代有 Bash 但子代的 AgentDefinition 未列出 Bash,子代就無法執行 Bash。預設為限制性的。
  • model — 可選的 model 覆寫。低成本的 subagent 任務(大量摘要)可在較小的 model 上執行,而 coordinator 則使用較大的 model。省略時,subagent 繼承 session 的預設 model。

description 對路由的重要性

當 coordinator 持有多個已登錄的 subagent type(researchercriticsummarizer),coordinator Claude 會根據自然語言 description 決定要在 Task tool 中傳入哪個 subagent_type。描述模糊或重疊的 AgentDefinition 會產生不確定的路由,就像模糊的工具描述會產生不確定的工具選擇一樣。這是撰寫 AgentDefinition 時最常見的錯誤:寫 description: "helpful agent",而不是 description: "從 arXiv 讀取並綜合學術論文;回傳附有頁碼引用的結構化書目摘要。"

AgentDefinition 是 Claude Agent SDK 中 subagent 的宣告式規格。它包含四個關鍵欄位:父代 Claude 用來路由 Task 呼叫的 description、設定 subagent 持久行為憲章的系統提示、限制 subagent 可呼叫工具範圍的 allowedTools 白名單,以及可選的 model 覆寫。AgentDefinition 是靜態設定——它不攜帶對話狀態。每次 Task 呼叫都會產生一個以對應 AgentDefinition 為種子的全新 session 實例。 Source ↗

AgentDefinition 存放在哪裡

在 Claude Code 中,AgentDefinition 以 markdown 檔案的形式存放在 .claude/agents/<name>.md(專案範圍)或 ~/.claude/agents/<name>.md(使用者範圍)下。在 Agent SDK(Python 或 TypeScript)中,它們以物件形式以程式方式傳遞給 session 建構子。兩種形式產生相同的執行時期行為。

allowedTools — 限定 Subagent 實際可用的工具

AgentDefinition 上的 allowedTools 欄位,是 subagent 呼叫、context passing 與 spawning 中最與考試相關的單一參數。理解其語義可以避免一整類的錯誤答案。

allowedTools 是嚴格的白名單

清單上有的工具可以呼叫。清單上沒有的工具無法呼叫——不存在隱式繼承父代能力的機制。擁有 allowedTools: ["Read", "Grep"] 的 subagent,即使其父代 coordinator 可以呼叫 Write,它也無法呼叫 Write。這是刻意設計的:subagent 的專業化在工具邊界上強制執行,而不是依賴 prompt 邊界來期望達成。

allowedTools 只能限制,永遠無法擴展

第二條關鍵規則:AgentDefinition 無法授予其 subagent 超出 session 整體設定所允許的權限。若 session 在禁止 Bash 的權限設定下啟動,在其 allowedTools 中列出 Bash 的 subagent 仍然無法執行 Bash。白名單是對已允許範圍的限制;它們無法覆寫 session 的安全邊界。

常見的專業化模式

考試情境通常獎勵專業化:

  • researcher subagent:["Read", "Grep", "Glob", "WebSearch"] — 可探索與讀取,但不能修改。
  • critic subagent:[](無工具)— 純粹推理,無法碰觸檔案系統或 shell。
  • coder subagent:["Read", "Edit", "Write", "Bash", "Grep"] — 可修改原始碼,但可能不被允許進一步 spawn subagent(無 Task)。
  • coordinator["Task", "Read"] — 職責是協調,而非執行,因此持有 Task 加上足夠的唯讀存取來查看輸入。

Subagent 呼叫、context passing 與 spawning 的 allowedTools 速查表:

  • allowedTools 是嚴格白名單 — 未列出 = 拒絕。
  • Subagent 不會自動繼承父代的 allowedTools。
  • "Task" 必須在 coordinator 的 allowedTools 中,spawning 才能運作。
  • allowedTools 只能限制,永遠無法擴展超出 session 的整體權限邊界。
  • 專業化 subagent 應持有最小化、以任務為範圍的工具集,而非父代的完整清單。

干擾線索:任何暗示「subagent 繼承 coordinator 工具」的答案都是錯的。subagent 呼叫的每個工具都必須明確列出。 Source ↗

Context 隔離 — 最容易讓考生踩坑的規則

若說 CCA-F 考試在 subagent 呼叫、context passing 與 spawning 上強調哪一條規則,那就是:subagent 在隔離的 context 中執行,不會自動繼承 coordinator 的對話歷史

隔離 Context 的實際含義

當 Task tool spawn 一個 subagent 時,SDK 建立一個新的 session,其訊息歷史只包含:

  1. subagent 的系統提示(來自其 AgentDefinition)。
  2. coordinator 在 Task tool 呼叫中提供的 prompt 字串,作為第一條 user 訊息。

這就是整個初始狀態。coordinator 先前的訊息、先前的 tool_result 條目、先前的思考區塊、先前的 user 指令——這些對 subagent 全部不可見。subagent 不知道 coordinator 做了什麼、載入了什麼文件、呼叫了哪些工具,除非 coordinator 將那些資訊打包進 Task prompt。

這樣設計的原因

Context 隔離存在三個原因:

  • Context window 衛生 — coordinator 的 context window 可能已經有 50K token 的深度。將其複製進每個 subagent 會浪費 subagent 的可用 token 和 API 費用。
  • 專業化保真度 — 聚焦的 subagent prompt,比稀釋的通用對話轉儲表現更好。
  • 安全性與可稽核性 — 從未見過上游敏感資料的 subagent,不可能透過其工具呼叫或最終輸出意外洩漏它。

明確傳遞的義務

由於 context 不會自動流動,需要 subagent 知道某些資訊的 coordinator,必須在 Task tool 的 prompt 參數中明確傳入那些資訊。這就是考試綱要中的「必須明確傳遞」規則。它看起來像這樣:

Task(
  subagent_type="summarizer",
  description="Summarize support ticket thread",
  prompt="""
Summarize the following customer support ticket thread into
a 3-sentence incident description. Thread:
<thread>
  {full_ticket_thread_here}
</thread>
Return only the 3-sentence summary, no preamble.
"""
)

coordinator 負責將工單內容打包進 prompt。若 coordinator 依賴 subagent「已經知道」要摘要什麼,subagent 就會幻想或拒絕執行。

「Context 沿著 agent 階層向下流動」在 CCA-F 考試上是錯的。

來自傳統軟體背景的考生,往往假設 subagent 繼承 context 的方式就像子函式呼叫繼承詞法作用域(lexical scope)那樣。它們不是。Subagent 在完全隔離的 context window 中執行,只以 AgentDefinition 系統提示加上 Task tool 的 prompt 參數為種子。

若情境描述「coordinator 載入了一筆客戶記錄,然後 spawn 了一個 summarizer subagent——summarizer 看到什麼?」,正確答案是「只有 coordinator 在 Task prompt 中包含的內容」,而不是「客戶記錄,因為 subagent 繼承了 coordinator 的 context」。光是這個錯誤,就可能在多 agent 研究情境中損失兩到三道考題。 Source ↗

Context Passing 策略 — 完整、摘要或結構化

既然 coordinator 必須明確打包 context,問題就變成了如何打包。CCA-F 認識三種原型。架構師根據資料量和 subagent 的資訊需求來選擇。

完整歷史直接傳遞

coordinator 將相關的對話或工具輸出逐字拼接進 Task prompt。簡單、無損,但 token 成本高。適用於 subagent 需要對 coordinator 已看過的相同材料進行深度推理的情況。

摘要傳遞

coordinator 在 spawn 前將先前的 context 壓縮成簡短的簡報——幾句話或幾個要點。成本較低,但有損失:subagent 無法恢復 coordinator 捨棄掉的細節。適用於 subagent 的任務範圍窄、只需要摘要的情況。

結構化 Payload 傳遞

coordinator 將 context 打包為結構化資料——JSON、XML 標籤或 markdown 圍欄區塊——清楚地將元資料與自然語言任務指令分開。這是生產等級的模式,也是 CCA-F 在多 agent 研究系統情境中期望架構師推薦的做法。

結構化 payload 的範例:

<task>
  <goal>Identify any factual inconsistencies</goal>
  <context>
    <source_1 id="arxiv:2301.04567">
      {paper_1_summary}
    </source_1>
    <source_2 id="arxiv:2302.11234">
      {paper_2_summary}
    </source_2>
  </context>
  <instruction>
    Return a JSON array of {claim, source, conflicts_with} objects.
  </instruction>
</task>

XML 標籤的分隔給了 subagent 清晰的心智模型:目標、然後是 context(附有來源出處)、然後是輸出指令。這也讓 subagent 的輸出在回到 coordinator 時更容易稽核。

在回答 CCA-F 關於將多來源研究傳遞給 subagent 的題目時,結構化 payload 答案優先於「傳遞完整的 coordinator 對話」(浪費且混淆出處)和「傳遞一行摘要」(資訊有損失)。結構化 payload 保留出處、將元資料與指令分離,是多 agent 研究和結構化資料擷取情境所推薦的習慣用法。 Source ↗

fork_session — 分岔探索而不失去主幹

fork_session 機制是 subagent 呼叫、context passing 與 spawning 在 CCA-F 上的第三根支柱。它解決的問題與 Task 不同:不是「spawn 一個執行有限工作的子代」,而是「在保持原始 session 完整的同時,從當前 session 探索一條替代路徑」。

Forking 帶給你什麼

fork 會建立當前 session 狀態的副本——訊息歷史、工具呼叫歷史、SDK 持久化的任何內容——作為一個擁有自身 session_id 的新 session。在 fork 中執行的動作不會影響主幹。你可以執行實驗、復原錯誤,或探索假設性的分支。

fork_session vs Task

這兩種機制截然不同,CCA-F 會測試你區分它們的能力:

  • Task 建立一個全新的、context 隔離的 subagent,只以 AgentDefinition 和一個 prompt 為種子。用於委派有界的工作單元。
  • fork_session 將現有 session 的完整狀態複製到一個新的分支中。用於分岔探索、A/B 測試工具策略,或可復原的實驗。

若情境問「如何讓 researcher agent 嘗試兩種不同的資料庫查詢策略,同時不失去原始 context?」,答案是 fork_session——spawn 兩個 fork,在各自執行一個查詢,比較結果,捨棄較差的 fork。

fork_session 是 Agent SDK 的機制,用於將一個活躍的 session 分岔到一個新的、獨立執行的 session,該 session 繼承父代 session 在 fork 當下的訊息歷史。與 Task tool(建立只以 AgentDefinition 和明確 prompt 為種子的 context 隔離 subagent)不同,forking 保留完整的對話狀態,使 fork 可以從主幹所在的同一個點繼續推理。Fork 不共享未來狀態——fork 中的動作不會改變主幹。常見用途:分岔假說測試、A/B 工具策略探索,以及可復原的實驗。 Source ↗

Forking 不會複製權限或擴展工具授予

一個經常被考到的細節:forking 繼承訊息歷史,但不會神奇地授予 fork 額外的工具權限,或提升 session 的安全設定。若主幹無法呼叫 Bash,fork 也不行。fork 是記憶體操作,而非權限操作。

並行 Task 呼叫 — 單一 Coordinator 回應中的扇出

Agent SDK 允許 coordinator Claude 在單一助理回應中發出多個 tool_use 區塊,包括多個 Task 呼叫。SDK 會並行執行那些 subagent,並在全部完成後一起回傳其 tool_result 訊息。

並行 Spawning 的重要性

在多 agent 研究情境中,需要對同一個問題取得三個角度的 coordinator,可以並行 spawn 三個專家 subagent,而非循序執行:

  • researcher_arxiv — 搜尋 arXiv 並回傳發現。
  • researcher_github — 搜尋 GitHub 並回傳發現。
  • researcher_web — 搜尋網路並回傳發現。

三者並行執行;coordinator 同時看到所有三個 tool_result 訊息;然後綜合所有證據。循序 spawning 會讓延遲乘以 3,並推遲所有後續步驟。

何時不應扇出

當子任務相互依賴——subagent B 需要 subagent A 的輸出作為輸入——時,並行化是錯的。扇出相依的子任務,要嘛導致失敗(B 沒有 A 的資料),要嘛浪費工作(B 以過時的假設繼續執行)。相依的子任務應循序串接;獨立的子任務應扇出。

描述「coordinator 需要對相關主題進行三個獨立研究流」的 CCA-F 情境題,期望得到並行扇出的答案:在單一 coordinator 回應中發出多個 Task tool_use 區塊,讓 SDK 並行執行,彙整回傳的 tool_result。在此設定下,循序 spawning 雖然正確但較差;考試通常將並行版本標記為最佳答案。 Source ↗

Spawning 深度限制與遞迴 Subagent

如果 subagent 的 AgentDefinition 在 allowedTools 中包含 "Task",subagent 本身也可以進一步 spawn subagent。這會產生 agent 樹狀結構。若沒有深度限制,一個有缺陷或失控的規劃 agent 可能會遞迴直到預算爆炸。

實務上的深度上限

CCA-F 不測試特定的數字深度限制,但確實測試以下認識:

  • 深度在實務上受限於中間的 AgentDefinition 是否在其 allowedTools 中包含 Task。
  • 常見的衛生做法:只有最外層的 coordinator 持有 Task;葉子專家不持有。
  • 樹狀結構的形狀是設計決策,而非執行時期的意外。

防止失控的樹狀結構

最安全的預設是淺層階層:根部的一個 coordinator,一層的專家葉子,不再進一步遞迴。若確實需要更深的階層,每個中間層的 allowedTools 應明確攜帶 Task,且其 AgentDefinition 系統提示應強制執行預算(「你最多可以 spawn 兩個子代」)。

同步 vs 非同步呼叫

從 coordinator 的角度來看,Task 呼叫在 coordinator 自身的迴圈中是同步的:coordinator 發出 tool_use,等待 tool_result,然後繼續。SDK 在回傳之前將 subagent 執行至完成。在 Task tool 層面沒有暴露「shoot and forget」的原語。

並行呼叫不做的事

單一助理回應中的並行 Task 呼叫確實會彼此並行執行,但 coordinator 仍然等待所有呼叫完成後才繼續。透過 Task tool 介面沒有暴露任何 callback、事件串流或 promise 物件。CCA-F 會測試考生可能錯誤提議「發出 Task 呼叫後繼續執行」的情境——正確答案是,coordinator 的迴圈對於它發出的任何 Task,都會一律阻塞在等待 tool_result 上。

對延遲敏感情境的含義

在終端使用者正在等待的客服解決 agent 情境中,架構師必須仔細思考 spawning 深度和扇出寬度。三個各需 8 秒的並行 subagent,會阻塞 coordinator 8 秒(最慢那個),而非 24 秒。但三個 8 秒 subagent 的循序串接,則會阻塞 24 秒。扇出是掌控延遲的工具。

Coordinator 迴圈中的回傳值處理

當 subagent 以 stop_reason: end_turn 結束其迴圈時,其最終助理訊息內容會成為原始 Task 呼叫的 tool_result 主體。coordinator Claude 將該 tool_result 作為其下一輪輸入的一部分讀取。

Coordinator 實際看到什麼

coordinator 看到的是:

  • 一個 coordinator 自身發出的 tool_use 區塊。
  • 一個以 subagent 最終文字為內容的 tool_result 區塊。

coordinator 不會看到 subagent 的中間 tool_use 和 tool_result 訊息、其思考區塊,或其逐步推理過程——只有最終輸出。這就是為什麼設計良好的 subagent 要產出簡潔、結構化的最終輸出;下游 coordinator 需要的一切都必須在那最後一條訊息中。

輸出塑形模式

結構化 subagent 最終輸出的兩種常見模式:

  • 自由形式摘要 — 適用於探索性任務,coordinator 將對定性發現進行推理。
  • 結構化 JSON 或 XML 區塊 — 適用於輸出由 coordinator 機械消費的任務(例如 coordinator 將解析 subagent 的 JSON 並將欄位餵入下一步)。這與結構化資料擷取情境配合得很好。

權限繼承 vs 限制 — 回顧

將所有權限線索整合成單一心智模型:

  • 父代 session 權限邊界 — 外部上限;內部任何東西都無法超越這個邊界。
  • Coordinator allowedTools — 將 coordinator 限制在邊界的子集中。必須包含 Task 才能 spawn。
  • Subagent AgentDefinition allowedTools — 將 subagent 限制在其自身的子集中,受邊界約束(不受 coordinator 的清單約束)。若 subagent 本身被允許 spawn,必須包含 Task

每一層都是限制。沒有任何一層是擴展。考試在情境層面測試這一點:「coordinator 有 Bash,researcher subagent 未列出 Bash——researcher 可以呼叫 Bash 嗎?」答案:不行。

白話文解釋 Subagent 呼叫、Context Passing 與 Spawning

抽象的概念在錨定到具體情境時才真正好記。以下三個類比涵蓋了 subagent 呼叫、context passing 與 spawning 的完整面貌。

類比一:包辦宴席的外燴主廚與新進員工

一位承接大型跨部門餐宴的外燴主廚,無法獨自完成所有備料。他的做法是撰寫一份任務單——一份自給自足的文件,說明目標、背景脈絡、限制條件、預期的出餐格式——然後把這份任務單交給特地為此類工作聘來的專業廚師。那位廚師走進備料區時,手上只有這份任務單。他沒有出席主廚的早晨採購會議,沒有讀過主廚的菜單討論串,也沒有聽到外場與 VIP 桌的溝通。若任務單內容不完整,廚師只能猜測或回頭詢問。

這正是 subagent 呼叫、context passing 與 spawning 的運作方式。coordinator Claude 是主廚。AgentDefinition 是廚師的職務說明(他的專長、他帶來的工具)。Task tool 是把任務單交出去的動作。prompt 參數就是任務單的內容。subagent 帶著任務單加上自身的專業進場——僅此而已。若 coordinator 忘記把客人的菜單需求寫進任務單,摘要 subagent 就無法摘要它從未看過的東西。

這個類比對應每個核心術語:

  • Coordinator = 委派工作的主廚。
  • AgentDefinition = 廚師的職責描述與取得許可的工具清單。
  • Task tool 呼叫 = 把任務單交出去的動作。
  • prompt 參數 = 任務單的內容。
  • allowedTools = 廚師獲准使用的工具(若取得許可的刀具清單上沒有剃骨刀,就不能用)。
  • 隔離 context = 廚師沒有出席你先前的所有會議。

類比二:帶著自製小抄進考場的開放式筆記考試

想像一位考生參加開放式筆記考試,規定只能帶一份自己準備的小抄,其他什麼都不能帶。考生在考試期間掌握的知識包括:他準備的小抄,加上他進考場前就已具備的知識(訓練、學過的課程)。坐在考場外面的監考老師,有每堂課的詳細個人筆記——但考生在考試中無法取用那些筆記。

subagent 就是考生。小抄就是 Task prompt。考生既有的知識就是 AgentDefinition 系統提示。監考老師就是 coordinator,擁有考生看不到的豐富 context。若監考老師希望考生知道某件事,他必須在考生進場之前把它寫在小抄上。考試一旦開始,門就關上了。考生無法在中途打電話索取更多 context。

這個類比說明了為什麼明確的 context passing 是不可或缺的,以及為什麼摘要或結構化傳遞是在 token 成本和資訊完整性之間的取捨。小抄的空間有限;上面寫什麼至關重要。

類比三:分工明確的辦桌備料陣地

一位在繁忙宴席中坐鎮總鋪的師傅掌控整場菜色。訂單進來;他讀完整張菜單後決定誰做什麼。他把醬料交給滷味師傅,把主菜交給爐台師傅,把盤飾交給冷盤師傅。每位專家站在自己的備料區,使用各自的工具——滷味師傅有滷桶和長筷,爐台師傅有鑄鐵鍋和火候,冷盤師傅有鑷子和冰鎮碗。滷味師傅碰不到爐台;爐台師傅碰不到冷盤食材。總鋪師站在出菜口,手裡拿著完整的菜單和出菜板——他的工具是統籌,不是直接烹調。

總鋪師交派「擺好這道菜的醬料」時,滷味師傅得到的是精確的指令(「焢肉,兩份量,熱盤上桌」),而不是整場宴席的訂席紀錄、外場服務員對 VIP 桌的備注,或酒水搭配的決策。每位專家只拿到他們需要的資訊,不多也不少。

這就是從頂層俯視的 subagent 呼叫、context passing 與 spawning:

  • 總鋪師 = 持有 Task tool 的 coordinator。
  • 各備料區 = subagent 執行時期實例。
  • 每位師傅的工具架 = 各 AgentDefinition 的 allowedTools。
  • 委派的指令 = Task prompt。
  • 完成後送回出菜口的料理 = 回傳給 coordinator 的 tool_result。
  • 同時對全場師傅下令 = 單一 coordinator 回應中的並行 Task 呼叫。
  • 分出兩個爐台試做兩種不同收汁方式 = 用於分岔探索的 fork_session。

考試當天選用哪個類比

  • 關於為什麼 subagent 不知道 coordinator 知道的事的題目 → 開放式筆記考試類比。
  • 關於誰可以使用哪個工具的題目 → 辦桌備料陣地類比。
  • 關於委派合約以及什麼內容應該放進 prompt 的題目 → 外燴主廚類比。

多 Agent 研究系統情境對應

多 agent 研究系統情境是 CCA-F 考試中與 subagent 呼叫、context passing 與 spawning 吻合度最高的情境。典型的考試設定:

「一個團隊建立研究系統,coordinator agent 派發三個專門的 researcher——一個負責 arXiv,一個負責 GitHub,一個負責網路。researcher 必須並行工作,不得看到彼此的中間發現,並且必須回傳結構化引用。」

正確的架構使用:

  • 三個 AgentDefinition(每個來源一個),各有窄化的工具白名單和強制執行引用格式的系統提示。
  • 一個在 allowedTools 中包含 "Task" 以及最少其他工具的 coordinator AgentDefinition。
  • 在單一 coordinator 回應中發出的並行 Task 呼叫,各帶有識別研究問題和預期引用 schema 的結構化 XML payload。
  • coordinator 中的 tool_result 彙整,然後跨三個回傳的 JSON 區塊進行綜合。
  • 可選的 fork_session,若 coordinator 想在承諾之前探索兩種替代的綜合策略。

此情境的錯誤答案通常:

  • 將三個 researcher 合併成單一 subagent(失去並行性,混淆專業化)。
  • 依賴 context 繼承而非明確的結構化 payload(subagent 會幻想)。
  • 給每個 subagent "Task" 工具(引發失控遞迴)。
  • 在應使用 Task 的地方使用 fork_session(fork 繼承歷史——對獨立的研究流來說是浪費)。

開發者生產力與 Claude 情境對應

開發者生產力與 Claude 情境將 subagent 呼叫、context passing 與 spawning 疊加在 Claude Code 的內建檔案工具之上。典型的考試設定:

「一位工程師希望 Claude Code 透過三個專門的審查輪次來 review 一個 pull request:型別安全審查輪次、測試覆蓋率審查輪次和安全審查輪次。每個輪次應有各自的工具白名單。工程師希望三個輪次盡可能並行執行。」

正確的架構:

  • .claude/agents/ 下以 subagent markdown 檔案的形式登錄三個 AgentDefinition:type-check-reviewertest-coverage-reviewersecurity-reviewer
  • 每個都有窄化的 allowedTools 集合:型別檢查和安全審查只用 Read 和 Grep,測試覆蓋率審查額外加 Bash(範圍限定),以便呼叫測試執行器。
  • 頂層 Claude Code session 作為 coordinator,在其 allowedTools 中持有 Task。
  • coordinator 透過單一助理輪次中的三個 Task tool_use,並行 spawn 所有三個 reviewer。
  • 每個 reviewer 回傳一個結構化的發現區塊;coordinator 綜合並呈現統一的 review。

這個情境獎勵能夠認識 AgentDefinition 可以以檔案形式存在、並行 Task 扇出是正確的延遲選擇,以及最小化每個 subagent 的 allowedTools 是安全特性而非限制的考生。

常見考試陷阱 — Subagent 呼叫、Context Passing 與 Spawning

CCA-F 關於 subagent 呼叫、context passing 與 spawning 的題目中,五個陷阱反覆出現。全部記住。

陷阱一:將 Task Tool 視為自訂工具

答案選項可能描述「透過 MCP 撰寫自訂 Task tool」。錯誤。Task tool 是 Agent SDK 的內建工具,不是你自己實作的東西。拒絕任何暗示將 Task 作為使用者自定義工具來撰寫的答案。

陷阱二:Context 自動向下流動

這是最常被懲罰的誤解。Subagent 開始時的訊息歷史是空的,除了其系統提示和 Task prompt。任何暗示「subagent 有存取 coordinator 對話的權限」的答案,除非 coordinator 在 prompt 中明確傳入了那個對話,否則都是錯的。

陷阱三:allowedTools 繼承

考生以為 subagent 繼承 coordinator 的工具清單。它不會。AgentDefinition 的 allowedTools 是明確的、獨立的白名單。省略一個工具,它就無法被呼叫。

陷阱四:allowedTools 作為超出 Session 邊界的權限授予

allowedTools 只能限制已允許的範圍。在安全設定中 Bash 被停用的 session 中,在 subagent 定義上列出 Bash 並不會啟用 Bash。限制,永遠無法擴展。

陷阱五:混淆 Task 與 fork_session

Task spawn 一個全新的、context 隔離的 subagent。fork_session 將當前 session 的歷史複製到一個新的分支中。「目標是帶著完整的先前 context 在替代分支上繼續推理」的情境需要 fork_session;「目標是將有界的工作單元委派給專家」的情境需要 Task。選錯機制會損失考題。

CCA-F 上 subagent 呼叫、context passing 與 spawning 最強的陷阱,是在單一題目中結合陷阱二、三和五。

情境範本:「一個 coordinator agent 載入了一份 40 頁的客戶記錄,然後 spawn 一個 subagent 來擷取聯絡資訊。subagent 的 allowedTools 中有 Read 和 Grep。以下哪個陳述是正確的?」

常見的錯誤答案:

  • (A)subagent 可以讀取客戶記錄,因為 coordinator 已經載入了它。— 錯誤(context 隔離)。
  • (B)subagent 可以呼叫 Write,因為它繼承了 coordinator 的 Write 工具。— 錯誤(沒有繼承)。
  • (C)fork_session 在這裡是更好的機制。— 錯誤(fork 複製歷史,而當 subagent 只需要一個目標性的 payload 時,這是浪費)。

正確答案是:coordinator 必須在 Task prompt 中明確包含客戶記錄(或將 subagent 指向一個它可以 Read 的檔案路徑),且 subagent 只能 Read 和 Grep,不能做其他事情。 Source ↗

練習錨點 — 任務 1.3 情境題範本

CCA-F 關於 subagent 呼叫、context passing 與 spawning 的練習題歸類為五種反覆出現的形態。詳細的題庫在 ExamHub CCA-F 練習考試中;範本形態如下:

範本 A:Spawning 機制識別

「一位架構師希望 coordinator agent 將摘要任務委派給一個專家。coordinator 應呼叫哪個 SDK 提供的工具?」正確答案:Task。干擾項:「一個名為 'delegate' 的自訂 MCP 工具」、「Read」、「allowedTools 清單上的任何工具」。

範本 B:allowedTools 推論

「subagent 的 AgentDefinition 列出 [Read, Grep]。coordinator 的 allowedTools 列出 [Read, Grep, Bash, Task]。subagent 可以執行 Bash 嗎?」正確答案:不行。allowedTools 不從 coordinator 繼承。

範本 C:Context 隔離問題

「一個 coordinator agent 一直在處理多輪客服對話。它用 Task spawn 了一個 summarizer subagent。summarizer 啟動時看到什麼?」正確答案:其 AgentDefinition 系統提示,加上 coordinator 在 Task prompt 參數中提供的任何內容。 干擾項:「coordinator 的完整訊息歷史」、「coordinator 的最後一條助理訊息」、「coordinator 透過 Read 讀取的所有內容」。

範本 D:Task vs fork_session 選擇

「一個 researcher agent 希望嘗試兩種資料庫查詢策略,同時保留復原到當前狀態的能力。它應使用哪種機制?」正確答案:fork_session。干擾項:Task(錯誤,因為 Task 不在分支中保留完整歷史,且目標是探索,而非委派)。

範本 E:並行扇出識別

「coordinator 必須跨三個獨立來源研究同一個問題並綜合發現。哪種模式能最小化延遲?」正確答案:在單一 coordinator 回應中發出多個 Task tool_use 區塊,讓 SDK 並行執行 subagent。 干擾項:「串接三個循序的 Task 呼叫」(正確但較差;考試通常將並行標記為最佳)。

常見問題 — Subagent 呼叫、Context Passing 與 Spawning

Task tool 是什麼,為什麼它專屬於 Agent SDK?

Task tool 是 Agent SDK 的內建 spawning 機制。使用 subagent_typedescriptionprompt 呼叫 Task,會建立一個綁定到對應已登錄 AgentDefinition 的全新 subagent session。SDK 在隔離的 context window 中執行 subagent 的 agentic loop,並將最終輸出以 tool_result 的形式回傳給 coordinator。它專屬於 Agent SDK,是因為 spawning 是一個執行時期原語,不是使用者撰寫的工具所能忠實實作的——SDK 必須連接子代 session、序列化 AgentDefinition、執行 subagent 的迴圈,並將結果路由回父代的訊息歷史。

Subagent 會繼承 coordinator 的對話歷史嗎?

不會。這是 CCA-F 上最常被測試的誤解。Subagent 以隔離的 context 執行。當 Task tool spawn subagent 時,subagent 的開頭訊息歷史只包含其 AgentDefinition 的系統提示,以及 coordinator 傳入 Task 呼叫的 prompt 字串。coordinator 先前的訊息、tool_result 和推理,對 subagent 全部不可見。若 coordinator 需要 subagent 知道某些事,coordinator 必須在 Task prompt 參數中明確打包那些資訊。

AgentDefinition 包含什麼,為什麼 description 很重要?

AgentDefinition 是 subagent 的宣告式規格。它包含 description(父代 Claude 用來選擇要 spawn 哪個 subagent_type 的路由訊號)、系統提示(subagent 的行為憲章)、allowedTools 清單(subagent 的工具白名單),以及可選的 model 覆寫。description 很重要,是因為當 coordinator 持有多個已登錄的 subagent type 時,父代 Claude 透過讀取 description 在它們之間做選擇——模糊或重疊的 description 會產生不確定的路由。把 description 當作工具描述看待:具體、動詞導向、範圍明確。

allowedTools 如何與 coordinator 的工具權限互動?

allowedTools 是嚴格的白名單,只能限制,永遠無法擴展。subagent 只能呼叫自身 AgentDefinition 的 allowedTools 中列出的工具。subagent 不繼承 coordinator 的工具,且無法超出 session 的整體權限邊界。若 session 在停用 Bash 的設定下啟動,在 subagent 的 allowedTools 中列出 Bash 並不會啟用它。反之,coordinator 必須在其自身的 allowedTools 中包含 Task tool,spawning 才能成立——spawning 能力受到與其他所有工具相同的白名單機制管控。

我應該在什麼情況下使用 fork_session 而非 Task tool?

當你想將有界的工作委派給不需要看到完整 coordinator 歷史的專家 subagent 時,使用 Task。當你想沿著替代分支、從當前 session 的確切狀態繼續推理時,使用 fork_session——假說測試、A/B 工具策略探索,或可復原的實驗。Fork 在 fork 當下繼承完整的訊息歷史;Task subagent 從空的歷史開始,只以其 AgentDefinition 為種子。經驗法則:Task 是委派,fork 是探索。

Coordinator 可以並行 spawn 多個 subagent 嗎?

可以。Agent SDK 允許 coordinator 在單一助理回應中發出多個 tool_use 區塊——包括多個 Task 呼叫。SDK 並行執行那些 subagent,並在各自完成後回傳所有的 tool_result 訊息。這種並行扇出是獨立子任務(例如跨不同來源的三個研究流)的正確模式,因為延遲受最慢的 subagent 限制,而非所有 subagent 持續時間之和。當子任務相互依賴時,並行扇出是錯的——那些任務應循序串接,讓下游 subagent 可以消費上游輸出。

Subagent 本身可以 spawn 進一步的 subagent 嗎?

可以,前提是其 AgentDefinition 在 allowedTools 中包含 "Task"。這會產生多層的樹狀結構。在實務上,CCA-F 獎勵淺層階層:根部的一個 coordinator 持有 Task,一層的專家葉子不持有 Task。更深的樹在技術上可行,但會引入遞迴風險、除錯複雜性,以及中間層進入 spawn 迴圈時的預算爆炸風險。設計時以淺層為預設;明確地為深度提供理由。

延伸閱讀

Related ExamHub topics: Multi-Agent Orchestration with Coordinator-Subagent Patterns, Agentic Loops for Autonomous Task Execution, Agent SDK Hooks for Tool Call Interception, Session State, Resumption, and Forking.

官方資料來源