2

モデル消失時代のAIエージェント設計|モデル非依存・フォールバック構成

モデル消失時代のAIエージェント設計|モデル非依存・フォールバック構成

この記事の結論

Fable 5停止から学ぶ。LiteLLMやOpenRouterを使ったフォールバック設計で、モデル停止時でも数秒で自動切り替えするエージェントを実装する方法を解説。

結論:2026年6月12日、Anthropic が Claude Fable 5 と Mythos 5 を政府指令で全世界停止した事件は、特定モデルへの依存がいかにエージェント全停止リスクと直結するかを実証した。モデル非依存の抽象化レイヤーとフォールバック設計を実装すれば、同様の事態でも数秒以内に代替モデルへ切り替えられる。

  • 要点1:規制・ベンダー障害・非推奨化は今後も繰り返す。「モデル交換が1ファイル変更で済む」設計が最重要の運用耐性になる。
  • 要点2:LiteLLM Router(OSS)または OpenRouter(マネージド)を使えば、primary→secondary の自動フォールバックをコード数行で実現できる。
  • 要点3:グレースフルデグレードの設計(上位モデル停止時は下位モデルで機能維持)により、停止をユーザー体験の劣化に留め、完全停止を防げる。

対象読者:LLMを使ったエージェント・アプリケーションを設計・運用している開発者・テックリード・PM

今日やること:自社コードベースの LLM 呼び出し箇所を grep し、モデル名がハードコードされている箇所を1つ特定する

2026年6月12日、何が起きたか

2026年6月12日(日本時間6月13日早朝)、Anthropic は 公式声明 を発表し、Claude Fable 5 と Mythos 5 への全ユーザーアクセスを即時停止した。

経緯は以下の通りだ。米国政府は国家安全保障上の権限に基づき、外国籍を持つすべての人物(米国内在住・Anthropic社員含む)に対して Fable 5 と Mythos 5 へのアクセスを禁じる輸出管理指令を発動した。Anthropic はリアルタイムに外国籍ユーザーを識別・フィルタリングする手段を持たないため、全ユーザーを対象に両モデルを停止する以外の選択肢がなかった。

Fable 5 と Mythos 5 はわずか3日前の6月9日にリリースされたばかりだった。停止理由として政府が挙げたのは「Fable 5 のジェイルブレイク手法の存在」だが、Anthropic はこれを「特定の文脈でのみ Mythos のサイバーセキュリティ機能をアンロックする限定的なもの」であり、すべての安全装置を無効化する汎用ジェイルブレイクではないと反論している(CNBC報道)。

Claude Opus 4.8・Sonnet 4.6 を含む他モデルへのアクセスは継続されている。復活時期は「できるだけ早く」とされているが、公式には具体的な日程は示されていない。

この事件が開発者・PMにとって重要な理由はシンプルだ。特定モデル名をコードにハードコードしていた場合、アプリケーションはその瞬間から動作を停止する。 今後も規制強化・企業判断・ベンダー障害・モデルの非推奨化は必ず起こる。この記事では「起きるたびに手動対応」ではなく、設計レベルで耐性を持たせる方法を解説する。

なぜモデル消失は今後も繰り返すのか

Fable 5 停止は「特殊ケース」ではない。モデルが突然使えなくなるシナリオは複数存在する。

リスク種別 具体例 発生頻度
規制・政府指令 Fable 5 / Mythos 5 停止(2026年6月) 低頻度・突発的
ベンダー非推奨化 GPT-3.5-turbo の段階的廃止、Claude 2 の終了 半年〜2年サイクル
サービス障害 OpenAI API 障害(2024年複数回)、Anthropic の一時的なキャパシティ不足 月1〜複数回
レート制限到達 同時リクエスト数・TPM の上限超過 スケール時に高頻度
コスト急騰・モデル改訂 料金プランの突然の変更、コンテキスト長の仕様変更 不定期

開発者に馴染み深いのはレート制限や障害だが、規制リスクは「AIが国際的な競争資産になった」この時代において今後増加する可能性がある。Anthropic 自身が声明の中で「このような基準が業界全体に適用されれば、本質的にすべての新モデル展開が停止することになる」と警告していることも重要な視点だ(Anthropic公式声明)。

モデル抽象化レイヤーの設計思想

根本解決策は「LLM プロバイダとアプリケーションロジックを分離すること」だ。具体的には、アプリケーションコードが直接 claude-fable-5gpt-4o を呼ぶのではなく、プロバイダ非依存のインターフェースを経由する設計にする。

設計の核心は以下の3層に分解できる。


[アプリケーション層]
    ↓ model="high-tier" など抽象名で呼ぶ
[LLM ゲートウェイ / ルーター層]
    ↓ 抽象名 → 実際のモデルへのマッピング・フォールバック
