Closed5

OpenAI APIのタイムアウト設定とエラーハンドリング実装について調べる

ちゃこちゃこ

OpenAI APIの公式ドキュメントでは現状(2025年4月2日現在)クライアントのタイムアウトに関する設定についての記載がない。
https://platform.openai.com/docs/overview
タイムアウト機能はHTTPX(Python3向けのHTTPクライアント)を利用しているらしく、そのあたりについてはOpenAIのパッケージを管理してくれているPyPIやOpenAI APIのREADMEに記載がある。
https://github.com/openai/openai-python/blob/main/README.md#timeouts
https://pypi.org/project/openai/
タイムアウトの導入に関してはここを確認すれば実装できるが、エラーハンドリングに関しては記載がなさそうだったので、タイムアウトの導入を実装しつつエラーハンドリングに関して調べたことも併せてまとめておく。

ちゃこちゃこ

timeoutについて、openai-pythonの_client.pyには以下のコメントがある。

        # Configure a custom httpx client.
        # We provide a `DefaultHttpxClient` class that you can pass to retain the default values we use for `limits`, `timeout` & `follow_redirects`.
        # See the [httpx documentation](https://www.python-httpx.org/api/#client) for more details.
        # Enable or disable schema validation for data returned by the API.
        # When enabled an error APIResponseValidationError is raised
        # if the API responds with invalid data for the expected schema.
        #
        # This parameter may be removed or changed in the future.
        # If you rely on this feature, please open a GitHub issue
        # outlining your use-case to help us decide if it should be
        # part of our public interface in the future.
  • カスタムのhttpxクライアントを構成しているよ
  • timeoutとかのデフォルト値を保持するためにDefaultHttpxClientクラスを提供するよ
  • このパラメータ(OpenAIが提供しているデフォルト値?)は将来的に削除・変更するかも

などといったことが書かれている。
timeoutの値を明示的に指定しないとデフォルト値が使われるということはREADMEやPyPIに記載があるのだが、そのデフォルト値は変更される可能性があるらしい。本番運用する際にはちょっと注意したほうが良さそう。

ちゃこちゃこ

ちなみに、タイムアウトのデフォルト値はここに記載があった。
https://github.com/openai/openai-python/blob/main/src/openai/_constants.py#L8-L9
タイムアウトには4種類のタイムアウトがあり、4種類全てに同じタイムアウト値を適用する際にはtimeoutを使う。
httpxが提供しているものなので、httpxのドキュメントを参考にした。
https://www.python-httpx.org/advanced/timeouts/
4種類は次のようなものがある。

  • connectタイムアウト
  • readタイムアウト
  • writeタイムアウト
  • poolタイムアウト

特定のタイムアウトのみに適用したいタイムアウト値がある場合には、上記のように(timeout=600, connect=5.0)と書く。
connectタイムアウトはデフォルトで5秒に設定されていることはこのコードを見ることで初めて知った。地味に注意が必要。
また、タイムアウトを無効にするにはNoneで指定する必要がある。

ちゃこちゃこ

ここからはタイムアウトのエラーハンドリングについてまとめる。
READMEによると、以下のエラーが投げられるらしい。

On timeout, an APITimeoutError is thrown.

各種エラーについては上記に記載がある。
エラーハンドリングの記法については公式が以下のように提案してくれている。
https://platform.openai.com/docs/guides/error-codes/handling-errors
これにのっとり、今回は以下のように実装してみた。

+ import openai
from openai import OpenAI
...
+    client = OpenAI(timeout=1.0, max_retries=0)
-    client = OpenAI()
...
+            except openai.APITimeoutError as timeout_error:
+                print("OpenAIのタイムアウトが発生しました")

import openaiをしないとAPITimeoutErrorが見つからない。
ここの書き方を見つけるまでに少し時間がかかってしまったので備忘録がてら残しておく。

このスクラップは6ヶ月前にクローズされました