🛡️ AIモデルが突然使えなくなる日に備える モデル可用性BCPの設計
目次

⚠️ 非公開(zenn 未公開)

🛡️ AIモデルが突然使えなくなる日に備える モデル可用性BCPの設計

検証日: 2026-06-14 / 契機: 2026-06-12 の Anthropic Claude Fable 5 / Mythos 5 米政府指令停止
対象読者: 実装エンジニア / LLMOps / SRE

■概要

AIモデル可用性 BCP(Business Continuity Plan)は、「特定の AI モデルが突然使えなくなる」リスクを事前に想定し、サービスを継続できるようにする運用設計です。

従来のシステム可用性設計は「ベンダー障害」や「計画メンテナンス」を主な中断シナリオとして想定してきました。しかし 2026 年 6 月 12 日の事象は、それとは異なる種類の中断——規制当局の指令による予告なしの即時停止——が現実に起きることを示しました。

契機イベント: Fable 5 / Mythos 5 の即時停止(2026-06-12)

2026 年 6 月 12 日(金)17:21 ET、Anthropic は米商務省からの輸出管理指令を受け、最新モデル Claude Fable 5 および非公開上位モデル Claude Mythos 5全顧客向けに即時無効化しました(Anthropic 公式声明より)。

指令の対象は「米国内外を問わず、すべての外国籍者(自社の外国籍従業員を含む)への提供」でした。外国籍ユーザーと国内ユーザーをリアルタイムに選別することが実務上不可能なため、Anthropic はコンプライアンス確保の手段として全面停止を選択しました。

この事象には次の3つの特徴があります。

  1. 通知ゼロ・即日全停止だった — 通常の計画的 deprecation で保証される通知期間が一切適用されませんでした。
  2. 契約上、通知ゼロは規約どおりだった — 各ベンダーの利用規約には法令遵守 / force majeure 条項があり、それが通知日数の保証を上書きします。
  3. 同一ベンダー内で生き残ったモデルがあった — 停止対象は Fable 5 / Mythos 5 のみで、Claude Opus 4.8 等は影響を受けませんでした。

本ドキュメントは、この事象を起点に「AIモデルが突然使えなくなる」リスクを4クラスに分解し、クラスごとに効く対策・効かない対策を、構造・データ・実装・運用の各面から整理します。

不確実性の明示: 援用された具体的法令名(IEEPA / ECRA / EAR の deemed export 条項のいずれか)は公式声明に明記されておらず "national security authorities" の総称のみです([未確認])。政府側の制限解除条件・期限も確認できていません([未確認])。事実は一次ソース(Anthropic 公式声明)と複数報道のクロスチェックに基づきますが、WebFetch がブロックされた一部報道(Bloomberg / CNBC / CNN / NBC / Axios)は検索スニペット経由のため [二次情報] とマークします。

■特徴

特徴1: 「モデルが消える」を4クラスに分解する

「特定モデルが突然使えなくなる」を単一リスクとして扱うと、対策を誤ります。発生メカニズム・通知の有無・影響範囲が異なる4クラスに分けると、クラスごとに効く対策が変わります。

モデルが使えなくなる クラス1計画的 deprecation クラス2法令 政府指令force majeure クラス3ベンダー障害レート制限 クラス4品質のサイレント劣化 通知 2週間〜6ヶ月範囲 特定モデル頻度 中 通知 ゼロもありうる範囲 モデル単位〜ベンダー横断頻度 低 高影響 通知 なし範囲 一時的 確率的頻度 高 短時間 通知 なし範囲 出力品質のみ頻度 継続的に潜在
クラス 発生メカニズム 通知 影響範囲 頻度
1. 計画的 deprecation ベンダーによる計画退役 2週間〜6ヶ月あり 特定モデル
2. 法令・政府指令 / force majeure 規制当局の指令、輸出管理、不可抗力 ゼロもありうる モデル単位〜ベンダー横断 低・高影響
3. ベンダー障害・レート制限 API 障害、過負荷、429 / 5xx なし 一時的・確率的 高・短時間
4. 品質のサイレント劣化 モデルの内部更新、プロンプト感度の変化 なし 出力品質のみ 継続的に潜在

今回の事象はクラス2に該当します。クラス1への備え(計画退役の前倒し移行)をいくら整えても、クラス2を防ぐことはできません。

特徴2: ベンダー横断の最小通知日数は桁が違う

計画的 deprecation(クラス1)において、主要ベンダーは一定の通知期間を設けています。一次ソースで確認した最小通知日数を横並びにすると、preview と GA の間で桁が一つ違います

ベンダー GA / 公開モデルの最小通知 preview / experimental 出典
Anthropic 60日以上 明示なし platform.claude.com/docs
OpenAI GA: 6ヶ月以上 / specialized variant: 3ヶ月以上 2週間程度 developers.openai.com
Microsoft Azure Foundry 60日以上(GA ライフサイクルは launch から18ヶ月) 30日以上 learn.microsoft.com
Google Vertex / Gemini GA の一律日数の明示なし("earliest possible date" + advance notice 方式)[未確認] 2週間以上(preview。models 頁に明記)/ experimental は subject to change ai.google.dev
Amazon Bedrock Legacy 入り後 6ヶ月以上(launch から EOL まで最短12ヶ月) preview 固有ポリシーの記載は薄い docs.aws.amazon.com

BCP 設計上は「最弱リンク = preview / experimental の2週間(または通知なし)」を前提に置くことが適切です。また Anthropic の通知は Claude API 直販のみに適用され、Amazon Bedrock 経由の場合は Bedrock 側のライフサイクル日程が優先されます。