[プロバイダ層]
    Anthropic / OpenAI / Google / Groq / ローカルモデル ...

アプリケーション層はモデル名を知らない。ゲートウェイ層が「現時点でどのモデルが生きているか」を管理し、最適なモデルにルーティングする。モデルが停止した場合の切り替えはゲートウェイ層の設定変更だけで完結する。

実装アプローチは大きく2つある。

アプローチ ツール例 特徴 向いているチーム
OSS セルフホスト型 LiteLLM Proxy 自前インフラ・フル制御・カスタム可能 セキュリティ要件が厳しい・オンプレ環境
マネージドサービス型 OpenRouter インフラ不要・400以上のモデル対応・即日導入 スタートアップ・プロトタイプ・小規模チーム
自前アダプタ実装 抽象クラス + 設定ファイル 依存ゼロ・最小構成・最大柔軟性 特定要件がある・社内統制が強い環境

モデルルーティングの基礎設計については「モデルルーティング設計ガイド2026|タスク複雑度×コスト判断フロー」でも詳しく解説している。

LiteLLM Router によるフォールバック実装

LiteLLM は OpenAI 互換インターフェースで 100 種類以上の LLM を呼び出せる OSS ゲートウェイだ(LiteLLM 公式ドキュメント)。Router コンポーネントを使えば、primary モデルの失敗時に secondary へ自動的に切り替えられる。

以下は Python SDK による基本的なフォールバック設定だ。


# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
# 動作環境: Python 3.11+, litellm>=1.40.0

from litellm import Router

router = Router(
    model_list=[
        {
            "model_name": "primary-model",
            "litellm_params": {
                "model": "claude-opus-4-8",   # 主力モデル(利用可能)
                "api_key": "sk-ant-..."
            }
        },
        {
            "model_name": "secondary-model",
            "litellm_params": {
                "model": "gpt-4o",            # 停止時の第1フォールバック
                "api_key": "sk-proj-..."
            }
        },
        {
            "model_name": "tertiary-model",
            "litellm_params": {
                "model": "gemini/gemini-2.5-pro", # 第2フォールバック
                "api_key": "AI..."
            }
        }
    ],
    # primary-model が失敗したら secondary → tertiary の順で試みる
    fallbacks=[
        {"primary-model": ["secondary-model"]},
        {"secondary-model": ["tertiary-model"]}
    ],
    num_retries=2,          # 各モデルでの再試行回数
    request_timeout=30,     # タイムアウト(秒)
    allowed_fails=3,        # クールダウンまでの許容失敗回数
    cooldown_time=60        # クールダウン期間(秒)
)

response = await router.acompletion(
    model="primary-model",
    messages=[{"role": "user", "content": "タスクを実行して"}]
)
# response.model に実際に使われたモデルが入る
print(f"使用モデル: {response.model}")

ポイントは3点だ。

  • モデル名を抽象化する:"primary-model" という名前はアプリコードに書く。実際の claude-opus-4-8 はゲートウェイ設定に閉じ込める。Fable 5 が停止した日も、設定ファイルの1行を変えるだけで対応できる。
  • クールダウンを設定する:allowed_fails=3 で3回失敗したモデルを cooldown_time=60 秒間除外する。障害から自動復旧した際には再び主力モデルとして使われる。
  • 実際に使ったモデルをログに残す:response.model を記録しておくと、どの期間にどのモデルが多く使われたかを事後に確認できる。コスト管理とデバッグに役立つ。

YAML プロキシ設定(Litellm Proxy サーバー経由で使う場合)は以下のようになる。


# litellm_config.yaml
model_list:
  - model_name: primary-model
    litellm_params:
      model: claude-opus-4-8
      api_key: os.environ/ANTHROPIC_API_KEY

  - model_name: secondary-model
    litellm_params:
      model: gpt-4o
      api_key: os.environ/OPENAI_API_KEY

litellm_settings:
  fallbacks:
    - primary-model: [secondary-model]
  num_retries: 2
  request_timeout: 30
  allowed_fails: 3
  cooldown_time: 60

OpenRouter によるフォールバック実装

インフラを持たずにすぐ使いたい場合、OpenRouter が有力な選択肢だ。単一の API エンドポイントで 400 種類以上のモデルにアクセスでき、models パラメータに配列でフォールバックリストを渡せる(OpenRouter 公式ドキュメント)。


# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
# OpenAI SDK 互換で OpenRouter を利用する例

import openai

client = openai.OpenAI(
    base_url="https://openrouter.ai/api/v1",
    api_key="sk-or-v1-..."
)

