For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
メインナビゲーション
Theme

Responses API への移行

Responses API は、Chat Completions を発展させた新しい基盤 API です。アプリケーションへの組み込みがより簡単になり、エージェントの構築に必要な基本機能を利用できます。

Chat Completions のサポートは継続していますが、すべての新規プロジェクトには Responses を推奨します。

Responses API の概要

Responses API は、エージェントのように動作する高機能なアプリケーションを構築するための統一インターフェースです。次の機能を備えています。

Responses の利点

Responses API には、Chat Completions と比べて次の利点があります。

  • 性能の向上:GPT-5 などのリーズニングモデルは、Chat Completions よりも Responses で高い性能を発揮します。社内評価では、同じプロンプトと設定で SWE-bench の成績が 3% 向上しました。
  • エージェントによる反復実行を標準でサポート:モデルは 1 回の API リクエストの中で、web_search、image_generation、file_search、code_interpreter、リモート MCP サーバー、独自の関数など、複数のツールを呼び出せます。
  • コストの削減:キャッシュの利用効率が上がり、コストを抑えられます。社内テストでは、Chat Completions に比べてキャッシュの利用効率が 40% ~ 80% 向上しました。
  • コンテキストの保持:store: true を指定すると、ターン間で状態を保持し、推論やツールのコンテキストを引き継げます。
  • 柔軟な入力形式:input には文字列またはメッセージのリストを渡せます。システムレベルの指示は instructions で指定します。
  • 推論の暗号化:状態を保存せずに高度な推論を利用できます。
  • 今後のモデルへの対応:今後提供されるモデルにも対応できる設計です。
機能 Chat Completions API Responses API
テキスト生成
音声 近日対応予定
画像認識
構造化出力
Function Calling
ウェブ検索
ファイル検索
コンピューターの使用
コードインタープリター
MCP
画像生成
推論の要約

使用例

具体例を通じて、Responses API と Chat Completions API の違いを確認します。

メッセージとアイテムの違い

どちらの API でも、OpenAI のモデルを使って出力を生成できます。Chat Completions では、呼び出しの入力と結果をメッセージの配列で表します。一方、Responses API ではアイテムを使います。アイテムは、モデルが実行できるさまざまなアクションを表す複数の型の共用体です。message、function_call、function_call_output はいずれもアイテムの型です。Chat Completions のメッセージが複数の役割を 1 つのオブジェクトにまとめるのに対し、Responses では役割ごとにアイテムが分かれており、モデルのコンテキストを構成する基本単位が明確です。

また、Chat Completions は複数の候補を並列に生成して choices として返すことができ、候補の数は n パラメーターで指定します。Responses API にはこのパラメーターがなく、生成結果は 1 つだけです。

Chat Completions API
from openai import OpenAI

client = OpenAI()

completion = client.chat.completions.create(
    model="gpt-6-astra",
    messages=[
        {
            "role": "user",
            "content": "Write a one-sentence bedtime story about a unicorn.",
        }
    ],
)

print(completion.choices[0].message.content)
Responses API
from openai import OpenAI

client = OpenAI()

response = client.responses.create(
    model="gpt-6-astra",
    input="Write a one-sentence bedtime story about a unicorn.",
)

print(response.output_text)

Responses API から返されるフィールドには若干の違いがあります。message の代わりに、型付きの response オブジェクトが返されます。このオブジェクトには固有の id があります。Responses のレスポンスはデフォルトで保存されます。Chat Completions の生成結果も、新規アカウントではデフォルトで保存されます。どちらの API でも、保存を無効にするには store: false を指定します。

両 API が返すオブジェクトは構造も少し異なります。Chat Completions では choices 配列が返され、各要素に message が含まれます。Responses では、アイテムの配列が output フィールドに格納されます。

Chat Completions API
{
  "id": "chatcmpl-C9EDpkjH60VPPIB86j2zIhiR8kWiC",
  "object": "chat.completion",
  "created": 1756315657,
  "model": "gpt-5.5",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Under a blanket of starlight, a sleepy unicorn tiptoed through moonlit meadows, gathering dreams like dew to tuck beneath its silver mane until morning.",
        "refusal": null,
        "annotations": []
      },
      "finish_reason": "stop"
    }
  ],
  ...
}
Responses API
{
  "id": "resp_68af4030592c81938ec0a5fbab4a3e9f05438e46b5f69a3b",
  "object": "response",
  "created_at": 1756315696,
  "model": "gpt-5.5",
  "output": [
    {
      "id": "rs_68af4030baa48193b0b43b4c2a176a1a05438e46b5f69a3b",
      "type": "reasoning",
      "content": [],
      "summary": []
    },
    {
      "id": "msg_68af40337e58819392e935fb404414d005438e46b5f69a3b",
      "type": "message",
      "status": "completed",
      "content": [
        {
          "type": "output_text",
          "annotations": [],
          "logprobs": [],
          "text": "Under a quilt of moonlight, a drowsy unicorn wandered through quiet meadows, brushing blossoms with her glowing horn so they sighed soft lullabies that carried every dreamer gently to sleep."
        }
      ],
      "role": "assistant"
    }
  ],
  ...
}

