第2回 ResponsesとMessagesの設計差 — 会話・推論・ツールの責任はどこにあるか

連載:LLMのAPIと提供経路を選ぶ・第2回 | 連載のまとめ

APIはアプリの責任範囲を決める

OpenAIのResponses APIとAnthropicのMessages APIは、どちらも文章生成、推論、ツールを使う処理の土台になります。差が表れるのは、会話状態の持ち方と、ツールの選択や出力形式をAPIの設定でどこまで指定できるかです。

ここでは、提供元のAPIを直接使う場合のGPT-5.6 SolとClaude Opus 5.5を中心に比較します。Microsoft Foundry(以下、Foundry)でも同じ機能がすべて使えるという意味ではありません。

観点 GPT-5.6 Sol/Responses Opus 5.5/Messages 設計への影響
会話の継続 応答IDで参照、または自前履歴 メッセージ履歴を送る 保存・削除・復旧の責任を決める
推論の調整 reasoning.effort、noneも可能 output_config.effort、思考は常時有効 品質を満たす設定と遅延を実測する
推論の持ち越し 状態参照、または暗号化アイテムの再送 署名付き思考ブロックを再送 不透明な状態を加工しない
出力の構造 outputに本文・推論・ツール等のアイテム contentに型別のブロック 配列の先頭だけを回答にしない
必須ツールの指定 対応するtool_choiceで選択を指定 any/toolの強制指定は不可 必須の業務手順をアプリに置く
形式の制約 Structured Outputs Structured Outputs、strict tool use 形式が正しくても内容と実行結果は検証する

会話の履歴と推論状態を分ける

OpenAIでは、前の応答をprevious_response_idで参照する方式や、履歴を自分で送る方式を選べます。したがって「Responsesはサーバー管理、Messagesは自前管理」という二択にはなりません。Responsesも自前管理で使えます。[1]

ClaudeのMessages APIでは、アプリがそれまでの会話履歴を次のリクエストに含めて送ります。Opus 5.5では、利用者の発言やモデルの回答文に加え、推論の継続に使う「思考ブロック」も履歴に含める必要があります。そのため、アプリは回答文だけでなく、APIが返した思考ブロックも保存し、次のリクエストで再送できるようにします。[2]

設計では、次の3種類を分けて扱います。

データ 目的 移行時の扱い
利用者に見える発言と回答 会話の表示、検索、利用者による確認 他モデルへの引き継ぎ用に整える
プロバイダー固有のアイテム・署名 推論継続、ツール呼び出しの対応付け 互換性を確認し、原文で保つ
取得済みの根拠・業務の確定状態 判断の再現、二重実行防止 モデルを切り替えても業務の判断の基準として保持する

この分離は筆者の設計提案です。原文保存は無期限保存を意味しません。保存期限・暗号化・閲覧権限・削除の対象として扱います。

「考える深さ」は同じ目盛りではない

GPT-5.6 Solはreasoning.effortで推論量を調整でき、noneも選べます。Claude Opus 5.5は思考を無効化できず、output_config.effortで深さを調整します。Sonnet 5.5ではbetween_toolsにより前置きの思考を省けますが、対応するeffortや併用パラメーターに制約があります。GPT-5.6 Sol[3]、Opusの変更点[4]、Sonnetの変更点[5]

同じmediumでも品質・遅延・消費量が同じになるとは限りません。「どちらもmediumで比較」だけでは、自社に最適な設定を評価できません。各モデルで合格品質を満たす最小の設定を探し、その状態で費用と遅延を比べます。

思考の要約が表示できることも、推論の内部状態を完全に読めることとは別です。UIには処理中の状態を出し、監査には参照資料・ツール実行・最終判断を残す構成が実用的です。

JSONの保証とツール実行の保証は違う

Claude Opus 5.5/Sonnet 5.5では、tool_choiceのanyや特定ツール指定はエラーになります。Structured Outputsやstrict tool useは、出力やツール引数の形式を整えるための機能です。それだけでは特定のツールが呼ばれたことを保証しません。 Opusのツール選択仕様[4]

