エラー、レート制限 & 信頼性
- HTTP エラーマップを読み、リトライすべきステータスと修正すべきステータスを見分ける
- 一時的なエラーを、上限付きの指数バックオフとジッターでリトライする
- retry-after、平滑化、バッチ処理、より安価なモデルでレート制限に対処する
- モデルの廃止と移行から自分のコードを切り離す
本番コードはネットワークサービスと通信するため、失敗を前提にしなければなりません。ここで少し構造を持たせるだけで、不安定な連携と信頼できる連携の差が生まれます。
エラーマップ
扱うことになる典型的な HTTP ステータス:
| ステータス | 意味 | 対処 |
|---|---|---|
| 400 | 不正なリクエスト | ペイロードを修正;そのままリトライしない |
| 401 | API キーが不正/欠落 | 認証情報を確認 |
| 403 | 許可されていない | アクセス権/権限を確認 |
| 429 | レート制限 | バックオフしてリトライ(retry-after を尊重) |
| 500/529 | サーバーエラー / 過負荷 | バックオフ付きでリトライ |
- SDK はこれらを型付きの例外として表面化するので、文字列を解析する代わりにきれいに分岐できます。
バックオフ付きリトライ
一時的なエラー(429、5xx)には、上限付きの指数バックオフ + ジッターでリトライします:
import time, random
for attempt in range(5):
try:
return client.messages.create(...)
except (RateLimitError, APIStatusError) as e:
if attempt == 4 or not should_retry(e):
raise
time.sleep(min(2 ** attempt + random.random(), 30))
- 多くの SDK は一時的なエラーを自動でリトライします — 自前のリトライを追加する前にクライアントのデフォルトを把握しないと、リトライが二重になることがあります。
レート制限
制限はアカウント/ティアごと(1分あたりのリクエスト数とトークン数)に適用されます。制限に達すると、タイミングのヒント付きで 429 が返ります。上限を超えないための戦略:
Guided walkthrough1 of 4
- 429 を受け取ったら、レスポンスのタイミングのヒントを読み、その時間だけ待ってからリトライします。
- 一度にすべて送るのではなく、リクエストを時間に分散させます。
- 大量・非対話的なジョブをバッチ処理に移します。
- 大量のステップをより安価なモデルに振り分けます — モデルの選び方を参照。
大量のステップに適したモデルの選び方については モデルの選び方 を参照してください。
モデル移行
モデル ID は日付/バージョン付きで、廃止されます。自分を切り離しておきましょう:
- モデル ID は設定から読む——あちこちにリテラルを散らさない。
- 廃止を監視する — 廃止 & 移行ウォッチ と モデル一覧表 を参照。
- モデルを切り替えたら**評価を再実行する**。
- 400/401/403 はあなたの問題——リクエストか認証情報を修正し、やみくもにリトライしない。429 と 500/529 はリトライ可能。
- 一時的なエラーは、上限付きの指数バックオフ + ジッターでリトライする(例:min(2 ** attempt + random(), 30))。
- 429 では:retry-after を尊重し、バーストを平滑化し、オフライン作業をバッチ化し、大量のステップをより安価なモデルに振り分ける。
- モデル ID は設定から読み、廃止を監視し、モデル移行時には評価を再実行する。