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

OpenAI APIの公式ドキュメントでは現状(2025年4月2日現在)クライアントのタイムアウトに関する設定についての記載がない。
タイムアウト機能はHTTPX(Python3向けのHTTPクライアント)を利用しているらしく、そのあたりについてはOpenAIのパッケージを管理してくれているPyPIやOpenAI APIのREADMEに記載がある。 タイムアウトの導入に関してはここを確認すれば実装できるが、エラーハンドリングに関しては記載がなさそうだったので、タイムアウトの導入を実装しつつエラーハンドリングに関して調べたことも併せてまとめておく。
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に記載があるのだが、そのデフォルト値は変更される可能性があるらしい。本番運用する際にはちょっと注意したほうが良さそう。

ちなみに、タイムアウトのデフォルト値はここに記載があった。timeout
を使う。
httpxが提供しているものなので、httpxのドキュメントを参考にした。
4種類は次のようなものがある。
-
connect
タイムアウト -
read
タイムアウト -
write
タイムアウト -
pool
タイムアウト
特定のタイムアウトのみに適用したいタイムアウト値がある場合には、上記のように(timeout=600, connect=5.0)
と書く。
connectタイムアウトはデフォルトで5秒に設定されていることはこのコードを見ることで初めて知った。地味に注意が必要。
また、タイムアウトを無効にするにはNone
で指定する必要がある。

ここからはタイムアウトのエラーハンドリングについてまとめる。
READMEによると、以下のエラーが投げられるらしい。
On timeout, an APITimeoutError is thrown.
各種エラーについては上記に記載がある。
エラーハンドリングの記法については公式が以下のように提案してくれている。
これにのっとり、今回は以下のように実装してみた。
+ 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が見つからない。
ここの書き方を見つけるまでに少し時間がかかってしまったので備忘録がてら残しておく。

htttpxの知識がなかったので、以下ブログを読ませていただいた。
とても分かりやすく、勉強になりました。