Claude Code v2.1.236 に ANTHROPIC_DEFAULT_MODEL という環境変数が入りました。新しいセッションが開始するモデルを決めるものです。
チームで初期モデルを揃えたくて設定したんですが、まったく効きませんでした。
ANTHROPIC_DEFAULT_MODEL=claude-haiku-4-5 claude -p "1+1は?" --output-format json
# modelUsage → claude-opus-5[1m] ← haiku になっていない
バグではなく仕様でした。しかも名前がよく似た ANTHROPIC_MODEL とは優先順位が逆です。実測した結果を置いておきます。
一次情報
モデル設定: https://code.claude.com/docs/en/model-config
CHANGELOG: https://code.claude.com/docs/en/changelog
動作確認環境: Windows 10 / Claude Code v2.1.241 / settings.json の model は "opus[1m]"
実測: 5パターン流した結果
同じプロンプトを条件だけ変えて流し、--output-format json の modelUsage で実際に使われたモデルを見ました。
| 条件 | 実際に使われたモデル |
|---|---|
| 環境変数なし(基準) | claude-opus-5[1m] |
ANTHROPIC_DEFAULT_MODEL=claude-haiku-4-5 |
claude-opus-5[1m](効かない) |
ANTHROPIC_MODEL=claude-haiku-4-5 |
claude-haiku-4-5(効く) |
ANTHROPIC_MODEL=haiku + ANTHROPIC_DEFAULT_MODEL=sonnet
|
claude-haiku-4-5 |
ANTHROPIC_MODEL=haiku + --model sonnet
|
claude-sonnet-5 |
DEFAULT と付いているほうだけが無視されています。
なぜ効かないのか
公式ドキュメントに条件が明記されていました。
Claude Code starts a new session on the variable's model only when none of these selects a model:
- The
--modelflagANTHROPIC_MODEL- A
modelvalue in any settings file, including the choice you save with/model- An organization default model
どの設定ファイルにも model が書かれていないときだけ使われる、という条件付きの変数でした。
そして厄介なのが3つ目です。/model で選んだモデルは設定ファイルに保存されます。実際、/model opus[1m] を実行した直後の ~/.claude/settings.json がこれです。
{
"model": "opus[1m]",
"permissions": { }
}
一度でも /model を押していたら、その時点で ANTHROPIC_DEFAULT_MODEL は死んでいます。 モデルを切り替えたことがない人のほうが少ないと思うので、大半の環境では最初から効きません。
左が強い。DEFAULT という名前に反して、一番弱いのが ANTHROPIC_DEFAULT_MODEL です。
もう1つの罠: haiku と書くと無視される
ドキュメントには、変数そのものが無視されるケースも書かれていました。
Claude Code ignores the variable in these cases, and the Default option resolves as if you hadn't set it:
- You set it to
default,inherit,opusplan, orhaiku
ANTHROPIC_DEFAULT_MODEL=haiku は黙って無視されます。コストを下げようとしてこれを書くと、何も起きません。
一方、同じ文字列を ANTHROPIC_MODEL に渡すと普通に通ります。ここは実測できました。
ANTHROPIC_MODEL=haiku claude -p "..." --output-format json
# modelUsage → claude-haiku-4-5-20251001
同じ haiku という文字列が、変数名によって「有効」と「無視」に分かれます。
なお、この無視ルール自体は自分の環境では直接確認できていません。設定ファイルの model が先に効いてしまい、無視されたのか設定に負けたのかを区別できないためです。ここはドキュメントの記載として読んでください。
結局どちらを使えばいいのか
| やりたいこと | 使う変数 |
|---|---|
| 毎回このモデルに強制したい(CI、コスト固定) | ANTHROPIC_MODEL |
初期値だけ決めて、各自の /model は尊重したい |
ANTHROPIC_DEFAULT_MODEL |
再起動後の挙動も逆になります。
A choice you save with
/modeltakes precedence over the variable on later launches too. WithANTHROPIC_MODELset instead, Claude Code returns to that variable's model on the next launch, whatever you saved with/model.
ANTHROPIC_MODEL は毎回そのモデルに戻す。ANTHROPIC_DEFAULT_MODEL は /model の選択に譲る。チーム配布用なら後者が正しいのですが、その場合は各自の settings.json に model が残っていないことが前提になります。
効かせたい場合
settings.json から model を消します。
# 現状確認
cat ~/.claude/settings.json | grep model
ここに model が残っている限り、環境変数は効きません。消したうえで ANTHROPIC_DEFAULT_MODEL を設定し、/model を押さなければ初期値として機能します。
まとめ
-
ANTHROPIC_DEFAULT_MODELは設定ファイルにmodelが無いときだけ効く -
/modelの選択は設定ファイルに保存されるので、押した時点で環境変数は効かなくなる - 優先順位は
--model>ANTHROPIC_MODEL> 設定ファイル >ANTHROPIC_DEFAULT_MODEL -
ANTHROPIC_DEFAULT_MODEL=haikuは無視対象(default/inherit/opusplanも同じ) - 強制したいなら
ANTHROPIC_MODEL、初期値だけならANTHROPIC_DEFAULT_MODEL
「設定したのに効かない」と思ったら、まず settings.json の model を見に行くのが早いです。
関連記事
- Claude Code の fork、既定ONのはずが使えなかった — 環境変数1つで決まっていた — 同じく既定値が効かなかった話
- Claude Code のタスクリストが出ない — 原因は環境変数 ENABLE_TASKS=0 だった — 環境変数で挙動が変わる例
- Claude Code の設定でハマる箇所まとめ — 設定まわりの落とし穴
JQITのエンジニアの95%以上は未経験からの採用です。
よければコーポレートサイトにも遊びに来てください。
エンジニア採用も行っています。もしご興味あれば覗いてみてください。
▶ 採用サイト