Dev

Sonnet 5.5 の推論は、ひとつのモデルとひとつのアカウントの中にとどまる

以前の thinking を読めないモデルや API アカウントに切り替えても、リクエストは成功します。それまでのターンで積み上げた推論は、モデルが読む前に破棄されます。エラーも出ず、請求にも載りません。気づけるのは、API に報告を求めていた場合だけです。

Claude Sonnet 5.5 は 9 月 28 日に Sonnet 5 と同じ価格でリリースされ、同じ日に Claude Code v2.1.284 が Anthropic API でのデフォルトの Sonnet をこれに切り替えました。Anthropic は、Sonnet 5 向けに書いたコードが壊れる点を 5 つ挙げています。tool_choice の強制指定は 400 を返し、Claude API と Google Cloud では computer use がツールセットに移ります。どちらも Opus 5.5 で見覚えのある変更です。advisor ツールは Opus 4.8、Opus 4.7、Sonnet 5 を advisor として受け付けません。thinking のオフの仕方は Opus 5.5 と異なり、disabled は 400 を返し、代わりに high 以下の effort で between_tools を使います。そして thinking ブロックが、モデルとアカウントに紐づくようになりました。

先週、400 は良い壊れ方だと書きました。5 つ目の変更は 400 を出さないほうの変更で、モデルルーターが扱うべき単位を、ターンから会話へと静かに変えてしまいます。

Sonnet 5.5 の thinking を読めるモデルはどれか?

Sonnet 5.5 自身だけです。ドキュメントははっきりしています。Sonnet 5.5 は Sonnet 5、Opus 4.8、Haiku 4.5 とそれ以前のモデルの thinking ブロックを読めますが、Opus 5、Opus 5.5、Fable や Mythos 系のモデルのブロックは読めません。そして "no other model reads thinking blocks from Claude Sonnet 5.5." とあります。

これでどのペアが切れるかを見てください。このラインナップなら自然に考えるルーティングは、定型的なターンを Sonnet 5.5、難しいターンを Opus 5.5 に振る形です。この 2 つは、どちらの方向にも何も共有しません。Opus 5.5 は Opus 5 と、それ以前の Opus、Sonnet、Haiku のブロックを読めるので、Sonnet 5 から Opus 5.5 へ渡れば推論は残ります。Sonnet 5.5 から Opus 5.5 では残りません。Haiku 4.5 へ戻すルートでも同じです。

モデルが読めないブロックはどうなるのか?

プロンプトがモデルに届く前に API が取り除き、リクエストは成功します。破棄されたブロックは課金されず、input_tokens にも数えられません。text と tool_use のブロックは残るので、モデルは何が話され、何が実行されたかは引き続き把握できます。ただ、そのターンにはその裏にあった推論なしで答えることになります。

失われるのはリクエスト単位で、永続的ではありません。API が messages 配列を書き換えることはないので、それらのブロックを読めるモデルに戻った次のリクエストでは、推論がまた渡されます。Anthropic の推奨は、thinking を含む履歴を丸ごと送り続け、現在のモデルが使えないものは API に捨てさせることです。推論が本当に失われるのは、自分のクライアントがそれを削った場合だけです。

アカウントへの紐づけで何が加わるのか?

モデルとは無関係の、2 つ目の壁です。Sonnet 5.5 が生成したブロックは "work only in the account that produced them, or in an account linked to it." とされています。別のアカウントからブロックを送ると、API はやはり 200 のまま破棄します。以前のモデルのブロックは影響を受けません。

つまり、リンクされていない複数のアカウントにまたがる会話は、アカウントをまたぐたびに推論を失います。複数の組織のキーに負荷を分散するゲートウェイ、最初のアカウントがレート制限に当たったときに 2 つ目へ切り替える運用、開発用アカウントの会話を本番で再生するケースなどです。

ドキュメントに書かれていないことは?

エラーを一切出さない挙動にしては、不明な点が思ったより多く残っています。「リンクされた」の定義がありません。紐づけが組織単位なのか、ワークスペース単位なのか、キー単位なのか、また Bedrock のアカウントが直接の API アカウントに対して「別のアカウント」になるのかは、ページからは読み取れません。organization_binding_mismatch の報告が文書化されているのは Claude API と Google Cloud だけで、Amazon Bedrock、Claude Platform on AWS、Microsoft Foundry についてはどちらとも書かれていません。オプトアウトの方法も記載がありません。

Anthropic 自身の拒否時フォールバックもモデルの切り替えで、ドキュメントもそう明記しています。サーバー側フォールバック(fallbacks: "default"、ベータ、Claude API)は cyber と frontier_llm の拒否を Sonnet 5 で再試行しますが、Sonnet 5 は Sonnet 5.5 のブロックを読めないので、ブロックは破棄されます。しかも 1 ターンでは終わりません。スティッキールーティングにより、その会話の後続リクエストは約 1 時間、直接フォールバック先のモデルに送られます。範囲は自分の組織内です。

破棄はどうすれば見えるのか?

ブロック単位で見るには、自分から求めるしかありません。ベータヘッダー thinking-binding-controls-2026-08-01 を付けると、すべてのレスポンスのトップレベルに input_transformations 配列が入り、破棄された各ブロックが理由付きで並びます。モデル違いなら model_binding_mismatch、アカウント違いなら organization_binding_mismatch です。ヘッダーがなければ、破棄は黙って行われます。フォールバックはレスポンスの model フィールドには現れますが、分かるのはモデルが変わったことだけで、何が失われたかではありません。

python
resp = client.beta.messages.create(
    model="claude-sonnet-5-5",
    max_tokens=16000,
    messages=history,
    betas=["thinking-binding-controls-2026-08-01"],
)
for t in getattr(resp, "input_transformations", None) or []:
    if t.type == "thinking_dropped":
        log.warning("reasoning dropped at %s: %s", t.path, t.reason)

このとき、削ったリクエストではなく本物の system と tools を一緒に送ってください。Anthropic は今後のチェックで新しい種類や理由が増えるとしているので、知らない値で処理が失敗しないようにしてください。

ルーターは何を変えるべきか?

ルーティングの単位です。私見では、設計は擁護できても、デフォルトは擁護できません。ハードエラーにすれば、互換性のない切り替えをまたいで thinking を渡すルーターがすべて壊れますし、ブロックは消されるわけではなく、そのターンで使われないだけです。それでもリクエストはひとつも失敗しないので、通常のエラー監視には数えるものがありません。ブロック単位の唯一のシグナルは、ほとんどのインテグレーションが送ることのないベータヘッダーを付けないと得られません。

役割で分ける構成、つまりレビュアーがワーカーの出力を自分の会話で受け取る形なら、何も失いません。レビュアーが読むのは成果物であって、ワーカーの thinking ではないからです。これは、よりエージェント的なモデルをレビュアーの席に座らせたときに書いた役割分担の形です。一方、ひとつの会話の中でターンごとにモデルを選ぶルーターは、いまやモデルにどの推論を見せるかも選んでいることになります。モデルを、じっとしていない依存関係として扱う話で書いたモデルのポートフォリオは、各会話がその中のひとつにとどまる限り、今も機能します。

ですから、できるところでは会話単位でルーティングし、ひとつの会話はひとつのアカウントに置き、途中でどうしても切り替えるなら、互いのブロックを読めるペアの中にとどまってください。そのうえでステージングでヘッダーを有効にし、実際のトラフィックを 1 日分ルーターに流して、何が破棄されたかを数えてみてください。

ディスカッション

コメント欄はありません。議論は X で行っています。

Max Nardit

Max Nardit

@mnardit

ほかの記事

ベンチマークは実時間に連動することを証明しなければならない

エージェントが渡された数値を何でも押し下げるようになると、議論すべきはもうモデルではありません。自分が責任を持つのは、その数値と目標が一緒に動くという証拠です。そしてその証拠は、最適化が確認した範囲の外に出た時点で期限切れになります。

プロンプトキャッシュを壊したものを見つける

Cache diagnostics は、リクエストが直前のものと一致しなくなった最初の箇所を教えてくれます。役に立つのは、その判定をキャッシュ読み取り数と並べて読み、diagnostics が検出しないパラメータの変更を自分で押さえたときです。目で探して最も見つけにくいミスは、まさにそこにあります。

クローンしたリポジトリの設定ファイルが、まだ実行できること

Claude Code は、リポジトリがテレメトリのエクスポートを有効にすることを禁止しました。この狭い修正の裏には、もっと広い事実があります。コミットされた設定ファイルは、あなたの権限で動くコードです。ヘッドレス実行では、事前に誰も確認しません。対話モードでは確認のダイアログが表示されますが、筆者はそれを読まずに承認しています。