Claude Codeがモデルを認識できない警告 — 200K仮定の直し方
gatewayのエイリアスや独自モデルIDで「doesn't recognize the model」が出ると、Claude Codeはコンテキストを200Kと仮定します。直す4つの方法と、環境変数が効くIDの条件を表で示します。
LLM gatewayのエイリアスや独自のモデルIDでClaude Codeを起動すると、「doesn't recognize the model」という警告が出ることがあります。これはモデルが使えないという意味ではありません。モデルのコンテキストウィンドウが分からないので、Claude Codeが200Kトークンと仮定して動く、という通知です。
実際のウィンドウが200Kなら何も直す必要はありません。1Mや400Kのモデルなのに200Kで自動圧縮が走るなら、仮定を補正します。
警告は2通りの文面で出る
起動時に出る警告は、次の2種類のどちらかです。
⚠ Model "my-gateway-opus" isn't recognized · context assumed to be 200k tokens · ...
Claude Code doesn't recognize the model "my-gateway-opus", so it assumes a context window of 200k tokens. Update Claude Code, or see https://code.claude.com/docs/en/model-config#correct-the-window-for-a-gateway-or-custom-model-id to set the window.どちらも意味は同じです。引用符の中に、Claude Codeが読めなかったモデルIDが入ります。ここに自分が設定した文字列が出ていれば、次の節の切り分けに進めます。
似た名前の別の通知に注意してください。リクエスト時に出る [claude-code:unrecognized_model] の診断行は、同じ「認識できないID」が原因ですが、ウィンドウの仮定ではなくIDの取り扱いを知らせるものです。-p 実行では標準エラー、対話セッションではデバッグログに書かれ、モデルIDごとに1プロセスで1回だけ出ます。
is not a recognized model id というエラー文言で来た場合は、IDの綴りそのものが原因のことが多く、別の記事で扱っています。「is not a recognized model id」の意味とClaude CodeのモデルIDの書き方を見てください。
200Kと仮定されると何が起きるか
見えやすい症状は2つあります。
- 会話が200K付近に届く前に、自動圧縮が想定より早く走る
- 200K付近で
Prompt is too longが出る
後者は、実際には余裕のあるモデルで起きたときの手がかりになります。エラーリファレンスには、200K付近でこのエラーが出て、モデル側はもっと受け付けるなら、認識できないモデルIDが原因のひとつだと書かれています。
カスタムの ANTHROPIC_BASE_URL を使っていて、エラーが Prompt is too long · automatic compaction failed で始まる場合は、ウィンドウを設定するか、v2.1.299以降へ更新します。v2.1.299より前は、仮定した200K付近でリクエストを送らずにターンを終えていました。
圧縮そのものが失敗する別の症状は、「Conversation too long」で/compactが失敗するときの対処にまとめています。
補正が要るかを先に決める
補正するかどうかは、モデルの本当のウィンドウで決まります。上から順に確かめてください。
警告が出たら、どこから直すか
- Qモデルの実際のウィンドウは200Kより大きいですか?答えがいいえ(200Kちょうど)答えがはい
仮定と実際が一致しているので、補正は不要です。警告は通知にすぎません。
- Q更新してもIDが認識されないままですか?答えがいいえ(更新で認識された)答えがはい
claude updateで解決します。ほかの設定は要りません。 - QIDは社内独自のモデルなど、既知モデルの別名ではありませんか?答えがいいえ(既知モデルの別名)答えがはい
modelOverridesかmodelPickerのbehavesAsで、既知のモデルとして扱わせます。 - Qウィンドウは1M以外の値ですか?答えがいいえ(1M)答えがはい
IDの末尾に
[1m]を付けて起動します。
任意のウィンドウを宣言する
CLAUDE_CODE_MAX_CONTEXT_TOKENS に、モデルの実際のウィンドウを入れます。
この順序は、手間の少ない順でもあります。更新は1コマンド、別名の登録は設定ファイルへの数行、[1m] は起動オプションの変更だけです。環境変数は条件が細かいので、最後に回します。
4つの直し方を具体的に書く
更新して認識させる
モデルがClaude Codeより新しいだけなら、更新で済みます。
claude update更新後にIDを認識すれば、警告は起動時に出なくなります。
既知モデルの別名として登録する
gatewayやプロバイダーが、既知のAnthropicモデルに別のIDを付けている場合は、modelOverrides に登録します。キーがAnthropicのモデルID、値が自分のIDです。
{
"modelOverrides": {
"claude-opus-4-8": "my-gateway-opus"
}
}設定ファイルの置き場所は、ユーザー設定やプロジェクト設定など、通常の設定スコープのどれでも構いません。ここで注意するのは、キーにファミリー別名の opus を使えない点です。キーはAnthropicのモデルIDで書きます。モデルIDは公式のモデル一覧に載っている表記どおりに、日付付きのIDなら日付も含めて書きます。載っていないキーは無視されます。
modelOverrides に登録すると、リクエスト時の診断行 [claude-code:unrecognized_model] も止まります。IDを値として持つエントリがあれば、Claude Codeはそのモデルとして扱うためです。
別の手もあります。/model の一覧を組織向けに組む modelPicker の行に自分のIDを載せ、behavesAs に既知のモデルを指定する方法です。どちらを選んでも結果は同じで、Claude Codeはそのモデルとして扱います。modelPicker の組み方はClaude CodeのmodelPicker設定にあります。
1Mのモデルには [1m] を付ける
ウィンドウが1Mのモデルなら、モデルを指定する場所でIDに [1m] を付けます。
claude --model 'my-gateway-opus[1m]'シェルでは角括弧がパターンとして解釈されることがあるので、引用符で囲みます。1M contextを無効にしている環境では、[1m] を付けても付けなくても同じウィンドウになります。
任意のウィンドウは環境変数で宣言する
400Kのような中途半端な値は、CLAUDE_CODE_MAX_CONTEXT_TOKENS で宣言します。Claude Codeを起動する環境で、トークン数をそのまま渡します。
CLAUDE_CODE_MAX_CONTEXT_TOKENS=400000 claude --model my-gateway-modelclaude- で始まらず [1m] も付かない、認識できないIDなら、この変数だけで効きます。それ以外のIDでは効き方が変わるので、次の節で確かめてください。
環境変数が効くIDと効かないID
CLAUDE_CODE_MAX_CONTEXT_TOKENS は、IDの形で適用のされ方が3通りに分かれます。
| IDの形 | Claude Codeの扱い | 補正のしかた |
|---|---|---|
claude- で始まらず、認識できず、[1m] なし | Claude Codeの扱い変数がそのまま適用される | 補正のしかたこの変数だけでよい |
認識できず、[1m] を含む | Claude Codeの扱い1Mを仮定し、変数は単独では効かない | 補正のしかたCLAUDE_CODE_DISABLE_1M_CONTEXT=1 も設定する |
既知モデルに解決される、または接尾辞なしの claude- 名 | Claude Codeの扱い変数は単独では効かない | 補正のしかたDISABLE_COMPACT も設定する(全圧縮が止まる) |
3行目の例が、anthropic/claude-opus-4-8、us.anthropic.claude-…-v1:0、日付付きの claude-sonnet-4-5@20250929 のような、モデル名を含むIDです。これらは既知のモデルに解決されます。@YYYYMMDD のように、読み取り時に外される接尾辞はIDの一部として数えないので、接尾辞つきの未知の claude- IDは1行目か2行目に当たります。v2.1.259より前は、この接尾辞を数えず、接尾辞つきの未知IDを裸の claude- 名として扱っていました。
3行目のIDは既知のモデルに解決されるので、Claude Codeはそのモデルのウィンドウを使います。gatewayの実際のウィンドウがそれと違う場合だけこの変数が要りますが、DISABLE_COMPACT と組み合わせるので圧縮はすべて止まります。なお claude-opus-4-8[1m] は、CLAUDE_CODE_DISABLE_1M_CONTEXT を設定していてもOpus 4.8に解決されます。
2行目の組み合わせで200K超を宣言したときは、起動時に「200K limit isn't enforced」という警告が出ます。この構成では想定内の警告です。
圧縮を止めたいときは別の変数
ウィンドウの値を補正するのではなく、仮定の200Kで圧縮されること自体をやめさせたいなら、CLAUDE_CODE_DISABLE_UNKNOWN_MODEL_WINDOW_ENFORCEMENT=1 が使えます。v2.1.223以降の変数で、認識できないIDのとき、APIが「長すぎる」と実際に拒否するまで圧縮を待たせます。
ただし、gatewayがその拒否エラーを書き換えて返す構成では、この回復処理は動きません。仮定を直す手段と圧縮を止める手段の使い分け、/autocompact との関係は、autocompactの設定方法に詳しく書いています。
つまずきやすい点
- 警告が消えない:
modelOverridesのキーがAnthropicのモデルIDでないと無視されます。ファミリー別名や綴り違いを疑ってください [1m]を付けたのに200Kのまま:CLAUDE_CODE_DISABLE_1M_CONTEXT=1を設定していると、[1m]の有無で同じウィンドウになります- 環境変数を設定したのに圧縮が変わらない: IDが既知モデルに解決される形だと、変数は
DISABLE_COMPACTなしでは効きません - ステータスラインの割合が合わない:
CLAUDE_CODE_AUTO_COMPACT_WINDOWを設定している間、used_percentageはモデル本来のウィンドウに対する割合で、圧縮が走る時点を示しません - gateway側が200K超を拒否する: Claude Code側の仮定を上げても、gatewayが受け付けなければ失敗します。この構成では
/autocompact 200kで圧縮の境界を200Kに合わせられます。gatewayを含めた1Mの扱いはBedrock・Vertexでの1Mコンテキストも参考になります
直ったかを確かめる
補正したあとは、同じIDで新しいセッションを起動します。IDを認識するか宣言したウィンドウが使われている場合、その起動時に警告は出なくなります。出続けるなら、上の切り分けを順に戻って、設定がClaude Codeを起動した環境に届いているかを確認します。シェルで設定した環境変数は、別のターミナルやIDEから起動したClaude Codeには引き継がれません。
まとめ
警告が指しているのはモデルIDであって、モデルの故障ではありません。実際のウィンドウが200Kなら放置でよく、それ以外は更新、別名の登録、[1m]、環境変数の順に、手間の少ないものから試します。環境変数はIDの形で効き方が変わるので、先に表で自分のIDがどの行かを確かめるのが近道です。