◉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 し…
記事一覧/API / SDK
◈ API / SDK/2026-04-10上級

Gemini API 実践トラブルシューティング — 2.5 Pro のレート制限・タイムアウト・レスポンスエラーを実践

Gemini 2.5 Pro API で発生する 429(レート制限)、504(タイムアウト)、400(バリデーション)エラーを体系的に解説。実装済みの修正コード、指数バックオフ戦略、Safety Filter 対策、コスト最適化まで、本番環境で使える実践的なガイド。

gemini-api287troubleshooting59gemini-2.5-pro13rate-limit4error-handling8

✦ プレミアム記事

深夜に鳴った 429 の通知から

個人開発しているアプリの画像分類バッチが、ある晩まとめて 429 を返して止まっていたことがありました。ログを追うと、並列に投げていたリクエストが分間上限を一気に超えていたのです。原因を掴むまで小一時間。あの夜の手詰まりが、この記事の出発点です。

Gemini API を本番で回していると、429(レート制限)・504(タイムアウト)・400(バリデーション)といったエラーは避けて通れません。ただ、これらは「運が悪かった」で片づく類のものではなく、発生の仕組みを理解すればアーキテクチャの側で先回りできるものがほとんどです。

ここで扱うのは、小手先でエラーを潰す話ではありません。なぜそのエラーが出るのかという構造から入り、私自身が個人開発の本番運用で実際に使っている実装パターンと、そこで測った数値を添えてお伝えします。gemini-flash-latest(現在は Gemini 3.5 Flash が実体)のように使うモデルが変わっても効き続ける考え方を、中心に据えました。

Error 1: 429 Too Many Requests(レート制限エラー)

発生の仕組み

Gemini API には、1分間あたりまたは1時間あたりの API呼び出し数に制限があります。この制限を超えると 429 エラーが返されます。

API Pro・Enterprise のプランによってレート制限は異なります:

  • 無料枠: 1時間に60リクエスト、1分間に15リクエスト
  • Pro: 1分間に300リクエスト、1日に1,500,000リクエスト

根本原因

  1. 並列リクエストの過多: 複数の API 呼び出しを同時に実行している
  2. バッチ処理の最適化不足: 本来まとめられるリクエストをバラバラに送信している
  3. ポーリング間隔が短すぎる: 短間隔でポーリングを繰り返している
  4. 複数アプリケーションの干渉: 同じ API キーで複数のアプリが独立して呼び出している

実装例: 指数バックオフ + リトライロジック

async function callGeminiAPIWithRetry(
  prompt: string,
  maxRetries: number = 5,
  baseDelayMs: number = 1000
): Promise<string> {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    try {
      const response = await fetch(
        'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-pro:generateContent',
        {
          method: 'POST',
          headers: {
            'Content-Type': 'application/json',
            'x-goog-api-key': process.env.GEMINI_API_KEY,
          },
          body: JSON.stringify({
            contents: [{ parts: [{ text: prompt }] }],
          }),
        }
      );
 
      if (response.status === 429) {
        // レート制限: 指数バックオフで待機
        const delayMs = baseDelayMs * Math.pow(2, attempt) + Math.random() * 1000;
        console.log(`Rate limited. Retrying after ${delayMs}ms (attempt ${attempt + 1}/${maxRetries})`);
        await new Promise(resolve => setTimeout(resolve, delayMs));
        continue;
      }
 
      if (response.ok) {
        const data = await response.json();
        return data.candidates[0]?.content?.parts[0]?.text || '';
      }
 
      throw new Error(`API Error: ${response.status}`);
    } catch (error) {
      if (attempt === maxRetries - 1) throw error;
      
      const delayMs = baseDelayMs * Math.pow(2, attempt);
      console.log(`Attempt ${attempt + 1} failed. Retrying in ${delayMs}ms...`);
      await new Promise(resolve => setTimeout(resolve, delayMs));
    }
  }
 
  throw new Error('Max retries exceeded');
}

対策: リクエスト単位での調整

複数リクエストを1つにまとめる

// 悪い例: 複数リクエストを並列実行
Promise.all([
  callGeminiAPI(prompt1),
  callGeminiAPI(prompt2),
  callGeminiAPI(prompt3),
]);
 
// 良い例: 順序実行またはキューイング
const prompts = [prompt1, prompt2, prompt3];
for (const prompt of prompts) {
  const result = await callGeminiAPIWithRetry(prompt);
  // 次のリクエストへ(間隔は自動的に調整される)
}

バッチ処理の活用

Gemini API のバッチ処理エンドポイントは、複数のリクエストを効率的に処理し、レート制限の影響を軽減します:

async function batchGenerateContent(prompts: string[]) {
  const requests = prompts.map(prompt => ({
    model: 'models/gemini-2.5-pro',
    contents: [{ parts: [{ text: prompt }] }],
  }));
 
  const response = await fetch(
    'https://generativelanguage.googleapis.com/v1beta/batch:generateContent',
    {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'x-goog-api-key': process.env.GEMINI_API_KEY,
      },
      body: JSON.stringify({ requests }),
    }
  );
 
  return response.json();
}
✦

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

この記事の続きを読む

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

この記事で得られること
✦リトライ増幅率を実測して数値で管理する設計手順
✦429・503・504・400・Safety を初動から切り分ける判断表
✦キャッシュ×バッチ×モデル使い分けで API 呼び出し数を削減する実務パターン
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

◈ API / SDK2026-04-09
Gemini API のエラーを status で見分ける — 本番で止めない実装
Gemini API のエラーを HTTP status と finish_reason の2軸で切り分け、待つべきものと直すべきものを即断するための実装ノート。429 の3種類の上限、モデル廃止時のフォールバック、google-genai SDK 移行後の例外階層まで扱います。
◈ API / SDK2026-10-16
models は 200 なのに generateContent だけ 403 になる日 — 切り分けの順番を先に決めておく
モデル一覧の取得は 200 で通るのに、生成リクエストだけが 403 permission_denied で止まるときの切り分け手順です。キー・プロジェクト・請求の順に確かめる小さな診断スクリプトと、リトライしてはいけない理由、サポートへ渡す材料の揃え方をまとめました。
◈ API / SDK2026-05-20
Gemini API のストリーミングが本番だけまとめて返ってくる — Cloud Run・Vercel・Cloudflare のバッファリング対処
ローカル開発では一文字ずつ流れるのに本番デプロイ後だけ応答が一括で返ってくる — Cloud Run / Vercel / Cloudflare Workers / Nginx で発生するストリーミングバッファリング問題を、原因と対処パターン別に整理しました。