OpenAI Agents API vs Responses API:2026 年、開発者はどう選ぶか。JSON Tool Calling、Structured Output、マルチ Agent
9 月 10 日の Agents API 公開ベータのあと、よくある問いは「どのモデルが賢いか」ではない。誰がループを回すかだ。Responses API では function_call を自分で回す。Agents API は Codex harness をホストする。Tool Calling と Structured Output からマルチ Agent まで開き、選べる表を渡す。
先に一目
| 入口 | 一行 | 何を持つか |
|---|---|---|
| Agents API | OpenAI が Codex harness を回す | Session / Environment |
| Responses API | 自分でモデルを叩き、ループを回す | input / output items |
| Agents SDK | ループは自プロセスに残る | runner / handoff |
| JSON 鎖 | 名前、引数、結果はオブジェクトのまま | call_id / Schema |
先に主語を選ぶ。ループを自分で持つか。入口を替えても JSON 呼び出し鎖は残る。
選ぶのは誰がループを回すか。誰が賢いかではない
2026 年、GPT-6 Astra のツール呼び出しはすでに Responses を通る。Agents API は別層だ。セッションをホストし、文脈を圧縮し、subagent を送る。同じ JSON 鎖。主語が違う。
- 毎ステップを握る:承認、再試行、
function_call_outputを書き戻す——Responses API。 - 何時間も続く仕事、ホスト復旧、サンドボックス、subagent——Agents API。
- ループは自プロセスに残したいが runner は欲しい——Agents SDK。下はしばしば Responses。
Agents API 自体のツール呼び出しは OpenAI Agents API 完全解説。Agent と Function Calling がまだ一つの語なら AI Agent 完全ガイド。
各 API は層を持つ
Responses は下層:/v1/responses。input を送り、typed items を受ける。message、reasoning、function_call。GPT-6 Astra ガイド のツール呼び出しはこの道を要求する。Structured Output は text.format。Chat Completions の response_format ではない。
Agents API は管理 harness:POST /v1/agents/sessions。Agent、Tools、Environment を宣言する。OpenAI がループ、compact、復旧を回す。関数の答えが要るとき、session は requires_action を出す。あなたは turn_id / call_id で tool_result を返す。
Agents SDK は第三のプロトコルではない。自プロセスの runner だ。handoff、承認、保存はあなたのもの。モデル呼び出しはしばしば Responses に落ちる。公式は Session、SDK session、Responses conversation、sandbox を四つの別資源とする。
Tool Calling:一つの鎖、二つの書き戻し
Responses では毎ターン responses.create。ツール表と最終カードは同じリクエストに置ける:
{
"model": "gpt-6-astra",
"input": "Look up order A-1042.",
"tools": [
{
"type": "function",
"name": "lookup_order",
"parameters": {
"type": "object",
"properties": {
"order_id": { "type": "string", "pattern": "^[A-Z]-\\d{4}$" }
},
"required": ["order_id"],
"additionalProperties": false
}
}
],
"text": {
"format": {
"type": "json_schema",
"name": "order_card",
"strict": true,
"schema": {
"type": "object",
"properties": {
"order_id": { "type": "string" },
"status": { "enum": ["paid", "pending", "void"] }
},
"required": ["order_id", "status"],
"additionalProperties": false
}
}
}
}
モデルが照会するなら、output に独立した item が出る。call_id が呼び出しと結果を釘付けする:
{
"output": [
{
"type": "function_call",
"call_id": "call_3c91",
"name": "lookup_order",
"arguments": "{\"order_id\":\"A-1042\"}"
}
]
}
アプリが関数を実行し、結果を次の input item として戻す:
{
"type": "function_call_output",
"call_id": "call_3c91",
"output": "{\"status\":\"paid\",\"amount\":99.00}"
}
Agents API はこれらのターンを session に畳む。作成時にツール、サンドボックス、multi_agent を一度に宣言する:
{
"agent": {
"model": "gpt-6-astra",
"tools": [
{ "type": "function", "name": "lookup_order", "parameters": {
"type": "object",
"properties": { "order_id": { "type": "string", "pattern": "^[A-Z]-\\d{4}$" } },
"required": ["order_id"],
"additionalProperties": false
}},
{ "type": "web_search" }
],
"multi_agent": { "enabled": true, "max_concurrent_subagents": 3 }
},
"environment": { "type": "hosted", "workspace_directory": "/workspace" },
"input": [{ "role": "user", "content": [{ "type": "input_text", "text": "Look up A-1042." }] }]
}
関数の番が来ると、harness は required_actions で止まる。書き戻しは function_call_output ではない。turn_id 付きの tool result だ:
{
"type": "tool_result",
"turn_id": "turn_2",
"call_id": "call_3c91",
"success": true,
"output": "{\"status\":\"paid\"}"
}
名前は違う。門は同じ。Schema が実行できるものを決める。MCP の行は同じツール表の別表記。境界は MCP Tool Schema vs Function Calling。
Structured Output は最終カードを鎖す。ツール引数ではない
Responses は最終形を text.format に置く。ユーザーに見せるオブジェクトを縛る。ツール引数は別 Schema。契約は なぜ AI に JSON Schema が要るか。
- Responses:
text.format.json_schema+strict: trueが最終カードを鎖す。 - Agents API:ループはホストされる。最終成果物にも Schema が要る。function / MCP の引数は各自絞る。
- どちらも:Structured Output は門ではない。金額、確認、解放はホストが書く。
よくある誤りはカードだけを鎖し、lookup_order を広い object のままにすること。カードはきれいだ。副作用はもう走った。
マルチ Agent:ホストされた扇状か、自分の handoff か
「マルチ Agent 協働」は第三の知能ではない。誰が編制を持つかだ:
- Agents API:
multi_agent.enabled。subagent は自分の文脈を持つ。主 Agent は create / wait / interrupt。同時実行に上限を。 - Agents SDK:handoff オブジェクトは runner の中。承認と保存はあなたのもの。
- Responses:組み込み subagent はない。
responses.createを自分で繋ぐか、状態を Conversations に置く。
handoff は監査できる JSON であるべきだ。「経理に渡して」という文ではない。Schema への収め方は JSON Schema と Agent ワークフロー。
一枚の表、三つの入口
公式の対比は工学の問いに畳める:
| 軸 | Agents API | Responses API | Agents SDK |
|---|---|---|---|
| 誰がループを回すか | OpenAI 管理の harness | 毎回 create で自分で回す | 自プロセスの runner |
| 状態の場所 | Session / turns / items | history を組むか Conversations | 自分の保存か SDK session |
| ツールの書き戻し | tool_result + turn_id | function_call_output + call_id | SDK が包む。下はしばしば Responses |
| Structured Output | 最終成果物に別 Schema | text.format.json_schema | どこに付けるかはあなた |
| マルチ Agent | 組み込み subagent | 自分で編む | runner 内の handoff |
「より良い API」はない。あるのは「主語があなたの側にあるか」だけだ。
入口を決める四問
製品ページから選ばない。この四問:
- 業務の副作用は自プロセスを離れられるか?返金や書き込みにあなたの頷きが要るなら、先に Responses か SDK。
- 仕事は一つの文脈窓を超えるか?超え、自分で compact したくないなら Agents API。
- コマンドとファイル用のサンドボックスが要るか?Agents API の Environment は既にある。Responses では実行世界を自分で用意する。
- 並列 subagent が要るか?要り、編制を自作しないなら Agents API の multi_agent を開き、同時実行上限を凍らせる。
四つの「要る」がホスト側に落ちるなら Agents API。一つでも自分の手に残すなら Responses から。SDK は第三:ループはあなたのもの、糊は少ない。
比べる前に、二つの JSON 軌跡を広げる
入口を間違えるのは、大抵オブジェクトを見ていない。二つの軌跡を並べる。
- Responses の
output[]と Agents の session items を 整形。call_idが合うか見る。 - JSONPath 抽出 で
name、arguments、text.formatを抜く。文書を目で追わない。 - 同じ注文を二つの入口で JSON Diff。ループが流れたら、先に書き戻しの形を見る。
- 最終カードの Schema とツール引数の Schema は別々に審る。カードだけ鎖すのは正面だけ飾ることだ。
- 注文や社内 MCP を公開フォーマッタに貼らない。JSONSort はブラウザローカル。
二つの軌跡が再構築できて、初めて入口を選んでいる。スローガンではない。
落とし穴
- Agents API が Responses を置き換えたと思う。公式は二つの起点を書く。Astra の tool calling は今も Responses。
- Session と Conversation を一つの資源だと思う。一方を消しても他方は消えない。
- 最終カードだけ Schema、ツール引数は広い。副作用は function_call が走ったときに起きる。
- multi_agent を開き、同時実行上限を置かない。ホストされた扇状でも token は燃え、副作用は広がる。
- SDK を使い、門を書かない。runner はループを回す。金額は検証しない。
- デモ映像から API を選ぶ。デモはループを隠す。主語がどこにいるかを先に問う。
FAQ
2026 年の新規はどの API から始めるか?
Responses から。毎跳びが見える。窓を跨ぐ仕事、ホストされたサンドボックスや subagent が要るときだけ、ループを Agents API に渡す。
GPT-6 Astra は Agents API だけ使い、Responses を避けられるか?
Agents session だけ開いてよい。Astra の tool calling 文書は今も Responses を指す。短い鎖、Structured Output、自分で回すループは Responses のまま。
Structured Output は Tool Calling の代わりになるか?
ならない。Structured Output は最終オブジェクトを鎖す。Tool Calling は副作用を鎖す。返金、照会、ファイル編集はツール JSON。ユーザーが見るカードは text.format。
マルチ Agent には Agents API が必須か?
必須ではない。SDK の handoff も、自分で繋いだ複数の Responses もマルチ Agent。Agents API は扇状をホスト能力にしただけだ。
二つの API を混ぜられるか?
できる。資源は混ぜない。構造化カードは Responses、長い仕事は Agents session。Session、Conversation、sandbox は別々に作り、別々に消す。
結論
Agents API と Responses API は二世代ではない。一方はループをホストする。他方はループをあなたに渡す。Tool Calling、Structured Output、マルチ Agent は、その鎖の上の別オブジェクトだ。
先に主語を書く。この跳びは自プロセスを離れてよいか。それから入口を選ぶ。モデルは替わる。call_id と Schema を先に安定させる。
さらに読む
- OpenAI Agents API 完全解説 Session、Tool Calling、Schema のつなぎ
- AI Agent とは何か:完全ガイド ランタイムと JSON 契約
- なぜ AI に JSON Schema が要るか Schema / Function Calling / Structured Output
- JSON Schema と Agent ワークフロー ツールと状態を Schema に
- MCP Tool Schema vs Function Calling ツール JSON のプロトコル境界
- JSONSort ローカルツール箱 整形、検証、Diff
- すべての記事 JSON と AI のメモ
更新記録: 初回公開