OpenAI Responses APIの使い方を初心者向けに解説。Chat Completions APIとの違い、ストリーミング、ツール呼び出し、ステートフルな会話管理、移行手順までステップバイステップで紹介します。
使い方ガイド
公開: by ToolCraft Lab 約9分で読めます

OpenAI Responses API完全ガイド — Chat Completions APIからの移行方法と新機能を徹底解説

OpenAI Responses APIの使い方を初心者向けに解説。Chat Completions APIとの違い、ストリーミング、ツール呼び出し、ステートフルな会話管理、移行手順までステップバイステップで紹介します。

#OpenAI#API#Responses 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 APIResponses API
エンドポイント/v1/chat/completions/v1/responses
会話管理毎回メッセージ履歴を送信previous_response_idでサーバー側管理
組み込みツールなし(Function Callingのみ)Web検索、ファイル検索、コード実行
ストリーミングSSE(Server-Sent Events)SSE(より詳細なイベント)
出力形式choices[0].messageoutput[]配列
ステータス引き続き利用可能今後の推奨API

なぜResponses APIに移行すべきか

  1. 組み込みツール: Web検索やコード実行をAPI単体で利用可能
  2. 会話管理の簡素化: サーバー側でステート管理でき、クライアントの実装がシンプルに
  3. 新機能の優先提供: 今後の新機能はResponses APIを中心に開発される
  4. 下位互換性: 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 APIResponses API備考
messagesinput文字列またはメッセージ配列
system ロールinstructions または developer ロール
response.choices[0].message.contentresponse.output_text
functions / toolstools形式はほぼ同じ
max_tokensmax_output_tokensパラメータ名変更
stream=Truestream=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

段階的な移行のすすめ

一度にすべてを移行する必要はありません。以下の順序を推奨します。

  1. 新規機能 → Responses APIで実装
  2. シンプルなエンドポイント → 順次移行
  3. 複雑な会話フロー → ステートフル機能を活用して移行
  4. ストリーミング → イベント処理を書き換えて移行

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の正当な後継として以下の利点を提供します。

  • シンプルなインターフェース: inputoutput_text で直感的に操作
  • 組み込みツール: Web検索やコード実行をAPI単体で利用可能
  • ステートフルな会話: previous_response_id で会話管理がサーバーサイドに
  • 構造化出力: Pydanticモデルで型安全なレスポンスを取得
  • 下位互換性: 既存コードからの段階的な移行が可能

新規プロジェクトではResponses APIを選択し、既存プロジェクトは安定してからの段階的な移行を推奨します。大量のリクエストを処理する場合はChatGPT API Batch処理でコストを削減できます。また、料金面でClaude APIと迷っている方はChatGPT vs Claude API料金比較も参考にしてください。まずはシンプルなリクエストから試して、組み込みツールやステートフルな会話といった新機能の便利さを体感してみてください。