response = client.chat.completions.create(
    model="anthropic/claude-opus-4-8",   # プライマリ(明示的に指定)
    extra_body={
        "models": [
            "anthropic/claude-opus-4-8",     # 1st: 主力
            "openai/gpt-4o",                  # 2nd: Fable 5 停止時のフォールバック
            "google/gemini-2.5-pro"           # 3rd: 第2フォールバック
        ]
    },
    messages=[{"role": "user", "content": "タスクを実行して"}]
)

# 実際に使われたモデルを確認
print(f"使用モデル: {response.model}")

OpenRouter はレート制限・サーバーダウン・コンテキスト長エラーが発生した場合に自動的に次のモデルへ切り替える。課金は実際に使われたモデルの料金で発生する仕組みだ。

OpenRouter の詳しい設定と活用法については「OpenRouter 完全ガイド|マルチモデルLLMルーティング・コスト最適化・LiteLLM比較」を参照してほしい。

グレースフルデグレードの設計

フォールバックを組んでも、代替モデルが主力モデルと完全に同等の能力を持つわけではない。重要なのは「停止を完全停止にしない」グレースフルデグレード(graceful degradation)の発想だ。

実装パターンを3段階に整理する。

Tier 1:同等モデルへの即時切り替え

主力が停止しても、類似能力の代替モデルでフル機能を継続する。例:Fable 5 → Opus 4.8。ユーザーへの影響はほぼゼロ。

Tier 2:下位モデルでコア機能のみ継続

同等モデルも使えない場合、より軽量なモデルでコア機能(例:要約、分類)を維持する。高度な推論を要する機能はスキップまたはキューイングする。

Tier 3:キャッシュ・静的応答でフォールバック

全 LLM が利用不能な場合、事前生成した応答キャッシュや静的メッセージで最低限の機能を保つ。完全停止ではなく「機能縮退中」として扱う。


# 3段階グレースフルデグレードの疑似実装
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。

TIER_CONFIG = {
    "tier1": ["claude-opus-4-8", "gpt-4o"],          # フル機能
    "tier2": ["claude-sonnet-4-6", "gpt-4o-mini"],   # コア機能のみ
    "tier3": "cache",                                  # キャッシュ
}

async def call_with_degradation(prompt: str, require_full: bool = False):
    # Tier 1: フル機能モデルを試みる
    for model in TIER_CONFIG["tier1"]:
        try:
            return await call_model(model, prompt), "tier1"
        except ModelUnavailableError:
            continue

    if require_full:
        # フル機能が必須のタスクはキューに積んで後で処理
        await enqueue_for_later(prompt)
        return None, "queued"

    # Tier 2: 下位モデルで継続
    for model in TIER_CONFIG["tier2"]:
        try:
            return await call_model(model, prompt), "tier2"
        except ModelUnavailableError:
            continue

    # Tier 3: キャッシュ応答
    cached = get_cached_response(prompt)
    if cached:
        return cached, "tier3-cache"

    raise AllModelsUnavailableError("全モデルが利用不能です")

モデル差し替え時の現実的な注意点

フォールバックを実装した後も、「モデルを差し替えれば同じように動く」とは限らない。移行時に必ず確認すべき差分を整理する。

プロンプト互換性の問題

System プロンプトのフォーマットや役割分担の指示がモデルによって異なる解釈をされることがある。Anthropic の Claude 系列と OpenAI 系列ではシステムプロンプトの機能する書き方が微妙に異なる。フォールバック先でも同等の品質を得るには、プロンプトをモデル別に調整する仕組みか、最大公約数的な書き方を採用する必要がある。

コンテキスト長の差

主力モデルで 200K トークンを使う設計をしている場合、フォールバック先が 128K しか対応していないと入力が切り捨てられる。フォールバック時は自動的に入力を圧縮するか、コンテキスト長を意識したチャンク設計を最初から採用しておくことが重要だ。

コスト差のモニタリング

フォールバックが長期間続くと、コスト構造が変わる。主力モデルより高額なフォールバックに切り替わった場合、気づかないまま予算超過になるリスクがある。フォールバック発動時は Slack などにアラートを送り、使用モデルと推定コストを可視化する仕組みを入れておくとよい。

評価の自動化(回帰検証)

モデルを差し替えた後、出力品質が維持されているかを自動検証する仕組みを持つことが理想だ。代表的なテストケース20〜50件を用意し、フォールバック先での出力スコアを主力モデルと比較する評価パイプラインを CI に組み込むことを推奨する。


# モデル差し替え時の簡易回帰検証スクリプト
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。

import asyncio

TEST_CASES = [
    {"input": "テストプロンプト1", "expected_keyword": "期待キーワード1"},
    {"input": "テストプロンプト2", "expected_keyword": "期待キーワード2"},
    # ... 20〜50件
]