その他の違い

  • Responses のレスポンスはデフォルトで保存されます。Chat Completions の生成結果も、新規アカウントではデフォルトで保存されます。どちらの API でも、保存を無効にするには store: false を指定します。
  • リーズニングモデルは、Responses API でツールをより効果的に使用できます。GPT-5.4 以降、Chat Completions でツールを呼び出せるのは、reasoning_effort の値が none の場合だけです。
  • 構造化出力の指定形式が異なります。Responses では response_format の代わりに text.format を使います。詳しくは構造化出力ガイドをご覧ください。
  • Function Calling では、リクエストで指定する関数の設定と、レスポンスに含まれる関数呼び出しの両方で形式が異なります。違いの詳細は Function Calling ガイドをご覧ください。
  • Responses SDK には output_text ヘルパーがあります。Chat Completions SDK にはありません。
  • Chat Completions では、会話の状態を手動で管理する必要があります。Responses API では、Conversations API で会話を永続化するか、previous_response_id を渡してレスポンスを連結できます。

Chat Completions からの移行

移行の基本は、相互に関連する 3 つの変更です。リクエストの送信先を /v1/responses に変更し、型付きアイテムの output 配列から出力を読み取ります。さらに、アプリケーションでターン間の状態をどう引き継ぐかを決めます。

1. 生成エンドポイントの変更

まず、生成エンドポイントを post /v1/chat/completions から post /v1/responses に変更します。

関数やマルチモーダル入力を使っていない場合、テキストのみのメッセージ入力は両方の API でそのまま使えます。

テキストのみのメッセージ入力の再利用
const context = [
  { role: "system", content: "You are a helpful assistant." },
  { role: "user", content: "Hello!" },
];

const completion = await client.chat.completions.create({
  model: "gpt-6-astra",
  messages: context,
});

const response = await client.responses.create({
  model: "gpt-6-astra",
  input: context,
});

Chat Completions では、messages 配列を作成し、モデルが生成したテキストを completion.choices[0].message.content から読み取ります。

モデルによるテキスト生成
import OpenAI from "openai";
const client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

const completion = await client.chat.completions.create({
  model: "gpt-6-astra",
  messages: [
    { role: "system", content: "You are a helpful assistant." },
    { role: "user", content: "Hello!" },
  ],
});
console.log(completion.choices[0].message.content);

2. メッセージとアイテムの対応付け

Chat Completions は、入力にも出力にも messages を使います。Responses は input と output に型付きアイテムの配列を使います。message はアイテムの型の 1 つで、ほかにも reasoning、function_call、function_call_output などがあります。

Chat Completions の概念 Responses での対応
messages[] input に文字列または入力アイテムの配列を指定
システムまたは開発者からの指示 トップレベルの instructions。既存の会話履歴を維持する場合は、互換性のあるメッセージアイテムも使用可能
ユーザーメッセージ role: "user" を持つ入力メッセージアイテム
アシスタントメッセージ response.output に含まれる出力メッセージアイテム。状態を手動で管理する場合は input に含めて再送
ツールまたは関数の呼び出し function_call 型の出力アイテム
ツールまたは関数の実行結果 function_call_output 型の入力アイテム。call_id で呼び出しと対応付け
n による複数候補の生成 Responses では未対応。複数の出力候補が必要な場合は個別にリクエストを送信

最終的なテキストだけが必要な場合は、SDK の output_text ヘルパーを使います。推論、ツール、マルチモーダル出力を使う場合は、response.output の各アイテムを順に取り出し、type に応じて処理します。

3. 複数ターンの会話処理の更新

