CLAUDE LABEN
CORPS — Anthropicが$150Mの全国フェローシップ「Claude Corps」を発表(6/11)。早期キャリア人材1,000人をAI実務で育成し米国の非営利団体へ配置。第1期は10月開始SUBAGENTS — Claude Codeでサブエージェントの入れ子が可能に(最大5階層)。多段の委譲ワークフローをそのまま設計できるようになりましたWORKFLOWS — Dynamic workflowsがリサーチプレビューで登場。CLI・Desktop・VS Code拡張から、コードベース全域のバグ探索や大規模移行を組めます(Max/Team/Enterprise)BILLING — 6/15の課金変更まで残り2日。Agent SDK・headless・GitHub Actionsが月次クレジット($20/$100/$200)へ移行。同日にSonnet 4とOpus 4がAPIから引退しますFABLE5 — Fable 5の無料同梱期間は6/22まで継続中。Pro/Max/Team/Enterpriseで追加費用なしに試せますCODE80 — 「Claudeが自身のコードの80%超を書く」とIPO関連報道。2025年2月の10%未満から1年余りで急伸CORPS — Anthropicが$150Mの全国フェローシップ「Claude Corps」を発表(6/11)。早期キャリア人材1,000人をAI実務で育成し米国の非営利団体へ配置。第1期は10月開始SUBAGENTS — Claude Codeでサブエージェントの入れ子が可能に(最大5階層)。多段の委譲ワークフローをそのまま設計できるようになりましたWORKFLOWS — Dynamic workflowsがリサーチプレビューで登場。CLI・Desktop・VS Code拡張から、コードベース全域のバグ探索や大規模移行を組めます(Max/Team/Enterprise)BILLING — 6/15の課金変更まで残り2日。Agent SDK・headless・GitHub Actionsが月次クレジット($20/$100/$200)へ移行。同日にSonnet 4とOpus 4がAPIから引退しますFABLE5 — Fable 5の無料同梱期間は6/22まで継続中。Pro/Max/Team/Enterpriseで追加費用なしに試せますCODE80 — 「Claudeが自身のコードの80%超を書く」とIPO関連報道。2025年2月の10%未満から1年余りで急伸
記事一覧/API & SDK
API & SDK/2026-06-13上級

6/15 の claude-sonnet-4・claude-opus-4 引退に備えて、本番のモデルIDを棚卸しする

6月15日に claude-sonnet-4 と claude-opus-4 が API から引退します。直書きされたモデルIDを引退前に洗い出し、出力パリティを検証し、別名レイヤーとフォールバックで安全に切り替えるまでの実装手順をまとめました。

api-sdk9migration6model-deprecationproduction71

プレミアム記事

「6月15日に claude-sonnet-4 と claude-opus-4 が API から引退します」という一文を見たとき、最初に確認すべきは自分のコードのどこにそのモデルIDが直書きされているか、です。困るのは目につく場所ではありません。半年前に書いて以来触っていない夜間バッチや、環境変数のデフォルト値、いつか組み込んだベンダー製ラッパーの奥に残った model: "claude-opus-4" です。引退当日、そこだけが静かに model_not_found を返し始めます。

個人開発の運用では、こうした「忘れた固定値」を私自身も何度か踏んできました。動いているコードほど読み返さないので、引退のアナウンスが来てから慌てて全文検索しても、検索語が一致せず取りこぼします。今回はその取りこぼしを機械的になくし、切り替え後の挙動差まで含めて安全に移行するところまでを順に書いていきます。

grep だけでは漏れる — まず機械的に棚卸しする

grep -r "claude-opus-4" で済むなら苦労はありません。漏れるのは、os.environ.get("MODEL", "claude-opus-4") のようにデフォルト値として埋め込まれたケースや、config.json に文字列で置かれたケース、そして日付サフィックス付き(claude-opus-4-20250514 のような形)で書かれたケースです。

そこで「現役のIDを許可リストに持ち、それ以外の claude-* を全部あぶり出す」方針にします。引退する2つを名指しで拾いつつ、見覚えのないIDも「要確認」として報告させるのが肝心です。

#!/usr/bin/env python3
"""本番コードに残る引退予定・不明なモデルIDを洗い出すスキャナ。"""
import re
import sys
from pathlib import Path
 
# 2026-06 時点で現役のモデルID(ここに無い claude-* は要確認とみなす)
# 最新の正確なIDは必ず公式ドキュメントで確認してください
ALLOWED = {
    "claude-opus-4-8",
    "claude-sonnet-4-6",
    "claude-haiku-4-5",
}
# 6/15 に API から引退する明示ターゲット
RETIRING = {"claude-sonnet-4", "claude-opus-4"}
 