特徴3: 通知日数の保証は法令遵守 / force majeure 条項で上書きされる

上記の通知日数は「計画的な退役(deprecation)」に対する commitment にすぎません。主要ベンダーの利用規約・サービス条件には、法令遵守・政府指令・不可抗力による即時停止を認める条項が概ね存在し、それが通知日数の保証を上書きします(AWS / Azure は一般条件またはサービスライフサイクル文書上の例外として規定。逐語の確認状況は下表と[未確認]マークを参照)。

ベンダー 即時停止を認める条項(要旨) 出典
Anthropic Commercial Terms I.2.c / I.3.a: applicable law で禁止されると判断した場合は即時 terminate / suspend 可。M.10 force majeure で履行遅延を免責 anthropic.com/legal/commercial-terms
OpenAI "required to do so by law" なら access を limit / suspend 可。force majeure の列挙語に "governmental action" を明記 openai.com/policies/services-agreement
Microsoft Azure "compliance or security issues" 発見時は emergency retirement(短縮通知) を留保 learn.microsoft.com
Google Cloud TOS 1.4(e): 12ヶ月通知の例外として "comply with applicable law" を明記。pre-GA は "changed, suspended or discontinued at any time without prior notice" cloud.google.com/terms
Amazon Bedrock EOL 通常スケジュールに "private arrangement" 例外あり。AWS 一般規約の law / force majeure 条項が適用(逐語は[未確認]) docs.aws.amazon.com

計画的 deprecation の通知日数(lifecycle 文書の commitment)と、法令/政府指令による即時停止(Terms の suspension / force majeure 条項)は別レイヤーです。後者が前者を上書きするため、「数ヶ月の猶予があれば移行できる」という前提だけで BCP を組むと、今回のような事象に無防備になります。

特徴4: 同一ベンダー内の別モデルへの退避で凌げる場合がある

今回の停止は Fable 5 / Mythos 5 の2モデルのみで、Claude Opus 4.8 等の他モデルは影響を受けませんでした。この事実は BCP 設計の方向性を大きく左右します。

規制による停止は「ベンダー全体」ではなく「特定モデル単位」で発動しうる点が重要です。一方で Anthropic 自身が「この基準を業界全体に適用すれば、全フロンティアプロバイダの新モデル展開を実質停止させる」と述べており(Fortune [二次情報])、規制はベンダー横断で同時に効く可能性もあります。この非対称性が、「マルチプロバイダ化」という直感的な対策がクラス2に対して的外れになりうる理由です。

■構造

「モデル可用性 BCP」は具体的な単一システムを持たない設計方法論のため、C4 model を「BCP 設計の論理構造」に読み替えて表現します。

●システムコンテキスト図

設計 実装 運用 インシデント対応 規制対応 顧客開示判断 サービス影響を受ける モデル呼び出し API リクエスト 法令 指令 コンプライアンス要件 メトリクス ログ送信 アラート ダッシュボード 実装エンジニア SRE / LLMOps 経営 / 法務 顧客 モデル可用性BCP 設計 LLM ベンダー群 規制当局 モデルゲートウェイ抽象化レイヤ 監視基盤
要素名 説明
実装エンジニア model ID 外出し・フォールバック設定・eval 統合を担うアプリ開発者
SRE / LLMOps インシデント検知・退避 runbook 実行・カナリアロールアウト管理
経営 / 法務 規制対応の意思決定・顧客向け公式説明の承認・SLA 影響判断
顧客 モデル変更による出力品質変動・サービス停止の影響を受ける利用者
モデル可用性 BCP 設計 本設計の対象。クラス別リスクに対応する構成要素群の総体
LLM ベンダー群 API を提供するプロバイダ。規制・障害・deprecation の発生源
規制当局 輸出管理・AI 規制(EU AI Act 等)を通じてベンダーと設計に制約を課す
モデルゲートウェイ / 抽象化レイヤ 複数プロバイダへのルーティング・フォールバックを束ねる中間層
監視基盤 OTel トレース・メトリクス・アラートを受け取る可観測性インフラ

●コンテナ図

model ID を供給 切替イベントを記録 品質スコアを通知 評価ログを記録 フォールバック発火を通知 ログを集約 モデル設定外出し層 フォールバックルーティング層 品質 eval監視層 監査ログ層 インシデントコミュニケーション層
要素名 説明
モデル設定外出し層 model ID・プロバイダ設定を環境変数・設定ファイル・feature flag で管理し、コード変更なしの切り替えを可能にする
フォールバック・ルーティング層 retry-then-fallback チェーン・プロバイダルーティング・サーキットブレーカを実装し、自動切替を担う
品質 eval・監視層 golden set eval によるフォールバック候補の事前検証と、本番出力の継続品質監視を行う
監査ログ層 model version・タイムスタンプ・入出力を紐付けて記録し、規制対応・責任分界・品質劣化の事後分析を支える
インシデント・顧客コミュニケーション層 SEV 別更新ケイデンス・status page 文言テンプレートを用意し、顧客とステークホルダへの説明を定型化する

●コンポーネント図

モデル設定外出し層

MODEL_ID 供給 トラフィック比率制御 解決済み model ID 環境変数ストア feature flagシステム model groupalias 設定 フォールバックルーティング層
要素名 説明
環境変数ストア MODEL_ID 等の設定値をコードから分離して保持する。例: MODEL_ID=claude-opus-4-8
feature flag システム カナリア比率や kill switch をコード変更なしに制御する。LLM 切替の瞬時停止にも使用
model group alias 設定 論理モデル名と実 model ID のマッピング定義。例: LiteLLM model_group_alias、OpenRouter models 配列

