🐍

OpenAI Python LibraryでChatGPTを使用するときも、timeoutを設定した方が良いという話

2023/03/19に公開

OpenAI Python Libraryとは

https://github.com/openai/openai-python
PythonでOpenAI APIを叩くためのラッパーです。

pip install openai

でインストールできます。

main.py
import openai

openai.api_key = 'API_KEY'
try:
    completion = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "user", "content": "Hello!"}
        ]
    )
    print(completion.choices[0].message)
except:
    print('例外発生')

と、シンプルなコードでChatGPTのAPIを試すことができます。

何が起きたか?

https://zenn.dev/sion_pn/articles/07c12d1ef2fa7f

昨日こんな記事を書いた矢先に、Open AI Python Libraryから実行していたChatGPTも永遠にレスポンスが返って来ずにプログラムが停止するというのをやらかしてしまったので、こちらもtimeoutの初期値を調査しました。

ChatCompletionの処理を追う

https://github.com/openai/openai-python/blob/1d6142f376067e401492ca92ff88a08deb47d6ba/openai/api_resources/chat_completion.py#L21

chat_completion.py
@classmethod
def create(cls, *args, **kwargs):
    """
    Creates a new chat completion for the provided messages and parameters.
    See https://platform.openai.com/docs/api-reference/chat-completions/create
    for a list of valid parameters.
    """
    start = time.time()
    timeout = kwargs.pop("timeout", None)

    while True:
        try:
            return super().create(*args, **kwargs)
        except TryAgain as e:
            if timeout is not None and time.time() > start + timeout:
                raise

可変長引数でtimeoutが設定できるようになっており、案の定初期値がNoneになっています。

OpenAI Python Libraryのtimeout

See https://platform.openai.com/docs/api-reference/chat-completions/create
for a list of valid parameters.

https://platform.openai.com/docs/api-reference/chat-completions/create
コメントに従って、使用できるパラメータのリストを公式リファレンスで確認してもtimeoutに関する記載は一切ありませんが、コードを読む限り設定出来てちゃんと動きそうに見えます。

if timeout is not None and time.time() > start + timeout:

で、time.time()を代入したstarttimeoutの足し算をして、現在時間と比較をしています。
time.time()は現在時刻をUNIXエポック秒のfloat型で返すので、timeoutも同様にfloatかintの値を代入すればよいでしょう。

main.py
completion = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": "Hello!"}
    ],
    timeout = 60
)

これで、openai.ChatCompletion.createを実行した際にタイムアウトしたら、exceptで拾えるようになります。

まとめ

OpenAI Python Libraryのみならずpython-twitter-v2然り、リクエストを送ってレスポンスを取得するようなライブラリを使用する際は、タイムアウトがどうなっているのか意識するようにしましょう。
意外と、初期値がNoneになっているライブラリも少なくないようです。

Discussion