"adaptive thinking is not supported"エラーの原因と対処法
Claude 4.5以前のモデルにthinking type adaptiveを送ると400エラーになる。原因のモデル区分と、budget_tokens方式への戻し方を整理する。
"adaptive thinking is not supported on this model"は何のエラーか
thinking: {"type": "adaptive"} を含むリクエストが、モデル側でadaptive thinkingに対応していないときに返る400 invalid_request_errorです。エラーメッセージは次の1行だけです。
adaptive thinking is not supported on this model原因は明確です。adaptive thinkingは新しい世代のモデルから使えるようになった仕組みで、extended thinkingしか対応しない旧世代モデルにadaptiveを指定すると、このエラーになります。現役の対象は、Claude Opus 4.5・Claude Haiku 4.5・Claude Sonnet 4.5の3モデルです。これらは"adaptive"を拒否し、"enabled"(budget_tokens指定の従来方式)だけを受け付けます。Claude Opus 4.1・Claude Sonnet 4・Claude Opus 4もextended thinkingのみですが、いずれも提供終了済みで、リクエスト自体が失敗します。
adaptive thinkingとextended thinkingの違い
adaptive thinkingは、ほとんどの新しいモデルが対応するthinkingの既定方式です。budget_tokensを手動で指定する代わりにeffortパラメータで思考の深さを調整します。多くのモデルではデフォルトで有効になっています。
extended thinkingは、thinking: {"type": "enabled", "budget_tokens": N}で予算をトークン数で直接指定する旧方式です。Claude 4.5以前のthinking対応モデルはこちらしかサポートしません。両者の違いはExtended thinkingとAdaptive thinkingの違いの対応表にまとめています。2方式の位置付けはthink toolとextended thinkingの使い分けでも整理しています。
両方式を新しいモデルと古いモデルの両方に対応させたい実装では、モデルIDで分岐してthinkingパラメータの中身を切り替える必要があります。
モデル別のthinkingサポート早見表
| モデル | 対応するthinking | 既定 | "adaptive"を送ると |
|---|---|---|---|
| Claude Fable 5.1 / Mythos 5.1 / Fable 5 / Mythos 5 / Opus 5.5 | 対応するthinkingadaptiveのみ | 既定常時オン | "adaptive"を送ると問題なし(既定と同じ) |
| Claude Mythos Preview | 対応するthinkingadaptive・extended両方 | 既定常時オン | "adaptive"を送ると問題なし |
| Claude Opus 5 / Sonnet 5 | 対応するthinkingadaptiveのみ | 既定オン | "adaptive"を送ると問題なし |
| Claude Sonnet 5.5 | 対応するthinkingadaptiveのみ | 既定オン | "adaptive"を送ると問題なし(disabledは400。無効化の代わりにbetween_toolsをhigh以下のeffortで使う) |
| Claude Opus 4.8 / 4.7 | 対応するthinkingadaptiveのみ | 既定オフ | "adaptive"を送ると問題なし(effortはxhighから始めるのが推奨) |
| Claude Opus 4.6 / Sonnet 4.6 | 対応するthinkingadaptive・extended両方(extendedは非推奨) | 既定オフ | "adaptive"を送ると問題なし |
| Claude Opus 4.5 / Haiku 4.5 / Sonnet 4.5 | 対応するthinkingextendedのみ | 既定オフ | "adaptive"を送ると400エラー |
表の最終行がこの記事の対象です。
4.5世代のうちClaude Sonnet 4.5は2026年9月30日に非推奨となり、提供終了は2026年11月30日です(移行先はclaude-sonnet-5-5)。Opus 4.5とHaiku 4.5は現役です。
対処法 — budget_tokens付きのenabledに戻す
このエラーが出たら、thinkingパラメータを次の形に書き換えます。
curl https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-4-5-20250929",
"max_tokens": 2048,
"thinking": {
"type": "enabled",
"budget_tokens": 4096
},
"messages": [
{"role": "user", "content": "この設計の妥当性を検討してください"}
]
}'typeを"enabled"に戻し、effortではなくbudget_tokensでトークン数を直接指定します。
budget_tokensには制約があります。max_tokensより小さい値であることが必須です。thinkingに使ったトークンもそのターンのmax_tokensに含まれるため、最終応答の分の余白を残して設計します(interleaved thinkingを使う場合は対象外)。この制約があるため、max_tokens: 0によるキャッシュのプリウォーミングとextended thinkingは併用できません。
budget_tokensの数字
下限
1,024
これより小さい値はAPIが拒否
複雑なタスクの出発点
16,000以上
単純なタスクは下限付近から
バッチ処理を勧める境界
32k超
長時間リクエストがタイムアウトや接続数の上限に当たりうる
予算は上限ではなく目標値です。Claudeは予算を使い切る前に思考をやめることがあり、出力全体の硬い上限はあくまでmax_tokensです。実際に使った量はレスポンスのusage.output_tokens_details.thinking_tokensで確認できます。ストリーミングでは、最後のmessage_deltaイベントにだけ載ります。「Thinking budget exceeds」エラーは、budget_tokensが出力上限を超えたときの対処にあります。
Claude Opus 4.5だけは effortも併用します。extended thinkingのみ対応するモデルの中で唯一effortパラメータに対応しており、effortが応答全体の傾向を、budget_tokensがthinkingの深さを別々に制御します。Haiku 4.5・Sonnet 4.5ではeffortは使えず、budget_tokensだけで調整します。
extended thinkingへ戻す動機は、エラーを消すことだけではありません。手動で予算を固定できるぶん、レイテンシの予測しやすさやthinkingコストの厳密な制御が必要なワークロードでは、旧世代モデルのbudget_tokens方式そのものが実運用上の利点になります。Prompt Cachingの仕組みと組み合わせる場合は注意が必要で、リクエスト間でbudget_tokensの値を変えるとキャッシュのブレークポイントが無効になります。値はthinkingブロックとしてプロンプトに描画されるため、budget_tokensを頻繁にチューニングする実装ではキャッシュヒット率が落ちる副作用が出ます。
Claude Sonnet 4.6での実測が公式に載っています。同じbudget_tokens(4,000トークン)で2回目のリクエストを送るとキャッシュがヒットします(cache_read_input_tokens: 1370)。3回目に予算を8,000トークンへ変えると、キャッシュが再生成されます(cache_creation_input_tokens: 1370, cache_read_input_tokens: 0)。運用上の教訓はシンプルで、キャッシュを効かせたい会話ではbudget_tokensを一度決めたら変えないことです。
会話の途中でthinkingを切り替えたいときの制約
extended thinkingには、adaptive thinkingには無い制約が1つ増えます。thinking対応リクエストの最後のassistantターンは、必ずthinkingブロックで始まる必要があります。adaptive thinkingではこの要件がなくなりますが、旧世代モデルで動かす限りは意識しておく必要があります。ターンをまたいでthinkingの設定(オン/オフやbudget_tokensの値)を変えることも、プロンプトキャッシュを無効化する操作として扱われます。
複数モデルを併用する実装ではどう分岐するか
同じアプリケーションでClaude 4.5世代と新しいモデルの両方を呼び分ける場合、モデルIDを見てthinkingオブジェクトの形を丸ごと切り替えるのが確実です。「新しいモデルにもbudget_tokensを送れば動くはず」という判断はできません。Claude 4.7以降(Mythos Previewを除く)は逆にextended thinking("enabled")そのものを拒否するため、双方向に非互換です。片方の方式で全モデルをカバーしようとすると、どちらの世代かで必ずどちらかのエラーに当たります。
すでにadaptive thinking前提で実装していて、Claude 4.5世代へのフォールバックを追加する場合は、モデルの世代を判定してからthinkingパラメータを組み立てる分岐を通す設計にします。effortを使うコードパスとbudget_tokensを使うコードパスを両方持たせ、モデルIDの世代判定だけをスイッチにするのが最小の変更で済みます。
モデルIDを合わせたのに同じ400が出る場面
表のとおりにモデルを選んでもこのエラーが出る報告が、GitHubの公開issueにあります。うち2件は、thinkingを付ける側と、実際にリクエストを受けるモデルがずれていた例です。3件目は、同じ400が出ている報告です。
- ルーターやゲートウェイが途中でモデルを差し替える: NadirClawのissueでは、クライアントが見ているのはルーター側の仮のモデルIDで、そこでadaptiveが付きます。ルーティング先が
claude-haiku-4-5になると、リクエストごとに400になったと報告されています。報告者は後から原因の一部を訂正しており、再現した400の結果自体は変わっていません。 - 実行全体の設定をモデルごとに分けずに付ける: 第三者のOSSプロキシ(agent-sandbox)で出た報告では、Haiku向けの呼び出しがすべて400になりました。全体に
effortを指定した状態で、一部の役割だけHaiku 4.5へ振り分けていました。報告ではadaptive thinkingとeffortの両方がHaiku 4.5で拒否されています。 - WebSearchツールが毎回失敗する報告: Claude Codeのissueでは、チャットのモデルを切り替えてもエラーが変わらなかったと書かれています。報告者は、WebSearchの呼び出し先が固定の別モデルではないかと推測しています。
アプリが送ったモデルIDだけを見ていては原因に届かない例が多いので、次の順にどこで食い違うかを絞り込みます。
食い違いの探し方
- 1
実際に届いたモデルIDを記録する
エラー本文の
request_idと、ゲートウェイを通過した後のモデルIDをログに残します。request_idはエラーのJSONに入っています(SDKでは_request_id)。 - 2
そのモデルIDを表で引く
早見表で引き、最終行に当たるかを見ます。
- 3
thinkingを付ける場所を確かめる
アプリ側・ルーター側・SDKの共通設定のどこでadaptiveが付与されるかを探します。リクエスト単位のモデルではなく、実行全体の設定に付いているのが典型です。
- 4
モデルごとに組み立てる
先の分岐どおり、モデルIDを見て
thinkingとeffortをリクエストごとに決めます。
将来モデルを切り替えるときの逆方向の書き換え
新しいモデルへ移行する予定があるなら、budget_tokensからeffortへの書き換え方も知っておくと二度手間になりません。公式の移行マッピングはシンプルです。
| extended thinking(旧) | adaptive thinking(新) |
|---|---|
thinking: {"type": "enabled", "budget_tokens": 10000} | adaptive thinking(新)thinking: {"type": "adaptive"} |
思考深度はbudget_tokensで直接指定 | adaptive thinking(新)思考深度はoutput_config: {"effort": "high"}で指定 |
interleaved-thinking-2025-05-14ベータヘッダーが必要 | adaptive thinking(新)不要(adaptiveは自動で割り込み思考を行う。ヘッダーを送っても無視される) |
budget_tokensを削除してthinking: {"type": "adaptive"}に置き換え、深度制御をoutput_config.effortへ移すだけの変更です。ただし挙動そのものが変わる点には注意が必要です。固定予算では毎回thinkingが走りますが、adaptiveではモデルが入力の難度に応じてthinkingするかどうか自体を判断し、簡単な入力ではthinkingを省略することがあります。また、Opus 4.5以降のOpus、Sonnet 4.6以降のSonnet、Fable・Mythos系は前ターンのthinkingブロックを文脈に保持して入力トークンとして課金します。それ以前のOpus・SonnetとHaiku 4.5までは、直前のターンしか保持しません。
"thinking.type.enabled" is not supportedとの違い
似た文言のエラーに"thinking.type.enabled" is not supported for this modelがあります。これは逆方向のエラーで、旧方式の"enabled"(extended thinking)を新しい世代のモデルに送ったときに発生します。
2つの400エラーは対処が正反対
adaptive thinking is not supported on this model
対象はClaude 4.5以前でextended thinkingしか持たないモデル。"enabled"とbudget_tokensに戻します。
"thinking.type.enabled" is not supported for this model
対象はClaude 4.7以降(Mythos Previewを除く)。"adaptive"とeffortに変えます。
エラーメッセージの主語(adaptiveかenabledか)を見てから直します。
まとめ
見るのは2点だけです。エラーメッセージの主語(adaptiveかenabledか)と、ゲートウェイを通った後に実際に届いたモデルID。この2つが揃えば、thinkingをどちら向きに直すかが決まります。
よくある質問
エラーが出てもthinkingパラメータ自体を省略すれば動くか
Claude Opus 4.5・Haiku 4.5・Sonnet 4.5は、thinkingを省略するとthinkingがオフのまま通常のリクエストとして通ります。ただしthinkingは働かないため、extended thinkingを使いたいなら省略ではなく"enabled"への書き換えが必要です。"disabled"を送った場合も、この3モデルでは400にならずthinkingオフのままです。
ツール呼び出しの合間にもthinkingさせたい(interleaved thinking)場合はどうなるか
Claude 4.5世代でinterleaved thinkingを使うには、interleaved-thinking-2025-05-14ベータヘッダーとthinking: {"type": "enabled", "budget_tokens": N}を組み合わせます。ただしClaude Haiku 4.5はinterleaved thinking自体に対応していません。Claude APIではベータヘッダーを送ってもエラーにならず、無視されるだけです。対象はMessages API経由のツール呼び出しに限られます。
4.6世代に移る予定があるなら世代差も設計に入れます。Sonnet 4.6は手動モードのままベータヘッダーが動きますが非推奨で、adaptive thinkingが勧められています。Opus 4.6は手動モードに割り込み思考が無く、adaptiveでしか使えません。