OpenAI Python LibraryでOpenAI APIを呼び出すときに、timeoutを設定する方法のメモです。
はじめに
OpenAI Python Libraryを使ってChatCompletion APIを叩いてるときに、timeoutを設定したくなりました。
Referenceを見てもパッとやり方がわからなかったので、備忘録を残します。
OpenAI APIでtimeoutを設定するやり方、少し落とし穴があったので備忘録を書いた.
— BioErrorLog (@bioerrorlog) July 27, 2023
OpenAI Python Libraryでtimeoutを設定する - BioErrorLog Tech Blog https://t.co/VdBHLblWIM
# 作業環境 # openai version 0.27.8
OpenAI Python Libraryでtimeoutを設定する
やり方:request_timeout パラメータ
request_timeout
パラメータを設定することで、timeoutを設定することができます。
# コード例 response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "user", "content": "Hello world"}, ], request_timeout=20, # タイムアウトを設定 (秒) )
このrequest_timeout
パラメータについては、よく見るとREADMEに記載があります。
All endpoints have a .create method that supports a request_timeout param. This param takes a Union[float, Tuple[float, float]] and will raise an openai.error.Timeout error if the request exceeds that time in seconds
ChatCompletion APIだけでなく、.create
メソッドをもつものには全てrequest_timeout
パラメータを利用できるようです。
Timeoutが発生した時は、openai.error.Timeoutエラーが発生します。
落とし穴:timeout パラメータ
openaiのソースコードを眺めてみると、ChatCompletionではtimeout
パラメータも機能しているようにも見えます。
class ChatCompletion(EngineAPIResource): engine_required = False OBJECT_NAME = "chat.completions" @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/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 util.log_info("Waiting for model to warm up", error=e)
が、執筆時点(openai version0.27.8
)ではこのtimeout
パラメータは機能しませんでした。
Issueにもこの問題が提起されています。
しばらくはtimeout
パラメータではなく、ドキュメントに明示されているrequest_timeout
パラメータを使った方が良さそうです。
おわりに
以上、OpenAI Python Libraryでtimeoutを設定する方法を整理しました。
OpenAI APIを本番運用するには、このあたりのハンドリングも重要になりますね。
参考になれば幸いです。
[関連記事]