フォールバック・ルーティング層

リトライ上限到達 プロバイダ選択 全経路失敗 全経路失敗 リトライエンジン フォールバックチェーン サーキットブレーカ プロバイダルーター キャッシュオンフェイルオーバ
要素名 説明
リトライエンジン 429 / 5xx を対象に exponential backoff + jitter でリトライする。4xx はリトライしない
フォールバック・チェーン retry 上限到達後に次候補モデルへ順次切り替える。例: fallbacks=[{"claude-fable-5": ["claude-opus-4-8"]}]
サーキットブレーカ 一定失敗数(allowed_fails)超過でデプロイを cooldown し、カスケード障害を防ぐ
プロバイダルーター latency / cost / throughput 等の戦略でプロバイダを選択する。例: LiteLLM routing_strategy、OpenRouter provider.order
キャッシュオンフェイルオーバ 全自動経路が失敗した際にセマンティックキャッシュ応答を返すか、degraded UI へ落とす

品質 eval・監視層

スコア閾値で合否 比較結果 gen_ai.fallback 属性 p99 refusal cost golden seteval ゲート シャドウモード比較 カナリアメトリクス監視 OTel span属性収集 自動ロールバック判定
要素名 説明
golden set eval ゲート フォールバック候補を事前に同一データセット・同一 assert で評価し、品質閾値を超えたものだけを採用候補とする
シャドウモード比較 本番リクエストを現行・候補の両モデルに並行送信し、出力差分を自動採点する(コスト約2倍)
カナリアメトリクス監視 1% → 5% → 20% → 50% → 100% の段階トラフィックで p99 latency・refusal rate・cost を追跡する
OTel span 属性収集 gen_ai.fallback.reason / gen_ai.fallback.hop / gen_ai.fallback.route 等のカスタム属性例で稼働中モデルを可視化する(OTel gen_ai semantic conventions の標準属性ではない。独自属性は app.llm.fallback.* 等の名前空間にする案も可)
自動ロールバック判定 p99 latency +40% 超・refusal rate +5% 超・cost delta 超過のいずれかで自動ロールバックを発火する

監査ログ層

紐付け 付与 6ヶ月以上保持 規制対応要求時 model versionログ 入出力ログ タイムスタンプ付与 ログ保持管理 監査証跡エクスポート
要素名 説明
model version ログ 各リクエストに使用 model ID とバージョンを記録する。切替前後の出力差の根拠になる
入出力ログ 入力プロンプト・出力テキスト・tool call を記録する。EU AI Act Article 12 の記録要件に対応
タイムスタンプ付与 開始・終了日時を各ログに付与する。「使用期間の記録」要件に直結
ログ保持管理 最低6ヶ月の保持期間を設定し、削除ポリシーをドキュメント化する
監査証跡エクスポート 規制当局・法務・顧客からの説明責任要求に応じてログを出力する機能

インシデント・顧客コミュニケーション層

SEV1 SEV2 SEV3 更新トリガ 4フェーズ定型文 公開 SEV 判定 status page更新 文言テンプレートバンク 更新ケイデンス管理 チャネル配信
要素名 説明
SEV 判定 影響範囲・収益インパクトに基づき SEV1〜3 を割り当て、対応優先度を決める
status page 更新 外部公開のインシデントページを更新する。モデル変更による品質変動も degraded performance として掲載
文言テンプレートバンク Investigating / Identified / Monitoring / Resolved の4フェーズ別に定型文を事前準備する
更新ケイデンス管理 SEV1: 20〜30分ごと / SEV2: 4時間ごと / SEV3: 営業時間内 の頻度を自動リマインドする
チャネル配信 Slack(内部)/ メール / SMS / status page(外部)へ重大度別に配信する

■データ

●概念モデル

リスク分類 リスク分類 リスク分類 BCP設計 リスク分類 RiskClassリスククラス Providerプロバイダ Modelモデル ModelLifecycleStageライフサイクルステージ NoticeWindow通知期間 ContractClause契約条項 ModelConfigモデルID設定 FallbackPolicyフォールバックポリシー QualityGate品質ゲート AuditLogEntry監査ログエントリ Incidentインシデント CustomerNotification顧客通知
要素名 説明
RiskClass モデル可用性リスクの4分類(計画 deprecation / 法令・force majeure / ベンダー障害 / 品質劣化)
Provider LLM API を提供するベンダー。法管轄(jurisdiction)を持つ
Model 個別のモデル。ライフサイクルステージと通知期間を持つ
ModelLifecycleStage Active / Legacy / Deprecated / Retired / EOL 等の段階
NoticeWindow 退役通知の最小日数。契約条項により上書きされうる
ContractClause force majeure / 法令遵守による即時停止条項
ModelConfig 外出しされた model ID 設定(環境変数 / 設定ファイル / feature flag)
FallbackPolicy retry 対象・チェーン・backoff を定義するフォールバックの方針
QualityGate golden set・閾値・自動ロールバック条件
AuditLogEntry model version + 時刻 + 入出力を紐付けた監査記録
Incident リスククラスに分類されるインシデント。監査ログと顧客通知を生む
CustomerNotification SEV 別ケイデンスと status フェーズを持つ顧客向け通知

●情報モデル

