期限のある連絡は、読んだ直後に「あとで見よう」と思って、そのまま忘れてしまうことがあります。今回の Claude Sonnet 4.5 の件も、私にとってはそうなりかけていました。
Anthropic の廃止予定ページ(platform.claude.com の Model deprecations)を 2026 年 10 月 27 日に確認したところ、claude-sonnet-4-5-20250929 は 9 月 30 日に非推奨となり、提供終了日は 2026 年 11 月 30 日(暫定) と書かれていました。推奨される置き換え先は claude-sonnet-5-5 です。終了日を過ぎると、このモデルへのリクエストは失敗します。
Rork で作ったアプリに AI 機能を足している方、あるいは書き出したプロジェクトに自分で Claude API を呼ぶ処理を加えた方は、この日付を一度ご自身のコードに照らしておくと安心です。洗い出しから置き換え、確認までを、実際に動かして確かめた手順で書き残します。
最初にお伝えしたいこと
直接影響を受けるのは、モデル ID を自分で書いている場合です。Rork のメニューからモデルを選んで使っているだけの方は、メニュー側が Sonnet 5.5 に置き換わっていることもあり、ご自身での作業は基本的にありません。
一方、書き出したプロジェクトの中の API 呼び出し、サーバー関数、.env の設定などに claude-sonnet-4-5-20250929 が残っていれば、終了日以降は動かなくなります。しかも、モデル ID は思わぬ場所に散らばりがちです。1 か所を直して安心していたら、別のファイルに同じ文字列が残っていた、ということが起こります。
手順 1:洗い出しのスクリプトを置く
目で探すと見落とすので、プロジェクトのフォルダを走査する小さなスクリプトを使います。Node.js で動き、追加の依存はありません。audit-models.mjs という名前で、プロジェクトの外か直下に置いてください。
// audit-models.mjs — プロジェクト内の Claude モデル ID を洗い出し、廃止予定のものに印を付ける
import { readdirSync, readFileSync, statSync } from "node:fs";
import { join, extname } from "node:path";
const ROOT = process.argv[2] ?? ".";
const SKIP_DIRS = new Set(["node_modules", ".git", ".expo", "ios", "android", "dist", "build"]);
const EXTS = new Set([".ts", ".tsx", ".js", ".jsx", ".mjs", ".json", ".env", ".toml", ".yml", ".yaml", ".md"]);
// 公式の廃止ページ(platform.claude.com/docs/en/resources/model-deprecations)で確認した値。実行前に見直すこと。
const RETIRING = {
"claude-sonnet-4-5-20250929": { on: "2026-11-30", to: "claude-sonnet-5-5" },
};
// 別名(エイリアス)。固定のスナップショットではなく、先で指す先が変わりうるもの
const ALIAS = /^claude-sonnet-4-5$/;
// claude-<名前>-<数字>(-<数字>)(-<8桁日付>) の形を拾う
const MODEL_RE = /claude-(?:[a-z]+-)?(?:[a-z]+-)?\d+(?:-\d+)?(?:-\d{8})?/g;
const hits = [];
function walk(dir) {
for (const name of readdirSync(dir)) {
const p = join(dir, name);
const st = statSync(p);
if (st.isDirectory()) { if (!SKIP_DIRS.has(name)) walk(p); continue; }
if (!EXTS.has(extname(name)) && !name.startsWith(".env")) continue;
readFileSync(p, "utf8").split("\n").forEach((line, i) => {
for (const m of line.matchAll(MODEL_RE)) hits.push({ file: p, line: i + 1, id: m[0] });
});
}
}
walk(ROOT);
let urgent = 0;
for (const h of hits) {
const r = RETIRING[h.id];
const tag = r ? `要置換 → ${r.to}(${r.on} 終了)` : ALIAS.test(h.id) ? "別名: 指す先を公式で確認" : "対象外";
if (r) urgent++;
console.log(`${h.file}:${h.line}\t${h.id}\t${tag}`);
}
console.log(`\n合計 ${hits.length} 件 / 要置換 ${urgent} 件`);
process.exit(urgent > 0 ? 1 : 0);使い方はこの 1 行です。
node audit-models.mjs ./my-app要置換の行が 1 件でもあれば終了コードが 1 になります。あとで確認するときに、この値がそのまま合否の目印になります。
手順 2:試験用のフォルダで動かした結果
ご自身のプロジェクトに使う前に、私は試験用のフォルダで確かめました。.env、アプリ側の src/ai.ts、サーバー関数の supabase/functions/chat/index.ts、コメントだけを書いた src/notes.ts の 4 ファイルです。出力は次のとおりでした。
| 場所 | 見つかった ID | 判定 |
|---|---|---|
| .env の 1 行目 | claude-sonnet-4-5-20250929 | 要置換 |
| src/ai.ts の 1 行目 | claude-sonnet-4-5-20250929 | 要置換 |
| src/ai.ts の 2 行目 | claude-haiku-4-5-20251001 | 対象外 |
| src/notes.ts の 1 行目(コメント内) | claude-sonnet-4-5 | 別名。指す先を公式で確認 |
| supabase/functions/chat/index.ts | claude-sonnet-4-5-20250929 | 要置換 |
合計 6 件のうち、要置換は 3 件でした。ここで意外だったのは、同じ ID が 3 つの層(設定ファイル、アプリ、サーバー関数)に別々に書かれていたことです。試験用に私が作ったものですが、実際のアプリでも、あとから機能を足すたびに ID を写していけば同じことが起こるのだと思います。
手順 3:置き換えて、もう一度走らせる
置き換え先は、公式ページの移行例どおり claude-sonnet-5-5 です。完全に同じ ID の文字列だけを置き換えるので、他のモデルには触れません。
grep -rl "claude-sonnet-4-5-20250929" ./my-app --exclude-dir=node_modules --exclude-dir=.git \
| xargs sed -i 's/claude-sonnet-4-5-20250929/claude-sonnet-5-5/g'
node audit-models.mjs ./my-app
echo "exit=$?"試験用のフォルダでは、置き換えのあと「合計 6 件 / 要置換 0 件」となり、終了コードは 0 に変わりました。macOS の場合、sed -i のあとに '' を挟む(sed -i '' 's/…/…/g')必要があります。
落とし穴:置き換えて終わりではありません
スクリプトでわかるのは、文字列が残っていないことまでです。新しいモデルでアプリが期待どおりに動くかは、別に確かめる必要があります。モデルが変わると、返答の長さや言い回し、出力の形式が変わることがあります。JSON で返してもらう処理や、返答の先頭だけを見て分岐する処理は、特に動かしてみるのが確実です。
もう 1 つ、スクリプトの対象外にしたものがあります。claude-sonnet-4-5 のような日付なしの別名です。これがどのモデルを指すかは公式の記載で確認する必要があり、私の手元の確認では断定できませんでした。そのため「判定できない」と表示するだけにしています。
また、このスクリプトが見るのは、ソースと設定ファイルの文字列だけです。管理画面や、Supabase・Cloudflare などの環境変数に直接入力した値、あるいは別のサービスの設定は見えません。コードを直したあとに、そうした場所も一度ご自身の目で開いて確かめてください。
今後のために:モデル ID を 1 か所にまとめる
次に同じ連絡が来たときに慌てないよう、置き換えのついでに ID を定数にまとめておく形を載せておきます。こちらは試験フォルダで実行まではしておらず、考え方の見本としてご覧ください。
// src/config/models.ts — モデル ID はここだけに書く
export const CHAT_MODEL = process.env.CLAUDE_CHAT_MODEL ?? "claude-sonnet-5-5";呼び出し側は `import { CHAT_MODEL } from "./config/models"` として使います。こうしておけば、次の廃止連絡があっても、直す場所は 1 行で済みます。
次にやること
まず、お使いのプロジェクトで node audit-models.mjs を 1 回走らせて、件数だけ確認してみてください。0 件であれば、それで今回の作業は終わりです。
個人開発では、機能を足すたびに文字列を写しがちです。私自身、モデル ID を 1 か所の定数にまとめておくべきだったと、この試験で改めて感じました。次に機能を足すときは、そこから始めようと思っています。廃止の日付は変わることもあるため、11 月に入ったら公式の廃止ページをもう一度開いておくと安心です。