2026/06/23

つないでみよう:#31) Responses API ー 会話

今回から  Responses API を実際に使ってみましょう。まずは、会話から始めます。#2 で紹介した Chat Completion API と比較しながら進めたいと思います。


API のコールの仕方

まず、API の URL であるエンドポイントは以下の通りです。

Responses API Chat Completion API
https://api.openai.com/v1/responses https://api.openai.com/v1/chat/completions


HTTP ヘッダの指定方法には変化はないようです。どちらの API も以下の項目を指定します。

HTTP ヘッダ 設定値 補足
Content-Type application/json 送信するリクエストは JSON
Authorization Bearer (API キー) 別途取得した API キーを送信し認証


リクエストの記述は大きく変わっています。Chat Completion API では messages ノードに記述しましたが、Responses API では input ノードとなっています。

Chat Completion API では、構造がシンプルになっている点がありがたいですね。

Responses API Chat Completion API
{
   "model": "gpt-5-nano",
   "input": "大阪府の県庁所在地は?"
}
{
   "model": "gpt-5-nano",
   "messages": [
      {
         "role": "user",
         "content": "大阪府の県庁所在地は?"
      }
   ]
}

この事例では『大阪府の県庁所在地は?』とテキストで問い合わせるだけなのでシンプルな構造となっています。この input ノードの書き方で、テキストの問い合わせに画像を添えたり、柔軟に指定できます。結果的には、仕組みとしては messages ノードと大差ないと言えますね。


API コール

今回は、API の動作検証を兼ねて Postman でテスト実行してみます。

まず、”POST” を選択し、エンドポイントを入力します。ヘッダーには Authorization を追加し、API キーを指定します(Content-Type はデフォルトでセット済み)。最後に、ボディに送信する JSON を入力して完了です。

準備ができたら[送信]ボタンをクリックします。正しく送信できると、画面下部にレスポンスの JSON が表示されます。

Chat Completion API のレスポンスと比較しながら確認します。赤字の部分がリクエストに対する返答にあたる部分です。

Responses API Chat Completion API
{
   "id": "resp_xxxxx",
   "object": "response",
   "created_at": 1782125043,
   "status": "completed",
   "background": false,
   "billing": {
      "payer": "developer"
   },
   "completed_at": 1782125046,
   "error": null,
   "frequency_penalty": 0.0,
   "incomplete_details": null,
   "instructions": null,
   "max_output_tokens": null,
   "max_tool_calls": null,
   "model": "gpt-5-nano-2025-08-07",
   "moderation": null,
   "output": [
      {
         "id": "rs_xxxxx",
         "type": "reasoning",
         "content": [],
         "summary": []
      },
      {
         "id": "msg_xxxxx",
         "type": "message",
         "status": "completed",
         "content": [
            {
               "type": "output_text",
               "annotations": [],
               "logprobs": [],
               "text": "大阪府の県庁所在地は大阪市です。"
            }
         ],
         "role": "assistant"
      }
   ],
         ・・・(省略)・・・
}
{
   "id": "chatcmpl-xxxxx",
   "object": "chat.completion",
   "created": 1782126352,
   "model": "gpt-5-nano-2025-08-07",
   "choices": [
      {
         "index": 0,
         "message": {
            "role": "assistant",
            "content": "大阪府の県庁所在地は大阪市です。",
            "refusal": null,
            "annotations": []
         },
         "finish_reason": "stop"
      }
   ],
         ・・・(省略)・・・
}

Responses API は、Chat Completions API よりも汎用的かつ拡張性の高い API です。推論やツール実行などの情報を含めて返却するため、レスポンス JSON はより複雑な構造になっています。

output ノード内の要素で type が message となっているものが返答にとなります。output ノードは配列になっていて、リクエストに応じて要素数が可変となります。ですので、各要素の type を判定して返答を探す必要があります。

type にはさまざまな種類があり、抜粋すると次の通りです。

type 役割
message 最終回答
reasoning 内部推論の情報
function_call 関数(ツール)の呼び出し要求
function_call_output 関数実行結果
image_generation_call 画像生成の実行


会話の継続

Responses API では、会話の継続がサポートされています。

使い方は簡単で、previous_response_id に継続元のレスポンスを指定するだけです。具体的には、レスポンスの最初にある id(resp_ で始まる id)を指定するだけです。

Responses API Chat Completion API
{
   "model": "gpt-5-nano",
   "previous_response_id": "resp_xxxxx",
   "input": "そこの面積は?"
}
{
   "model": "gpt-5-nano",
   "messages": [
      {
         "role": "user",
         "content": "大阪府の県庁所在地は?"
      },
      {
         "role": "assistant",
         "content": "大阪府の県庁所在地は大阪市です。"
      }
,
      {
         "role": "user",
         "content": "そこの面積は?"
      }
   ]
}

Chat Completion API では、過去の会話をリクエストの JSON に含める必要がありました。会話が長くなると送信する JSON が膨大になります。

Responses API で会話を継続を使えば、課金額の節約にもなりますね。


前回 連載:つないでみよう


0 件のコメント:

コメントを投稿