【備忘録】OpenAIのResponses APIとChat Completions APIの比較

新しいアプリケーションを開発する際の参考にするため、OpenAIが提供する「Responses API」と「Chat Completions API」の違いを整理しました。自分の備忘録としてまとめておきます。

## 引用元情報

https://platform.openai.com/docs/guides/responses-vs-chat-completions


## Responses APIとは？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/7ef55a4c-f725-4aae-a5f5-0995ba36fbc1.png)

Responses APIはOpenAIの新しいコアAPIの一つであり、Chat Completionsのシンプルさと、より多くのエージェント的なタスクを実行する能力を組み合わせた、エージェントAPIプリミティブです。モデル機能が進化するにつれて、Responses APIは、アクション指向のアプリケーションを構築するための基盤となり、現時点では以下の組み込みツールを備えています：

* Webサーチ
* ファイル検索
* コンピュータ使用

OpenAIは、新規ユーザーにはResponses APIの使用を推奨しています。

## 機能比較

| 機能 | Chat Completions API | Responses API |
|---|---|---|
| テキスト生成 | ✓ | ✓ |
| 音声 | ✗ | 開発中（提供時期未定） |
| 画像認識 | ✓ | ✓ |
| 構造化出力 | ✓ | ✓ |
| 関数呼び出し | ✓ | ✓ |
| Webサーチ | ✗ | ✓ |
| ファイル検索 | ✗ | ✓ |
| コンピュータ使用 | ✗ | ✓ |
| コードインタープリタ | ✗ | 開発中（提供時期未定） |

## Chat Completions APIの今後について

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/e15668a4-fdbf-4d5f-aa87-9f15f276e3d4.png)

Chat Completions APIはAIアプリケーション構築のための一般的なAPIであり、OpenAIはこのAPIを継続的にサポートする意向を示しています。Responses APIは、ツールの使用、コード実行、状態管理を含むワークフローを簡素化するために導入されました。ただし、両APIの長期的な位置づけについては、今後の開発状況や利用者のニーズによって変化する可能性があります。

## ステートフルAPIとセマンティックイベント

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/a8cc1aea-a63e-4a5a-ae34-161d26353b65.png)

Responses APIではイベント処理の方法が異なります。予測可能なイベント駆動型アーキテクチャを持つ一方、Chat Completions APIはトークンが生成されるたびにcontentフィールドに継続的に追加し、各状態間の差異を手動で追跡する必要があります。

Responses APIは、何が変更されたか（特定のテキスト追加など）を詳細に記述するセマンティックイベントを明確に発行するため、特定の発行されたイベント（テキスト変更など）を対象とした統合を作成できます。これにより、統合が簡素化され、型の安全性が向上する可能性があります。

## コード比較

### テキスト生成の例

両方のAPIは、モデルから出力を生成する機能を提供しています。Chat Completionsでは`messages`配列が必要ですが、Responsesでは`input`（文字列または配列）が必要です。

**Chat Completions API：**

```python
from openai import OpenAI
client = OpenAI()

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

print(completion.choices[0].message.content)
```

**Responses API：**

```python
from openai import OpenAI
client = OpenAI()

response = client.responses.create(
  model="gpt-4o",
  input=[
      {
          "role": "user",
          "content": "Write a one-sentence bedtime story about a unicorn."
      }
  ]
)

print(response.output_text)
```

### レスポンスの違い

Responses APIからレスポンスを受け取ると、フィールドが少し異なります。`message`の代わりに、独自の`id`を持つ型付き`response`オブジェクトを受け取ります。

**Chat Completions APIのレスポンス：**

```json
[
  {
      "index": 0,
      "message": {
          "role": "assistant",
          "content": "Under the soft glow of the moon, Luna the unicorn danced through fields of twinkling stardust, leaving trails of dreams for every child asleep.",
          "refusal": null
      },
      "logprobs": null,
      "finish_reason": "stop"
  }
]
```

**Responses APIのレスポンス：**

