
Claude Code v2.1.284 の主要アップデート - Sonnet 5.5 登場 と auto mode 既定化の全プラン拡大
クラウド事業統括本部の石川です。Claude Code の v2.1.284(2026-09-28 公開)がリリースされました。本日は、/claude-api migrate を使って新しい Sonnet 5.5 向けに自動でコードのマイグレーションを試してみました。権限モードの開始時の挙動が変わる変更も含まれているため、破壊的変更もあわせてご確認ください。
前回のアップデート記事はこちらです。
アップデートサマリー
v2.1.284 では 100 件の変更が入りました。本記事の分類では、修正 53 件、改善 21 件、新機能 13 件、セキュリティ 6 件、破壊的変更 5 件などです。VS Code 拡張機能(18 件)と Claude Tag(10 件)の変更に加え、Claude apps gateway と利用上限(usage limit)まわりの変更もまとまって入っています。
また、**Sonnet 5 よりも賢く、効率的で、30% 高速な Sonnet 5.5 **が発表になりました。ほとんどの作業で最大30% 低コストになるため、Claude Code の使用量もさらに広がります。バグ修正や機能の迅速なイテレーションなど、よく定義された日常タスクに使用してください。
注目のアップデート
新機能: Claude Sonnet 5.5 の追加
Claude Sonnet 5.5(claude-sonnet-5-5)が追加され、Anthropic API における Sonnet の既定モデルになりました。1M コンテキストで、料金は 100 万トークンあたり入力 $2/出力 $10、キャッシュ読み取り $0.20 です。
Anthropic API で sonnet を指定して使っている方は、既定の Sonnet が変わる点を把握しておきたいところだと感じます。
不具合解消: compact 後も "Prompt is too long" エラーが続く不具合を修正
compact 後も "Prompt is too long" エラーが続く不具合が修正されました。compact 後のリクエストがまだ長すぎる場合は、直近の会話の保持量を減らしてもう一度 compact します。
長いセッションで compact 後もエラーから抜け出せなくなった経験がある方に効く修正だと感じます。一方で、再度の compact では直近の会話の保持量が減るため、直前の指示が要約から落ちる可能性がある点は意識しておきたいと考えています。
不具合解消: 破損したレスポンスストリームで生のエラーが表示される不具合を修正
破損したレスポンスストリームで "JSON Parse error" や "undefined is not an object" などの生のエラーが表示されたり、回答に "undefined" という語が書き込まれたりする不具合が修正されました。リトライされるか、中断されたレスポンスとして報告されます。
回答に "undefined" が紛れ込むと気付かずに使ってしまうおそれがあるため、リトライや中断として扱われるようになった点は安心材料だと感じます。
セキュリティ: 権限モード未設定時の auto mode 開始が全プラン・全プロバイダーに拡大
権限モードが設定されていない場合、対話型ターミナルと VS Code のセッションが auto mode で開始するよう変更されました。全プラン・全プロバイダーが対象で、permissions.defaultMode を設定していればそちらが優先されます。
これまで権限モードを意識せずに使っていた方ほど影響が大きいと考えています。Manual モードで使い続けたい場合は、後述の破壊的変更の節の設定例を参考に permissions.defaultMode を明示しておくと安心だと感じます。
セキュリティ: allowManagedPermissionRulesOnly 下でのプラグインの事前承認を修正
管理設定の allowManagedPermissionRulesOnly 下で、マーケットプレイス・claude.ai・npm 由来のプラグインが allowed-tools で自身のツールを事前承認できていた問題が修正されました。事前承認が維持されるのは、Anthropic 公式ソースのプラグインと、管理設定が信頼するソースのプラグインのみです。
allowManagedPermissionRulesOnly で権限ルールを管理者側に集約している組織では、管理設定が信頼していないソースのプラグインのツールは事前承認されなくなるため、事前承認を維持したいプラグインがある場合は、そのソースを管理設定で信頼する対応が必要になると見ています。
セキュリティ: MEMORY.md の不可視文字や Claude Code のマークアップを模したタグを無害化
自動メモリの読み込みで、MEMORY.md と呼び出されたメモリノートに含まれる不可視文字や、Claude Code 自身のマークアップを模したタグが、Claude に渡る前に無害化されるようになりました。
自動メモリを使っている方は、特別な設定をしなくてもアップデートするだけで適用される改善だと見ています。
アップデート内容
新機能
- Claude Sonnet 5.5(
claude-sonnet-5-5)の追加(注目のアップデートを参照) - auto mode で作業ディレクトリ外を読み取る前の確認に「Yes, but ask again next time」が追加されました。その 1 回の読み取りだけを許可し、以降の読み取りでは再度確認されます
- 対話型ターミナルに
/mcp reconnect allが追加され、接続に失敗した MCP サーバーや認証が必要な MCP サーバーをまとめて再接続できるようになりました - キーバインドアクション
effortSlider:decreaseEffort・increaseEffort・toggleUltracodeが追加され、/effortスライダーの矢印キーと Tab キーをkeybindings.jsonで割り当て直せるようになりました - Claude apps gateway の spend limit について、gateway がこのバージョン以降で動作している場合、
/usageとステータスラインに金額(例: "$271.40 / $500.00 spent this month")が表示されるようになりました。ステータスラインのrate_limits.spend_limitにはused_usd・limit_usd・periodが追加されています - Claude apps gateway で、管理ポリシーの
availableModelsが空の場合、またはmodelやenforceAvailableModelsを設定しないまま Claude Code の起動時モデルを含めていない場合に、起動時の警告が表示されるようになりました - Claude apps gateway の
telemetry.forward_toの送信先にauth: { google: {} }を指定できるようになり、gateway の Google Cloud 認証情報で Google Cloud の OTLP エンドポイントへテレメトリを直接エクスポートできます - Claude apps gateway と ID プロバイダー間の証明書によるクライアント認証(
private_key_jwt)に対応しました。クライアントシークレットではなく証明書の認証情報を発行する ID プロバイダー向けです - [VS Code] 各プロンプトと応答の上に時刻を表示するオプションが追加され、日付が変わる箇所には日付の行が入ります(設定「Claude Code: Show Message Timestamps」、既定はオフ)
- [VS Code] Manage plugins の各行にプラグインの読み込みエラーと注記が表示され、無効化・アンインストール・エラーのコピーができるポップアップが追加されました
- [VS Code] Effort スライダーの下に Ultracode のオン/オフスイッチが追加され、スライダー上の Ultracode の段階を置き換えました。モデルピルにはどの effort レベルでも "· Ultracode" と表示されます
- [Claude Tag] スレッド・チャンネルの既定・DM で "Opus (latest)" のようなモデルファミリーを選べるようになり、選択はそのファミリーの最新モデルに追従します
- [Claude Tag] analytics の支出予測チャートに、組織全体の上限に計上される支出と上限の使用割合が追加されました
改善
- 設定ファイルで実際に使われている部分だけ設定スキーマを構築するようにし、起動時間とメモリ使用量を改善しました
- レスポンス途中で接続が切れた後のリトライが、そのリクエストの他のリトライと同じ回数枠を共有するよう変更されました。失敗し続けるリクエストはより早く打ち切られます
- 非対話モードの最初のターンで、
CLAUDE_CODE_MCP_STARTUP_WAIT_MSが0でも、--allowedToolsまたはmcp_toolフックで指定された接続中の MCP サーバーを最大 2 秒待つよう変更されました - 利用上限の待機表示を改善しました。上限の状態と、usage credits の選択肢を含むカウントダウンがプロンプト下の 1 ブロックにまとまり、上限メッセージでカウントダウンを繰り返さなくなりました
- claude.ai サブスクライバー向けに
/rate-limit-optionsが/helpとコマンドメニューに表示されるようになり、利用上限の通知が案内するコマンドを探せるようになりました - Sonnet モデルのセーフガードがメッセージにフラグを立てたときの通知が、理由を説明し、編集して再試行する選択肢を示すよう変更されました
- Claude in Chrome のツールがプレフィックスなしで呼ばれた場合の "No such tool available" エラーが、呼ぶべきツール名を示すようになりました
- Monitor のイベント行が説明の繰り返しではなく各イベントの出力内容を表示するようになり、変化のない "Waiting for N … to finish" 行をイベントごとに繰り返さなくなりました
/claude-apiを改善しました。hillclimbは eval で測定できないほど小さなプロンプトの言い換えにラウンドを費やさなくなり、report.htmlの横に追加で依頼したページはネットワークから何も読み込まない単一のローカルファイルとして作られます/tasks・/copy・/hooksなどの一覧で、各名前の後の詳細が収まる場合は 1 列に揃い、収まらない場合は右端に配置されるようになりましたclaude plugin marketplace addが、同じ名前で別ソースから追加済みのマーケットプレイスを置き換える場合に、その旨と取り消し方法を表示するようになりました- 管理設定がサインインを必須にしている(
forceLoginMethodまたはforceLoginOrgUUID)状態で API キー・トークン・apiKeyHelperが設定されている場合の起動拒否メッセージが、使用中の認証情報・その設定場所・削除方法を示すようになりました - 未信頼のフォルダで
claude remote-controlを実行した場合に、終了せずにターミナル上でワークスペースの信頼を求めるようになりました /recapが、チャットスレッド(自分のものを含む)やルーティン、Webhook から中継されて届いた場合に短い通知を出して実行を断るよう変更されました。ターミナル・Claude アプリ・Remote Control・-p・SDK ホストから入力した場合は従来どおり実行されます- artifact ページで、Claude がデザイン方針を返信ではなくページ内に書き、ユーザーが既に付けた名前をページタイトルに使うようになりました
- Artifact ツールに claude.ai のチャットやプロジェクトのリンク、チャット内の artifact、artifact ID のみが渡された場合に、処理を止めずに正しいリンクか内容を求めるようになりました
/artifactsのフィルタータブが 1 語のラベル(All・Mine・Shared)でタイトルの横に表示され、/configや/pluginと同じタブバーを使うよう変更されました- [Claude Tag] Claude アカウントを接続していないユーザーからの @メンションに対し、最初の 1 回だけでなく毎回、非公開のサインイン案内を投稿するよう変更されました。このほか、管理設定の "Notify members now" の配信範囲、セルフホスト環境のオンデマンドランナーの待機通知、チャンネルマネージャー追加時のエラー表示と GitHub サインイン、チャンネルのアクセスリストの表示が改善されました
セキュリティ
allowManagedPermissionRulesOnly下でのプラグインの事前承認の修正(注目のアップデートを参照)MEMORY.mdの不可視文字や Claude Code のマークアップを模したタグの無害化(注目のアップデートを参照)ANTHROPIC_FOUNDRY_RESOURCEの値が検証されないまま Foundry エンドポイントのホスト名に埋め込まれていた問題を修正しました。単純なリソース名でない値は拒否されます- プロジェクト外から
.claude/rulesにシンボリックリンクされたルールが、外部インポートの承認確認を一度も表示しないままスキップされる不具合を修正しました。プロジェクト外からシンボリックリンクされた.claudeディレクトリにも同じ承認を求めます - ターミナルがフォーカスを取り戻した瞬間に押したキーが、短い安全用の遅延が再開する前に Remote Control の有効化確認に回答してしまう不具合を修正しました
- Workflow ツールのサンドボックスで、非同期スクリプトフックが投げるエラーに対するハードニングを強化しました
修正
- 破損したレスポンスストリームの生のエラー表示を修正: 注目のアップデートを参照
- compact 後も "Prompt is too long" エラーが続く不具合を修正: 注目のアップデートを参照
- thinking ブロック直後のエラーでターンが終わる不具合を修正: thinking ブロックの直後に overloaded エラーやサーバーエラーが届くと、リトライされずにターンがエラーで終わる不具合を修正しました
- Agent SDK セッションの不正な画像・ドキュメントブロックによるクラッシュを修正:
sourceが不正な画像をユーザーメッセージに含むとクラッシュする不具合と、不正なドキュメントブロックの後の全ターンが失敗する不具合を修正しました。不正な画像は説明の注記に置き換えられます - 再開したセッションで MCP ツール呼び出しが失敗する不具合を修正: MCP サーバーの接続中に MCP ツール呼び出しが "No such tool available" で失敗する不具合を修正しました。呼び出しはサーバーの接続を最大 10 秒待ちます
claude mcp addが MCP サーバーの制限下で成功と報告する不具合を修正: 管理設定で MCP サーバーをプラグイン由来に制限している場合に成功と報告していた不具合を修正しました。読み込まれないサーバーを保存せず、拒否して対処方法を表示します- Windows で多数のプラグインを有効にすると Bash ツールが失敗する不具合を修正: 存在しないプラグインの
bin/ディレクトリは PATH に追加されず、継承したエントリも二重に追加されません - Elicitation 系フックの
{"decision":"block"}が無視される不具合を修正: Elicitation・ElicitationResult フックが返す{"decision":"block"}で、終了コード 2 と同様に MCP の elicitation を拒否します - 認識できないモデル ID で Explore サブエージェントが Opus に切り替わる不具合を修正: プロキシ経由のカスタムモデルなど Claude Code が認識しないモデル ID でセッションを実行している場合に、Claude API 上で Explore サブエージェントが Opus に切り替わっていました。Explore はセッションのモデルを引き継ぎます
- Claude apps gateway が 431 エラーを返す不具合を修正: ID プロバイダーが多数のグループを返すサインインからのリクエストに対し、常に
431 Request Header Fields Too Largeを返していた不具合を修正しました。最大 256 KiB のリクエストヘッダーを受け付けます - [VS Code] 大きなテキストファイルを添付すると compact 後も "Prompt is too long" になる不具合を修正: メッセージに大きなテキストファイルを添付した場合の不具合です
- 地味に嬉しい修正: [VS Code] パスに非 ASCII 文字・空白・括弧を含むファイルへのチャット内リンクが開かない不具合を修正しました。日本語のファイル名やフォルダ名を使っている環境では、チャット内のリンクからそのままファイルを開けるようになるのは助かると感じます。
- このほか、フルスクリーン描画、vim モード、プラグインのマーケットプレイスとインストール、利用上限の通知、VS Code 拡張機能、Claude Tag など、多数の細かな不具合が修正されています。
破壊的変更
権限モード未設定時の auto mode 開始が全プラン・全プロバイダーに拡大
注目のアップデートで紹介した、対話型ターミナルと VS Code のセッションの開始モードの変更です。
変更前(〜v2.1.283): permissions.defaultMode を設定せずに起動した場合の例
claude # プランやプロバイダーによっては Manual(default)モードで開始
変更後(v2.1.284〜):
claude # 全プラン・全プロバイダーで auto mode で開始
従来どおり Manual モードで開始したい場合は、permissions.defaultMode を明示します(~/.claude/settings.json の設定例)。
{
"permissions": {
"defaultMode": "default"
}
}
公式ドキュメントでは、default が Manual モードの設定値であると説明されています。なお、公式ドキュメントの開始モードの説明では全プラン・全プロバイダーでの auto mode 開始を「v2.1.283 以降」としていますが、CHANGELOG では v2.1.284 の変更として記載されています(2026-09-29 時点)。本記事は CHANGELOG の記載に従っています。
Ultracode が xhigh の effort を強制しなくなった
Ultracode が /effort 内の独立したトグル(Tab キー、または /effort ultracode [on|off])に変更されました。xhigh の effort を強制しなくなり、どの effort レベルでもオンのままにできます。VS Code 拡張機能でも、Effort スライダーの下に Ultracode のオン/オフスイッチが追加されています。
変更前(〜v2.1.283)の例:
/effort # Ultracode を選ぶと effort は xhigh に固定される
変更後(v2.1.284〜)の例:
/effort ultracode on # Ultracode をオン(effort レベルはそのまま)
/effort xhigh # 従来と同じく xhigh で使いたい場合は effort レベルも指定
Opus 固定時の安全性に関するモデル切り替え先を API が選択
ANTHROPIC_DEFAULT_OPUS_MODEL または modelOverrides で Opus モデルを固定しているセッションの、安全性に関するモデル切り替えが変更されました。Anthropic API では、固定したモデルではなく、フラグの種類ごとに API が切り替え先のモデルを選びます。
変更前(〜v2.1.283)の例: CHANGELOG の記述から、切り替え先には固定したモデルが使われていたと推測されます。
export ANTHROPIC_DEFAULT_OPUS_MODEL=<固定する Opus のモデル ID>
# 安全性に関するモデル切り替えの切り替え先は固定したモデル(推測)
変更後(v2.1.284〜)の例:
export ANTHROPIC_DEFAULT_OPUS_MODEL=<固定する Opus のモデル ID>
# Anthropic API では、フラグの種類ごとに API が切り替え先のモデルを選ぶ
ネットワーク共有上のファイルの artifact 公開を拒否
artifact の公開で、ネットワーク共有上のファイル(\\host\share パスや /net の自動マウント)を、--add-dir で追加したマップ済みネットワークドライブ上にある場合を除いて拒否するよう変更されました。
変更前(〜v2.1.283)の例: 次のようなネットワーク共有上のパスのファイルです(パスは例です)。CHANGELOG の記述から、変更前はこれらのファイルも公開できていたと推測されます。
\\fileserver\share\report.html
/net/fileserver/share/report.html
変更後(v2.1.284〜): 上記のパスは拒否されます。マップ済みネットワークドライブを --add-dir で追加した場合は公開できます(例)。
claude --add-dir Z:\share
[VS Code] CLAUDE_CONFIG_DIR が絶対パスの場合のみ適用
claudeCode.environmentVariables 設定内の CLAUDE_CONFIG_DIR が絶対パスの場合のみ適用されるよう変更され、会話を引き継ぐターミナルにも渡されるようになりました。
以下は claudeCode.environmentVariables で指定する CLAUDE_CONFIG_DIR の値の例です。変更前に相対パスも適用されていた点は、CHANGELOG の記述からの推測です。
変更前(〜v2.1.283):
CLAUDE_CONFIG_DIR = .claude-work # 相対パスでも適用(推測)
変更後(v2.1.284〜):
CLAUDE_CONFIG_DIR = /Users/you/.claude-work # 絶対パスの場合のみ適用
Sonnet 5.5 用コードに /claude-api migrate を使ってマイグレーションしてみた
Claude Sonnet 5.5 は、Sonnet 5 と同じ 1M コンテキスト・同じトークン単価ですが、API の使い方には互換性のない変更があります。Anthropic のブログ記事「Claude Sonnet 5.5: What's New for API Developers」では、Sonnet 5 からの移行で対応が必要な変更として、5 つの破壊的変更と 1 つのレスポンス形式の変更が挙げられています。あわせて、Claude Code の /claude-api migrate で、モデル ID の置き換えとこれらの変更をコードベースに適用できると紹介されています。
そこで、Sonnet 5 向けに書いた Python プログラムを /claude-api migrate で Sonnet 5.5 向けに書き換えてみました。
Sonnet 5 から Sonnet 5.5 への移行で対応が必要な変更
下記のブログ記事に挙げられている変更は次の 6 つです。今回のサンプルでは、このうち 1 と 2 が該当します。
| # | 変更の内容 | 今回のサンプル |
|---|---|---|
| 1 | thinking: {"type": "disabled"} が 400 エラーになる。thinking を止めるには {"type": "between_tools"} を使う(effort が high 以下の場合のみ) |
該当(advise) |
| 2 | tool_choice の any / tool(ツール呼び出しの強制)が 400 エラーになる。auto と strict: true のツールに置き換え、いつ使うかをプロンプトで指示する |
該当(ask_weather) |
| 3 | thinking ブロックがモデルと会話に結び付く。会話は追記のみにする | 該当なし(単発のリクエストのみ) |
| 4 | Claude API と Google Cloud では、computer use は computer_toolset_20260801 でのみ使える |
該当なし |
| 5 | advisor ツールで組み合わせられる advisor のモデルが変わる | 該当なし |
| 6 | ツール呼び出しの間のテキストが thinking ブロックで返る | 該当なし |
Claude Code に同梱されている claude-api スキルの移行ガイドには、1 と 2 をそのまま Sonnet 5.5 に送った場合のエラーメッセージが記載されています。
"thinking.type.disabled" is not supported for this model. Use "thinking.type.between_tools" for the lowest thinking setting, or "thinking.type.adaptive" and "output_config.effort" to control thinking behavior.
tool_choice: type "tool" and "any" are not supported for this model.
つまり、モデル ID を claude-sonnet-5-5 に置き換えるだけでは、今回のサンプルは動きません。
Step1: Sonnet 5 向けのサンプルを用意する
天気を調べて服装を一言アドバイスする、Sonnet 5 向けのサンプルを用意しました。ask_weather では tool_choice で get_weather ツールの呼び出しを強制し、advise では応答の速さを優先して thinking を無効にしています。どちらも Sonnet 5 では使える書き方で、Sonnet 5.5 では 400 エラーになります。
weather_bot_before.py
"""天気を調べて服装を一言アドバイスするサンプル(Claude Sonnet 5 向け)"""
import json
import sys
import anthropic
MODEL = "claude-sonnet-5"
client = anthropic.Anthropic()
WEATHER_TOOL = {
"name": "get_weather",
"description": "指定した都市の現在の天気を取得する",
"input_schema": {
"type": "object",
"properties": {"city": {"type": "string", "description": "都市名"}},
"required": ["city"],
},
}
def get_weather(city: str) -> dict:
# デモ用の固定データ(実際には天気 API を呼び出す)
return {"city": city, "condition": "晴れ", "temperature_c": 24}
def ask_weather(question: str) -> dict:
"""get_weather ツールを必ず呼ばせて、ツールの入力から天気を取得する"""
response = client.messages.create(
model=MODEL,
max_tokens=1024,
tools=[WEATHER_TOOL],
tool_choice={"type": "tool", "name": "get_weather"},
messages=[{"role": "user", "content": question}],
)
tool_use = next(b for b in response.content if b.type == "tool_use")
return get_weather(**tool_use.input)
def advise(weather: dict) -> str:
"""天気に合う服装を一言で返す(応答の速さを優先して thinking を無効化)"""
response = client.messages.create(
model=MODEL,
max_tokens=1024,
thinking={"type": "disabled"},
messages=[
{
"role": "user",
"content": f"次の天気に合う服装を一言で教えてください: {json.dumps(weather, ensure_ascii=False)}",
}
],
)
return next(b.text for b in response.content if b.type == "text")
if __name__ == "__main__":
question = sys.argv[1] if len(sys.argv) > 1 else "東京の天気は?"
weather = ask_weather(question)
print(weather)
print(advise(weather))
Step2: /claude-api migrate を実行する
Claude Code の対話セッションでは、次のように入力します。
/claude-api migrate weather_bot_before.py to weather_bot_after.py