RiskClass : string: classId : string: name : boolean: noticeGuaranteed : string: scope : string: frequency : string: exampleTrigger Provider : string: providerId : string: name : string: jurisdiction Model : string: modelId : string: name : string: version : boolean: isPreview ModelLifecycleStage : string: stageId : string: stageName : string: description : boolean: allowsNewCustomers NoticeWindow : string: windowId : string: minDays : string: appliesTo : boolean: overridableByLaw ContractClause : string: clauseId : string: clauseType : string: verbatim : string: sourceUrl ModelConfig : string: configId : string: modelIdRef : string: configLocation : boolean: isExternalized : datetime: lastUpdated FallbackPolicy : string: policyId : list: retryHttpCodes : string: maxRetryAttempts : list: backoffIntervals : list: fallbackChain : list: fallbackTypes QualityGate : string: gateId : string: goldenSetRef : string: p99LatencyThresholdPct : string: refusalRateThresholdPct : string: costDeltaThreshold : string: qualityFloor : boolean: autoRollback AuditLogEntry : string: entryId : datetime: timestamp : string: modelId : string: modelVersion : string: input : string: output : string: retentionMonths Incident : string: incidentId : string: severity : string: riskClassRef : datetime: startTime : datetime: endTime : string: status : list: affectedModelIds CustomerNotification : string: notificationId : string: incidentRef : string: channel : string: severity : string: updateCadence : string: statusPhase : string: message : datetime: sentAt provides 1 many currentStage many 1 retirementNotice 1 0..1 defines 1 many overrides many 1 informs 1 many informs 1 many references many 1 selects 1 many triggersOn 1 0..1 classifiedAs many 1 generates 1 many triggers 1 many recordsUse many 1

■構築方法

すべての抽象化ツールを使わない場合でも、モデル ID をコードに直書きしないだけで、クラス1(計画 deprecation への移行)とクラス2(同一ベンダー内退避)の両方に対応できます。まずこの「外出し」を最優先で行い、マルチプロバイダ抽象化はクラス3の目的で費用対効果を見て判断します。

設定キー早見表(各ツール)

ツール モデル指定キー フォールバック設定キー リトライ クールダウン
LiteLLM SDK model / model_name fallbacks=[{A:[B]}] num_retries cooldown_time
LiteLLM Proxy (YAML) model_name router_settings.fallbacks / litellm_settings.fallbacks num_retries cooldown_time
OpenRouter model / models:[...] models:[...](配列)/ fallbacks:[{model}] 自動(provider フォールバック)
Vercel AI Gateway model:'creator/name' providerOptions.gateway.models:[...] 自動(order 順試行)
LangChain init_chat_model("provider:model") .with_fallbacks([...]) max_retries
Amazon Bedrock modelId (Converse API) 障害時 fallback はクライアント実装。fallback-model(Intelligent Prompt Routing)は品質/コスト最適化用で可用性フェイルオーバーとは別 クライアント実装

model ID を設定値として外出しする(最小実装)

環境変数で外出し(最小コスト)

# 実装案 / 例
import os
from anthropic import Anthropic

client = Anthropic()
MODEL_ID = os.environ.get("LLM_MODEL_ID", "claude-opus-4-8")  # 環境変数で切替可能

response = client.messages.create(
    model=MODEL_ID,
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello"}],
)
# 切り替えは環境変数1つで完結。退避時は1行変更するだけ
export LLM_MODEL_ID=claude-opus-4-8
export LLM_MODEL_ID=claude-haiku-4-5

設定ファイル(YAML)で外出し

# config/model.yaml(実装案 / 例)
llm:
  primary_model: "claude-opus-4-8"
  fallback_model: "claude-haiku-4-5"
  timeout_seconds: 30

Feature Flag で外出し(段階ロールアウト向け)

# 実装案 / 例(GrowthBook / LaunchDarkly 等の SDK と組み合わせ)
import os

def get_model_id(user_id: str) -> str:
    # flag が true の場合に新モデルへ段階的に移行
    if feature_flag_enabled("use_new_model", user_id):
        return os.environ.get("LLM_NEW_MODEL_ID", "claude-opus-4-8")
    return os.environ.get("LLM_MODEL_ID", "claude-haiku-4-5")

LiteLLM — マルチプロバイダ抽象化の最小セットアップ

# SDK のみ(Python 直呼び出し)
pip install litellm
# Proxy サーバとして使う場合
pip install "litellm[proxy]"

各プロバイダの API キーは環境変数で設定します。

export OPENAI_API_KEY="sk-..."
export ANTHROPIC_API_KEY="sk-ant-..."
export AZURE_API_KEY="..."
export AZURE_API_BASE="https://your-resource.openai.azure.com/"
export AZURE_API_VERSION="2024-10-21"

SDK(Router クラス)最小セットアップ

出典: https://docs.litellm.ai/docs/routing

import os
from litellm import Router

model_list = [
    {
        "model_name": "claude-opus",           # アプリ側が使う名前
        "litellm_params": {
            "model": "anthropic/claude-opus-4-8",
            "api_key": os.getenv("ANTHROPIC_API_KEY"),
        },
    },
    {
        "model_name": "claude-opus",           # 同じ名前で Bedrock も登録(フェイルオーバー候補)
        "litellm_params": {
            "model": "bedrock/anthropic.claude-opus-4-8",
            "aws_region_name": "us-east-1",
        },
    },
]

router = Router(
    model_list=model_list,
    routing_strategy="simple-shuffle",
    num_retries=3,
    allowed_fails=3,
    cooldown_time=30,
)

response = router.completion(
    model="claude-opus",
    messages=[{"role": "user", "content": "Hello"}],
)

Proxy(config.yaml)最小セットアップ

