API Timeoutの診断と対策:長文LLM生成における安全な再試行と接続設定
LLM APIのタイムアウト解決ガイド:connect/read/poolタイムアウトの個別設定、推論モデル向けSSEストリーミング安定化、二重課金を防ぐ安全な再試行設計。
OpenAI o3-miniやClaude 3.7 Sonnetのような推論モデルを活用する際、API Timeout(接続タイムアウトや読み取りタイムアウト)は頻発する課題です。複雑な推論ステップを伴う処理では、初回トークン生成(TTFT)や全体の回答生成に30秒から90秒以上かかることがあり、標準的なHTTPクライアントの制限を超えて切断が発生します。
長文生成を安定して処理するために、多くの開発者がBetterTokenを活用しています。中間バッファリングのない最適化されたServer-Sent Events(SSE)配信により、安定したストリーミング接続を維持できます。詳しい接続仕様はBetterToken API Referenceで確認できます。
切断の発生箇所:HTTPリクエストの4つのフェーズ
LLM APIへのリクエストは4つの独立した段階で構成されており、それぞれに適したタイムアウト設定が必要です:
- Connect Timeout(接続タイムアウト):TCP接続とTLSハンドシェイクの完了待機時間(5〜10秒推奨)。
- Write Timeout(送信タイムアウト):10万トークンを超える大規模コンテキスト送信時の所要時間。
- Read Timeout(読み取りタイムアウト):初回トークン返却(TTFT)およびSSEストリーム間隔の待機時間。
- Pool Timeout(プールタイムアウト):高並行リクエスト時にクライアントの空きソケットを待機する時間。
タイムアウト診断マトリクス
Python(HTTPX)での粒度の高いタイムアウト設定
標準ライブラリの既定値(10秒)では推論モデルの呼び出しで切断が頻発します。以下の安定した接続設定を推奨します:
SSEストリームの切断防止と安全な再試行設計
接続切断時の二重課金やサーバー負荷を防ぐため、再試行処理には以下の3つの原則を適用します:
- 受信開始後の再試行を避ける:既に一部のトークンを受信している場合、全プロンプトを再送すると二重課金となります。
- ランダム指数バックオフ(Full Jitter):接続失敗時の再試行間隔をランダムに分散させて同時リクエスト集中を防ぎます。
- 冪等性キーの活用:バッチジョブでは一意のタスクIDを付与して重複実行を防止します。
動作確認項目
- ステータスコード
200 OKの確認。 - ストリーミングが途中で途切れることなく全トークンを受信完了できること。
- 通信完了後にソケットが正常にプールへ解放されること。
詳細なAPI仕様はBetterToken API Referenceをご覧ください。