◉CLAUDE LABEN
●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/API & SDK
⬡ API & SDK/2026-06-28上級

弱いモデルへ静かに落ちる方がエラーより怖い — Claude API のモデル降格に「下限」を設ける設計

無人運用のパイプラインでモデルが使えなくなったとき、弱いモデルへ自動で落ちる実装は危険です。タスクごとの能力契約と降格予算で「どこまで落ちたら止めるか」を決める設計を、個人開発の自動運用の実体験から解説します。

claude-api83fallback8model-availabilityerror-handling10production87

✦ プレミアム記事

無人で動かしているパイプラインで一番こわいのは、止まることではありません。止まらずに、こっそり質を落としたまま動き続けることです。

個人開発で複数のサイトの定期実行を回していて、深夜のバッチが主力モデルにアクセスできず、自動で軽量モデルへ落ちていたことがありました。リトライは成功し、ログには 200 OK が並び、処理は完走していました。気づいたのは翌朝で、その間に出力された分は明らかに密度が足りていませんでした。エラーで止まっていれば即座に分かったのに、フォールバックが「成功」を演出してしまったのです。

このとき痛感したのは、フォールバックの設計で本当に難しいのは「どのモデルに落とすか」ではなく、**「落ちてはいけない下限をどこに引くか」**だということでした。落とせるだけ落とす実装は、無人運用では静かな品質事故の温床になります。

「落とす」前に「落ちてよいか」を決める

多くのフォールバック実装は、エラーを受け取ってから次のモデルを選びます。順序が逆です。先に決めるべきは、そのタスクが弱いモデルに落ちても許されるのかという一点です。

たとえば私の運用では、タスクをおおまかに二種類に分けています。

タスク種別降格して許されるか理由
記事本文の生成・要約の最終確定許されない質が落ちると読者に届く成果物が劣化する。やり直しが効かない
タグ付け・カテゴリ分類・短い整形許される多少精度が落ちても後段で補正でき、影響範囲が小さい

前者で軽量モデルへ落ちるくらいなら、その回はスキップして次の実行に回す方がよいのです。「動き続けること」より「下限を割らないこと」を優先する。この判断を、エラーが起きてからその場の勢いで決めてはいけません。コードに契約として書いておきます。

タスクごとに「最低限必要な能力」を契約にする

フォールバックを「モデルの並び順」で書くと、新しいモデルが増えるたびに並びを直す羽目になります。代わりに、タスクが要求する能力と、各モデルが満たす能力を別々に宣言し、突き合わせる形にします。

from dataclasses import dataclass, field
from enum import IntEnum
 
 
class Tier(IntEnum):
    """能力の段階。数値が大きいほど高能力。比較で下限判定に使う。"""
    LIGHT = 1     # 軽量・高速。分類や整形向け
    BALANCED = 2  # 標準。多くの実務タスクの主力
    DEEP = 3      # 高能力。最終成果物や難しい推論向け
 
 
@dataclass(frozen=True)
class ModelSpec:
    """モデル1つ分の能力宣言。model_id は環境変数などから差し込む前提。"""
    model_id: str
    tier: Tier
    supports_thinking: bool = False
    max_output_tokens: int = 8192
 
 
@dataclass
class TaskContract:
    """このタスクが満たすべき下限。ここを割るモデルは候補から外す。"""
    name: str
    min_tier: Tier
    needs_thinking: bool = False
    min_output_tokens: int = 1024
    # 降格を1段でも許すか。最終成果物は False(=主力以外に落ちない)にする
    allow_downgrade: bool = True
 
    def is_satisfied_by(self, spec: ModelSpec) -> bool:
        if spec.tier < self.min_tier:
            return False
        if self.needs_thinking and not spec.supports_thinking:
            return False
        if spec.max_output_tokens < self.min_output_tokens:
            return False
        return True

model_id を直接ハードコードしない点が肝心です。モデルの実IDは環境ごとに変わりますし、引退・改名もあります。コードが依存するのは「能力」であって「名前」ではない、という形にしておきます。

✦

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

この記事の続きを読む

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

この記事で得られること
✦タスクごとに「最低限必要な能力」を契約として書き、その下限を割るフォールバックを禁止する実装
✦降格予算(degradation budget)で「静かに弱いモデルへ落ち続ける」事故を時間と件数で止める仕組み
✦一時的な不在と恒久的な消滅を区別し、恒久消滅だけ切り替えを永続化する判定ロジック(動くPythonコード)
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

⬡ API & SDK2026-05-22
Claude の『このモデルは現在利用できません』が出る時に効くモデル選択フォールバックの設計
Claude API で『このモデルは現在利用できません(this model is currently unavailable)』と返ってきたとき、529 Overloaded やレート制限と同じ扱いにすると遠回りになります。エラーの種類を SDK の例外クラスで見分け、モデル ID をリクエスト単位で切り替えるフォールバックの実装と、思い込みで書きやすい落とし穴をまとめました。
⬡ API & SDK2026-05-22
Claude API の tool_result could not be submitted が再発しないための回復ハンドラ設計
Claude API でエージェントを長時間動かしていると、ある日突然 'tool_result could not be submitted' が連発し始めることがあります。再試行しても直らない、ストリーミング途中で死ぬ、そして次のセッションでもまた出る — 常時稼働のエージェント基盤で実際に踏み抜いた4種類の原因と、TypeScript で書いた回復ハンドラの実装を整理しました。
⬡ API & SDK2026-05-09
Claude API の 400/422/529 を“呼ぶ前”に消す5層プリフライト設計 — 月数百件の失敗呼び出しをゼロにした実装
Claude API の 400/422/529 エラーを“呼ぶ前”に止める5層プリフライト設計を、TypeScript の完全実装と運用1ヶ月分の数値でまとめました。失敗呼び出しのコスト・リトライ・通知ノイズを同時に削減できます。