async def regression_check(new_model: str) -> dict:
    results = {"pass": 0, "fail": 0, "details": []}
    for case in TEST_CASES:
        response = await call_model(new_model, case["input"])
        passed = case["expected_keyword"] in response
        results["pass" if passed else "fail"] += 1
        if not passed:
            results["details"].append({
                "input": case["input"],
                "expected": case["expected_keyword"],
                "actual": response[:200]
            })
    return results

ベンダーロックイン回避のチェックリスト

設計レビューで確認すべき項目を整理する。

  • LLM を呼び出すコードでモデル名がハードコードされていないか(環境変数または設定ファイルに外出しする)
  • モデル名の変更が1ファイル以内の変更で完了するか
  • フォールバックリストが最新の利用可能モデルで更新されているか(廃止モデルが残っていないか)
  • フォールバック発動時にアラートが飛ぶか
  • フォールバック先でも主要ユースケースのコンテキスト長が収まるか
  • モデル差し替え時の回帰テストが自動化されているか
  • コスト監視ダッシュボードでモデル別の使用量が確認できるか

【要注意】よくある失敗パターンと回避策

失敗1:設定はしたが、フォールバックをテストしていない

フォールバックの設定をしても、実際にプライマリモデルを意図的に落とした状態でテストしなければ、本番での動作は保証できない。ステージング環境で主力モデルの API キーを意図的に無効化し、フォールバックが正しく起動することを確認する。

失敗2:フォールバック先がいつの間にか廃止されている

LLM の非推奨化サイクルは早い。フォールバックリストに設定したモデルが半年後に廃止されている、というケースは珍しくない。月次でフォールバックリストを見直し、公式ドキュメントで現役モデルを確認する運用を組み込む。

失敗3:フォールバックをリトライループと混同する

「同じモデルへの再試行」と「別モデルへのフォールバック」は別物だ。一時的な過負荷なら短時間の再試行で解決するが、Fable 5 のような停止は再試行では解決しない。エラー種別を見て「再試行」か「フォールバック」かを振り分けるロジックが必要だ。接続タイムアウトは再試行、ModelNotFoundError はフォールバックへ、と区別する。

よくある質問

Q:OpenRouter と LiteLLM のどちらを選べばよいですか?

A:スピードを優先する小規模チームや PoC 段階なら OpenRouter が向いています。インフラを自前管理でき、セキュリティ要件が厳しい環境(金融・医療など)や、独自ルーティングロジックが必要な場合は LiteLLM Proxy のセルフホストが向いています。両者を組み合わせる構成も可能です。

Q:プロンプトをモデルごとに書き分けるのは現実的ですか?

A:フォールバック先が2〜3モデルの範囲なら、モデルファミリー別(Claude系・OpenAI系・Gemini系)のプロンプトテンプレートを持つことは現実的です。モデルファミリー内での差し替えは多くの場合プロンプト修正なしで機能します。ファミリーをまたぐ場合のみ調整する設計が実用的です。

Q:コンテキスト長が足りない場合のフォールバックはどう設計しますか?

A:フォールバック先のコンテキスト長が短い場合、入力を自動圧縮(要約・チャンク分割)するミドルウェアを挟む設計が有効です。LiteLLM には入力が長すぎる場合に自動でエラーを返す機能があるため、これをフォールバックのトリガーとして利用することができます。

Q:Fable 5 の停止は永続しますか?Anthropic が対応するまで待てばよいですか?

A:Anthropic は「できるだけ早く復旧する」としており、今回は特定のモデルに限定した停止です。ただし「復旧するまで待つ」という戦略はビジネス継続性の観点から推奨できません。規制環境は今後も変化する可能性があり、今回の事件をきっかけに抽象化レイヤーを実装しておくことが中長期の運用安定性につながります。

Q:完全停止を防ぐには何段階のフォールバックが必要ですか?

A:最低でも2段階(primary + 1段フォールバック)は必須です。本番クリティカルなシステムでは3段階(+ Tier3のキャッシュ)を推奨します。ただし段階を増やすほど設定の保守コストも増えるため、ユースケースのビジネスインパクトに応じて判断してください。

この記事を読んでエージェント設計を見直したい方へ

UravationではAIエージェント設計・実装・運用の研修・コンサルを行っています。LLMゲートウェイの導入から評価パイプラインの構築まで、実務レベルの支援が可能です。

Need help moving from reading to rollout?

この記事を読んで導入イメージが固まってきた方へ

Uravationでは、AIエージェントの要件整理、PoC設計、社内導入、研修まで一気通貫で支援しています。

この記事をシェア

X Facebook LINE

※ 本記事の情報は2026年6月時点のものです。サービスの料金・仕様は変更される可能性があります。最新情報は各サービスの公式サイトをご確認ください。

関連記事