🐈

OpenAIのAPIのresponsesへの変更を体験

に公開

OpenAIのAPIですが、出たころに触った手癖で書いていたり、ちょっとReasoningモデルは返信遅いしなぁということで、GPT-4.1を使っていたりしたら、浦島太郎状態になっていました。

古いか。最近は何というのだろうか?

というわけで、ちょっとプロダクトを作る兼、来週のハンズオンに向けてAPIを使ってみて「おお!!!」と思ったことをつらつらと書いておきます。

大体ドキュメントを見ながら書いています。
https://platform.openai.com/docs/overview

chat.completion => responses

以前からresponseがおすすめだよー。みたいに出てたように記憶しているのですが、(AIがな、chat.completionの方を知ってて書いてくれるから)chat.completionの方を使ってお茶を濁していました。
しかし、今回ハンズオンすることもあり、OpenAIのドキュメントも今のところ、chat.completionが多いように思うが、新時代に対応しておこうと思いました。

手書きでコードを書いてみると、responsesの方がいい感じですね。(覚える必要があるけど)
画像を読み取るコードは次のような感じでございます。

import base64
from openai import OpenAI

client = OpenAI(api_key=api_key) # まずはクライアント作成
model = 'gpt-5-nano'  # モデル名指定

def decode_image(image_path):
    with open(image_path, 'rb') as f:
        return base64.b64encode(f.read()).decode('utf-8')

def res_image(prompt, b64_image):
    res = client.responses.create(
        model=model,
        input = [{
            'role': 'user',
            'content': [
                {"type": 'input_text', 'text': prompt},
                {'type': 'input_image', 'image_url':f"data:image/jpeg;base64,{b64_image}"}
            ]
        }],
    )
    return res
image_path = 'test.jpg'
b64_image = decode_image(image_path)
res = res_image('画像に写っているものを教えてください', b64_image)

Reasoning には temperature パラメータがない

GPT-5はすべてが reasoning モデルになったということで、temperatureパラメータいじって返答をぶらせようとすると、なんとないですとの回答が!!!

たしかに。考えてくれる深さの指定なのね。nanoはminimalなさそうだった(もしかしたらタイポかもしれませんが、エラーが吐かれた)。

def gpt_response(input_text, model, reasoning_effort='low'):
    """
    1つの問い合わせに返答する関数
    input_text: str 問い合わせ
    model: str モデル名
    reasoning_effort: str 'minimal', 'low', 'medium', 'high' の3種類
          nano modelは 'minimal' なし。reasoning modelの頑張り具合
    """

    res = client.responses.create(
        model=model,
        input=input_text,
        reasoning={ "effort": reasoning_effort }
    )
    return res

reasoning modelの答えは low でもブレブレだったわ。まぁ考えてる証拠ね。

Structured_output

Structured_outputを使う際、responsesだとparseメソッドが提供されてます。

次のような感じで、データが取得できます。

from pydantic import BaseModel

class Test(BaseModel):
    name: str
    address: str
    etc: list[str]

def st_output(data):
     res = client.responses.parse(
         model='gpt-5-nano',
         input=f'次のデータを構造化してください: {data}',
         text_format=Test
     )
    return res

参考ドキュ: https://platform.openai.com/docs/guides/structured-outputs?api-mode=responses

まとめ

色々とややこしくなってきたし、新しいAPIにしてくれていい感じに思えました。
知識のブラッシュアップにちょっとコードを書くのが非常に面白い。
コード書くのめんどくさいと言っていたが、いざ手を離すと寂しいのかもしれません・・・。

ちなみに来週の久しぶりのハンズオンは、はんなりプログラミングのAPIを使ってみるハンズオンです。
https://hannari-python.connpass.com/event/368228/

Discussion