「Multiagent orchestration」(多代理協調)讓一個代理能與其他代理協調以完成複雜的工作。代理可以在各自獨立的上下文中平行運作,這有助於提升輸出品質,也能縮短完成時間。
不確定多代理設置是否適合您的問題?請參閱何時使用多代理系統(以及何時不該使用)。
Managed Agents API 請求需要 managed-agents-2026-04-01 beta 標頭,但記憶體儲存端點除外,其使用 agent-memory-2026-07-22。SDK 會自動設定正確的 beta 標頭。請參閱 Beta 標頭。
所有代理共享相同的沙箱、檔案系統和 vault 憑證,但每個代理都在自己的**工作階段執行緒(session thread)中運行,這是一個具有自己對話歷史的上下文隔離事件串流。協調者(coordinator)在主要執行緒(primary thread)**中回報活動(與工作階段層級的事件串流相同);當協調者委派工作時,會在執行期間產生額外的執行緒。
執行緒是持久性的:協調者可以向先前呼叫過的代理發送後續訊息,而該代理會保留其先前回合的所有內容。
每個代理使用自己的配置:模型、系統提示、工具、MCP 伺服器和技能。工作階段層級的代理配置覆寫是例外;它們適用於協調者及其 self 副本。工具、MCP 伺服器和上下文不會共享。
多代理協調最適合用於需要跨多種介面工作的複雜任務,或是由多個範圍明確的任務共同達成整體目標的情況。
效果良好的模式:
在定義您的代理時,設定 multiagent 以宣告協調者可以委派的代理名單:
ant beta:agents create <<YAML
name: Engineering Lead
model: claude-opus-4-8
system: You coordinate engineering work. Delegate code review to the reviewer agent and test writing to the test agent.
tools:
- type: agent_toolset_20260401
multiagent:
type: coordinator
agents:
- type: agent
id: $REVIEWER_AGENT_ID
- type: agent
id: $TEST_WRITER_AGENT_ID
YAMLmultiagent.agents 可以接受以下任何一種:
{"type": "agent", "id": agent.id} 透過 ID 參照先前建立的 agent。如果未指定 version,則該參照會固定在協調者建立時該代理的最新版本。{"type": "agent", "id": agent.id, "version": agent.version} 固定特定的代理版本。{"type": "self"} 允許協調者產生自己的副本。如果工作階段是使用代理配置覆寫建立的,這些覆寫也會套用到這些副本;透過 ID 參照的名單項目則不受影響。協調者的配置(包括其 multiagent.agents 名單)會在協調者建立或更新時建立快照。被參照的代理會固定在當時解析的版本,不會自動採用其定義的後續更新。若要委派給被參照代理的較新版本,請更新協調者,使其名單參照該版本。
協調者只能委派給一層代理;參照一個本身擁有 multiagent.agents 名單的代理,會使建立或更新請求因驗證錯誤而失敗。multiagent.agents 中最多可列出 20 個不重複的代理,但協調者可以呼叫每個代理的多個副本。
建立一個參照協調者的工作階段。協調者會視需要委派給其名單中的代理。
session = client.beta.sessions.create(
agent=coordinator.id,
environment_id=environment.id,
)MCP 伺服器是代理範圍的(每個代理定義宣告自己的伺服器和工具),而 vault 憑證是工作階段範圍的(在建立工作階段時傳入的 vault_ids 適用於每個執行緒)。這對您的整合有兩個影響:
在建立工作階段時的代理配置覆寫可以取代協調者及其 self 副本的 MCP 伺服器。
research_agent = client.beta.agents.create(
name="researcher",
model="claude-haiku-4-5",
mcp_servers=[
{"type": "url", "name": "github", "url": "https://api.githubcopilot.com/mcp/"},
],
tools=[{"type": "mcp_toolset", "mcp_server_name": "github"}],
)
coordinator = client.beta.agents.create(
name="coordinator",
model="claude-opus-4-8",
tools=[{"type": "agent_toolset_20260401"}],
multiagent={
"type": "coordinator",
"agents": [{"type": "agent", "id": research_agent.id}],
},
)
session = client.beta.sessions.create(
agent=coordinator.id,
environment_id=environment.id,
vault_ids=[vault.id],
)
print(session.id)在此範例中,只有研究員(researcher)宣告了 GitHub MCP 伺服器,因此協調者沒有存取權限。工作階段的 vault_ids 將 GitHub 憑證提供給研究員的執行緒。
如果在您宣告伺服器後,代理的 MCP 呼叫驗證失敗,請確認憑證的 mcp_server_url 與代理的 mcp_servers[].url 指向同一個伺服器。兩個 URL 在比對前都會被正規化(scheme 和 host 轉為小寫、移除預設連接埠和結尾斜線),因此主機大小寫、預設連接埠或結尾斜線的差異不會妨礙比對;但不同的路徑、子網域或非預設連接埠則會。
工作階段層級的事件串流(/v1/sessions/{session_id}/events/stream)被視為主要執行緒,包含所有執行緒中所有活動的精簡檢視。您不會看到子代理的完整活動,但會看到它們工作的開始和結束,以及阻塞事件(例如工具權限請求)。
工作階段執行緒是您深入檢視特定代理活動的地方。
工作階段的 status 是所有代理活動的彙總;如果至少有一個執行緒是 running,則整體工作階段狀態也會是 running。
最多支援 25 個並行執行緒。協調者可以呼叫名單中單一代理的多個副本,建立與一個 agent 關聯的多個執行緒。
如下列出與工作階段關聯的所有執行緒:
for thread in client.beta.sessions.threads.list(session.id):
print(f"[{thread.agent.name}] {thread.status}")完整清單包含主要執行緒。主要執行緒的 parent_thread_id 為 null。
這些事件在 /v1/sessions/{session_id}/events/stream 的主要執行緒上呈現多代理活動。訊息方向事件的命名是相對於其串流所在的執行緒:agent.thread_message_received 表示有訊息從另一個執行緒抵達此執行緒,而 agent.thread_message_sent 表示此執行緒發送了一則訊息。例如,協調者委派的任務會以 agent.thread_message_received 事件的形式抵達子執行緒自己的串流。
| 類型 | 描述 |
|---|---|
session.thread_created | 已建立一個執行緒。包含 session_thread_id 和 agent_name。 |
session.thread_status_running | 執行緒開始活動。 |
session.thread_status_idle | 與執行緒關聯的代理正在等待輸入。包含一個 stop_reason,指出代理停止的原因。 |
session.thread_status_terminated | 執行緒已被封存或遇到終止性錯誤。 |
agent.thread_message_received | 在主要執行緒上,某個代理向協調者發送了報告或問題。包含 from_session_thread_id、from_agent_name 和 content。 |
agent.thread_message_sent | 在主要執行緒上,協調者向另一個代理發送了任務或後續訊息。包含 to_session_thread_id、to_agent_name 和 content。 |
關鍵事件會被代理轉發到主要執行緒。不過,您可能仍想調查特定代理的推理和工具呼叫。若要這麼做,請串流或列出相關工作階段執行緒的事件。
每個工作階段執行緒在 /v1/sessions/{session_id}/threads/{thread_id}/stream 都有自己的事件串流,並且接受與工作階段層級串流相同的 event_deltas[] 參數,因此您可以在模型生成時預覽子代理的文字。一個連線只會預覽它正在讀取的執行緒:子執行緒的預覽永遠不會出現在工作階段層級的串流上,因此若要即時觀看子代理,請開啟其自己的執行緒串流。請參閱預覽工作階段執行緒事件以了解如何選擇加入、累積和核對預覽。
with client.beta.sessions.threads.events.stream(
thread.id,
session_id=session.id,
) as stream:
for event in stream:
match event.type:
case "agent.message":
for block in event.content:
if block.type == "text":
print(block.text, end="")
case "session.thread_status_idle":
break如果子代理需要從您的用戶端取得某些東西,例如執行 always_ask 工具的權限,或是自訂工具的結果,該事件會被交叉發佈到主要執行緒,並以 session_thread_id 識別來源的工作階段執行緒。
{
"type": "session.thread_status_idle",
"id": "sevt_01ABC...",
"session_thread_id": "sth_01DEF...",
"agent_name": "code-reviewer",
"stop_reason": {
"type": "requires_action",
"event_ids": ["toolu_01XYZ..."]
}
}發佈 user.tool_confirmation(帶有 tool_use_id)或 user.custom_tool_result(帶有 custom_tool_use_id);伺服器會自動將回應路由到正確的執行緒。
以下範例擴展了工具確認處理器以路由回覆。相同的模式也適用於 user.custom_tool_result。
for event_id in stop.event_ids:
client.beta.sessions.events.send(
session.id,
events=[
{
"type": "user.tool_confirmation",
"tool_use_id": event_id,
"result": "allow",
}
],
)Was this page helpful?