Claude CodeのLLMゲートウェイで効く環境変数3つの使い分け
ゲートウェイ越しのClaude Codeで症状別に効く環境変数を示します。インターリーブ思考のヘッダー、effort、未知モデルIDの自動圧縮と、MAX_CONTEXT_TOKENSとの違いです。
Claude CodeをLLMゲートウェイ経由で使うと、直接接続では起きない食い違いが3種類出ます。思考のbetaヘッダー、effortの送信、そして未知のモデルIDに対するコンテキストウィンドウの想定です。それぞれに専用の環境変数があり、症状ごとに触る変数が決まっています。
| 症状 | 効く環境変数 |
|---|---|
| ゲートウェイがインターリーブ思考のbetaヘッダーを受け付けない | 効く環境変数DISABLE_INTERLEAVED_THINKING=1 |
| 独自のモデルIDでeffortが送られない | 効く環境変数CLAUDE_CODE_ALWAYS_ENABLE_EFFORT=1 |
| 未知のモデルIDで自動圧縮が想定ウィンドウに沿って走る | 効く環境変数CLAUDE_CODE_DISABLE_UNKNOWN_MODEL_WINDOW_ENFORCEMENT=1 |
3つとも既定では設定不要です。ゲートウェイの構成が合わなかったときにだけ足す、互換のための調整弁です。
インターリーブ思考のbetaヘッダーを止める
DISABLE_INTERLEAVED_THINKINGを1にすると、Claude Codeはインターリーブ思考のbetaヘッダーを送らなくなります。ゲートウェイや上流のプロバイダーがインターリーブ思考に対応していないときに使う変数です。
インターリーブ思考は、ツール呼び出しの合間にも思考を挟める機能です。リクエストのボディには専用フィールドがなく、anthropic-betaヘッダーの値だけで要求します。この性質が、ゲートウェイ越しで2通りの結果を生みます。
- ゲートウェイがヘッダーを削ると、エラーも出ないまま機能だけが使えなくなります。上流にはその要求が届きません
- ゲートウェイや上流がその値を拒否する構成では、変数でヘッダー自体を送らないようにして回避します
変数を足す前に、ゲートウェイのログでanthropic-betaの値を拒否している行がないかを見てください。前者のようにヘッダーが削られているだけなら、ログにはエラーが残らず、受信したヘッダーの値から思考の指定が欠けているかどうかで判断することになります。
本筋の対処は、anthropic-betaを一覧の絞り込みなしでそのまま転送することです。互換性ガイドは、betaの値はClaude Codeのリリースごとに増えるので、個別の値を許可リストにしないよう求めています。ヘッダーを通せるなら、この変数は要りません。
CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1では代わりになりません。この変数は試験的なbetaをまとめて止めますが、拡張コンテキスト・インターリーブ思考・effortのbeta値は止めずに残します。インターリーブ思考だけを止めたいときは、専用のDISABLE_INTERLEAVED_THINKINGが必要です。
thinkingフィールドそのものを拒否されるとき
インターリーブ思考と取り違えやすいのが、thinkingフィールド自体の拒否です。こちらはbetaヘッダーではなくリクエストボディの項目なので、効く変数が違います。
| 症状 | 効く環境変数 | 効かない条件 |
|---|---|---|
400でthinkingフィールドやadaptiveの値が拒否される | 効く環境変数CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING=1(固定の思考予算に戻る) | 効かない条件Opus 4.6とSonnet 4.6だけが対象。Sonnet 5以降、Haiku 5.5、Opus 4.7以降は常にadaptive reasoningなので効かない |
ゲートウェイがthinkingパラメーターを丸ごと受け付けない | 効く環境変数CLAUDE_CODE_DISABLE_THINKING=1(パラメーターを送らない) | 効かない条件省略しても、既定で思考するモデルは考え続けることがある。Opus 5.5、Sonnet 5.5、Haiku 5.5、Fableモデルは思考をオフにできない |
上流がthinkingフィールドを拒否した場合、Claude Codeは同じリクエストを再試行し、その会話が終わるまで該当の機能を外します。変数はこの自動回避を待たずに、最初から送らないための設定です。
独自のモデルIDでeffortを送らせる
CLAUDE_CODE_ALWAYS_ENABLE_EFFORTを1にすると、Claude Codeがeffort対応と認識していないモデルIDにも、リクエストごとにeffortを付けます。ゲートウェイやサードパーティプロバイダーがモデルを独自の名前で公開しているときのための変数です。
effortの扱いは、接続方式で既定が変わります。互換性ガイドの比較表では、Claude Codeが認識しないモデルID(ゲートウェイのエイリアスなど)に対する送信内容は次のとおりです。
| 接続方式 | 認識できないIDへのリクエスト |
|---|---|
| Amazon BedrockまたはAgent Platform形式 | 認識できないIDへのリクエスト固定予算のthinking。effortは送らない |
Anthropic Messages形式(ANTHROPIC_BASE_URL) | 認識できないIDへのリクエスト現行モデルが受け付ける項目をすべて。effortを含む |
| Claude apps gatewayへのサインイン | 認識できないIDへのリクエストBedrock・Agent Platform形式と同じ |
つまり、ANTHROPIC_BASE_URLで接続しているならeffortは既定で届く設計で、この変数が効く場面は限られます。Bedrock形式やAgent Platform形式のゲートウェイにエイリアスを置いている構成で、effortを使いたいときに検討する変数です。どの接続方式で何が起きるかは、手元の構成と照らして確かめてください。
安全弁も用意されています。effortパラメーターをAPI側で拒否するモデル、具体的にはClaude 3系、Sonnet 4.0と4.5、Opus 4.0と4.1、Haiku 4.5は、この変数を立てても対象から外れます。強制的に送ってリクエストが落ちる事態は避けられています。
上流がeffortを拒否したときの挙動も押さえておくと、設定の効果が読めます。output_config.effortにExtra inputs are not permittedなどで400が返ると、Claude Codeはeffortを外して再試行し、そのモデルには終了までeffortを付けません。変数でeffortを強制しても、上流が受け付けなければ最終的には自動で外れます。
モデル別のeffort設定そのものはmodelSettingsのeffortをモデル別に直接編集するで扱っています。
未知のモデルIDで自動圧縮を止める
CLAUDE_CODE_DISABLE_UNKNOWN_MODEL_WINDOW_ENFORCEMENTを1にすると、Claude Codeが認識しないモデルIDでは先回りの自動圧縮をしなくなります。ゲートウェイのエイリアスが典型例です。Claude Code v2.1.223以降が必要です。
変数を設定しないときは、Claude Codeがそのモデルについて想定しているコンテキストウィンドウに沿って圧縮します。想定は未知のIDで200K、IDに[1m]が付いていれば1Mです。ゲートウェイの先のモデルの実際の窓が違うと、早すぎる圧縮が起きます。
変数を設定した場合の流れは次のとおりです。
変数を設定したときの圧縮の流れ
- 1
先回りの圧縮をしない
想定ウィンドウに近づいても、Claude Codeは自動では圧縮しません。
- 2
APIが「長すぎる」と拒否する
上流が会話の長さを理由に拒否すると、Claude Codeが認識できる形式のエラーのときに限り、圧縮して再試行します。
- 3
書き換えられたエラーは救えない
ゲートウェイがエラーを独自の文言に書き換えていると、回復の処理は働きません。
3つ目が落とし穴です。ゲートウェイがContextWindowExceededErrorのような独自の言い回しでエラーを返す構成では、圧縮されないまま400が出続けます。そのときは/compactで手動回復し、再発防止にはCLAUDE_CODE_AUTO_COMPACT_WINDOWにゲートウェイの上限を指定します。値は100,000トークン以上、モデルのウィンドウ以下に丸められるので、100,000未満の上限には合わせられません。
CLAUDE_CODE_MAX_CONTEXT_TOKENSで窓を直す選択肢との違い
同じ「早すぎる圧縮」でも、原因が想定ウィンドウのずれなのか、圧縮の時機そのものなのかで手が変わります。
- 窓の大きさを宣言し直したい:
CLAUDE_CODE_MAX_CONTEXT_TOKENSに実際のウィンドウを指定します。圧縮は宣言した窓に沿って続きます - 先回りの圧縮自体をやめたい:
CLAUDE_CODE_DISABLE_UNKNOWN_MODEL_WINDOW_ENFORCEMENT=1にします。圧縮はAPIが拒否した後の回復だけになります
前者は、窓の大きさを知っていて宣言できる場合の素直な直し方です。後者は、窓が不明、あるいはゲートウェイ側で変動する場合の逃げ道になります。
MAX_CONTEXT_TOKENSの効き方はモデルIDの種類で3通りに分かれます。
| モデルID | MAX_CONTEXT_TOKENSの効き方 |
|---|---|
認識できない独自の綴りで、[1m]を含まない | MAX_CONTEXT_TOKENSの効き方そのまま効き、宣言した窓で先回りの圧縮が続く |
認識できない独自の綴りで、[1m]を含む | MAX_CONTEXT_TOKENSの効き方単独では効かない。1Mと想定される。CLAUDE_CODE_DISABLE_1M_CONTEXT=1を併用すると[1m]なしの綴りと同じ扱いになる |
| Claude Codeが認識するモデルに解決されるID | MAX_CONTEXT_TOKENSの効き方DISABLE_COMPACTも立てた場合だけ効く。この変数は圧縮を全部止める |
3行目の例が、anthropic/claude-opus-4-8やBedrockのus.anthropic.claude-…-v1:0のような、Claudeのモデル名を含むIDです。見かけは独自でも、Claude Codeは元のモデルに解決します。ゲートウェイのエイリアスだと思っていたIDがここに当たると、MAX_CONTEXT_TOKENSを設定しても反映されません。
併用するとき警告が出る組み合わせ
CLAUDE_CODE_DISABLE_1M_CONTEXT=1は、ネイティブで1Mの窓を持つモデルを200Kで圧縮させる変数です。これと未知モデル用の変数、あるいは200Kを超えるMAX_CONTEXT_TOKENSを同時に立てると、200Kの上限が効かなくなります。Claude Codeは次の警告を出します。
CLAUDE_CODE_DISABLE_1M_CONTEXT is set, but the 200K limit isn't enforced for <model>, so this session can grow past it.[1m]付きの未知IDで窓を直したいときは、この警告が出るのが想定された状態です。200Kで止めたいなら、警告の案内に従ってCLAUDE_CODE_AUTO_COMPACT_WINDOW=200000を足します。
3つをまとめて設定する
全部が要る構成は多くありません。ゲートウェイが何を通さないかに合わせて、必要な行だけsettings.jsonのenvに入れます。
{
"env": {
"ANTHROPIC_BASE_URL": "https://gateway.example.com",
"DISABLE_INTERLEAVED_THINKING": "1",
"CLAUDE_CODE_ALWAYS_ENABLE_EFFORT": "1",
"CLAUDE_CODE_DISABLE_UNKNOWN_MODEL_WINDOW_ENFORCEMENT": "1"
}
}これは3変数の置き場所を示す例で、全部を入れる推奨構成ではありません。一時的に試すなら、シェルで立てて起動するのが手軽です。
DISABLE_INTERLEAVED_THINKING=1 \
CLAUDE_CODE_DISABLE_UNKNOWN_MODEL_WINDOW_ENFORCEMENT=1 \
claude管理端末へ配る場合は、ゲートウェイのURLと同じ管理設定ファイルのenvに入れておけば、開発者が個別に設定せずに済みます。管理設定からの配布の流れはClaude CodeのLLMゲートウェイをロールアウトする手順にあります。
変数を足す前に確かめること
3つの変数はどれも、ゲートウェイ側の構成を直せないときの回避策です。転送の問題なら、ゲートウェイ側を直す方が全機能を保てます。
anthropic-betaを値の絞り込みなしで転送しているかoutput_configなどのボディのフィールドを書き換えずに通しているか- 上流のエラー文言を、Claude Codeが認識する形式のまま返しているか
どの変数が効いているかは、ゲートウェイが受け取ったリクエストで確かめます。ログに残るなら、次の3点を見ます。
anthropic-betaの値に、インターリーブ思考やeffortのbeta値が含まれているか- ボディに
thinkingやoutput_configが含まれているか - 上流が返した
400のメッセージが、どのフィールド名を挙げているか
変数を立てたのに挙動が変わらないときは、次の条件に当たっていないかを順に疑います。
CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETASで代用していた。インターリーブ思考とeffortのbeta値は止まりません- adaptive reasoningの停止変数を、Sonnet 5以降などの常時adaptiveなモデルに設定していた
CLAUDE_CODE_DISABLE_THINKINGで思考が止まると期待したが、既定で思考するモデルだったMAX_CONTEXT_TOKENSを、Claudeのモデル名を含むIDに設定していた。DISABLE_COMPACTを併用しない限り反映されません- 未知モデル用の変数は、Claude Code v2.1.223より古い版では使えません
互換性の全体像はClaude CodeのLLMゲートウェイ互換性で、一覧の取得はLLMゲートウェイのモデルディスカバリで扱っています。
まとめ
症状と変数は1対1で対応します。ヘッダーを拒否されるならDISABLE_INTERLEAVED_THINKING、effortが届かないならCLAUDE_CODE_ALWAYS_ENABLE_EFFORT、早すぎる圧縮には窓を宣言するMAX_CONTEXT_TOKENSか、先回りをやめるDISABLE_UNKNOWN_MODEL_WINDOW_ENFORCEMENTです。後者2つのどちらを選ぶかは、実際のウィンドウを宣言できるかで決まります。
effortの変数は、接続方式によっては既定で届くため効果が出ない点に注意が要ります。設定したのに挙動が変わらないときは、まずモデルIDが想定した種類に当たっているかを確認してください。