出典: https://docs.litellm.ai/docs/proxy/configs

# config.yaml
model_list:
  - model_name: claude-opus
    litellm_params:
      model: anthropic/claude-opus-4-8
      api_key: os.environ/ANTHROPIC_API_KEY
  - model_name: gpt-fallback
    litellm_params:
      model: openai/gpt-4o
      api_key: os.environ/OPENAI_API_KEY

litellm_settings:
  num_retries: 3
  request_timeout: 30
  fallbacks: [{"claude-opus": ["gpt-fallback"]}]
  allowed_fails: 3
  cooldown_time: 30

general_settings:
  master_key: sk-1234
# Proxy 起動と確認
litellm --config config.yaml
curl http://0.0.0.0:4000/chat/completions \
  -H "Authorization: Bearer sk-1234" \
  -H "Content-Type: application/json" \
  -d '{"model": "claude-opus", "messages": [{"role": "user", "content": "Hello"}]}'

OpenRouter / Vercel AI Gateway / LangChain / Bedrock の最小セットアップ

OpenRouter はインストール不要で、OpenAI 互換クライアントの base_url を差し替えるだけで利用できます。

# 実装案 / 例(補完元: https://openrouter.ai/docs/guides/routing/provider-selection)
import os
from openai import OpenAI

client = OpenAI(api_key=os.getenv("OPENROUTER_API_KEY"), base_url="https://openrouter.ai/api/v1")
response = client.chat.completions.create(
    model="anthropic/claude-opus-4.8",
    messages=[{"role": "user", "content": "Hello"}],
)
# LangChain: プロバイダ:モデル 形式で指定(出典: https://docs.langchain.com/oss/python/langchain/models)
from langchain.chat_models import init_chat_model
model = init_chat_model("anthropic:claude-opus-4-8")
# Amazon Bedrock Converse API: modelId を変えるだけで別モデルへ切替
import boto3
bedrock = boto3.client("bedrock-runtime", region_name="us-east-1")
response = bedrock.converse(
    modelId="anthropic.claude-opus-4-8-v1:0",
    messages=[{"role": "user", "content": [{"text": "Hello"}]}],
)

■利用方法

フォールバック設定キー一覧表

