概要
OpenAIでAPIリクエストを送っても,responseが得られずに固まってしまう現象に困っている方へ.
Timeout時間を設定し,一定時間返答がなければリクエストをやり直すことで回避できます.
環境
python=3.8
openai=1.38.0
ChatCompletionのキホン
PythonでGPTを使いたければ次の型がキホンですね.
openaiライブラリのバージョンによって変わってくるので環境に注意です.
from openai import OpenAI
client = OpenAI() #必要に応じてapi_keyなど設定
messages = [
{"role": "system", "content": "You are helpful assistant."},
{"role": "user", "content": "Hey ChatGPT, how are you?"}
]
response = self.client.chat.completions.create(
model = "gpt-4o",
messages=messages
)
response_text = response.choices[0].message.content
タイムアウト処理の設定
タイムアウトは最初のクラスのインスタンスを定義するところで設定します.
エラー処理は,openai.APITimeoutError
を用いるのに注意です.
from openai import OpenAI
import httpx
client = OpenAI(api_key=api_key, timeout=httpx.Timeout(15.0, read=5.0, write=10.0, connect=3.0))
try:
response = self.client.chat.completions.create(
model = "gpt-4o",
messages=messages
)
except openai.APITimeoutError as e: #普通のTimeoutErrorではないことに注意
print(e, flush=True)
httpx.Timeout の read, write, connect という引数は,HTTPリクエストの特定の段階におけるタイムアウトの制限時間を設定するものです.それぞれの数字は秒数を表しています.
- read (読み込みタイムアウト): サーバーからのレスポンスデータを受け取る際の最大待機時間を秒単位で指定します.例えば,read=5.0 と設定すると,サーバーが5秒以内にレスポンスを送信しない場合,タイムアウトとしてリクエストが失敗します.
- write (書き込みタイムアウト): クライアントからサーバーへデータを送信する際の最大待機時間を秒単位で指定します.例えば,write=10.0 と設定すると,データが10秒以内に送信されない場合,タイムアウトとしてリクエストが失敗します.
- connect (接続タイムアウト): サーバーへの接続が確立されるまでの最大待機時間を秒単位で指定します.例えば,connect=3.0 と設定すると,サーバーへの接続が3秒以内に確立されない場合,タイムアウトとしてリクエストが失敗します.