Claude Sonnet 5でmax_tokensが途中で切れる問題の対処法
Sonnet 4.6用のmax_tokensをそのまま流用すると、Sonnet 5では出力が途中で切れます。原因と、effortとmax_tokensの調整方法をまとめます。
Claude Sonnet 4.6からmax_tokensを持ち越すと出力が切れる
Claude Sonnet 4.6で動いていたコードをそのままClaude Sonnet 5に向けると、レスポンスが完成する前に止まることがあります。stop_reasonが"max_tokens"になり、本文の途中で文章が切れているのが典型症状です。原因はコードの不具合ではなく、max_tokensの値がSonnet 5の挙動に対して小さすぎることにあります。
Sonnet 5でhigh・xhigh・maxのeffortを使う場合、max_tokensには思考とツール呼び出し分の余白を残す必要があります。長いタスクではアダプティブシンキング(モデルが考える深さを自分で決める仕組み)が予算の大部分を使い、出力のほとんどが思考で埋まったまま、答えが尻切れで終わります。max_tokensを引き上げるか、effortをmediumへ下げれば解消します。
起きやすいのは、Sonnet 4.6時代に思考なしで運用していたワークフローです。Sonnet 5ではアダプティブシンキングが既定でオンになり、thinkingを省いたリクエストでも思考トークンが乗ります。max_tokensは思考と応答本文の合計にかかる厳格な上限なので、同じリクエストでも本文に残る枠が減ります。
Sonnet 4.6とSonnet 5でmax_tokensの前提が変わった3点
max_tokensが足りなくなる背景は1つではなく、3つの変更が重なっています。
| 変更点 | Sonnet 4.6 | Sonnet 5 |
|---|---|---|
| アダプティブシンキング | Sonnet 4.6明示的にオンにしない限り無効 | Sonnet 5既定でオン(thinking未指定でも思考する) |
| 手動のthinking設定 | Sonnet 4.6budget_tokensで予算を指定できた(現在は非推奨) | Sonnet 5廃止・400エラー(effortで代替) |
| トークナイザー | Sonnet 4.6旧トークナイザー | Sonnet 5新トークナイザー(同じ文章で約30%多いトークン数) |
2つ目の変更は、thinking: {type: "enabled", budget_tokens: N}を残したコードが400エラーで止まるだけなので、気づくのは簡単です。厄介なのは1つ目と3つ目で、どちらもmax_tokensの枠を内側から削ります。新トークナイザーは入力だけでなく出力の数え方にも及ぶため、同じ内容を書いてもSonnet 4.6より多くのトークンを消費します。思考の分量が同じでも数え方が変わり、Sonnet 4.6時代に決めた枠を先に食いつぶすわけです。増分は内容とワークロードの形によって変わります。新トークナイザー自体の仕組みと入力側への影響はClaudeの新トークナイザーでトークン数が30%増える仕組みと対処にあります。
high・xhighのeffortほど余白を大きく残す理由
effortパラメーターは、モデルの知性とトークン消費のバランスを調整する仕組みで、Sonnet 5の既定値はhighです。Sonnet 4.6と同じ既定値ですが、Sonnet 5はeffortの指示を厳格に守ります。lowやmediumでは求められた範囲だけに作業を絞り、highやxhighでは複雑なタスクに応じて思考量が伸びます。
| effort | 想定用途 | max_tokensへの影響 |
|---|---|---|
max | 想定用途最大の思考量 | max_tokensへの影響思考量が最も伸びやすく、余白を大きく取る |
xhigh | 想定用途最も難しいコーディング・エージェントタスク向けの推奨設定 | max_tokensへの影響思考が長引きやすい |
high(既定) | 想定用途大半のユースケース | max_tokensへの影響長いタスクでは思考が枠を使い切ることがある |
medium | 想定用途コスト重視で知性を多少落としても構わないとき | max_tokensへの影響思考が浅くなる分、余白の消費は小さい |
low | 想定用途レイテンシ重視の短いタスク | max_tokensへの影響求められた範囲に作業を絞る |
xhighやmaxはコード生成やツール呼び出しを伴う長いタスクで使うことが多く、そこはまさにmax_tokensが尽きやすい条件と重なります。max_tokens不足に遭遇したら、まずeffortの設定を確認するのが早道です。
Sonnet 4.6との強さの対応は、Sonnet 5のmediumがSonnet 4.6のhigh相当、Sonnet 5のhighがSonnet 4.6のmax相当という目安で示されています。ベンチマークで比べるときは、effortの名前ではなく観測される思考の長さで揃えます。effortの使い分けはClaude effortとは、Claude Code上での切り替えはClaude Code effortレベルの使い方と設定で扱っています。
max_tokens不足の見分け方
まずstop_reasonを見ます。次の3手で切り分けると、設定の見直しで済むのか、プロンプトの問題なのかが分かれます。
max_tokens不足の切り分け
- 1
stop_reasonを確認する
"max_tokens"なら上限到達で止まっています。"end_turn"ならmax_tokensは無関係です。 - 2
中身の偏りを見る
テキストブロックが不自然な位置で切れているか、思考ブロックだけが長く本文がほとんど無ければ、思考が枠を使っています。
- 3
usageのoutput_tokensを見る
max_tokensにほぼ等しければ、思考と本文を合わせた出力が上限に当たっています。
# usageとstop_reasonだけを抜き出して確認する
curl -s 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-5",
"max_tokens": 16000,
"thinking": {"type": "adaptive"},
"messages": [{"role":"user","content":"'"$PROMPT"'"}]
}' | jq '{stop_reason, usage}'effortを下げる場合は、リクエストのoutput_configにeffortを指定します。
# xhigh運用でmax_tokens不足が出たときにeffortをmediumへ落として比較する
curl -s 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-5",
"max_tokens": 16000,
"output_config": {"effort": "medium"},
"messages": [{"role":"user","content":"'"$PROMPT"'"}]
}' | jq '{stop_reason, usage}'上限を上げるか、effortを下げるか
対処は2つで、どちらを選ぶかは、切れた応答が思考を必要としていたかで決まります。
どちらで直すか
max_tokensを上げる
難しいコード生成や長い推論など、思考を削ると品質が落ちるリクエスト向けです。Sonnet 4.6でぎりぎりに詰めていた値も、上限の128kトークンの枠内で引き上げられます。
effortを下げる
答えの質に思考がさほど効かない処理向けです。xhighやmaxからmediumへ落とすと、思考の消費が減り、同じmax_tokensでも収まりやすくなります。
思考トークンはusage.output_tokensに含まれて課金され、max_tokensの枠も消費します。displayをomittedにして思考の表示を消しても、課金されるのは内部で生成された全思考トークンで、消費量は変わりません。予算を減らしたいなら、表示設定ではなくeffortを調整します。
Sonnet 5のコンテキストウィンドウは1Mトークン、1回の出力上限は128kトークンで、別の数字です。入力に余裕があっても、同期Messages APIの出力は128kで頭打ちになります。Message Batches APIでは、ベータヘッダーoutput-300k-2026-03-24を付けると、Sonnet 5とSonnet 5.5が最大300kトークンまで出力できます。リアルタイムの応答が要らない長文生成なら、バッチ側へ回して枠を広げる選択肢があります。
ツール呼び出しのループでは上限がリクエストごとに効く
エージェント的なツール呼び出しループでは、max_tokensはターン全体ではなく、ループ内の各リクエストに別々に効きます。公式は、この上限はターン全体の支出を縛りません。1回の応答が上限に当たっても、ループ全体の出力量がmax_tokensで頭打ちになるわけではありません。逆に言えば、各リクエストで思考とツール呼び出しの両方を収める余白が要ります。
注意したいのは、max_tokensで止まった応答の末尾が不完全なtool_useブロックのときです。この場合、手順は、より大きいmax_tokensで同じリクエストをやり直して、完全なツール呼び出しを得ることです。切れたtool_useをそのままtool_resultで継続する形ではありません。ツール呼び出しを含む会話でstop_reasonが"max_tokens"なら、継続する前に末尾のブロックが完結しているかを確かめます。
移行時にmax_tokensだけ見直せば済むとは限らない
アダプティブシンキングが既定でオンになったことで、Sonnet 4.6時代に思考なしで運用していたワークフロー全体を見直す必要があります。budget_tokens指定のコードは400エラーになるため、effortへの置き換えが避けられません。temperature・top_p・top_kを既定値以外にしているコードも400エラーです。文体の揺らぎをtemperatureに頼っていた場合、システムプロンプトの指示で口調や多様性を誘導するよう案内されています。max_tokens不足とは別の症状ですが、同じ移行作業で同時に見つかりやすいエラーです。
4.6と5を併用する環境では、モデルごとに思考の指定を分けます。
$2と$10は標準価格で、以前予告されていた$3/$15への引き上げは行われません。ただし新トークナイザーでトークン数が増えるので、単価比と掛け合わせて見ます。
単価とトークン数を掛け合わせる
Sonnet 5 入力
$2
Sonnet 4.6は$3
Sonnet 5 出力
$10
Sonnet 4.6は$15
トークン数
約1.3倍
同じ文章を新トークナイザーで数えた場合の目安
入力側の実質単価比
約0.87倍
2÷3×1.3。思考トークンは含まない
出力側も同じ式なら10÷15×1.3で約0.87倍です。ここに思考トークンが加わるため、既定でアダプティブシンキングが走るSonnet 5では、1リクエストの総額が下がるとは限りません。max_tokensの余白を広げる調整は、コスト試算とセットで確認します。コード生成が多いプロンプトと自然文中心のプロンプトの両方でusageを見ておくと、どのワークロードで余白が足りなくなりやすいかが分かります。同じプロンプトをSonnet 4.6と5に流し、usage.output_tokensを並べると、新トークナイザーによる増分を自分のワークロードで測れます。Sonnet 5は現在レガシーモデルなので、新しく組むワークロードではSonnet 5.5を前提に、effortとmax_tokensを測ることになります。Anthropic API全体のモデル選択と料金体系はAnthropic API完全ガイドにあります。
まとめ
上限かeffortかを選ぶのは、stop_reasonとusage.output_tokensで上限到達を確かめてからです。ツール呼び出しの途中で切れたときは、継続せず上限を上げてやり直します。