exceeds_200k_tokensとは — 拡張コンテキストウィンドウでも200kで判定される固定しきい値
statusLineのexceeds_200k_tokensは、実際のコンテキストウィンドウのサイズに関わらず常に20万トークンで判定される固定しきい値です。1Mトークンのセッションで誤用しないための使い所を解説します。
Claude Codeのstatusline stdinに含まれるexceeds_200k_tokensは、直近のAPIレスポンスにおけるトークン合計が20万を超えたかどうかを示すブール値です。公式ドキュメントは、実際のコンテキストウィンドウのサイズに関わらない固定のしきい値だと明記しています。Sonnet 5.5・Sonnet 5・Fable 5のように100万トークン(1M)のコンテキストウィンドウを持つモデルでも、判定基準は20万のままです。
そのため、この値を「コンテキストウィンドウが埋まってきた合図」として扱うと、1Mトークンのセッションの序盤で誤警告を出す設計になりがちです。以下では、値が何と比べられるのか、どの環境で実態と一致するのか、使い分けの手順を順に見ます。
exceeds_200k_tokensとは何を示すフィールドか
exceeds_200k_tokensは、直近のAPIレスポンスに含まれる入力トークン・キャッシュトークン・出力トークンの合計が20万を超えているかを示す真偽値です。stdin JSONのトップレベルに直接置かれています。公式の例では、使用量が少ないうちはfalseが入っています。
{
"context_window": {
"context_window_size": 200000
},
"exceeds_200k_tokens": false
}このフィールドの核心は「固定」という一語です。context_window.context_window_sizeは既定で20万、拡張コンテキストウィンドウに対応するモデルでは100万になります。exceeds_200k_tokensは、どちらのケースでも20万という同じ数字とだけ比較します。
もう1つ押さえたいのは、これが累積値ではなく直近のレスポンスの合計だという点です。圧縮などで会話が縮んだあとのレスポンスでは、再びfalseに戻り得ます。「一度trueになったら終わりまでtrue」という値ではありません。
拡張コンテキストウィンドウのセッションで何が起きるか
Claude Codeでは、Anthropic API上のFable 5.1・Fable 5・Sonnet 5以降(Sonnet 5.5を含む)・Opus 4.7以降が、どのプランでも1Mのコンテキストウィンドウで動きます。Opus 4.6とSonnet 4.6は[1m]付きのバリアントを選んだときだけ1Mになります。プランごとの条件はClaude 1Mコンテキストの実務活用にまとめてあるので、ここではexceeds_200k_tokensの挙動だけを追います。
ネイティブで1Mのモデルは、既定で約96.7万トークンまで自動圧縮に入りません。20万を超えた時点では、圧縮までまだ約77万トークン分の余地があるわけです。それでもexceeds_200k_tokensは、20万を超えたレスポンスからtrueを返します。
1Mウィンドウのセッションにある3つの数字
exceeds_200k_tokensのしきい値
200,000
ウィンドウの大きさに関係なく固定
コンテキストウィンドウ
1,000,000
used_percentageの分母
自動圧縮の開始
約967,000
CLAUDE_CODE_AUTO_COMPACT_WINDOWで変更可
次の表は、1Mのセッションでトークンが積み上がっていくときの2つのフィールドの違いです。トークン数は説明用の値で、実際のセッションごとに異なります。左列は出力を含む合計ですが、used_percentageは入力側のトークンだけで計算するため、実際には表の割合と少しずれる場合があります。
| 直近レスポンスの合計(概算) | used_percentage(分母1M) | exceeds_200k_tokens |
|---|---|---|
| 50,000 | used_percentage(分母1M)5% | exceeds_200k_tokensfalse |
| 150,000 | used_percentage(分母1M)15% | exceeds_200k_tokensfalse |
| 210,000 | used_percentage(分母1M)21% | exceeds_200k_tokenstrue |
| 500,000 | used_percentage(分母1M)50% | exceeds_200k_tokenstrue |
| 900,000 | used_percentage(分母1M)90% | exceeds_200k_tokenstrue |
used_percentageは21%から90%まで埋まり具合を追い続けます。exceeds_200k_tokensは21%でtrueになったあと、90%でも同じtrueです。この約70ポイント分の変化は、exceeds_200k_tokensだけを見るスクリプトには届きません。
CLAUDE_CODE_DISABLE_1M_CONTEXT=1を設定すると、状況が変わります。Sonnet 5.5やFable系のようにネイティブで1Mを持つモデルも、20万のウィンドウとして扱われます。自動圧縮も20万の境界で発生するため、exceeds_200k_tokensと実際の逼迫度が重なります。
20万の境界で止める設定には、もう1つ注意点があります。自動圧縮をオフにしていると、セッションは圧縮されずにコンテキスト上限のエラーで止まります。Sonnet 4.6の[1m]など、使用量クレジットが絡む1M有効化の条件はUsage credits required for 1M contextの意味と対処で扱っています。
used_percentageとの違いは何か
同じ「逼迫度」に見えても、exceeds_200k_tokensとcontext_window.used_percentageは計算の中身が違います。
2つのフィールドの違い
exceeds_200k_tokens
入力・キャッシュ・出力トークンの合計を、固定の20万と比べます。1Mのセッションでは序盤でtrueになり、以降の埋まり具合を反映しません。公式の「欠落し得る」「nullになり得る」フィールドの一覧には入っていません。
context_window.used_percentage
input_tokens + cache_creation_input_tokens + cache_read_input_tokensを分子に、モデルのウィンドウサイズを分母にします。出力トークンは含みません。セッション序盤はnullになり得ます。
current_usageオブジェクトの内訳はClaude Codeのcurrent_usageで直近リクエストの内訳を読むで扱っています。
出力トークンまで含めた合計が20万を超えたかだけを知りたい場面では、exceeds_200k_tokensがそのまま使えます。逆に「今どれくらい埋まっているか」には、ウィンドウサイズを分母にしたused_percentageが向きます。
used_percentageにも落とし穴が1つあります。CLAUDE_CODE_AUTO_COMPACT_WINDOWを設定すると、圧縮の開始点は動きますが、used_percentageの分母はモデルの全ウィンドウのままです。公式の環境変数リファレンスにも、この変数を設定したあとはused_percentageが圧縮のタイミングを示さなくなると書かれています。100万のウィンドウで圧縮窓を50万にすると、圧縮は50万付近(used_percentageでは約50%)で起き、100%には届きません。used_percentageを圧縮までの残りとして読めなくなります。
LLMゲートウェイやカスタムモデルIDでは何が変わるか
ANTHROPIC_BASE_URLでLLMゲートウェイを指定した場合、Claude Codeは認識できるモデルに、Anthropic API上と同じウィンドウを割り当てます。Fable 5.1・Fable 5・Sonnet 5以降・Opus 4.7以降は[1m]なしで1Mになります。Opus 4.6のように[1m]バリアント経由でしか1Mにならないモデルは、付けなければ20万で動きます。
ゲートウェイやその先のサーバーが課す低い上限を、Claude Codeは検出できません。ゲートウェイが20万を超えるリクエストを拒否するなら、CLAUDE_CODE_AUTO_COMPACT_WINDOW=200000を設定します。すると、どのモデルのセッションも20万の境界で圧縮されます。
認識できないモデルID(ゲートウェイ独自のエイリアスなど)の扱いは、IDに[1m]が含まれるかで分かれます。
| IDの種類 | CLAUDE_CODE_MAX_CONTEXT_TOKENSの効き方 |
|---|---|
認識できない独自ID([1m]なし) | CLAUDE_CODE_MAX_CONTEXT_TOKENSの効き方指定した値をそのままウィンドウとして使い、そこで圧縮する |
認識できない独自ID([1m]あり) | CLAUDE_CODE_MAX_CONTEXT_TOKENSの効き方単独では効かず、1Mのウィンドウと見なされる |
| 認識できるモデルのID | CLAUDE_CODE_MAX_CONTEXT_TOKENSの効き方DISABLE_COMPACTも設定したときだけ効く |
[1m]付きの独自IDでウィンドウを直したいときは、CLAUDE_CODE_DISABLE_1M_CONTEXT=1も併せて設定します。このとき宣言したウィンドウが20万を超えていると、起動時に次の警告が出ます。
CLAUDE_CODE_DISABLE_1M_CONTEXT is set, but the 200K limit isn't enforced for <model>, so this session can grow past it. To enforce it, set CLAUDE_CODE_AUTO_COMPACT_WINDOW=200000 (or the autoCompactWindow setting).この構成では警告が出ること自体が想定内です。ただし、exceeds_200k_tokensがtrueになっても、残りの余白はウィンドウ設定しだいで変わります。フィールドだけで判断するのは危険です。モデルを固定する設定キーの綴りを取り違えないことも、認識ズレを避ける前提になります(ANTHROPIC_MODEL環境変数でモデルを固定する方法を参照)。
null処理が要らないという利点
used_percentageはセッション序盤に、current_usageはセッション序盤と/compactの直後にnullになり得ます。statuslineのドキュメントは、nullにはフォールバックの既定値を用意するよう求めています。そのため、// 0のようなフォールバックを毎回書くことになります。
exceeds_200k_tokensは、公式の「欠落し得るフィールド」にも「nullになり得るフィールド」にも載っていません。単純な条件分岐だけで済ませたいスクリプトでは、この扱いやすさが実利になります。
自分の環境で使うフィールドを決める手順
どのフィールドで警告を出すか
- 1
context_window_sizeを読む
stdinの
context_window.context_window_sizeが20万か100万かを先に見ます。Claude Codeが認識したウィンドウの大きさが、この値に入ります。 - 2
20万なら exceeds_200k_tokens でよい
Opus 4.6やSonnet 4.6の
[1m]なし、CLAUDE_CODE_DISABLE_1M_CONTEXT=1を設定した環境、Amazon Bedrockなどで20万のウィンドウとして動くOpus 4.8以降では、しきい値とウィンドウが一致します。 - 3
100万なら used_percentage に切り替える
ネイティブ1Mのセッションでは、
used_percentageかcontext_window.current_usageから自分で比率を出します。出力トークンを含めた合計が必要なときだけ、exceeds_200k_tokensを併用します。 - 4
圧縮窓を動かしているなら自前で計算する
CLAUDE_CODE_AUTO_COMPACT_WINDOWを設定している環境では、used_percentageも圧縮の目安になりません。current_usageの入力側の合計を、設定した圧縮窓で割って自分で比率を出します。
サブエージェント用のsubagentStatusLineには注意が要ります。tasks配列の各要素が持つのはcontextWindowSizeとtokenCountなどで、exceeds_200k_tokensは含まれません。サブエージェントの行では、この2つから自分で比率を計算します。
実装例 — ウィンドウサイズと組み合わせて誤警告を防ぐ
exceeds_200k_tokensだけで警告を出さず、context_window.context_window_sizeが20万以下かを先に調べると、1Mのセッションでの誤警告を避けられます。
#!/usr/bin/env bash
input=$(cat)
WINDOW_SIZE=$(echo "$input" | jq -r '.context_window.context_window_size // 200000')
EXCEEDS_200K=$(echo "$input" | jq -r '.exceeds_200k_tokens // false')
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)
if [ "$WINDOW_SIZE" -le 200000 ] && [ "$EXCEEDS_200K" = "true" ]; then
echo "⚠️ コンテキストが20万トークンに到達"
else
echo "📊 使用率 ${PCT}%"
fi設定ファイルには、statusLineとしてこのスクリプトを登録します。
{
"statusLine": {
"type": "command",
"command": "~/.claude/statusline.sh"
}
}Claude Codeに組み込む前に、スクリプトへ直接JSONを流し込むと、分岐の挙動を単体で確かめられます。次の4つは、1Mで25%使用・20万ウィンドウで97%使用・used_percentageがnull・context_window自体がないペイロードです。
echo '{"context_window":{"context_window_size":1000000,"used_percentage":25},"exceeds_200k_tokens":true}' | ~/.claude/statusline.sh
echo '{"context_window":{"context_window_size":200000,"used_percentage":97},"exceeds_200k_tokens":true}' | ~/.claude/statusline.sh
echo '{"context_window":{"context_window_size":200000,"used_percentage":null},"exceeds_200k_tokens":false}' | ~/.claude/statusline.sh
echo '{"exceeds_200k_tokens":false}' | ~/.claude/statusline.sh実際に出た4行は次のとおりです。
📊 使用率 25%
⚠️ コンテキストが20万トークンに到達
📊 使用率 0%
📊 使用率 0%1行目は、exceeds_200k_tokensがtrueでもウィンドウが1Mなので、警告が出ず使用率の表示になります。2行目のように、20万ウィンドウでtrueのときだけ警告が出ます。3行目と4行目は、// 0のフォールバックが効いて、nullや欠落でも表示が崩れません。
まとめ
exceeds_200k_tokensは、ウィンドウの大きさと無関係に、直近のレスポンスを固定の20万と比べる値です。20万のウィンドウでは目安として使えますが、ネイティブ1Mのセッションではcontext_window_sizeを見てused_percentageに切り替えます。圧縮窓を動かしている環境では、used_percentageも圧縮の目安にならない点に気をつけてください。