「必ず顧客の権限を確認してから検索する」などの業務要件は、アプリが先に実行します。モデルが検索を提案しなかった場合の扱いも、アプリの制御フローに置きます。

OpenAI側で使うツールを指定しても、呼び出し先のシステムでは権限不足でアクセスを拒否されたり、処理がエラーになったりする場合があります。アプリ側では、ツールが選ばれたことだけで処理が成功したと判断せず、呼び出し先から返る結果を確認します。

要件 保証を置く場所
所定のJSONで受け取る 対応する構造化出力とアプリ側の検証
許可された検索を必ず実施する アプリの必須処理
申請・注文を一度だけ確定する 業務APIの認可・冪等性・トランザクション
実行結果を根拠として回答する ツール結果の保存、回答評価、失敗時の停止

「ツール対応」の実行主体を読む

検索やコード実行が提供元のサーバーで動くのか、モデルが呼び出しを提案してアプリ側で動かすのかを区別します。後者には、実行環境、資格情報、タイムアウト、承認、再試行の実装が必要です。OpenAIのツールには組み込み機能と外部連携、Claudeにはサーバーツールとクライアントツールがあります。OpenAIのツール[6]、Claudeのツール概要[7]

SDKと管理型エージェントを同じ層で比較する

モデルを呼ぶクライアントSDK、ツールループを動かすエージェントSDK、実行環境ごと預ける管理サービスは、互いに置き換えられる範囲が一部に限られます。

層 OpenAI側の例 Anthropic側の例 自社が判断すること
モデルAPI Responses API Messages API 入出力・状態・ツールの契約
クライアントSDK OpenAI公式SDK Anthropic公式SDK 接続、型、ストリーム、採用バージョン
エージェントの実行ループ Agents SDK Claude Agent SDK ツールの権限、状態、制御、実行環境
管理型の実行基盤 Agents API Claude Managed Agents 保存、実行環境、復旧、契約と所在地

Claude Agent SDKはClaude Codeのツールと実行ループをアプリへ組み込む選択肢です。管理型のAgents APIとClaude Managed Agentsは、実行や状態をサービス側へ預ける選択肢です。Claude Agent SDK[8]、OpenAI Agents API[9]、Claude Managed Agents[10]

2026年10月8日の文書では、この2つの管理型基盤はいずれもゼロデータ保持(Zero Data Retention、以下、ZDR)の対象外です。自前の実行環境を選べることから、管理APIが保持するセッションまでZDRになると判断してはいけません。

ゼロデータ保持が必須の場合は、まず利用するモデルAPIがZDRに対応するか、その適用条件を確認します。その上で、会話履歴の管理やツールの呼び出しを、管理サービスに任せず自社のアプリで行う構成を検討します。

Agents SDKやClaude Agent SDKを採用しても、モデルAPIやホスティングの非対応機能が自動で使えるようにはなりません。Foundry Agent Serviceも、この表の各社の直接サービスとは別に評価する対象です。

共通アダプターを作るなら、テキスト、使用量、終了状態、ツール結果を共通化しつつ、各社固有の原文を別に保持します。共通のeffortをそのまま各社に送るような抽象化は、互換性を過大評価しやすい設計です。

HTTP 200の後にも判断が残る

通信が成功しても、回答が完成したとは限りません。上限到達、拒否、ツール待ち、途中のストリームエラーを分け、本文が空でも終了状態を検査します。画面で「完了」を出すのは、アプリが最終状態を確認した後にします。

APIの差は、こうした責任分担を通じて実装工数と障害時の体験へ現れます。

前回: 第1回 性能以外の選定軸

参考資料

参考資料の仕様確認日:2026年10月8日。表と実装方針は筆者の整理・提案です。

  1. Conversation state
  2. Preserved thinking
  3. GPT-5.6 Sol
  4. Opusの変更点
  5. Sonnetの変更点
  6. OpenAIのツール
  7. Claudeのツール概要
  8. Claude Agent SDK
  9. OpenAI Agents API
  10. Claude Managed Agents