# モデルIDらしき文字列。-20250514 のような日付サフィックスも拾う
MODEL_RE = re.compile(r"claude-[a-z]+-[0-9][a-z0-9-]*")
SCAN_EXT = {".py", ".ts", ".tsx", ".js", ".mjs", ".json",
            ".yaml", ".yml", ".env", ".toml", ".sh"}
 
 
def normalize(model_id: str) -> str:
    # 末尾の日付サフィックスを落として「世代」だけで比較する
    return re.sub(r"-\d{8}$", "", model_id)
 
 
def scan(root: str):
    hits = []
    for path in Path(root).rglob("*"):
        if path.is_dir() or path.suffix not in SCAN_EXT:
            continue
        if "node_modules" in path.parts or ".git" in path.parts:
            continue
        try:
            text = path.read_text(encoding="utf-8", errors="ignore")
        except OSError:
            continue
        for lineno, line in enumerate(text.splitlines(), 1):
            for raw in MODEL_RE.findall(line):
                base = normalize(raw)
                if base in RETIRING:
                    hits.append((str(path), lineno, raw, "RETIRING 6/15"))
                elif base not in ALLOWED:
                    hits.append((str(path), lineno, raw, "unknown - confirm"))
    return hits
 
 
if __name__ == "__main__":
    root = sys.argv[1] if len(sys.argv) > 1 else "."
    found = scan(root)
    for path, lineno, model, tag in found:
        print(f"[{tag}] {path}:{lineno}  {model}")
    print(f"\n{len(found)} 件の要対応モデルIDが見つかりました", file=sys.stderr)
    sys.exit(1 if found else 0)

これをリポジトリのルートで python3 scan_models.py . と走らせ、[RETIRING 6/15] のタグが付いた行が、当日エラーになる箇所です。許可リスト方式にしておくと、将来別のモデルが引退するときも、許可リストを更新するだけで同じスキャナが使い回せます。

ひとつ補足すると、コードを全部直しても安心はできません。すでに送信中のリクエストログやダッシュボードのクエリにIDが残っていることがあります。直近30日のリクエストログを集計して、実際に呼ばれているモデルIDの分布を出しておくと、コードからは消したつもりでも経路が残っていた、という事故を防げます。

なぜ「sed で一括置換」が危険なのか

検出できたら、claude-opus-4claude-opus-4-8 に一括置換したくなります。ですが、モデルIDの置換は文字列置換ではなく、挙動の変更です。世代が上がると、同じプロンプトでも出力トークン量が変わり、レイテンシが変わり、整形の癖(箇条書きにするか散文にするか、コードブロックの付け方)も微妙に変わります。

ここで効いてくるのが、IDをコード中に散らさないという設計判断です。client.messages.create(model="...") の呼び出しが数十箇所に散っていると、置換のたびに数十箇所をレビューすることになり、しかも一箇所だけ直し忘れます。私はこの「直し忘れ一箇所」で痛い目を見てから、モデルIDを一枚のレイヤーに閉じ込めるようにしました。具体的な実装は後半で示します。

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

この記事の続きを読む

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

この記事で得られること
本番コード・cron・設定ファイル・ベンダーSDKに残る claude-sonnet-4 / claude-opus-4 を一括検出する Python スキャナの実装
単純な置換が壊す出力パリティ(出力トークン量・整形・下流パーサ)を引退前に測る検証ハーネス
次回の引退を1行で乗り切る別名レイヤーと、model_not_found を握りつぶさないフォールバックの組み方
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

API & SDK2026-05-03
Claude API で契約書レビュー自動化システムを構築する — リスク条項検出・差分追跡・修正提案を本番運用する実装ガイド
契約書レビューを Claude API で自動化する本番運用設計を、PDFパース・リスク条項検出・構造化JSON出力・差分管理・修正提案まで通しで実装するガイドです。
API & SDK2026-04-26
Claude API のReplay駆動テスト — 本番応答を録画して回帰テストを成立させる設計パターン
Claude APIの非決定的な応答を録画・再生してE2Eテストを安定運用するReplay駆動テストの本番設計。カセット形式・差分検証・CI統合まで実装パターンで解説します。
API & SDK2026-04-16
Claude API × Go言語 本番実装 — Anthropic Go SDK・並行処理・Tool Use・マイクロサービス統合
Anthropic Go SDKを使ったClaude API本番実装の完全解説。ストリーミング・goroutineによる並行処理・Tool Use・Gin/Echoフレームワーク統合・グレースフルシャットダウンまで、Goらしい設計パターンを実装コード付きで徹底解説します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →