OpenAI Responses API完全ガイド — Chat Completions APIからの移行方法と新機能を徹底解説
OpenAI Responses APIの使い方を初心者向けに解説。Chat Completions APIとの違い、ストリーミング、ツール呼び出し、ステートフルな会話管理、移行手順までステップバイステップで紹介します。
「OpenAIのAPIを使うなら、もうChat Completionsではなく Responses API が新しいスタンダードです。」 2025年に登場したResponses APIは、従来のChat Completions APIの後継として位置づけられ、より柔軟で強力な機能を提供します。筆者も既存プロジェクトの移行を段階的に進めていますが、特にステートフルな会話管理の楽さには感動しました。
本記事では、Responses APIの基本的な使い方からストリーミング、ツール呼び出し、ステートフルな会話管理まで、実際のコード例を交えて解説します。既存のChat Completions APIからの移行ガイドも用意しています。
Responses APIとは
Responses APIは、OpenAIが提供する新しいAPI基盤です。従来のChat Completions APIの機能をすべて包含しつつ、組み込みツールやマルチターン会話のステート管理といった新機能が追加されています。
Chat Completions APIとの主な違い
| 項目 | Chat Completions API | Responses API |
|---|---|---|
| エンドポイント | /v1/chat/completions | /v1/responses |
| 会話管理 | 毎回メッセージ履歴を送信 | previous_response_idでサーバー側管理 |
| 組み込みツール | なし(Function Callingのみ) | Web検索、ファイル検索、コード実行 |
| ストリーミング | SSE(Server-Sent Events) | SSE(より詳細なイベント) |
| 出力形式 | choices[0].message | output[]配列 |
| ステータス | 引き続き利用可能 | 今後の推奨API |
なぜResponses APIに移行すべきか
- 組み込みツール: Web検索やコード実行をAPI単体で利用可能
- 会話管理の簡素化: サーバー側でステート管理でき、クライアントの実装がシンプルに
- 新機能の優先提供: 今後の新機能はResponses APIを中心に開発される
- 下位互換性: Chat Completions APIのパラメータの多くがそのまま使える
基本的な使い方
セットアップ
# OpenAI Pythonライブラリのインストール(1.x系)
pip install openai --upgrade
from openai import OpenAI
client = OpenAI() # 環境変数 OPENAI_API_KEY を自動読み取り
最もシンプルなリクエスト
response = client.responses.create(
model="gpt-4o",
input="Pythonでフィボナッチ数列を計算する関数を書いてください"
)
print(response.output_text)
Chat Completions APIでは messages パラメータにロールとコンテンツを指定する必要がありましたが、Responses APIでは input に文字列を渡すだけで動作します。
システムプロンプトの設定
response = client.responses.create(
model="gpt-4o",
instructions="あなたは経験豊富なPythonエンジニアです。コード例を交えて簡潔に回答してください。",
input="デコレータの使い方を教えてください"
)
print(response.output_text)
instructions パラメータが、Chat Completions APIの system ロールに相当します。
メッセージ形式での入力
より細かく制御したい場合は、従来と同様のメッセージ形式も使えます。
response = client.responses.create(
model="gpt-4o",
input=[
{"role": "developer", "content": "簡潔に日本語で回答してください"},
{"role": "user", "content": "RESTとGraphQLの違いは?"}
]
)
print(response.output_text)
ロール名が system から developer に変更されている点に注意してください。
ストリーミング
レスポンスをリアルタイムに受け取るストリーミングは、UX向上に不可欠です。
基本的なストリーミング
stream = client.responses.create(
model="gpt-4o",
input="マイクロサービスアーキテクチャのメリットとデメリットを説明してください",
stream=True
)
for event in stream:
if event.type == "response.output_text.delta":
print(event.delta, end="", flush=True)
print() # 改行
ストリーミングイベントの種類
Responses APIのストリーミングでは、より詳細なイベントが提供されます。
for event in stream:
match event.type:
case "response.created":
print("レスポンス生成開始")
case "response.output_item.added":
print("新しい出力アイテム追加")
case "response.output_text.delta":
print(event.delta, end="")
case "response.output_text.done":
print("\nテキスト出力完了")
case "response.completed":
print("レスポンス完了")
print(f"トークン使用量: {event.response.usage}")
ストリーミングのイベント一覧
| イベント | 説明 |
|---|---|
response.created | レスポンスの生成開始 |
response.in_progress | 処理中 |
response.output_item.added | 新しい出力項目の追加 |
response.output_text.delta | テキストの差分データ |
response.output_text.done | テキスト出力の完了 |
response.completed | レスポンス全体の完了 |
response.failed | エラー発生 |
ツール呼び出し(Function Calling)
Responses APIでは、従来のFunction Callingに加え、組み込みツールが利用可能です。
カスタム関数の定義
tools = [
{
"type": "function",
"name": "get_weather",
"description": "指定した都市の天気情報を取得します",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "都市名(例: 東京、大阪)"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "温度の単位"
}
},
"required": ["city"]
}
}
]
response = client.responses.create(
model="gpt-4o",
input="東京の今日の天気は?",
tools=tools
)
ツール呼び出しの処理
import json
# レスポンスからツール呼び出しを取得
for item in response.output:
if item.type == "function_call":
function_name = item.name
arguments = json.loads(item.arguments)
call_id = item.call_id
print(f"関数: {function_name}")
print(f"引数: {arguments}")
# 実際の関数を実行(ここでは仮の結果を返す)
result = {"temperature": 22, "condition": "晴れ", "humidity": 45}
# 関数の結果をAPIに返す
response = client.responses.create(
model="gpt-4o",
input=[
{"role": "user", "content": "東京の今日の天気は?"},
item, # ツール呼び出しのアイテム
{
"type": "function_call_output",
"call_id": call_id,
"output": json.dumps(result)
}
],
tools=tools
)
print(response.output_text)
組み込みツール: Web検索
Responses APIの大きな特徴である組み込みWeb検索を使ってみましょう。
response = client.responses.create(
model="gpt-4o",
input="2026年のPython最新バージョンは何ですか?",
tools=[{"type": "web_search_preview"}]
)
print(response.output_text)
web_search_preview を指定するだけで、モデルが必要に応じて自動的にWeb検索を行い、最新の情報を含む回答を生成します。
組み込みツール: コードインタープリター
response = client.responses.create(
model="gpt-4o",
input="1から100までの素数をリストアップして、その個数も教えてください",
tools=[{"type": "code_interpreter"}]
)
print(response.output_text)
ステートフルな会話管理
Responses APIの最も革新的な機能の一つが、サーバーサイドでの会話状態管理です。
従来の方法(Chat Completions API)
# 従来: 毎回すべてのメッセージ履歴を送信する必要があった
messages = [
{"role": "system", "content": "あなたはPythonの専門家です"},
{"role": "user", "content": "リスト内包表記とは?"},
{"role": "assistant", "content": "リスト内包表記とは..."},
{"role": "user", "content": "具体例を教えて"}, # ← 履歴全体を送る
]
新しい方法(Responses API)
# 1回目のリクエスト
response1 = client.responses.create(
model="gpt-4o",
instructions="あなたはPythonの専門家です",
input="リスト内包表記とは?"
)
print(response1.output_text)
print(f"Response ID: {response1.id}")
# 2回目のリクエスト — previous_response_id で会話を継続
response2 = client.responses.create(
model="gpt-4o",
previous_response_id=response1.id,
input="具体例を教えて"
)
print(response2.output_text)
# 3回目以降も同様
response3 = client.responses.create(
model="gpt-4o",
previous_response_id=response2.id,
input="ネストした場合はどう書くの?"
)
print(response3.output_text)
previous_response_id を指定するだけで、サーバー側に保存された会話履歴が自動的に参照されます。クライアント側でメッセージ配列を管理する必要がありません。
ステートフル会話の利点
- クライアント実装の簡素化: メッセージ履歴の管理が不要
- トークン計算の省略: サーバー側で自動的に処理
- 長い会話の効率化: 毎回全履歴を送信するオーバーヘッドがない
会話履歴の取得
保存された会話履歴を取得することもできます。
# 特定のレスポンスを取得
response = client.responses.retrieve(response_id="resp_abc123")
# 入力項目を含めて取得
response = client.responses.retrieve(
response_id="resp_abc123",
include=["input"]
)
Structured Outputs(構造化出力)
APIのレスポンスをJSON形式で受け取りたい場合に便利な機能です。
from pydantic import BaseModel
class BookReview(BaseModel):
title: str
author: str
rating: int
summary: str
pros: list[str]
cons: list[str]
response = client.responses.parse(
model="gpt-4o",
input="『リーダブルコード』のレビューを書いてください",
text_format=BookReview
)
review = response.output_parsed
print(f"タイトル: {review.title}")
print(f"評価: {review.rating}/5")
print(f"良い点: {', '.join(review.pros)}")
Chat Completions APIからの移行ガイド
既存のコードをResponses APIに移行する手順を解説します。
移行マッピング
| Chat Completions API | Responses API | 備考 |
|---|---|---|
messages | input | 文字列またはメッセージ配列 |
system ロール | instructions または developer ロール | |
response.choices[0].message.content | response.output_text | |
functions / tools | tools | 形式はほぼ同じ |
max_tokens | max_output_tokens | パラメータ名変更 |
stream=True | stream=True | イベント形式が異なる |
移行前のコード
# Chat Completions API
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "簡潔に回答してください"},
{"role": "user", "content": "Dockerとは?"}
],
max_tokens=500,
temperature=0.7
)
result = response.choices[0].message.content
移行後のコード
# Responses API
response = client.responses.create(
model="gpt-4o",
instructions="簡潔に回答してください",
input="Dockerとは?",
max_output_tokens=500,
temperature=0.7
)
result = response.output_text
段階的な移行のすすめ
一度にすべてを移行する必要はありません。以下の順序を推奨します。
- 新規機能 → Responses APIで実装
- シンプルなエンドポイント → 順次移行
- 複雑な会話フロー → ステートフル機能を活用して移行
- ストリーミング → イベント処理を書き換えて移行
Chat Completions APIは当面廃止されないため、既存のプロダクションコードは安定してからの移行で問題ありません。Chat Completions APIの基本的な使い方はChatGPT API Pythonガイド、Assistants APIとの詳しい比較はOpenAI Assistants vs Claude Tool Useで解説しています。
エラーハンドリング
from openai import OpenAI, APIError, RateLimitError, APIConnectionError
client = OpenAI()
try:
response = client.responses.create(
model="gpt-4o",
input="テスト"
)
print(response.output_text)
except RateLimitError as e:
print(f"レート制限に到達: {e}")
# リトライロジックを実装
except APIConnectionError as e:
print(f"接続エラー: {e}")
# ネットワーク状態を確認
except APIError as e:
print(f"APIエラー: {e.status_code} - {e.message}")
# エラー内容に応じた処理
リトライの実装
import time
from openai import RateLimitError
def create_response_with_retry(client, max_retries=3, **kwargs):
"""リトライ付きのレスポンス生成"""
for attempt in range(max_retries):
try:
return client.responses.create(**kwargs)
except RateLimitError:
if attempt < max_retries - 1:
wait_time = 2 ** attempt # 指数バックオフ
print(f"レート制限。{wait_time}秒後にリトライ...")
time.sleep(wait_time)
else:
raise
# 使用例
response = create_response_with_retry(
client,
model="gpt-4o",
input="テスト"
)
料金について
Responses APIの料金はChat Completions APIと同じトークン単価です。ただし、組み込みツールを使用する場合は追加料金が発生します。
| 組み込みツール | 追加料金 |
|---|---|
| Web検索 | 検索1回あたり約$0.03〜 |
| コードインタープリター | セッションあたり約$0.03 |
| ファイル検索 | クエリあたり約$0.025 |
まとめ — Responses APIで次世代のAI開発を
OpenAI Responses APIは、Chat Completions APIの正当な後継として以下の利点を提供します。
- シンプルなインターフェース:
inputとoutput_textで直感的に操作 - 組み込みツール: Web検索やコード実行をAPI単体で利用可能
- ステートフルな会話:
previous_response_idで会話管理がサーバーサイドに - 構造化出力: Pydanticモデルで型安全なレスポンスを取得
- 下位互換性: 既存コードからの段階的な移行が可能
新規プロジェクトではResponses APIを選択し、既存プロジェクトは安定してからの段階的な移行を推奨します。大量のリクエストを処理する場合はChatGPT API Batch処理でコストを削減できます。また、料金面でClaude APIと迷っている方はChatGPT vs Claude API料金比較も参考にしてください。まずはシンプルなリクエストから試して、組み込みツールやステートフルな会話といった新機能の便利さを体感してみてください。