
OpenAI Responses APIチュートリアル:Python開発者向けの実行可能サンプル14選
本当に必要なOpenAI Responses APIのチュートリアルをお届けします。組み込みツール、ストリーミング、関数呼び出し、MCP、そしてChat Completionsからの3ステップ移行を網羅した、14の実行可能なPythonサンプルを用意しました。Responses APIは2025年3月11日に、エージェントスタイルのアプリケーション向けの統一プリミティブとしてOpenAIからリリースされ、2026年4月現在、すべての新しいOpenAIプロジェクトにおける推奨スタート地点となっています。以下のすべてのサンプルは、2026年4月に最新の openai>=1.50 Python SDKに対してテスト済みです。どのコードブロックもそのまま実行可能です。
主なポイント
- Responses API(2025年3月11日リリース)は、Chat Completions、Assistants、および組み込みツールを1つのステートフルなプリミティブに統合します。
web_search、file_search、code_interpreter、computer_use、image_generation、そしてリモートMCPサーバーを標準でサポートしています。- Chat Completionsからの移行は3ステップで完了します:エンドポイントの変更、
messages→inputの名前変更、ツールスキーマの更新。- 軽量な状態管理には
previous_response_id(store: trueと併用)を、信頼性の高いマルチターンセッションには Conversations API を使用します。
OpenAI Responses APIとは?
OpenAI Responses API は、2025年3月にリリースされた統一プリミティブで、Chat CompletionsのシンプルさとAssistants APIのツール利用機能を組み合わせます。テキストと画像の入力、組み込みツール(Web検索、ファイル検索、コードインタープリター、コンピューター操作、画像生成)、関数呼び出し、構造化出力、ストリーミング、そして previous_response_id を介したステートフルな会話をサポートしています。
では、なぜChat Completionsがすでに機能しているのに、OpenAIは第3のAPIを提供したのでしょうか?それは、エージェントループ(モデルがツールを呼び出し、結果を取得し、次の行動を決定するプロセス)を chat.completions の上に構築するのが不自然だったからです。最終的には messages 配列間でツールの結果を行き来させたり、Assistants APIでスレッドIDを管理したり、独自の状態管理を実装したりすることになっていました。Responses APIはこのループを第一級の概念として扱います。
2026年に新しいOpenAIプロジェクトを始める場合、Responses APIがデフォルトであり、Chat Completionsは移行対象となるレガシープリミティブです。大きな例外は、リアルタイム音声(Realtime APIを使用)と純粋な埋め込み(Embeddings APIを使用)です。それ以外、チャットボット、エージェント、RAGパイプライン、構造化データ抽出器などについては、Responses APIがOpenAIのドキュメントや OpenAIのアナウンス投稿 で推奨されています。
複数のモデルをオーケストレーションする場合や、より高レベルの足場となるレイヤーが必要な場合は、通常、Responses APIを OpenAI Agents SDK と組み合わせて使用します。トレードオフについては OpenAI Agents SDK比較 で詳しく解説していますが、要約すると:Responsesはプリミティブであり、Agents SDKはフレームワークです。
Responses APIはChat Completionsとどう違うのか?
Responses APIは Chat Completionsのスーパーセット です。Chat Completionsのすべての機能はResponsesでも動作し、さらに組み込みツール、ステートフル性、エージェントループが追加されています。OpenAIはすべての新しいプロジェクトでResponsesを推奨しています。Chat Completinsは引き続きサポートされています が、エージェントのためのデフォルトプリミティブではなくなりました。
以下は OpenAIプラットフォームドキュメント に基づいた比較表です。
| 機能 | Responses API | Chat Completions | Assistants API |
|---|---|---|---|
| 入力の形状 | input(文字列または配列) | messages 配列 | スレッド + メッセージ |
| ステートフル | はい(previous_response_id) | いいえ(履歴を送信) | はい(スレッド) |
| 組み込みツール | 全5種 + MCP | なし | コードインタープリター、ファイル検索 |
| ストリーミング | はい(型付きSSEイベント) | はい | はい |
| 関数呼び出し | はい(フラットな tools 配列) | はい(フラットな tools 配列) | はい(アシスタントごと) |
| マルチモーダル入力 | テキスト + 画像 + ファイル | テキスト + 画像 | テキスト + 画像 + ファイル |
| 推奨用途 | エージェント、新規プロジェクト | 単純な補完、レガシー | 廃止予定(2026年) |
| ステータス(2026年4月) | 新規プロジェクトのデフォルト | レガシー、引き続きサポート | サポート終了へ移行中 |
Chat Completionsのすべての機能はResponsesで動作しますが、その逆は成り立ちません。判断基準はシンプルです。組み込みツール、ステートフル性が必要か、あるいは新規プロジェクトであれば、Responsesを使用してください。安定したChat Completionsパイプラインがあり、ツールに触れておらず、ゲートウェイがまだResponsesをサポートしていない場合、移行は急務ではありませんが、古いAPIで新しいエージェントを構築しないでください。
セットアップと最初のResponses API呼び出し
最初のResponses API呼び出しを行うには、OpenAI Python SDK 1.50以降をインストールし、OPENAI_API_KEY 環境変数を設定して、model と input を指定して client.responses.create() を呼び出します。完全なHello Worldの例は60秒以内で実行できます。
ステップ1 — SDKのインストール:
pip install --upgrade "openai>=1.50"ステップ2 — APIキーの設定:
export OPENAI_API_KEY="sk-proj-..."(Windows PowerShellの場合:$env:OPENAI_API_KEY = "sk-proj-..."。これをgitにコミットしないでください。ローカル開発には .env ファイルと python-dotenv を使用してください。)
ステップ3 — Hello World呼び出し:
from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="gpt-5",
input="Say hello in exactly 5 words.",
)
print(response.output_text)これを実行すると、5単語の挨拶が返ってきます。output_text ヘルパーはすべてのテキストチャンクを1つの文字列に連結するため、構造化出力を気にしない場合に便利です。
ステップ4 — レスポンスオブジェクトの検査:
print("ID: ", response.id)
print("Status: ", response.status)
print("Model: ", response.model)
print("Output: ", response.output) # list of output items
print("First text:", response.output[0].content[0].text)
print("Usage: ", response.usage) # input_tokens, output_tokensこの response.output 配列は暗記すべき重要な要素です。これは、テキスト、ツール呼び出し、ツール結果、推論サマリーといった型付きアイテムのリストです。組み込みツールの使用を開始すると、これを頻繁に反復処理することになります。
Responses APIでレスポンスをストリーミングするには?
Responses APIでのストリーミングには Server-Sent Events を使用します。client.responses.create() に stream=True を渡し、結果のイベントストリームを反復処理します。各イベントには type フィールドがあり、トークンチャンクには response.output_text.delta、最終ペイロードには response.completed が含まれます。SDK 1.50+ は型付きイベントストリームを公開しています。
UIにトークンをレンダリングする場合は、response.output_text.delta イベントを反復処理し、その他は無視します。
from openai import OpenAI
client = OpenAI()
with client.responses.stream(
model="gpt-5",
input="Write a haiku about Python decorators.",
) as stream:
for event in stream:
if event.type == "response.output_text.delta":
print(event.delta, end="", flush=True)
elif event.type == "response.error":
print(f"\n[error] {event.error}")
break
elif event.type == "response.completed":
print("\n[done]")
final = stream.get_final_response()
print(f"\nTokens: {final.usage.output_tokens}")テスト中に遭遇したいくつかの落とし穴:ストリームコンテキストマネージャーは接続クリーンアップを自動的に処理するため、手動で閉じないでください。非同期処理が必要な場合は、OpenAI() を AsyncOpenAI() に置き換え、async with と async for を使用します。イベント名や形状は同じです。
組み込みツール:Web検索、ファイル検索、コードインタープリター、コンピューター操作、画像生成
Responses APIには 5つの組み込みツール が付属しています:ライブインターネット検索用の web_search、ベクトルストア取得用の file_search、サンドボックス化されたPython実行用の code_interpreter、ブラウザ/デスクトップ自動化用の computer_use、インライン画像作成用の image_generation です。tools 配列に {"type": "<tool_name>"} を追加することで、いずれかを有効にできます。
エディタの横に常にピン留めしているマトリックスはこちらです。
| ツール | 目的 | コスト | ステートフル | モデル | 本番環境対応(2026年4月) |
|---|---|---|---|---|---|
web_search | ライブインターネット検索 | 呼び出しごとの追加料金 | いいえ | gpt-5, gpt-4.1 | はい |
file_search | ベクトルストアRAG | 呼び出しごと + ストレージ | はい(ベクトルストア) | gpt-5, gpt-4.1, oシリーズ | はい |
code_interpreter | サンドボックス化されたPython | セッションごと | はい(コンテナ) | gpt-5, oシリーズ | はい |
computer_use | ブラウザ/デスクトップ制御 | 呼び出しごとの追加料金 | セッションごと | gpt-5(プレビュー) | プレビュー |
image_generation | インライン画像作成 | 画像ごと | いいえ | gpt-5, gpt-image-1 | はい |
パイプラインで web_search をベンチマークしたところ、最初の呼び出しで1.5〜3秒の遅延が発生しましたが、繰り返し呼び出しではキャッシュされました。UI設計時にこれを考慮に入れてください。深く掘り下げたい場合は、OpenAI CookbookのWeb検索例 が最もクリーンな参照資料です。
Web検索
from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="gpt-5",
tools=[{"type": "web_search"}],
input="What did OpenAI announce at DevDay 2025? Cite your sources.",
)
print(response.output_text)
# Inspect the web_search_call items in response.output for raw search hits
for item in response.output:
if item.type == "web_search_call":
print(f"[searched] {item.query}")ファイル検索
ファイル検索は2段階のプロセスです。ベクトルストアを作成し、ファイルをアップロードしてから、tools 配列でストアIDを参照します。
from openai import OpenAI
client = OpenAI()
# 1. Create a vector store + upload a file
store = client.vector_stores.create(name="company-handbook")
client.vector_stores.files.upload_and_poll(
vector_store_id=store.id,
file=open("handbook.pdf", "rb"),
)
# 2. Use it in a Responses call
response = client.responses.create(
model="gpt-5",
input="What's our PTO policy?",
tools=[{
"type": "file_search",
"vector_store_ids": [store.id],
}],
)
print(response.output_text)コードインタープリター
モデルにCSV上でPythonを実行させて何かをグラフ化したいですか?code_interpreter がサンドボックス化されたコンテナでそれを行います。
from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="gpt-5",
input="Read sales.csv and plot monthly revenue as a bar chart. Return a summary.",
tools=[{"type": "code_interpreter", "container": {"type": "auto"}}],
)
print(response.output_text)コンテナは同じセッション内の呼び出し間で持続するため、モデルがデータフレームに対して反復処理を続けたい場合に役立ちます。
コンピューター操作
2026年4月現在、まだプレビュー段階です。モデルは仮想ブラウザ/デスクトップを受け取り、タスクを完了するためにクリック等操作を行います。Playwright/Seleniumの世界ですでに解決できない特定のブラウザ自動化ユースケースがない限り、これはスキップしてください。
画像生成
from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="gpt-5",
input="Generate a diagram showing a CI/CD pipeline with build, test, and deploy stages.",
tools=[{"type": "image_generation"}],
)
# Image bytes live in image_generation_call items
for item in response.output:
if item.type == "image_generation_call":
with open("pipeline.png", "wb") as f:
f.write(item.result)カスタムツールを使用した関数呼び出し
Responses APIの関数呼び出しにより、モデルは独自のPython関数を呼び出すことができます。各関数を tools 配列内のJSONスキーマとして定義し、呼び出しを実行し、response.output で function_call アイテムを確認し、関数を実行して、function_call_output を介して結果を戻します。
Responses APIは、エージェントループに処理を任せることで、関数呼び出しを4ステップの手順から単一のラウンドトリップに変換します。以下は通貨変換の完全な例です。
import json
from openai import OpenAI
client = OpenAI()
def convert_currency(amount: float, from_currency: str, to_currency: str) -> dict:
# Real impl would hit an FX API. Stubbed for the example.
rate = 1.08 if (from_currency, to_currency) == ("USD", "EUR") else 1.0
return {"amount": amount * rate, "currency": to_currency}
tools = [{
"type": "function",
"name": "convert_currency",
"description": "Convert an amount from one currency to another.",
"parameters": {
"type": "object",
"properties": {
"amount": {"type": "number"},
"from_currency": {"type": "string"},
"to_currency": {"type": "string"},
},
"required": ["amount", "from_currency", "to_currency"],
},
}]
# Turn 1: model decides to call our function
first = client.responses.create(
model="gpt-5",
input="How much is 250 USD in EUR?",
tools=tools,
)
# Find the function_call item, run it, send the result back
for item in first.output:
if item.type == "function_call" and item.name == "convert_currency":
args = json.loads(item.arguments)
result = convert_currency(**args)
second = client.responses.create(
model="gpt-5",
previous_response_id=first.id,
input=[{
"type": "function_call_output",
"call_id": item.call_id,
"output": json.dumps(result),
}],
tools=tools,
)
print(second.output_text)これが完全なループです。このパターンに慣れていない場合は、概念的なモデルについて説明している 関数呼び出しの基礎 の投稿をご覧ください。また、スキーマを手書きしたくない場合は、関数呼び出しライブラリのまとめ も維持しています。tool_choice パラメータ("auto"、"required"、または特定のツール名に設定)は、決定論性が必要な場合にツール呼び出しを強制または禁止するためのレバーです。
構造化出力(JSONスキーマとPydantic)
構造化出力 は、モデルがスキーマに準拠したJSONを返すことを保証します。response_format={"type": "json_schema", "json_schema": {...}} パラメータを渡すか、Python SDKを使用している場合は、client.responses.parse() を介してPydanticモデルを直接渡します。モデルはプロンプト時だけでなく、デコード時に制約されます。
from openai import OpenAI
from pydantic import BaseModel
client = OpenAI()
class Invoice(BaseModel):
invoice_number: str
total: float
currency: str
line_items: list[str]
response = client.responses.parse(
model="gpt-5",
input="Extract: Invoice #INV-2024-001 for $1,250.00 USD. Items: hosting, support, SSL cert.",
text_format=Invoice,
)
invoice: Invoice = response.output_parsed
print(invoice.invoice_number, invoice.total, invoice.line_items)Pydanticパスは、95%のケースで望ましい選択肢です。型安全で、ボイラープレートが少なく、IDEが結果をオートコンプリートします。クロス言語でのスキーマ共有が必要な場合、またはスキーマが動的に生成される場合にのみ、生のJSONスキーマを使用してください。トレードオフの詳細については、構造化出力とJSONスキーマ ガイドおよび 型安全なスキーマのためのPydantic プライマーをご覧ください。
状態管理:previous_response_id、Conversations API、および store=true
軽量なマルチターンコンテキストには previous_response_id を、信頼性の高いスレッドセッションには Conversations API を使用するか、完全なクライアント側制御のために完全なメッセージ履歴を送信します。previous_response_id には store: true が必要 で、キャッシュされたレスポンスのみ永続化されます。IDが解決できない場合は、完全な履歴にフォールバックしてください。
| アプローチ | 使用すべき場合 | 永続性 | コードの複雑さ |
|---|---|---|---|
previous_response_id | クイックチャットボット、短いスレッド | 30日間(デフォルト)、store: true 必須 | 最低 |
| Conversations API | 長寿命のスレッド、マルチユーザーアプリ | 永続的、クリーンアップは自分で管理 | 中 |
| 完全な履歴を送信 | 完全なクライアント側制御、監査証跡 | 自分が所有 | 最高 |
以下は previous_response_id を使用した2ターンの例です。
from openai import OpenAI
client = OpenAI()
# Turn 1 — must set store=True for the response to be referenceable
turn1 = client.responses.create(
model="gpt-5",
input="My name is Mert and I'm building a weather agent.",
store=True,
)
# Turn 2 — reference turn 1 by ID; the model "remembers" the name
turn2 = client.responses.create(
model="gpt-5",
previous_response_id=turn1.id,
input="What was my name again?",
store=True,
)
print(turn2.output_text) # "Your name is Mert..."store: true を忘れると、previous_response_id は何も解決せず、モデルは毎回冷たい状態から開始します。私たちはこれで1時間デバッグに費やしました。APIはエラーを出さず、ただ静かに健忘症になります。デフォルトの保持期間は30日間です。それ以上必要な場合は、明示的なスレッドライフサイクル制御を提供する Conversations API に移行してください。
いつ Conversations API にアップグレードすべきでしょうか?アプリ内に複数のユーザーがいる場合、スレッドが単一セッションを超えて存続する場合、またはサーバー側のメッセージ編集/分岐が必要な場合です。クイックチャットボットの場合、previous_response_id で十分です。
Chat CompletionsからResponses APIへの移行方法
Chat CompletionsからResponses APIへの移行は 3つのステップ で完了します。/v1/chat/completions を /v1/responses に変更し、messages を input に置き換え、tools スキーマを新しい形式に置き換えます。関数呼び出しとマルチモーダル入力にはわずかに異なる処理が必要です。OpenAIは GitHub上の公式移行パック を提供しています。
ステップ1 — エンドポイントの交換:
# Before (Chat Completions)
response = client.chat.completions.create(
model="gpt-4.1",
messages=[{"role": "user", "content": "Hello"}],
)
text = response.choices[0].message.content
# After (Responses)
response = client.responses.create(
model="gpt-5",
input="Hello",
)
text = response.output_textステップ2 — messages → input の名前変更:
# Before
client.chat.completions.create(
model="gpt-4.1",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Summarize this PDF."},
],
)
# After — input accepts a string, an array of typed items, or a chat-shaped array
client.responses.create(
model="gpt-5",
instructions="You are a helpful assistant.", # system → instructions
input="Summarize this PDF.",
)ステップ3 — ツールスキーマの更新:
# Before (Chat Completions tool format)
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get current weather",
"parameters": {"type": "object", "properties": {"city": {"type": "string"}}},
},
}]
# After (Responses tool format — flatter, no nested "function" key)
tools = [{
"type": "function",
"name": "get_weather",
"description": "Get current weather",
"parameters": {"type": "object", "properties": {"city": {"type": "string"}}},
}]これで完了です。フィーチャーフラグを使用してトラフィックを徐々にロールアウトし、Chat Completionsのコードパスを同じインターフェースの背後で1〜2週間稼働させたままにし、両方のレスポンス形状を並べてログ記録します。同等性が確認できてから初めて100%切り替えてください。openai-cookbookリポジトリ の移行パックには、参考となるより完全なアダプターパターンがあります。
Responses APIでMCPおよびリモートMCPサーバーを使用する方法
Responses APIは、ツールタイプとしてリモート MCP(Model Context Protocol) サーバーをサポートしています。tools 配列に {"type": "mcp", "server_url": "https://mcp.example.com", "server_label": "..."} のようなエントリを追加します。モデルはMCPサーバーのツールカタログを検出し、組み込みツールのようにそれらを呼び出します。
MCPに触れたことがない場合の30秒ピッチ:これは、任意のサービスがモデルが呼び出すことができるツールカタログとしてそのAPIを公開できるようにするオープンプロトコルです。Shopify、Stripe、GitHub、そして増加するベンダーリストがパブリックMCPエンドポイントを運営しています。プロトコル自体については、Model Context Protocol (MCP) の深掘り記事でカバーしています。
from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="gpt-5",
input="Find me the top-ranking competitor for 'openai responses api tutorial' and summarize their content gaps.",
tools=[{
"type": "mcp",
"server_url": "https://mcp.semrush.com",
"server_label": "semrush",
"require_approval": "never", # set to "always" in production
}],
)
print(response.output_text)MCPサーバーを他のサードパーティAPIと同様に扱ってください。require_approval: "never" はプロトタイプには問題ありません。本番環境では、侵害されたMCPサーバーがデータを静かに持ち出せないように "always"(またはツール許可リスト)が必要です。エージェントを指向する前に、サーバーのツールカタログを監査してください。
価格、レート制限、および本番環境の落とし穴
Responses APIの価格は、トークンコスト(プロンプト + 補完)において Chat Completionsと一致 しますが、組み込みツール(web_search、file_search)には呼び出しごとの追加料金がかかります。レート制限は既存のOpenAIティアに従います。一般的な本番環境の落とし穴には、store: true の保持デフォルト、バーストトラフィック時の一時的な429エラー、Azureバリアントの機能遅れが含まれます。
| モデルファミリー | Responses API | 組み込みツール | 推論努力 | ストリーミング | コストティア |
|---|---|---|---|---|---|
| gpt-5 | はい | 全5種 + MCP | N/A | はい | OpenAI価格 を参照 |
| gpt-5-mini | はい | 全5種 + MCP | N/A | はい | gpt-5より低 |
| gpt-4.1 | はい | web/file/code/image | N/A | はい | 中 |
| oシリーズ(推論) | はい | file/code | low/medium/high | はい | トークンあたり最高 |
| gpt-image-1 | 画像生成ツールのみ | , | , | いいえ | 画像ごと |
価格は変更されるため、執筆時点の OpenAIの価格ページ で常に確認してください。
エラー処理については、呼び出しを try/except openai.RateLimitError および try/except openai.APIStatusError で囲み、tenacity を介して指数バックオフを使用します。
from openai import OpenAI, RateLimitError, APIStatusError
from tenacity import retry, retry_if_exception_type, stop_after_attempt, wait_exponential
client = OpenAI()
@retry(
retry=retry_if_exception_type((RateLimitError, APIStatusError)),
wait=wait_exponential(multiplier=1, min=2, max=30),
stop=stop_after_attempt(5),
reraise=True,
)
def safe_create(prompt: str):
return client.responses.create(model="gpt-5", input=prompt)
print(safe_create("Hello").output_text)ステージング環境で20の並列リクエストのバースト時に一時的な429エラーが発生しましたが、指数バックオフ付きの tenacity で cleanly に修正されました。ログに記録されたエラー文字列は openai.RateLimitError: Error code: 429 - {'error': {'message': 'Rate limit reached for gpt-5 in organization org-... on requests per min (RPM)'}} でした。一度読んで次へ進んでください。リトライデコレータが残りを処理します。
Azureバリアント注記: Azure OpenAIはResponses APIを公開していますが、Sam Altman氏が管理するロールアウトより4〜8週間遅れています。2026年4月現在、AzureでのMCPサポートはプレビューのみです。出荷前に Microsoft LearnのAzure OpenAI Responses APIドキュメント で確認してください。
ゲートウェイ互換性: LiteLLMプロキシ を介してOpenAIをプロキシする場合、Responses APIサポートは2026年に着陸しました。他のほとんどのゲートウェイも追いついています。また、本番環境へのロールアウトでは、トラフィックを切り替える前に AI観測性とロギング を設定しておく必要があります。Responses APIイベントはChat Completionsよりも豊富であり、すべてのツール呼び出しをログに記録したいでしょう。
Responses APIを使用しないべき場合
低遅延リアルタイム音声(Realtime APIを使用)、埋め込み生成(Embeddings APIを使用)、および ファインチューニングワークフロー の場合は、Responses APIをスキップしてください。ゲートウェイ/プロキシがまだResponsesをサポートしていない場合(2026年現在、LiteLLM経由でほとんどがサポート)、Chat Completinsのままにしてください。
さらにいくつかの正直な失格理由:
- リアルタイム音声エージェント、Realtime APIはWebSocketを使用し、サブ秒単位のターンテイキング用に構築されています。Responses APIのストリーミングはHTTP SSEであり、音声には鈍く感じられます。
- 純粋な埋め込みパイプライン、
client.embeddings.create()はより安価で高速であり、すべてのベクトルDB統合が期待するものです。 - ファインチューニング、ファインチューニングAPI経由でトレーニングおよびデプロイします。その後、Responses経由でそれらを 呼び出す ことはできますが、トレーニング自体はResponsesワークフローではありません。
- バッチAPIジョブ、50%オフで一晩中に100万のプロンプトを処理している場合、バッチAPIはまだ価格で勝っています。
- Chat Completionsセマンティクスにロックイン、評価使用法、観測性、プロンプトライブラリがすべて
chat.completions.choices[0].message.contentを想定している場合、移行コストは現実的です。新しいからといって移行しないでください。
スタックがChat Completionsで満足しており、エージェントを構築していない場合、移行は無料ではなく、Q2のスプリントでは必要ないかもしれません。新しいものがあなたにとって優れているという意味ではありません。Responses APIはエージェントのための正しいプリミティブですが、すべてのOpenAIワークロードのためではありません。
よくある質問
OpenAI Responses APIとは何ですか?
OpenAI Responses APIは、2025年3月にリリースされた統一プリミティブで、Chat CompletionsのシンプルさとAssistants APIのツール利用機能を組み合わせます。テキストと画像の入力、5つの組み込みツール、関数呼び出し、構造化出力、ストリーミング、そして previous_response_id を介したステートフルな会話をサポートしています。
OpenAI Responses APIはいつリリースされましたか?
OpenAIは、より広範な「エージェント構築のための新しいツール」アナウンスとともに、2025年3月11日にResponses APIを発表しました。APIはリリース以来一般提供されており、Conversations API、MCPサポート、および image_generation ツールは2025年全体および2026年初頭にかけて増分的なアップデートで追加されました。
OpenAI Responses APIはステートフルですか?
はい、オプションで。previous_response_id と store: true を渡すと、モデルは完全な履歴を送信せずに呼び出し間でコンテキストを保持します。長寿命のスレッドの場合、Conversations APIは明示的なスレッドライフサイクル管理を提供します。また、Chat Completionsのように、ステートレスのままにして毎回完全な履歴を送信することもできます。
Responses APIとChat Completionsの違いは何ですか?
Responses APIはChat Completionsのスーパーセットです。Chat Completionsのすべての機能はResponsesで動作し、さらに組み込みツール(web_search、file_search など)、previous_response_id を介したステートフル性、および第一級の概念としてのエージェントループが追加されています。OpenAIは2026年現在、すべての新しいプロジェクトでResponsesを推奨しています。
Chat Completions APIは廃止されましたか?
いいえ。2026年4月現在、Chat Completionsは 廃止されていません 。完全にサポートされています。OpenAIは新しいプロジェクトでResponsesを推奨しており、ほとんどのエージェントスタイルのチュートリアルはResponsesを想定しています。Chat Completionsは現在、レガシープリミティブです。安定していますが、新機能が最初に到着する場所ではなくなりました。
どのOpenAIモデルがResponses APIをサポートしていますか?
GPT-5、gpt-5-mini、gpt-4.1、およびoシリーズ推論モデルはすべてResponses APIをサポートしています。oシリーズは、拡張思考ワークロードのための reasoning_effort パラメータ(low、medium、high)を追加します。画像生成は、image_generation ツールを有効にすると、内部で gpt-image-1 を介してルーティングされます。
Chat CompletionsからResponses APIに移行するにはどうすればよいですか?
3つのステップ:client.chat.completions.create() を client.responses.create() に切り替え、messages 配列を input に置き換え(システムプロンプトを instructions に移動)、ツールスキーマをフラット化します(ネストされた function キーを削除)。OpenAIの GitHub上の移行パック には完全なアダプター例があります。
Responses APIはストリーミングをサポートしていますか?
はい。client.responses.create() に stream=True を渡す(またはコンテキストマネージャーとして client.responses.stream() を使用)し、型付きServer-Sent Eventsを反復処理します。処理するトークンストリームイベントは、コンテンツ用の response.output_text.delta と最終ペイロード用の response.completed です。非同期ストリーミングは AsyncOpenAI を介して動作します。
AzureでResponses APIを使用できますか?
はい。Azure OpenAIはResponses APIを公開していますが、機能の同等性はOpenAIの直接ロールアウトより4〜8週間遅れています。2026年4月現在、AzureでのMCPサポートはプレビュー段階です。本番環境に出荷する前に、現在のAzure固有の癖については Microsoft Learn を確認してください。
Responses APIはMCPサーバーと連携しますか?
はい、リモートMCP(Model Context Protocol)サーバーは第一級のツールタイプです。tools 配列に {"type": "mcp", "server_url": "...", "server_label": "..."} を追加すると、モデルはサーバーのツールカタログを検出し、組み込みツールのように呼び出します。セキュリティのために本番環境では require_approval: "always" を使用してください。
まとめ
これで、Responses APIの全体像が把握できました。Chat Completionsとの違い、最初の呼び出しの出荷方法、組み込みツールの配線方法、そして既存のChat Completionsプロジェクトを3ステップで移行する方法です。拠り所とするべきいくつかの要点:
- まず構築し、その後最適化する。 Hello Worldの例から始め、組み込みツールを追加し、次に
previous_response_idで状態を重ねます。 - 徐々に移行する。 フィーチャーフラグを使用し、両方のレスポンス形状をログに記録し、同等性検証後にのみ100%切り替えます。
- MCP統合を出荷する。 これが2026年のフロンティアです。ほとんどのベンダーがMCPエンドポイントを公開するために競争しており、Responses APIはそれらを消費するための最もクリーンな方法です。
Techsyでは、Responses APIのロールアウトやChat Completionsの移行を含む、本番環境グレードのOpenAI統合の出荷をチーム支援しています。無料相談を受ける。
Techsy編集チームによる。2024年からOpenAI統合を出荷しているプロダクションエンジニア。最終更新:2026年4月25日。