ANTIGRAVITY LABEN
記事一覧/Agents & Manager
Agents & Manager/2026-04-13上級

Antigravity AIエージェント耐障害性設計 — リトライ・サーキットブレーカー・フォールバックで本番を守る

Antigravityで構築するAIエージェントに耐障害性を組み込む実践ガイド。リトライ戦略、サーキットブレーカー、モデルフォールバック、チェックポイント設計まで本番運用に必要な全パターンを網羅する。

antigravity436agents90error-handling2production59resilience7circuit-breaker3retry8

プレミアム記事

AIエージェントはなぜ本番で壊れるのか

Antigravity で動くAIエージェントを開発環境でテストしているときは、すべてが順調に見える。しかし本番にデプロイした瞬間、想像もしなかった壊れ方をします。LLM APIが429を返す。レスポンスが途中で途切れます。トークン上限に達してエージェントが中途半端な状態で停止します。

私がこの問題に本格的に向き合ったのは、マルチエージェントパイプラインを本番投入して3日目の深夜2時だった。Gemini APIのレートリミットに引っかかり、5つのエージェントが連鎖的に停止。復旧に4時間かかった。

このガイドでは、その経験から構築した耐障害性パターンをすべて公開します。サーキットブレーカー、リトライ戦略、モデルフォールバック、チェックポイント設計——本番環境でAIエージェントを安定稼働させるために必要な実装パターンを、動作するコードとともに解説します。

リトライ戦略の設計 — Exponential Backoff と Jitter の正しい実装

AIエージェントのAPI呼び出しは、従来のWebサービスとは異なるリトライ戦略が必要です。LLM APIは応答に数秒〜数十秒かかるため、単純なリトライでは待ち時間が爆発的に増加します。また、複数エージェントが同時にリトライすると「リトライストーム」を引き起こし、API側の負荷をさらに悪化させる。

なぜ固定間隔リトライではダメなのか

固定間隔(例: 毎回3秒待機)でリトライすると、障害発生時に全エージェントが同じタイミングで再リクエストを投げる。これはいわゆる「Thundering Herd(群集雪崩)」問題で、APIの復旧をかえって遅らせる。

Exponential Backoff with Jitter(指数バックオフ+ジッター)が標準解です。待ち時間を指数的に増やしつつ、ランダムなゆらぎを加えることで、リトライのタイミングを分散させる。

// Antigravity プロジェクトで使えるリトライユーティリティ
// エージェントのAPI呼び出しをラップして自動リトライする
 
interface RetryConfig {
  maxRetries: number;       // 最大リトライ回数
  baseDelayMs: number;      // 初回待機時間(ミリ秒)
  maxDelayMs: number;       // 待機時間の上限
  jitterFactor: number;     // ジッター係数(0〜1)
  retryableErrors: number[]; // リトライ対象のHTTPステータス
}
 
const DEFAULT_CONFIG: RetryConfig = {
  maxRetries: 5,
  baseDelayMs: 1000,
  maxDelayMs: 60000,
  jitterFactor: 0.5,
  retryableErrors: [429, 500, 502, 503, 504],
};
 
async function withRetry<T>(
  operation: () => Promise<T>,
  config: Partial<RetryConfig> = {}
): Promise<T> {
  const cfg = { ...DEFAULT_CONFIG, ...config };
  let lastError: Error | null = null;
 
  for (let attempt = 0; attempt <= cfg.maxRetries; attempt++) {
    try {
      return await operation();
    } catch (error: unknown) {
      lastError = error instanceof Error ? error : new Error(String(error));
 
      // リトライ対象でないエラーは即座にスロー
      const status = (error as { status?: number }).status;
      if (status && \!cfg.retryableErrors.includes(status)) {
        throw error;
      }
 
      if (attempt === cfg.maxRetries) {
        break; // 最大リトライ回数に達した
      }
 
      // Exponential Backoff + Full Jitter
      const exponentialDelay = cfg.baseDelayMs * Math.pow(2, attempt);
      const cappedDelay = Math.min(exponentialDelay, cfg.maxDelayMs);
      const jitter = cappedDelay * cfg.jitterFactor * Math.random();
      const finalDelay = cappedDelay - (cappedDelay * cfg.jitterFactor / 2) + jitter;
 
      console.warn(
        `[Retry ${attempt + 1}/${cfg.maxRetries}] ` +
        `Waiting ${Math.round(finalDelay)}ms before retry. ` +
        `Error: ${lastError.message}`
      );
 
      await new Promise(resolve => setTimeout(resolve, finalDelay));
    }
  }
 
  throw new Error(
    `Operation failed after ${cfg.maxRetries} retries. Last error: ${lastError?.message}`
  );
}
 
// 使用例: Gemini API呼び出しにリトライを適用
const response = await withRetry(
  () => 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 }] }] }),
  }),
  { maxRetries: 3, baseDelayMs: 2000 }
);
// 期待出力: 429エラー時に2s→4s→8sの間隔でリトライし、成功すればレスポンスを返す

リトライと冪等性

ここで見落としがちな問題があります。リトライするということは、同じ操作を複数回実行する可能性があるということです。LLMへの問い合わせ自体は冪等だが、エージェントが「ファイルに書き込む」「APIを呼ぶ」といった副作用を伴うアクションを実行する場合、リトライが重複実行を引き起こす。

対策は、アクション実行前にチェックポイントを記録し、リトライ時に「すでに実行済みか」を確認するパターンです。これについては後のセクションで詳しく解説します。

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

この記事の続きを読む

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

この記事で得られること
AIエージェントが本番で突然止まる問題を、サーキットブレーカーとリトライ戦略で根本解決できる
モデルフォールバック・チェックポイント・グレースフルデグラデーションの実装パターンを習得し、自分のプロダクトに即適用できる
エージェントの障害を検知・復旧・予防する監視基盤を構築し、深夜のインシデント対応から解放される
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

Agents & Manager2026-05-22
Antigravity Agent のフォールバック階層設計 — モデル劣化・API障害・コスト超過を 4 段で受け止める Resilience アーキテクチャ
AI エージェントの本番運用で起きる『モデル応答劣化・API障害・コスト超過』を 4 段階のフォールバック階層で受け止める設計を、6 アプリ並行運用の実装ログとともに整理しました。
アプリ開発2026-04-23
Antigravity Python API を本番で落とさない — リトライ・タイムアウト・サーキットブレーカー実装ガイド
Antigravity で開発する Google Gen AI SDK アプリケーションを本番環境で安定稼働させるための、リトライ・タイムアウト・サーキットブレーカー・バックプレッシャー設計を、動作する Python コードと運用経験から体系的に解説します。
Agents & Manager2026-07-05
エージェント開発スタックの『既知の正常』を1枚のロックファイルで守る — 可動部が同時に動く時代の変更予算設計
IDEビルド・CLI・モデル・依存が同時に動くと、回帰の原因が特定できなくなります。既知の正常を1枚のロックファイルに固定し、一度に動かす軸を絞る変更予算の設計を、実装コードと運用ログで整理しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →