Claude Sonnet 4.5は11月30日で終了:Sonnet 5.5で400エラーになる設定と、4.6へ逃がす選択肢

当ページのリンクには広告が含まれています。

モデル名を一度も書いていないのに、11月30日に止まるコードがあります。LangChainのAnthropicLLMは、モデルを指定しないとclaude-sonnet-4-5を使います。11月2日に公開された最新版の1.7.9でもこの既定値のままで、変更しない方針が11月3日にGitHub上で示されました。

AnthropicはClaude Sonnet 4.5を、Claude APIでは11月30日に提供終了します。推奨の移行先はSonnet 5.5ですが、モデル名を書き換えるだけでは移れません。temperature、思考の予算指定、ツールの強制指定などが400エラーになるうえ、思考が既定でオンになります。

年内に改修やテストの時間を取れないなら、料金と数え方が4.5と同じSonnet 4.6へ移すのが近道です。変更は少なく済みますが、提供終了が先へ延びるだけです。両方の移行先で問題になる設定をコードから洗い出すスクリプトと、費用の分かれ目を計算する式も紹介します。

目次

11月30日に止まるのはClaude API側。BedrockとGoogle運用の環境は別の日程

Anthropicは9月30日に提供終了の予定を告知しました。対象はclaude-sonnet-4-5-20250929と、その別名のclaude-sonnet-4-5です。終了日を過ぎると、このモデルへのリクエストはすべて失敗します。

注意したいのは、この日付が当てはまる環境です。公式ページによると、11月30日はClaude API、Claude Platform on AWS、Anthropicが運用するGoogle Cloud、Microsoft Foundryの日付です。Amazon BedrockとGoogleが運用するGoogle Cloudは、それぞれ独自に終了日を決めます。

使っている環境によって、コードに書かれているモデルIDの形も違います。

  • Claude API:claude-sonnet-4-5-20250929、またはclaude-sonnet-4-5
  • Amazon Bedrock:anthropic.claude-sonnet-4-5-20250929-v1:0
  • Googleが運用するGoogle Cloud:claude-sonnet-4-5@20250929
  • Microsoft FoundryとClaude Platform on AWS:claude-sonnet-4-5

n8nやDifyのようなツールで、画面からモデルを選んでいる場合も同じです。コードを書いていなくても、設定画面や環境変数に4.5が残っていないかを確かめてください。

Sonnet 5.5へは、モデル名の置換だけでは移れない

公式のSonnet 5.5移行ガイドを読むと、Sonnet 4.5のコードでは当たり前だった次の指定が、Sonnet 5.5では400エラーになります。

  • temperature、top_p、top_kの指定
  • thinkingのenabledとbudget_tokensによる思考の予算指定。output_config.effortで深さを決める方式に変わった
  • thinkingのdisabled。思考を止める最小の設定はbetween_tools
  • 会話の最後をassistantの発言で終える「prefill」。出力の書き出しを指定する用途で使われてきた
  • tool_choiceのanyとtoolによる、ツールの強制指定
  • betaヘッダーを付けないoutput_format。output_config.formatへ移す

エラーにならない変化も見落とせません。thinkingを何も指定しないリクエストでも、Sonnet 5.5では思考が走ります。応答の先頭が思考ブロックになりうるので、response.content[0].textのように先頭を文字列として読むコードは壊れます。思考は出力トークンとして課金され、max_tokensにも含まれます。

数え方も変わります。Sonnet 5.5は新しいトークナイザーを使うため、同じ文章がSonnet 4.5より約3割多いトークンになります。2,000×1,500ピクセルの画像は、約2.5倍のトークンを使います。max_tokensや月の予算をトークン数で決めている場合は、数え直しが必要です。

Claude Codeを使っているなら、移行ガイドが案内している/claude-api migrate this project to claude-sonnet-5-5で書き換えを任せることもできます。その場合も、下のスクリプトで変更が漏れていないかを確かめると安心です。

時間がなければSonnet 4.6へ。変更は少ないが、期限が延びるだけ

移行先の候補はSonnet 5.5だけではありません。Sonnet 4.6は旧モデルの扱いですが、少なくとも2027年2月17日までは提供されます。料金もトークナイザーも4.5と同じで、thinkingを指定しなければ思考は動きません。

項目4.6 → 5.5
料金(100万トークンあたりのドル、入力/出力)3/15 → 2/10
同じ文章のトークン数4.5と同じ → 約3割増
思考を指定しないとき動かない → 動く
temperatureなど使える(旧APIバージョンのみ) → 400
思考の予算指定非推奨で可 → 400
ツールの強制指定使える → 400
prefill400 → 400
提供終了2027年2月17日以降 → 2027年9月28日以降

表の「旧APIバージョンのみ」には条件があります。10月21日に出たClaude APIの新バージョンでは、どのモデルでもtemperatureなどが400になります。SDKのメジャー版を上げると新バージョンに切り替わる仕組みは、Claude API 2026-10-21への移行で詳しく書きました。

私の考えでは、Sonnet 4.6は「11月30日に間に合わない場合の避難先」です。prefillを使っていなければ、4.6への変更はモデル名の置換でほぼ済みます。ただ、Sonnet 5.5への改修は数か月以内にもう一度やることになります。

次の告知も近そうです。同じ提供終了ページでは、Haiku 4.5の「この日より前には終了しない」日付は10月15日、Opus 4.5は11月24日です。Anthropicは60日以上前に通知すると定めているので、急に止まることはありません。それでも、4.5世代を複数使っているなら、モデルIDを1か所にまとめ、今回の改修で5.5世代へそろえておくほうが手間は少なく済みます。

費用は単価ほど下がらない。分かれ目は思考トークンの量

Sonnet 5.5の単価は4.5の3分の2ですが、トークンが約3割増え、思考の分の出力も加わります。月の費用は次の式で比べられます。トークン数は、4.5で実際に計測した値を100万トークン単位で入れます。

Sonnet 4.5 / 4.6 = 入力 × 3 + 出力 × 15
Sonnet 5.5      = 入力 × 1.3 × 2 + 出力 × 1.3 × 10 + 思考 × 10

たとえば、4.5で入力1,000万トークン、出力100万トークンを使う処理なら、4.5は月45ドルです。5.5では入力が1,300万トークンで26ドル、出力が130万トークンで13ドルになり、思考を除けば合わせて39ドルです。約13%下がります。

この6ドルの差は、思考トークン60万で消えます。見える出力130万トークンの半分弱です。既定のhighのまま思考を多く使う処理では、4.5より高くなる可能性があります。私は思考トークンを測っていません。移行の前に、代表的なリクエストを数十件流して、思考と出力のトークン数を記録してから判断してください。

一方、キャッシュの読み取りは4.5の100万トークン0.30ドルに対し、5.5は0.10ドルです。同じ長いシステムプロンプトを何度も送る処理では、5.5の割安さが大きくなります。思考が要らない処理は、thinkingにbetween_toolsを指定し、effortを下げて測り直すのが先です。

4.5の使用箇所と、400になる設定を洗い出すスクリプト

標準ライブラリだけで動く確認用スクリプトを作りました。指定したフォルダのPython、JavaScript、TypeScript、JSON、YAMLなどを読み、4.5のモデルIDと、移行先で問題になる指定を探します。各行に、Sonnet 4.6とSonnet 5.5での扱いを並べて表示します。

"""Claude Sonnet 4.5の使用箇所と、移行先で400エラーになる設定を探す(2026-11-03の公式移行ガイドに基づく)。

使い方: python3 check_sonnet45.py [フォルダ]   既定はカレントフォルダ
各行の表示: ファイル:行  [Sonnet 4.6での扱い / Sonnet 5.5での扱い]  内容
"""
import re
import sys
from pathlib import Path

