エラー、レート制限 & 信頼性
本番コードはネットワークサービスと通信するため、失敗を前提にしなければなりません。ここで少し構造を整えるだけで、不安定な連携と信頼できる連携の差が生まれます。
エラーの全体像
扱うことになる代表的な 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 は一時的なエラーを自動でリトライします — 自前のリトライを追加する前に、クライアントのデフォルト挙動を把握しておきましょう。)
レート制限
制限はアカウント/ティアごとに適用されます(毎分のリクエスト数とトークン数)。制限に達すると、タイミングのヒントとともに 429 が返ります。対策としては、retry-after を尊重する、バーストを平準化する、オフライン作業をバッチ処理する、大量処理のステップには安価なモデル(モデルの選び方)を使う、などがあります。
モデル移行
モデル ID は日付付き/バージョン付きであり、いずれ非推奨になります。次のようにして自分を守りましょう:
- モデル ID を設定から読み込む。あちこちにリテラルを散りばめない。
- 非推奨を監視する — 非推奨 & 移行ウォッチとモデル表を参照。
- モデルを切り替えたら**評価(evals)を再実行する**。