アプリケーションで複数ターンの会話を扱う場合は、コンテキストを引き継ぐ処理を更新します。Responses で状態を管理する主な方法は次の 3 つです。

  • previous_response_id を使うと、過去のレスポンスのコンテキスト管理を OpenAI に任せられます。各リクエストで共通の instructions を再送してください。previous_response_id は、前のレスポンスのトップレベルの instructions を引き継ぎません。
  • コンテキストを自分で管理したり短くしたりする必要がある場合は、過去の output アイテムを次のリクエストに含めて再送します。
  • 永続的な会話オブジェクトが必要な場合は、Conversations API を使います。

Chat Completions では、会話履歴を保存し、それまでのメッセージをまとめた messages 配列をリクエストのたびに送信します。

複数ターンの会話
let messages = [
  { role: "system", content: "You are a helpful assistant." },
  { role: "user", content: "What is the capital of France?" },
];
const res1 = await client.chat.completions.create({
  model: "gpt-6-astra",
  messages,
});

messages = messages.concat([res1.choices[0].message]);
messages.push({ role: "user", content: "And its population?" });

const res2 = await client.chat.completions.create({
  model: "gpt-6-astra",
  messages,
});

previous_response_id を使う場合も、連結した過去のレスポンスの入力トークンはすべて、API の入力トークンとして課金されます。

4. 状態を保存する条件の決定

Responses のレスポンスはデフォルトで保存されます。Chat Completions の生成結果も、新規アカウントではデフォルトで保存されます。どちらの API でも、保存を無効にするには store: false を指定します。

ゼロデータ保持(ZDR)が要件となっている組織などでは、コンプライアンス要件やデータ保持ポリシーにより、Responses API に状態を保存できない場合があります。このようなケースに対応するため、OpenAI は暗号化された推論アイテムを提供しています。これにより、ワークフローをステートレスに保ちながら推論アイテムを活用できます。

状態を保存せずに推論を使い続けるには、次のように設定します。

  • store: false を store フィールドに指定します。
  • 返された推論アイテムをすべて保持し、再送します。レスポンスを作成すると、各推論アイテムにはデフォルトで encrypted_content が含まれます。

この設定では、API が暗号化した推論トークンを返します。通常の推論アイテムと同様に、以降のリクエストに含めて再送できます。 ZDR の対象組織には、OpenAI が store: false を自動的に適用します。リクエストに encrypted_content が含まれている場合、その内容はメモリ内で復号され、次のレスポンスの生成に使われた後、安全に破棄されます。新しく生成された推論トークンも直ちに暗号化して返すため、中間状態は永続化されません。

5. 関数定義と出力の更新

Chat Completions と Responses では、関数の定義に次の 2 つの違いがあります。

  1. Chat Completions では、関数定義の外側に型タグを置きます。Responses では、関数定義の中に型タグを置きます。
  2. Chat Completions では、デフォルトで関数に厳格モードを適用しません。Responses では、strict を省略すると、まず厳格モードの適用を試みます。スキーマを厳格モードに適合させられない場合は、非厳格モードで可能な限りスキーマに従って Function Calling を行い、適用したツール定義を strict: false とともに返します。Responses で明示的に非厳格モードを使うには、strict: false を指定します。

右側の Responses API の関数定義は、左側の Chat Completions の例と同じ働きをします。

Chat Completions API
{
  "type": "function",
  "function": {
    "name": "get_weather",
    "description": "Determine weather in my location",
    "strict": true,
    "parameters": {
      "type": "object",
      "properties": {
        "location": {
          "type": "string"
        }
      },
      "additionalProperties": false,
      "required": [
        "location"
      ]
    }
  }
}
Responses API
{
  "type": "function",
  "name": "get_weather",
  "description": "Determine weather in my location",
  "parameters": {
    "type": "object",
    "properties": {
      "location": {
        "type": "string"
      }
    },
    "additionalProperties": false,
    "required": [
      "location"
    ]
  }
}

Function Calling のベストプラクティス

Responses では、ツールの呼び出しとその出力は別々の型のアイテムで、call_id を使って対応付けます。Responses での仕組みについては、Function Calling のドキュメントをご覧ください。

6. 構造化出力の定義の更新

Responses API では、構造化出力の定義を指定する場所が response_format から text.format に変わりました。

構造化出力
const completion = await openai.chat.completions.create({
  model: "gpt-6-astra",
  messages: [
    {
      role: "user",
      content: "Jane, 54 years old",
    },
  ],
  response_format: {
    type: "json_schema",
    json_schema: {
      name: "person",
      strict: true,
      schema: {
        type: "object",
        properties: {
          name: {
            type: "string",
            minLength: 1,
          },
          age: {
            type: "number",
            minimum: 0,
            maximum: 130,
          },
        },
        required: ["name", "age"],
        additionalProperties: false,
      },
    },
  },
  reasoning_effort: "medium",
});