EXTENSIONS = {".py", ".js", ".mjs", ".cjs", ".ts", ".tsx", ".json", ".yaml", ".yml", ".toml", ".env", ".ipynb"}
SKIP_DIRS = {".git", "node_modules", ".venv", "venv", "__pycache__", "dist", "build"}

# (正規表現, Sonnet 4.6での扱い, Sonnet 5.5での扱い, 内容)
RULES = [
    (r"claude-sonnet-4-5(?:-20250929)?(?![\w.@-])", "置換", "置換", "Claude APIでは11月30日に終了するモデルID"),
    (r"anthropic\.claude-sonnet-4-5-20250929", "置換", "置換", "Amazon BedrockのID。終了日はAWS側の表で確認"),
    (r"claude-sonnet-4-5@20250929", "置換", "置換", "Google運用のGoogle CloudのID。終了日はGoogle側の表で確認"),
    (r"\bAnthropicLLM\s*\(", "確認", "確認", "LangChainのAnthropicLLMは既定モデルがclaude-sonnet-4-5"),
    (r"[\"']?\b(temperature|top_p|top_k)\b[\"']?\s*[:=]", "可", "400", "サンプリング設定"),
    (r"budget_tokens|[\"']type[\"']\s*:\s*[\"']enabled[\"']", "可(非推奨)", "400", "思考の予算指定"),
    (r"[\"']type[\"']\s*:\s*[\"']disabled[\"']", "可", "400", "思考オフ。5.5ではbetween_toolsに"),
    (r"tool_choice[\"']?\s*[:=]\s*\{[^}]*[\"']type[\"']\s*:\s*[\"'](any|tool)[\"']", "可", "400", "ツールの強制指定"),
    (r"\boutput_format\b", "確認", "400", "output_formatはoutput_config.formatへ"),
    (r"computer_20250124", "確認", "400", "古いcomputer useツール"),
    (r"interleaved-thinking-2025-05-14|fine-grained-tool-streaming-2025-05-14", "可", "削除", "不要・衝突するbetaヘッダー"),
    (r"[\"']role[\"']\s*:\s*[\"']assistant[\"']", "確認", "確認", "末尾のassistantはprefill扱いで4.6・5.5とも400"),
    (r"\.content\[0\]\.text|\[[\"']content[\"']\]\[0\]\[[\"']text[\"']\]", "可", "要修正", "5.5は先頭が思考ブロックになりうる"),
]
COMPILED = [(re.compile(pattern), on46, on55, note) for pattern, on46, on55, note in RULES]


def scan_text(text):
    """(行番号, 4.6, 5.5, 内容, 行) を返す。1行に複数の規則が当たればすべて返す。"""
    found = []
    for number, line in enumerate(text.splitlines(), 1):
        for regex, on46, on55, note in COMPILED:
            if regex.search(line):
                found.append((number, on46, on55, note, line.strip()[:100]))
    return found


def files(root):
    for path in sorted(Path(root).rglob("*")):
        if path.is_file() and not SKIP_DIRS & set(path.parts) and (path.suffix in EXTENSIONS or path.name.startswith(".env")):
            yield path


def main():
    root = sys.argv[1] if len(sys.argv) > 1 else "."
    total = 0
    for path in files(root):
        for number, on46, on55, note, line in scan_text(path.read_text(encoding="utf-8", errors="replace")):
            total += 1
            print(f"{path}:{number}  [4.6:{on46} / 5.5:{on55}]  {note}\n    {line}")
    print(f"\n{total}件。0件でも、モデル名を設定画面や環境変数で渡している場合はそちらも確認してください。")


if __name__ == "__main__":
    main()

check_sonnet45.pyとして保存し、調べたいフォルダを渡して実行します。

python3 check_sonnet45.py ./my-app

移行ガイドに載っている「変更前」と「変更後」のコード例を使って、7件のテストを用意しました。変更前の例からはサンプリング設定、思考の予算指定、ツールの強制指定を400として検出し、変更後の例では何も出ないことを確認しています。