```json
[
  {
      "id": "msg_67b73f697ba4819183a15cc17d011509",
      "type": "message",
      "role": "assistant",
      "content": [
          {
              "type": "output_text",
              "text": "Under the soft glow of the moon, Luna the unicorn danced through fields of twinkling stardust, leaving trails of dreams for every child asleep.",
              "annotations": []
          }
      ]
  }
]
```

## その他の注目すべき違い

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/f7fd488e-814f-4bfd-9011-f97d3293d123.png)

* Responses APIは`output`を返しますが、Chat Completions APIは`choices`配列を返します
* 構造化出力のAPI形状が異なります。Responsesでは`response_format`の代わりに`text.format`を使用します
* 関数呼び出しのAPI形状が異なります（リクエストの関数設定とレスポンスで送り返される関数呼び出しの両方）
* 推論が異なります。Chat Completionsの`reasoning_effort`の代わりに、Responses APIでは`reasoning.effort`を使用します
* Responses SDKには`output_text`ヘルパーがありますが、Chat Completions SDKにはありません
* 会話状態：Chat Completionsでは会話状態を自分で管理する必要がありますが、Responsesには長時間実行される会話を支援する`previous_response_id`があります
* レスポンスはデフォルトで保存されます。新規アカウントのChat completionsもデフォルトで保存されます。ストレージを無効にするには、`store: false`を設定します

## 既存のAPIへの影響

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/9e1f527c-0d78-46a7-951d-f7f8eb8acc96.png)

### Chat Completions

Chat Completions APIは現在広く使用されているAPIであり、OpenAIは現時点では新しいモデルと機能のサポートを継続する方針です。アプリケーションに組み込みツールが必要ない場合は、当面はChat Completionsを使用することができます。

OpenAIの発表によれば、組み込みツールや複数のモデル呼び出しに依存しない新しいモデルは、Chat Completionsにもリリースされる予定です。一方、エージェントワークフロー向けに特別に設計された機能については、Responses APIが推奨されています。

### Assistants

[Assistants API](https://platform.openai.com/docs/api-reference/assistants)ベータからの開発者フィードバックに基づいて、Responses APIには改善が組み込まれています。OpenAIによれば、Responses APIは、OpenAI上でエージェントを構築するための将来の方向性を表しているとのことです。

OpenAIは、AssistantsとResponses APIの間で機能パリティを達成するための作業を進めており、現時点の計画では、Assistant風およびThread風オブジェクトやCode Interpreterツールのサポートなどが含まれています。この作業が完了した後、OpenAIはAssistants APIの正式な廃止を発表する予定であり、2026年前半をサンセット日の目標としていますが、この時期は変更される可能性があります。

OpenAIは、廃止が発表された際には、開発者がデータを保持し、アプリケーションを移行できるよう、Assistants APIからResponses APIへの移行ガイドを提供する予定です。正式に廃止が発表されるまで、AssistantsAPIには新しいモデルが提供される見込みです。

## 開発における考慮点

![openai-api-evolution.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/090f51ab-fe81-4414-9c55-a2e5dce69008.png)

Responses APIはエージェント機能を備えたOpenAIの新しいAPIです。Chat Completions APIはすぐに廃止される予定はありませんが、現在のOpenAIの方針によれば、将来的にはResponses APIがより多くの機能を持つことになる見込みです。新規開発では、プロジェクトの要件に応じてResponses APIの採用を検討することも選択肢の一つでしょう。

OpenAIの現在の計画では、Assistants APIは2026年前半に廃止される予定とされていますので、現在利用している場合は将来的な移行の可能性を考慮に入れておくことが望ましいでしょう。

## 注意事項

本記事は2025年3月時点の情報に基づいていますが、OpenAIの製品やAPIは頻繁に更新され、計画も変更される可能性があります。最新かつ正確な情報については、必ずOpenAIの公式ドキュメント（[https://platform.openai.com/docs/](https://platform.openai.com/docs/)）を確認してください。特に新機能の実装や廃止予定のタイミングなどは変更される可能性が高いので注意が必要です。

また、APIの使用方法や料金体系も変更される場合がありますので、実装前に公式情報で最新状況を確認することを強くお勧めします。