Multi-agent — the “subagents” we already have, differently
This is the “GPT-5.6 likes subagents” bit: multi_agent.enabled lets the model spawn a tree of subagents that OpenAI orchestrates server-side. But the SDK already ships a portable client-side subagent system — so the real question is who orchestrates.
1What the feature is
Multi-agent (beta, GPT-5.6) lets the model spin up and coordinate subagents in parallel inside a single Responses request — the mechanism behind GPT-5.6's ultra mode. Enable it with multi_agent.enabled: true and the beta header OpenAI-Beta: responses_multi_agent=v1. A root agent (/root) spawns a tree (/root/researcher, …); OpenAI hosts the orchestration via six actions (spawn_agent, followup_task, send_message, wait_agent, interrupt_agent, list_agents) surfaced as multi_agent_call items. The root synthesizes the final answer.
multi_agent_call items — OpenAI runs them and returns multi_agent_call_output. Ordinary client-owned function_calls still work exactly as before: any agent can emit one, you run it, you return function_call_output.2The rival we already ship
Unlike the other three GPT-5.6 features, this isn't a missing capability — the SDK already has a subagent story, but client-side:
- subagent/ — markdown agent definitions + registry
- delegate/ — a
spawn/delegatetool - task/ —
TaskTool/TaskToolSetbacked by aTaskManager
Our system spawns and drives full sub-conversations. Same goal as OpenAI's multi-agent; opposite philosophy on who holds the reins.
3Hosted vs client-side
| Axis | OpenAI hosted multi-agent | SDK client-side subagents |
|---|---|---|
| Orchestrator | OpenAI servers (opaque) | Our code — full sub-conversations |
| Portability | GPT-5.6 only, beta | Any model |
| Observability | Encrypted agent_messages | Full event stream, ours |
| Code to maintain | Little (offloaded) | More (we own it) |
4If we wanted hosted mode
Supporting it would need modest plumbing plus new parsing:
| Needed | SDK today |
|---|---|
multi_agent param + beta header | none (responses_options.py, llm.py:916) |
parse multi_agent_call/_output/agent_message with agent/phase | none (message.py:541) |
/responses/compact, reasoning.summary, and max_tool_calls. Recommendation in #4085: keep the portable client-side system as default; treat hosted multi-agent as an optional, model-specific accelerator only if a maintainer decides it's worth the beta surface.4Quiz
Five questions to check you actually understood it — not trivia. Click an answer to see whether it's right and why.