実際のコードでも試しました。LangChainのlangchain-anthropic 1.7.9で、AnthropicLLMを定義しているllms.pyを読ませた結果です。

langchain-anthropic-1.7.9/llms.py:32  [4.6:置換 / 5.5:置換]  Claude APIでは11月30日に終了するモデルID
    model: str = Field(default="claude-sonnet-4-5", alias="model_name")
langchain-anthropic-1.7.9/llms.py:38  [4.6:可 / 5.5:400]  サンプリング設定
    temperature: float | None = None
langchain-anthropic-1.7.9/llms.py:41  [4.6:可 / 5.5:400]  サンプリング設定
    top_k: int | None = None
langchain-anthropic-1.7.9/llms.py:44  [4.6:可 / 5.5:400]  サンプリング設定
    top_p: float | None = None
langchain-anthropic-1.7.9/llms.py:137  [4.6:確認 / 5.5:確認]  LangChainのAnthropicLLMは既定モデルがclaude-sonnet-4-5
    class AnthropicLLM(LLM, _AnthropicCommon):
langchain-anthropic-1.7.9/llms.py:147  [4.6:置換 / 5.5:置換]  Claude APIでは11月30日に終了するモデルID
    model = AnthropicLLM(model="claude-sonnet-4-5")
langchain-anthropic-1.7.9/llms.py:147  [4.6:確認 / 5.5:確認]  LangChainのAnthropicLLMは既定モデルがclaude-sonnet-4-5
    model = AnthropicLLM(model="claude-sonnet-4-5")
langchain-anthropic-1.7.9/llms.py:177  [4.6:可 / 5.5:400]  サンプリング設定
    "temperature": self.temperature,
langchain-anthropic-1.7.9/llms.py:178  [4.6:可 / 5.5:400]  サンプリング設定
    "top_k": self.top_k,
langchain-anthropic-1.7.9/llms.py:179  [4.6:可 / 5.5:400]  サンプリング設定
    "top_p": self.top_p,
langchain-anthropic-1.7.9/llms.py:221  [4.6:確認 / 5.5:確認]  末尾のassistantはprefill扱いで4.6・5.5とも400
    {"role": "assistant", "content": assistant_part.strip()}
langchain-anthropic-1.7.9/llms.py:288  [4.6:可 / 5.5:要修正]  5.5は先頭が思考ブロックになりうる
    return response.content[0].text
langchain-anthropic-1.7.9/llms.py:325  [4.6:可 / 5.5:要修正]  5.5は先頭が思考ブロックになりうる
    return response.content[0].text

13件。0件でも、モデル名を設定画面や環境変数で渡している場合はそちらも確認してください。

13件のすべてが修正対象というわけではありません。このファイルでは、temperatureなどを送る前に、モデルが受け付けない設定を取り除く処理を通しています。スクリプトは文字列で探すだけなので、こうした処理までは読み取れません。結果は、人が確かめる候補の一覧として使ってください。

一方で、288行目と325行目のresponse.content[0].textは気になります。応答の先頭を文字列として読む作りなので、Sonnet 5.5で先頭に思考ブロックが来ると、文字列を取り出せない可能性があります。動かして確かめてはいませんが、LangChainのメンテナーもAnthropicLLMは非推奨だとしています。モデル名を書き換えるだけで済ませず、ChatAnthropicへ移るのが安全です。

スクリプトが0件でも安心はできません。モデル名を設定画面、データベース、クラウドの環境変数で渡している場合は、そちらも確かめてください。11月30日まで、残りは4週間ほどです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

生成AIと業務自動化のツールについて、公式の発表・ドキュメント・料金表で確かめながら、仕事への取り入れ方をまとめています。調査や執筆には生成AIを使い、記事の内容は一次情報と照合しています。詳しくは運営者情報と編集方針をご覧ください。

目次