ツール キー名 説明
LiteLLM SDK fallbacks list[str] または list[dict] モデル切替は ["代替1", "代替2"]、キー/api_base 切替は [{"プライマリ": ["代替1"]}]
LiteLLM SDK num_retries int 同一モデルへのリトライ回数
LiteLLM SDK allowed_fails int cooldown 発動前に許可する失敗数
LiteLLM SDK cooldown_time int(秒) 失敗したデプロイを一時停止する期間
LiteLLM SDK content_policy_fallbacks list[dict] コンテンツポリシー違反時のフォールバック先
LiteLLM SDK context_window_fallbacks list[dict] コンテキスト長超過時のフォールバック先
OpenRouter models string[] 優先順のモデル配列(先頭から試行)
OpenRouter fallbacks [{model}] Anthropic Messages API 互換エンドポイント用(最大3件)
OpenRouter provider.order string[] プロバイダ試行順(同一モデル内)
OpenRouter provider.allow_fallbacks boolean プロバイダ間フォールバックの許可(デフォルト true
Vercel Gateway providerOptions.gateway.models string[] モデルレベルのフォールバック配列
Vercel Gateway providerOptions.gateway.order string[] プロバイダ試行順
LangChain .with_fallbacks([...]) メソッド 失敗時に試行する Runnable のリスト
LangChain max_retries int init_chat_model でのリトライ回数
Bedrock modelId string Converse API のモデル指定(差し替えだけで切替)

retry と fallback の順序(共通原則)

「同一モデルへのリトライを尽くしてから別モデルへフォールバック」が基本順序です。

リクエスト
  └─ プライマリモデルへ送信
       ├─ 429 / 5xx → 同一モデルへ retry(num_retries 回)
       │     └─ retry 尽きたら → fallback モデルへ
       ├─ 4xx(400/401/403 等) → retry しない(即失敗 / 別 fallback へ)
       └─ 200 → 成功、schema 検証して返却
  • retry 対象: 429(レート超過)、5xx(サーバ障害)
  • retry 非対象: 400(不正リクエスト)、401(認証)、403(権限)など 4xx 系
  • 4xx はリトライしても解決しないため即座に fallback(またはエラー)へ移行します。

LiteLLM — フォールバック設定の書き方

出典: https://docs.litellm.ai/docs/completion/reliable_completions / https://docs.litellm.ai/docs/routing

from litellm import completion

# 基本フォールバック(モデル名リスト)
response = completion(
    model="anthropic/claude-opus-4-8",
    messages=[{"role": "user", "content": "Hello"}],
    num_retries=3,                                    # 同一モデルへのリトライ
    fallbacks=["openai/gpt-4o", "openai/gpt-4o-mini"], # 順に試す
)
# Router でエラー種別ごとにリトライ回数を分ける(実装案 / 例)
from litellm import Router
from litellm.router import RetryPolicy, AllowedFailsPolicy

retry_policy = RetryPolicy(
    ContentPolicyViolationErrorRetries=0,   # コンテンツポリシー違反はリトライしない
    AuthenticationErrorRetries=0,           # 認証エラーはリトライしない
    RateLimitErrorRetries=3,               # 429 は 3 回リトライ
    InternalServerErrorRetries=3,          # 5xx は 3 回リトライ
)
router = Router(
    model_list=model_list,
    num_retries=3,
    cooldown_time=30,
    retry_policy=retry_policy,
)

テスト用フラグ mock_testing_fallbacks: true を付けると、実際の障害なしにフォールバック動作を検証できます。

OpenRouter — フォールバック設定の書き方

出典: https://openrouter.ai/docs/guides/routing/model-fallbacks

# models 配列(標準エンドポイント用)。実際に使ったモデルは response.model で確認できる
response = client.chat.completions.create(
    model="anthropic/claude-opus-4.8",   # プライマリ(先頭として扱われる)
    messages=[{"role": "user", "content": "Hello"}],
    extra_body={
        "models": [
            "anthropic/claude-opus-4.8",
            "openai/gpt-4o",
            "google/gemini-2.0-flash",
        ],
    },
)

fallbacks パラメータ(Anthropic Messages API 互換エンドポイント用)は最大3件まで、models との併用は不可です。

LangChain — フォールバック設定の書き方

出典: https://docs.langchain.com/oss/python/langchain/models

from langchain.chat_models import init_chat_model

primary = init_chat_model("anthropic:claude-opus-4-8")
fallback_1 = init_chat_model("openai:gpt-4o")
fallback_2 = init_chat_model("google_genai:gemini-2.5-flash-lite")

# primary 失敗 → fallback_1 → fallback_2 の順に試行
model = primary.with_fallbacks([fallback_1, fallback_2])
response = model.invoke("Hello")

実行時に config={"configurable": {"model": "...", "model_provider": "..."}} で切り替えられるようにするには init_chat_model(..., configurable_fields=("model", "model_provider")) を使います。

Vercel AI Gateway — フォールバック設定の書き方

出典: https://vercel.com/docs/ai-gateway/models-and-providers/model-fallbacks

import { streamText } from 'ai';

const result = streamText({
  model: 'openai/gpt-5.5',                     // プライマリモデル
  prompt: 'Hello',
  providerOptions: {
    gateway: {
      models: ['anthropic/claude-opus-4.7', 'google/gemini-3.1-pro-preview'],
    },
  },
});
// 最初に成功したモデルから返す(公式逐語: "Failover happens automatically.")

フォールバック後にどのモデルが使われたかは result.providerMetadata のゲートウェイ情報から取得でき、監査ログに残せます(具体フィールド名は公式 provider-options リファレンスで確認してください)。

fallback 先での出力 schema 検証

フォールバック後のモデルはプライマリと同じ出力フォーマットを返すとは限りません。下流の JSON パーサが壊れることを防ぐため、fallback 先でも出力を検証します。

# 実装案 / 例: pydantic を用いた schema 検証
from pydantic import BaseModel, ValidationError
import json

class OutputSchema(BaseModel):
    answer: str
    confidence: float

def parse_validated(content: str) -> OutputSchema:
    try:
        return OutputSchema(**json.loads(content))
    except (json.JSONDecodeError, ValidationError) as e:
        # schema 不一致はフォールバック成功とみなさず再試行またはエラーにする
        raise ValueError(f"Output schema validation failed: {e}\nRaw: {content}")

■運用

退避ルートの runbook 化

モデル停止イベントを「障害」として扱い、手順を事前に文書化しておくことが稼働後の核心です。

夜間インシデント中に素引きできる最小手順は次のとおりです。

# 1. model ID を切り替える(環境変数 or feature flag)
export LLM_MODEL_ID=claude-opus-4-8
# 2. ロールアウト反映を確認
kubectl rollout status deployment/app-backend
# 3. 5分後に確認するメトリクス: gen_ai.fallback.hop>0 のリクエスト数 / parser エラー率 / p99 latency
# 4. 閾値(p99 +40% / 拒否率 +5%)を超えなければ 1% → 5% へ段階拡大
  1. model ID の切り替え: 設定値として外出しされた model ID を変更するだけで退避が始まる(コード変更なし)。
  2. カナリアロールアウト: 退避先へ一度に全トラフィックを流さず、段階的に増やして品質を確認する。
フェーズ トラフィック比率 継続条件 自動ロールバック条件
初期 0.1% 5分間エラーなし -
初期拡大 1% 10分間品質 floor 通過 p99レイテンシ +40% 超
中期 5% → 20% 各フェーズ15分 拒否率 +5% 超
大規模 50% → 100% 品質モニタリング継続 コスト per request 予算超過

同一セッション内で同じモデルに当たるよう、セッション ID でハッシュしてカナリアを割り当てます(高リスクアプリは 0.1% 開始が推奨 [二次情報])。

  1. 品質監視: レイテンシ(p50/p95/p99)、エラー・拒否率、出力スキーマ適合率、コスト per request、ユーザーフィードバックを継続監視する。
  2. 自動ロールバック: p99 latency +40% 超・拒否率 +5% 超・コスト超過のいずれかで feature flag 経由で前モデルへ戻す。

観測(OTel span 属性)

フォールバック発生時に以下の OTel span 属性を emit し、「今どのモデルが動いているか」「なぜ退避したか」を可視化します(futureagi.com [二次情報])。

属性 意味
gen_ai.fallback.reason 退避トリガー rate_limit_429 / provider_5xx / timeout
gen_ai.fallback.hop 何番目の退避か 1 / 2
gen_ai.fallback.route 退避先ルート claude-opus-4-8
gen_ai.fallback.score 品質スコア 0.87
gen_ai.fallback.mttr_ms 退避完了までの時間 1240
# すべてのリクエストに model version と rollout 状態を付与する
with tracer.start_as_current_span("llm.request") as span:
    span.set_attribute("gen_ai.model", model_id)
    span.set_attribute("gen_ai.model_version", response.headers.get("x-model-version"))
    span.set_attribute("gen_ai.rollout_state", "canary")  # canary / stable / shadow
    span.set_attribute("gen_ai.request_id", request_id)

品質劣化時の degraded mode 設計

自動フォールバックチェーンがすべて尽きた場合、または品質 floor を下回った場合のフォールバック先として degraded mode を定義します(Google SRE Book / futureagi.com)。

  • 静的 UI 表示: LLM 呼び出しなしで「現在 AI 機能が一時的に利用できません」を返す
  • ルールベース回答: ナレッジベース検索・FAQ テンプレート・hardcoded 回答
  • 人間オペレータへのエスカレーション: チケット起票・Slack 通知

品質 floor の値はカナリアしきい値(p99 +40% / 拒否率 +5%)を転用するのが現実的です。

顧客説明(SEV 別ケイデンスと status 文言テンプレ)

モデル停止は「サービス障害」として扱い、incident communication のプロセスを適用します(incident.io [二次情報])。

SEV 影響範囲 受信者 更新頻度
SEV1 全顧客・収益影響あり On-call + 経営 + CS + 公開 status page 20〜30分ごと
SEV2 一部顧客・回避策あり On-call + Slack stakeholder 4時間ごと
SEV3 軽微影響 チームチャンネルのみ 営業時間内
[Identified]
We have identified the issue affecting [AI model / AI feature name].
Our team is implementing a fix and we expect resolution within [timeframe].
Note: During this period, [alternative model / reduced capability] is in use.
Output quality may differ from the usual standard.

モデル品質変動(停止でなく出力品質の低下)を顧客に開示する専用テンプレートは一次ソースに見当たりませんでした([未確認])。Atlassian の「degraded performance」文言が最も近い転用元です。

監査ログ保持(EU AI Act への対応)

監査ログは規制対応・説明責任・品質劣化検知の三用途を兼ねます。

{
  "request_id": "req_abc123",
  "timestamp": "2026-06-14T08:00:34Z",
  "model_id": "claude-opus-4-8",
  "model_version": "20261001",
  "rollout_state": "canary_5pct",
  "input_hash": "sha256:...",
  "output_hash": "sha256:...",
  "fallback_hop": 1,
  "fallback_reason": "rate_limit_429"
}

EU AI Act の条文帰属は次のとおりです(条文ビューア artificialintelligenceact.eu で確認。一次ソースは EUR-Lex の Regulation (EU) 2024/1689)。

  • Article 12 §1 / §2: 高リスク AI システムに、存続期間を通じたイベントの自動記録(ログ)を技術的に可能にすることを義務付ける。
  • Article 19(providers)/ Article 26(6)(deployers): Article 12 で自動生成されるログを最低6ヶ月保持することを求める。「最低6ヶ月」は Article 12 本文ではなく Article 19・26(6) 側に帰属します。

■ベストプラクティス

リスククラスごとに「誤解 → 反証 → 推奨」の構造で整理します。

クラス1: 計画的 deprecation

  • 誤解: 「モデルが廃止されるかもしれないから常時マルチプロバイダを稼働させておく」
  • 反証: 主要ベンダーは GA モデルに60日〜6ヶ月の通知を義務付けており、計画的 deprecation の大半は前倒し移行で対処できます。常時マルチプロバイダの維持コストは過剰投資になりえます。
  • 推奨: 退役日カレンダーを監視し、通知が来たら後継モデルへの移行 eval を実施する。model ID を設定外出しにしておけば移行コードは最小です。

クラス2: 法令・政府指令 / force majeure(最重要)

  • 誤解: 「今回の Anthropic 停止事件の教訓は、マルチプロバイダ化でベンダーロックインをなくすことだ」
  • 反証: Anthropic 自身が「同じ jailbreak で OpenAI の GPT-5.5 を含む他の公開モデルからも同様の能力を引き出せる」「この標準が業界全体に適用されれば全フロンティアモデルプロバイダの新モデル展開を実質停止させる」と明言しています(Fortune [二次情報] / Anthropic 公式声明)。規制・輸出管理は米国ベンダー横断で効きうるため、OpenAI/Google に切り替えても同じ指令で同時に止まる可能性があります。また今回の停止対象は Fable 5 / Mythos 5 の2モデルのみで Opus 4.8 は無影響でした。同一ベンダー内の別 GA モデルへの退避が第一候補になりえた(品質 eval と契約要件の確認が前提)ため、マルチプロバイダ抽象化はオーバースペックだった疑いがあります。
  • 推奨: 同一ベンダー内の別モデルへの退避経路を runbook 化する。preview モデルを本番に置かない。顧客説明テンプレと監査ログを整備する。マルチプロバイダはクラス3の目的で導入を判断し、クラス2の保険として期待しない。
  • 復旧期待値(RTO)の補助情報: Anthropic は公開モデルの重み保全をコミットしています。規制による停止は「重みの消滅」ではなく「コンプライアンス確認後に復旧しうる一時停止」である場合があり、この区別が復旧期待値(どこまで待つか / 恒久退避に切り替えるか)の判断材料になります。ただし重み保全は再提供(推論可用性)の保証ではない点に注意します。

クラス3: ベンダー障害・レート制限

  • 誤解: 「多段フォールバックを組んでおけば障害に強い」
  • 反証: テストされない failover は本番で失敗します(zylos.ai [二次情報])。また抽象化レイヤ自身が新たな単一障害点になる事例があります(OpenRouter は公式ステータスで 2026-02-17 に「401 Errors across API surfaces」約1時間21分を記録、解説ブログは 80〜90% 失敗と報じる [二次情報])。LiteLLM は #15526 で高負荷時に K8s pod が再起動ループに陥るカスケード障害が報告されています(open issue・一次確認済)。
  • 推奨: リトライ(429/5xx のみ、4xx はリトライしない)を尽くしてからフォールバック。フォールバックチェーンはカオスエンジニアリングで定期検証する。抽象化レイヤを導入する場合はその可用性自身を SLO に含める。

クラス4: 品質のサイレント劣化

  • 誤解: 「自動フォールバックを設定しておけばサービスは継続できる」
  • 反証: 自動フォールバックは「動くが結果が劣化して気づかない」リスクを生みます。「Claude Opus 向けに調整したワークフローを小型モデルに routing すると構造的に異なる出力を生み、下流の parsing/validation を壊す」(tianpan.co [二次情報] / arXiv 2606.08162)。eval ゲートも golden set が本番分布を外す・overfitting・継続保守コストという限界があり、安全性の錯覚(false assurance)を生むおそれがあります。
  • 推奨: フォールバック先での出力スキーマ適合率を必ず監視する。golden set は本番の実際の失敗事例から作る。自動退避は degraded mode と組み合わせ、品質 floor を割ったら人間にエスカレーションする。

全クラス共通で最も堅い2施策

施策 理由
model ID を設定値として外出しする クラス1(前倒し移行)とクラス2(同一ベンダー内退避)の両方に効く。今回の事象で「最小の備えとして即日復旧できた」唯一の施策。コードを変えずに運用で対処できる
監査ログ(model version + タイムスタンプ + 入出力の紐付け) 参照した主要ベンダー文書・運用文献の範囲では「やるべきでない」とする論は見つからなかった。規制対応・クラス4の品質劣化検知・顧客説明の根拠の三用途を兼ね、コストが最も低い割に汎用性が最高

■トラブルシューティング

# 症状 原因 対処
① サイレント品質劣化 フォールバック後も API は 200 を返すが、下流 parser が JSON decode error を出す / 品質クレーム増加 フォールバック先モデルの出力スキーマが primary と異なる(array→object、フィールド名変化等)。自動退避は品質連続性を保証しない(arXiv 2606.08162 / tianpan.co [二次情報]) フォールバック先ごとに出力スキーマの smoke test を事前実施。本番では gen_ai.fallback.hop が1以上のリクエストの parser エラー率を別途モニタリングし、閾値超過で自動ロールバックまたは degraded mode へ遷移する
② 抽象化レイヤ自身の障害 プロバイダは正常なのに抽象化ゲートウェイが 401 / 5xx を返す。開発者が「API キーが原因」と誤切り分け OpenRouter は 2026-02-17 にキャッシュ層障害で 80〜90% 失敗、401 "User not found" を返し誤誘導(tokenmix.ai [二次情報])。LiteLLM は高負荷時に K8s readiness probe 失敗→再起動ループ(BerriAI/litellm#15526 / open / 一次確認済)。LiteLLM v1.82.7・v1.82.8 は PyPI で侵害(compromised packages は 2026-03-24 10:39 UTC から約40分 live、影響確認対象は 10:39〜16:00 UTC に pip install/upgrade した環境、公式 Docker image は非影響)(LiteLLM advisory 一次ソース) 抽象化ゲートウェイの可用性を SLO に含める。切り分けは「ベンダー直 API」と「ゲートウェイ経由」を並列で叩いて比較する。LiteLLM は公式 Docker image(ghcr.io/berriai/litellm)を使い PyPI 直インストールを避ける
③ テストされない fallback が本番で失敗 フォールバックチェーンが紙の上では整備されているが、実際に primary が落ちたときに fallback も失敗 フォールバックパスが本番相当の負荷でテストされていない(zylos.ai [二次情報])。chaos engineering を行わない限り検証できない 月次でカオステスト(tool call への障害注入・429 シミュレート・primary タイムアウト注入)を実施。fallback 発火時の p99 レイテンシを SLO に含める
④ OSS/ローカル退避の品質ギャップ コスト削減・依存排除を目的にローカル LLM へ退避したが、complex reasoning で品質が落ちる 実用的なローカルデプロイ(≤14B active params)は frontier モデルに対し 11〜13% の精度劣化(arXiv 2511.07885 [二次情報]、QWEN3-14B が NATURALREASONING で 11.8〜13.2% trailing) ローカル LLM を「保険」として設計しない。退避先は同一ベンダー内の別 GA モデルか同等 frontier モデルを第一候補に。採用する場合は golden set 品質 eval を必須とし、精度低下を業務許容範囲と照合する

■まとめ

AIモデルの突然停止は「計画 deprecation」「法令・政府指令(force majeure)」「ベンダー障害・レート」「サイレント品質劣化」の4クラスに分けると、効く対策が見えてきます。今回の Anthropic Fable 5 / Mythos 5 停止のような規制起因の停止にはマルチプロバイダ化が的外れになりうる一方、全クラスに効く最小の備えは「model ID を設定値として外出しすること」と「どのモデルがいつ何を出したかの監査ログ」です。

この記事が少しでも参考になった、あるいは改善点などがあれば、ぜひリアクションやコメント、SNSでのシェアをいただけると励みになります!

■参考リンク

概要・契機イベント(一次 / 報道)

ライフサイクル・契約条項

技術的緩和(構築・利用)

運用・トラブルシューティング

準一次ソース(arXiv)