BioErrorLog Tech Blog

試行錯誤の記録

OpenAI Python Libraryでtimeoutを設定する

OpenAI Python LibraryでOpenAI APIを呼び出すときに、timeoutを設定する方法のメモです。

はじめに

OpenAI Python Libraryを使ってChatCompletion APIを叩いてるときに、timeoutを設定したくなりました。

Referenceを見てもパッとやり方がわからなかったので、備忘録を残します。

# 作業環境
# 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

Ref. GitHub - openai/openai-python: The OpenAI Python library provides convenient access to the OpenAI API from applications written in the Python language.

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)

Ref. openai-python/openai/api_resources/chat_completion.py at b82a3f7e4c462a8a10fa445193301a3cefef9a4a · openai/openai-python · GitHub

が、執筆時点(openai version0.27.8)ではこのtimeoutパラメータは機能しませんでした。

Issueにもこの問題が提起されています。

timeout paramter is not respected in openai.ChatCompletion.create method · Issue #549 · openai/openai-python · GitHub

しばらくはtimeoutパラメータではなく、ドキュメントに明示されているrequest_timeoutパラメータを使った方が良さそうです。

おわりに

以上、OpenAI Python Libraryでtimeoutを設定する方法を整理しました。

OpenAI APIを本番運用するには、このあたりのハンドリングも重要になりますね。

参考になれば幸いです。

[関連記事]

www.bioerrorlog.work

www.bioerrorlog.work

www.bioerrorlog.work

www.bioerrorlog.work

参考

GitHub - openai/openai-python: The OpenAI Python library provides convenient access to the OpenAI API from applications written in the Python language.

timeout paramter is not respected in openai.ChatCompletion.create method · Issue #549 · openai/openai-python · GitHub

OpenAI Platform