🐍
OpenAI Python LibraryでChatGPTを使用するときも、timeoutを設定した方が良いという話
OpenAI Python Libraryとは
OpenAI APIを叩くためのラッパーです。
Pythonで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を試すことができます。
何が起きたか?
昨日こんな記事を書いた矢先に、Open AI Python Libraryから実行していたChatGPTも永遠にレスポンスが返って来ずにプログラムが停止するというのをやらかしてしまったので、こちらもtimeoutの初期値を調査しました。
ChatCompletionの処理を追う
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.
コメントに従って、使用できるパラメータのリストを公式リファレンスで確認してもtimeoutに関する記載は一切ありませんが、コードを読む限り設定出来てちゃんと動きそうに見えます。
if timeout is not None and time.time() > start + timeout:
で、time.time()
を代入したstart
とtimeout
の足し算をして、現在時間と比較をしています。
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