◉GEMINI LABEN
●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り6日。移行先は deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 が GA(10/06)。gemini-3.1-flash-image は非推奨で停止日は未発表です●MCP — ツール結果が 8.5万トークンに膨らんだ事例を、ADK で 310 トークンに包んで抑えた報告が出ています●FLASH — gemini-3.7-flash と 3.5-flash は新しい Flash モデルに自動で回されます(10/08)●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り6日。移行先は deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 が GA(10/06)。gemini-3.1-flash-image は非推奨で停止日は未発表です●MCP — ツール結果が 8.5万トークンに膨らんだ事例を、ADK で 310 トークンに包んで抑えた報告が出ています●FLASH — gemini-3.7-flash と 3.5-flash は新しい Flash モデルに自動で回されます(10/08)●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…
記事一覧/開発ツール
⟐ 開発ツール/2026-03-29上級

Gemini API 本番運用ノート — 429・500・503 に静かに耐えるエラーハンドリングとレート制限の設計

Gemini API を本番で動かして気づいた、エラーハンドリングとレート制限の運用パターンの記録です。指数バックオフ・ジッター・サーキットブレーカー・トークンバケット・モデルカスケードを、個人開発アプリで踏んだ落とし穴と実測メトリクス付きで整理しました。

gemini-api287error-handling8rate-limiting4production105circuit-breakerretry-pattern

✦ プレミアム記事

取り組みの背景 — なぜ本番AIアプリは「気づかないうちに壊れる」のか

壁紙アプリの異変に気づいたのは、クラッシュレポートではなくレビュー欄からでした。「昨日から説明文が出ません」。サーバーは生きていて、ログに例外は一件も積まれていません。手元で叩き直してみると、Gemini API は HTTP 200 を返し続けていて、response.text だけが空でした。

AI を組み込んだアプリの障害は、この形で届きます。プロセスは落ちません。アラートも鳴りません。機能だけが静かに抜け落ちて、気づくのは数日後のレビューです。200 で中身が空、ストリーミングが途中で切れる、安全フィルターで応答がブロックされる——従来の Web API のように「例外が飛んだから止まった」という分かりやすい壊れ方をしてくれません。

ここから先は、その静かな壊れ方に一つずつ名前を付けて、落ちる前に手当てするための運用ノートです。エラーの分類、指数バックオフ、サーキットブレーカー、トークンバケット、モデルカスケード。個人開発のアプリで実際に踏んだ落とし穴と並べて書いていきます。

Gemini API エラーコード全体像とリトライ判定マトリクス

Gemini API が返すHTTPエラーは大きく「リトライ可能」と「リトライ不可」の2種類に分かれます。この判定を間違えると、修正すべきバグに対して無意味なリトライを繰り返したり、逆に一時的な障害でサービスを停止させたりしてしまいます。

リトライ可能なエラー(Transient Errors)

  • 429 Too Many Requests — レート制限超過。最も頻繁に発生するエラーで、RPM(リクエスト/分)、TPM(トークン/分)、RPD(リクエスト/日)、IPM(画像/分)のいずれかの上限に到達した場合に返されます
  • 500 Internal Server Error — Google側の一時的な障害。モデル推論のタイムアウトやインフラの問題で発生します
  • 503 Service Unavailable — サービスの一時停止。メンテナンスや過負荷時に返されます
  • 504 Gateway Timeout — リクエストの処理時間が上限を超過した場合に発生します

リトライ不可のエラー(Permanent Errors)

  • 400 Bad Request — リクエスト形式の不備(不正なJSON、サポートされていないパラメータ等)
  • 401 Unauthorized — APIキーが無効または期限切れ
  • 403 Forbidden — APIキーに対象モデルのアクセス権がない、または地域制限
  • 404 Not Found — 指定したモデル名が存在しません。タイポだけでなく、使っていたモデルが世代交代で消えたときにも同じ 404 が返ります。後述の「モデルの世代交代は 404 として届く」で扱います

判定ロジックの実装

# Python: リトライ判定ヘルパー
RETRYABLE_STATUS_CODES = {429, 500, 503, 504}
 
def is_retryable(status_code: int) -> bool:
    """リトライ可能なエラーかどうかを判定する"""
    return status_code in RETRYABLE_STATUS_CODES
 
def classify_error(status_code: int, error_message: str) -> dict:
    """エラーを分類し、推奨アクションを返す"""
    if status_code == 429:
        return {
            "type": "rate_limit",
            "retryable": True,
            "action": "exponential_backoff",
            "message": "レート制限に到達。バックオフ後にリトライ"
        }
    elif status_code in (500, 503, 504):
        return {
            "type": "server_error",
            "retryable": True,
            "action": "exponential_backoff",
            "message": "サーバー側の一時的なエラー。自動リトライ"
        }
    elif status_code == 400:
        return {
            "type": "client_error",
            "retryable": False,
            "action": "fix_request",
            "message": f"リクエスト形式エラー: {error_message}"
        }
    else:
        return {
            "type": "fatal_error",
            "retryable": False,
            "action": "alert_developer",
            "message": f"即時対応が必要: {status_code} {error_message}"
        }
✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦429/500/503 の発生頻度と、リトライ可否を最短で見極めるための判定マトリクス
✦指数バックオフ+ジッター・サーキットブレーカー・トークンバケットを Python と TypeScript の動くコードで実装
✦Pro→Flash→Flash-Lite のカスケード設計と、個人開発アプリで踏んだ落とし穴・実測リトライ成功率
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Gemini Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

⟐ 開発ツール2026-03-31
Gemini API × React Native 本番運用ノート — 個人開発アプリで踏んだ落とし穴と設計判断
iOS/Android 両対応の個人開発アプリで Gemini API を React Native/Expo から呼ぶ時に踏んだ落とし穴、AdMob 連携時のモデル振り分け、Cold Start とコスト、AsyncStorage キャッシュの TTL 設計をまとめた運用ノート
◈ API / SDK2026-05-02
Gemini API を個人アプリに組み込む時の 7 つの設計判断 — エラー設計から品質モニタリングまで
Gemini API を個人アプリに本番導入した時に直面する設計判断を、私自身の運用記録から 7 つに絞ってまとめました。コストとレイテンシのトレードオフ、エラー時のフォールバック設計、品質モニタリングまで、教科書には載っていない実戦的な判断軸を共有します。
◈ API / SDK2026-04-22
Gemini API 本番の耐障害性設計 — Circuit Breaker・Bulkhead・フォールバックモデルで AI サービスを落とさない実装パターン
Gemini API の本番運用で発生する 429・503・タイムアウト障害を乗り切るための耐障害性設計を実装レベルで解説します。Circuit Breaker、Bulkhead、フォールバックモデル切替、Graceful Degradation までコード付きで網羅します。