7. ストリーム受信処理の更新

Chat Completions のストリーミングでは、delta フィールドを含むチャンクが順次返されます。Responses のストリーミングでは、型付きのサーバー送信イベントを使います。ストリームの受信処理を更新し、各イベントの type に応じて処理を分岐させ、UI やオーケストレーション層で必要なイベントを処理してください。

テキストのストリーミングでは、次のようなイベントを監視します。

  • response.created
  • response.output_text.delta
  • response.completed
  • error

Function Calling のストリームでは、response.function_call_arguments.delta や response.function_call_arguments.done などのイベントも発生します。Responses のストリーミングガイドと Responses のストリーミングイベントリファレンスをご覧ください。

8. ネイティブツールへの移行

OpenAI のネイティブツールがアプリケーションの用途に合っている場合は、ツールの呼び出しを更新すると、OpenAI が提供するツールをそのまま使えます。

Chat Completions では、OpenAI がホストするツールをネイティブに使えないため、ツールとの連携を自分で実装する必要があります。 この例では、GPT-5.6 Terra の推論を無効にしています。GPT-6 Astra と GPT-6.1 Sol でツールを呼び出すには Responses API が必要です。

ウェブ検索ツール
async function web_search(query) {
  const res = await fetch(`https://api.example.com/search?q=${query}`);
  const data = await res.json();
  return data.results;
}

const completion = await client.chat.completions.create({
  model: "gpt-5.6-terra",
  reasoning_effort: "none",
  messages: [
    { role: "system", content: "You are a helpful assistant." },
    { role: "user", content: "Who is the current president of France?" },
  ],
  functions: [
    {
      name: "web_search",
      description: "Search the web for information",
      parameters: {
        type: "object",
        properties: { query: { type: "string" } },
        required: ["query"],
      },
    },
  ],
});

9. 移行時によくある誤りの確認

Chat Completions から Responses にコードを移行する際は、次の誤りに注意してください。

  • choices[0].message.content から読み取ろうとすること。Responses では response.output_text または response.output から読み取ります。
  • output の各要素をすべてメッセージとして扱うこと。推論、ツール呼び出し、関数呼び出しにはそれぞれ別のアイテム型があります。
  • 次のレスポンスに手動でコンテキストを引き継ぐ際に、推論、関数呼び出し、関数呼び出しの出力のいずれかのアイテムを渡し忘れること
  • 対応する call_id を付けずに関数の実行結果を送信すること
  • Responses のリクエストで response_format を指定してしまうこと。Responses では text.format を使います。
  • Chat Completions のストリーミング用チャンクハンドラーを流用し、Responses の型付きイベントを処理しないこと
  • previous_response_id を使えば過去のコンテキストが課金対象から外れると考えること。連結した過去のレスポンスの入力トークンには、引き続き入力トークンとして料金がかかります。

段階的な移行のチェックリスト

Chat Completions のサポートは継続しているため、ユーザーフローごとに移行できます。

  • テキスト生成のフローから始めます。
  • エンドポイント、リクエストボディ、出力の処理を更新します。
  • フローで previous_response_id を使うか、アイテムを手動で再送するか、Conversations API を使うかを決めます。
  • ステートレスなフローや ZDR が適用されるフローでは、store: false を追加します。ターン間で推論のコンテキストを引き継ぐ必要がある場合は、暗号化された推論アイテムもリクエストに含めます。
  • 関数定義を移行し、関数呼び出しの出力に正しい call_id が含まれていることを確認します。
  • 構造化出力のスキーマを response_format から text.format に移します。
  • ストリームの受信処理を更新し、Responses の型付きイベントを処理できるようにします。
  • ワークフローに適した箇所では、独自のオーケストレーションを OpenAI がホストするツールに置き換えます。
  • Responses に振り分けるトラフィックを増やす前に、動作、レイテンシ、トークン使用量、エラーを比較します。

OpenAI の最新機能や改善を活用できるよう、すべてのフローを段階的に Responses API に移行することを推奨します。

Assistants API

Assistants API のベータ版に寄せられた開発者のフィードバックをもとに、Responses API には柔軟性、速度、使いやすさを高める改善を取り入れました。今後、OpenAI でエージェントを構築するための基盤となるのは Responses API です。

Assistants API は 2026 年 8 月 26 日に正式に提供を終了し、現在は利用できません。移行ガイドに沿って、アプリケーションの連携先を Responses API に変更してください。