マイグレーション先のモデルを指定します。今回は、sonnet5.5です。

すると、weather_bot_after.pyが作成されます。
weather_bot_after.py
"""天気を調べて服装を一言アドバイスするサンプル(Claude Sonnet 5.5 向け)"""
import json
import sys
import anthropic
MODEL = "claude-sonnet-5-5"
client = anthropic.Anthropic()
# 安全性分類器に拒否されたとき、同じリクエストを別モデルで再実行する(Claude API のみ)
FALLBACK_OPTIONS = {
"betas": ["server-side-fallback-2026-07-01"],
"fallbacks": "default",
}
# tool_choice の強制が使えないため、呼び出しの確認とリトライはコード側で行う
MAX_TOOL_ATTEMPTS = 3
WEATHER_TOOL = {
"name": "get_weather",
"description": "指定した都市の現在の天気を取得する",
"strict": True,
"input_schema": {
"type": "object",
"properties": {"city": {"type": "string", "description": "都市名"}},
"required": ["city"],
"additionalProperties": False,
},
}
def get_weather(city: str) -> dict:
# デモ用の固定データ(実際には天気 API を呼び出す)
return {"city": city, "condition": "晴れ", "temperature_c": 24}
def check_refusal(response) -> None:
"""拒否された応答(HTTP 200 + stop_reason="refusal")を content を読む前に弾く"""
if response.stop_reason == "refusal":
category = response.stop_details.category if response.stop_details else None
raise RuntimeError(f"リクエストが拒否されました (category={category})")
def ask_weather(question: str) -> dict:
"""get_weather ツールを呼ばせて、ツールの入力から天気を取得する"""
for _ in range(MAX_TOOL_ATTEMPTS):
response = client.beta.messages.create(
model=MODEL,
max_tokens=16000,
system="質問に含まれる都市の天気を、get_weather ツールを呼び出して取得してください。",
tools=[WEATHER_TOOL],
output_config={"effort": "low"},
messages=[{"role": "user", "content": question}],
**FALLBACK_OPTIONS,
)
check_refusal(response)
tool_use = next((b for b in response.content if b.type == "tool_use"), None)
if tool_use is not None:
return get_weather(**tool_use.input)
raise RuntimeError(f"get_weather ツールが {MAX_TOOL_ATTEMPTS} 回呼び出されませんでした")
def advise(weather: dict) -> str:
"""天気に合う服装を一言で返す(応答の速さを優先して effort を low にする)"""
response = client.beta.messages.create(
model=MODEL,
max_tokens=16000,
output_config={"effort": "low"},
messages=[
{
"role": "user",
"content": f"次の天気に合う服装を一言で教えてください: {json.dumps(weather, ensure_ascii=False)}",
}
],
**FALLBACK_OPTIONS,
)
check_refusal(response)
return next(b.text for b in response.content if b.type == "text")
if __name__ == "__main__":
question = sys.argv[1] if len(sys.argv) > 1 else "東京の天気は?"
weather = ask_weather(question)
print(weather)
print(advise(weather))
Step3: 差分を確認する
diff で実際にどう書き換えられたかを確認します。
% diff weather_bot_before.py weather_bot_after.py
1c1
< """天気を調べて服装を一言アドバイスするサンプル(Claude Sonnet 5 向け)"""
---
> """天気を調べて服装を一言アドバイスするサンプル(Claude Sonnet 5.5 向け)"""
7c7
< MODEL = "claude-sonnet-5"
---
> MODEL = "claude-sonnet-5-5"
10a11,19
> # 安全性分類器に拒否されたとき、同じリクエストを別モデルで再実行する(Claude API のみ)
> FALLBACK_OPTIONS = {
> "betas": ["server-side-fallback-2026-07-01"],
> "fallbacks": "default",
> }
>
> # tool_choice の強制が使えないため、呼び出しの確認とリトライはコード側で行う
> MAX_TOOL_ATTEMPTS = 3
>
13a23
> "strict": True,
17a28
> "additionalProperties": False,
26a38,44
> def check_refusal(response) -> None:
> """拒否された応答(HTTP 200 + stop_reason="refusal")を content を読む前に弾く"""
> if response.stop_reason == "refusal":
> category = response.stop_details.category if response.stop_details else None
> raise RuntimeError(f"リクエストが拒否されました (category={category})")
>
>
28,37c46,61
< """get_weather ツールを必ず呼ばせて、ツールの入力から天気を取得する"""
< response = client.messages.create(
< model=MODEL,
< max_tokens=1024,
< tools=[WEATHER_TOOL],
< tool_choice={"type": "tool", "name": "get_weather"},
< messages=[{"role": "user", "content": question}],
< )
< tool_use = next(b for b in response.content if b.type == "tool_use")
< return get_weather(**tool_use.input)
---
> """get_weather ツールを呼ばせて、ツールの入力から天気を取得する"""
> for _ in range(MAX_TOOL_ATTEMPTS):
> response = client.beta.messages.create(
> model=MODEL,
> max_tokens=16000,
> system="質問に含まれる都市の天気を、get_weather ツールを呼び出して取得してください。",
> tools=[WEATHER_TOOL],
> output_config={"effort": "low"},
> messages=[{"role": "user", "content": question}],
> **FALLBACK_OPTIONS,
> )
> check_refusal(response)
> tool_use = next((b for b in response.content if b.type == "tool_use"), None)
> if tool_use is not None:
> return get_weather(**tool_use.input)
> raise RuntimeError(f"get_weather ツールが {MAX_TOOL_ATTEMPTS} 回呼び出されませんでした")
41,42c65,66
< """天気に合う服装を一言で返す(応答の速さを優先して thinking を無効化)"""
< response = client.messages.create(
---
> """天気に合う服装を一言で返す(応答の速さを優先して effort を low にする)"""
> response = client.beta.messages.create(
44,45c68,69
< max_tokens=1024,
< thinking={"type": "disabled"},
---
> max_tokens=16000,
> output_config={"effort": "low"},
51a76
> **FALLBACK_OPTIONS,
52a78
> check_refusal(response)
差分を、Claude の説明の区分に沿って整理すると次のとおりです。
| 区分 | 変更 | 箇所 |
|---|---|---|
| 必須 | モデル ID を claude-sonnet-5 から claude-sonnet-5-5 に変更 |
MODEL |
| 必須 | 強制 tool_choice を {"type": "auto"} に変更し、system プロンプトでツールの使用を指示。ツールが呼ばれなければ 1 回再試行 |
ask_weather |
| 必須 | ツール定義に strict: True と additionalProperties: False を追加 |
WEATHER_TOOL |
| 必須 | thinking={"type": "disabled"} を削除し、output_config={"effort": "low"} を指定 |
advise |
| あわせて入れた変更 | max_tokens を 1024 から 16000 に変更 |
両方の呼び出し |
| あわせて入れた変更 | stop_reason が refusal のときに例外を出す処理を追加 |
両方の呼び出し |
| あわせて入れた変更 | client.beta.messages.create に変え、サーバー側フォールバック(betas と fallbacks="default")を追加 |
両方の呼び出し |
Step4: 移行ガイドと突き合わせ、構文を確認する
同梱の移行ガイドの Sonnet 5.5 の節と、書き換え後のコードを突き合わせました。
- thinking の無効化: 移行ガイドでは、まず adaptive thinking を
lowの effort で試し、thinking を止める必要がある場合だけ{"type": "between_tools"}をhigh以下の effort で使う順番になっています。書き換え後のadviseは、1 つ目の方法(thinking の指定を省いて effort をlow)になっています。 - 強制 tool_choice: 移行ガイドでは、
autoとツールを使う場面を示すプロンプト、strict: trueの組み合わせに置き換え、autoは呼び出しを保証しないので呼び出しの有無を確認して再試行するよう書かれています。書き換え後のask_weatherは、この形になっています。
まとめ
Sonnet 5 から Sonnet 5.5 への移行はモデル ID の置き換えだけでは済みませんが、/claude-api migrate を使えば、破壊的変更への対応をコードに当てはめる作業を任せられると感じます。移行対象のファイルが多いプロジェクトほど効果が大きいと見ています。
最後に
Sonnet 5.5 は Sonnet 5 と同じトークン単価のまま Anthropic API の既定の Sonnet になり、Claude API のコードの移行も /claude-api migrate で進められることを確認できました。Claude Code でも Claude API でも、Sonnet 5.5 に移りやすいリリースだと感じます。
Sonnet を使っている方は、アップデートした上で、Claude API のコードも /claude-api migrate で移行してみてはいかがでしょうか。
参考文献








