「定義ファイルに軽いモデルを指定した。それなのに、ワーカー役はメインの会話と同じモデルで動き続けている」。Claude Codeで役ごとにモデルを分けようとすると、この行き止まりに当たります。

原因は、指定を書ける場所が環境変数・エージェント定義ファイル・実行時オプションの3か所に分かれている点にあります。しかも重なったときの順序は1本ではなく、メインの会話用とサブエージェント用の2本が並んで走っています。書いた場所が間違っているのではなく、書いた場所より強い指定がどこかに残っている、という形でつまずきます。

この記事は、どこに何を書けば反映されるのかを公式ドキュメントに沿って並べ直します。検証したのはclaude-opus-5・Claude Code v2.1.x系・macOS 15の組み合わせで、検証日は2026-08-03です。

こんなふうに調べていませんか

  • 定義ファイルにmodel:を書いたのに、ワーカー役が思ったモデルで動いてくれない
  • 環境変数・settings.json・起動オプションのどれを直せばいいのか、見当がつかない

この記事を読み終えたときに手に入るもの

  • 環境変数・定義ファイル・実行時オプションのどこに書けば効くかを、根拠を持って選べるようになります
  • 優先順位がメイン用とサブ用の2本に分かれていることを踏まえ、上書きの原因を説明できるようになります
  • 割り当てたモデルで動いているかを、2つの見方で確かめられるようになります

結論30秒でわかる、この記事の結論

  • 指定を書ける場所は3か所あり、重なったときは決まった順序で片方が消えます。消えたことは画面に出ません。
  • 順序は1本ではなく、利用者と話す側と、作業を任される側とで別々に走ります。
  • 役ごとに分けたいときは、全員をそろえてしまう指定を外すところから始めます。
指定を書ける場所は、この3か所に分かれます同じ指定でも、置いた場所で届く相手が変わります指定を書ける場所は、この3か所に分かれます環境変数まとめて配るシェルやCIから、同じ値を全員へ渡す定義ファイル役ごとに固定するその役の分だけ、書いた値が残る実行時オプションその場で差し替える起動のときと、動かしながら鈴木さん同じ指定でも、置いた場所で届く相手が変わります
指定を書ける場所は、この3か所に分かれます — 同じ指定でも、置いた場所で届く相手が変わります

進行役は3人です。若葉さんが言葉の意味から、高梨課長が自分の手で動かす側から聞き、鈴木さん(本誌監修)が答えます。

01Claude Codeのモデル設定は、AIエージェントのどこに効くんですか?

若葉さん
若葉さんの発言

モデル設定というと、どのAIを使うかを1つ選ぶ話ではないんですか。

鈴木さん
鈴木さんの発言

1つではないんです。撮影の現場に近いと思っています。全体を見て指示を出す人と、割り振られた作業を受け持つ人がいて、同じ人でなければいけない理由はありませんよね。

Claude Codeは、1つのセッションの中に2つの役を持ちます。利用者と直接やり取りするメインの会話と、そこから作業を任されるサブエージェントです。本記事では前者をディレクター役、後者をワーカー役と呼びます。

モデル設定とは、この2つの役へそれぞれどのモデルを充てるかの指定です。下書きを作るような判断の要る作業と、表記ゆれを見るような機械的な作業を、同じモデルで受け持たなければならない理由はありません。役ごとに分けられるのは、その理由のなさを設定へ落とせるからです。

ただし、指定を書ける場所は3か所に分かれています。環境変数、エージェント定義ファイル、実行時オプションです。同じ役に対して複数の場所から指定が届いたときは、決まった順序で上書きされます。

現場の呼び名と、設定の呼び名を並べます宛先の名前が分かると、書く場所が決まります現場の呼び名と、設定の呼び名を並べます宛先の名前が分かると、書く場所が決まります現場でいうとこの記事の言い方段取りを決める人メインの会話(ディレクター役)持ち場を受け持つ人サブエージェント(ワーカー役)誰がどこに入るかの表定義ファイルのmodel朝礼で全員へ言い渡す環境変数
現場の呼び名と、設定の呼び名を並べます — 宛先の名前が分かると、書く場所が決まります

この章のまとめ

ディレクター役とワーカー役は、別々の指定で動きます。片方を直したつもりが、もう片方には届いていないことがあります。

02モデル設定を書ける3か所は、エージェントのどれを動かすんですか?

3か所の違いは、何を動かすかと、その指定がいつまで残るかの2点に出ます。

設定箇所書き方の例主に使う場面
環境変数CLAUDE_CODE_SUBAGENT_MODEL=haikuシェルやCI、チーム全体への一括適用
エージェント定義ファイル.claude/agents/writer.mdmodel: sonnet役割ごとに固定して割り当てたいとき
実行時オプションclaude --model opus起動時やその場だけの一時的な切り替え

書き始める前に確かめることが2つあります。1つはバージョンです。本記事はv2.1.196以降の挙動を基準にしています。CLAUDE_CODE_SUBAGENT_MODELinheritを指定したときの扱いが、このバージョンの前後で変わるためです。claude -vで確認します。

もう1つは、どの階層のsettings.jsonを編集するかです。settings.jsonは管理設定・コマンドライン引数・ローカル・プロジェクト・ユーザーの5階層に分かれます。同じキーはこの順で上書きされるので、チームで共有したいのか手元に留めたいのかで書く場所を選びます。

どの役に効くかと、いつまで残るか同じ「モデル設定」でも、立つ区画が違いますどの役に効くかと、いつまで残るか同じ「モデル設定」でも、立つ区画が違いますその起動だけ差し替える--model / ANTHROPIC_MODEL全員へ一律に配るCLAUDE_CODE_SUBAGENT_MODEL / --agents既定として置いておくsettings.json の model キー役ごとに固定する.claude/agents/ の model上:その起動のあいだだけ / 下:次の起動にも残る左:利用者と話す側へ / 右:作業を任される側へ
どの役に効くかと、いつまで残るか — 同じ「モデル設定」でも、立つ区画が違います

この章のまとめ

3か所は競合するのではなく、受け持ちが違います。まず自分が動かしたいのがどちらの役なのかを決めると、書く場所が絞れます。

03環境変数でモデル設定を変えると、サブエージェントは全員そろうんですか?

高梨課長
高梨課長の発言

環境変数なら1行で済みますよね。これで役ごとに分けられますか。

鈴木さん
鈴木さんの発言

そこが分かれ道です。環境変数は全員に配る通達に近くて、宛名を書き分ける欄がありません。分けたいときは、その通達を出さないほうを選びます。

環境変数は2種類あり、受け持つ相手が違います。

ANTHROPIC_MODELは、メインの会話(ディレクター役)のモデルを指定します。settings.jsonmodelキーより優先されますが、セッション限定の上書きなのでsettings.json自体は書き換わりません(出典: Claude Code公式ドキュメント)。

CLAUDE_CODE_SUBAGENT_MODELは、委譲されるサブエージェント(ワーカー役)の全員へ一律で適用されます。個々の定義ファイルがmodel: opusと書いていても、この環境変数のほうが優先されます。

export ANTHROPIC_MODEL=claude-opus-5
export CLAUDE_CODE_SUBAGENT_MODEL=claude-haiku-5
claude

その場だけ試すならexport、チームへ配るならsettings.jsonenvキーに書きます。envの値は、起動するセッションと、そこから生成するサブプロセスの両方へ渡ります。

{
  "env": {
    "CLAUDE_CODE_SUBAGENT_MODEL": "haiku"
  }
}

inheritという値の扱いは、バージョンの前後で反転します。v2.1.196以降は未設定と同じ扱いになり、次は呼び出しごとの指定へ、その次は定義ファイルのmodelフィールドへ進みます。v2.1.195以前は逆に、メインの会話のモデルへ強制する値でした。

環境変数は、宛先が2つに分かれます書き方は似ていても、届く相手が違います環境変数は、宛先が2つに分かれます書き方は似ていても、届く相手が違いますANTHROPIC_MODEL利用者と話す側へ届く設定ファイルの既定より強いその起動のあいだだけ効く設定ファイル自体は書き換わりませんCLAUDE_CODE_SUBAGENT_MODEL任される側の全員へ届く役ごとの定義より強い宛名を分ける欄がない分けたいときは、これを置かない側を選びます
環境変数は、宛先が2つに分かれます — 書き方は似ていても、届く相手が違います

この章のまとめ

環境変数は速く効きます。速く効くぶん、下に置いた指定をまとめて隠します。

04定義ファイルのモデル設定で、AIエージェントの役割ごとに割り当てられるんですか?

割り当てを役ごとに変える本体は、ここです。サブエージェント定義ファイルのmodelフロントマターには、sonnetopushaikufableのエイリアスを書きます。claude-opus-5のような完全なモデルIDでも指定できます。省略するとinherit扱いになり、メインの会話と同じモデルを使います(出典: Claude Code公式ドキュメント)。

役ごとに変えるとは、下書きを作るwriterには判断力の要るモデルを指定し、フォーマットの機械的な確認だけを行うbulk-checkerには軽いモデルを指定する、ということです。

---
name: writer
description: 記事の下書きを作成する
model: sonnet
---
---
name: bulk-checker
description: 表記ゆれなど機械的な確認だけを行う
model: haiku
---

組み込みの調査役Exploreは、v2.1.198以降メインの会話のモデルを引き継ぎます(Claude API利用時は上限がOpus。出典: Claude Code公式ドキュメント)。調査役だけ軽いモデルへ固定したいなら、同名のExplore定義を自分で作りmodel: haikuを書けば上書きできます

---
name: Explore
description: コードベースの調査に使う
model: haiku
---

定義ファイルそのものの書き方はAGIM-210で、役の分け方の考え方はAGIM-209で扱っています。本記事は「モデルをどこに書けば反映されるか」に絞ります。

この章のまとめ

定義ファイルは、役ごとの違いを書ける唯一の場所です。ここに書いた値が消えるとしたら、上から来ています。

05同じ名前のサブエージェントが並んだら、どの定義のモデル設定が採られるんですか?

置き場所にも順位があります。同名のサブエージェントが複数あるときは、上位の場所にある定義modelフィールドが採用されます。

順位置き場所共有範囲永続性
1管理設定配下の.claude/agents/組織全体永続
2--agentsフラグそのセッションのみ一時的
3プロジェクトの.claude/agents/協力者全員永続
4ユーザーの~/.claude/agents/自分の全プロジェクト永続
5プラグインのagents/有効化した範囲永続
同じ名前の定義がぶつかったとき上にあるものほど強く、下にあるものほど広く配られます同じ名前の定義がぶつかったとき上にあるものほど強く、下にあるものほど広く配られます組織の管理設定下から上書きされない位置にある起動時に渡した一時の定義そのセッションが終われば消えるプロジェクトに置いた定義協力者どうしで共有する手元のユーザー設定自分の全プロジェクトに効くプラグインが持ち込む定義有効にした範囲にだけ現れる同じ名前が並んだときは、上にあるほうのmodelが採られます。
同じ名前の定義がぶつかったとき — 上にあるものほど強く、下にあるものほど広く配られます

この章のまとめ

効かないときは、書いた値より先に置いた場所を見ます。同じ名前が、思っていない階層にも残っていることがあります。

06実行時オプションのモデル設定は、そのセッションのエージェントだけ変わるんですか?

--modelは、セッション開始時にメインの会話のモデルを指定するフラグです。settings.jsonmodelキーとANTHROPIC_MODEL両方より優先されます(出典: Claude Code公式ドキュメント)。起動のたびに切り替えたいときに使います。

claude --model claude-opus-5

すでに起動しているセッションを切り替えるには/modelを使います。settings.jsonmodelキーを直接書き換えても、反映されるのは次に起動したときです。いま開いているセッションで試したい場合は/modelのほうが早く分かります。

/model sonnet

--agentsフラグは、ワーカー役の定義をコマンドラインからJSONで渡します。ファイルに保存されない一時的な定義で、置き場所の順位は管理設定に次ぐ2位です。そのため、同名の定義ファイルより先に読まれます。

claude --agents '{
  "writer": {
    "description": "記事の下書きを作成する",
    "model": "sonnet"
  }
}'

名前の似た--fallback-modelは、役割分担の設定ではありません。主モデルが混雑または提供終了で使えないときの代替先を、カンマ区切りで指定する機能です。目的の違うものとして区別しておきます。

実行時に触れる入口は3つあります起動の前後どちらで触るかで、入口が変わります実行時に触れる入口は3つあります起動の前後どちらで触るかで、入口が変わります起動のとき--model話し相手のモデルを、その起動だけ差し替える動かしながら/model開いたままのセッションを切り替えるその場で渡す--agents任される側の定義を、残さずに渡す
実行時に触れる入口は3つあります — 起動の前後どちらで触るかで、入口が変わります

この章のまとめ

実行時オプションは、その場をしのぐための入口です。恒久的な割り当ては、ここではなく定義ファイル側に置きます。

07Claude Codeのモデル設定が重なったとき、AIエージェントではどちらが勝つんですか?

高梨課長
高梨課長の発言

結局、どれが勝つんでしょうか。順番を1本覚えれば済みますか。

鈴木さん
鈴木さんの発言

1本では足りないんです。列が2本あります。同じ駅名でも路線が違えば行き先が変わるのと同じで、どちらの列の話をしているかを先に決めます。

優先順位は1本ではありません。メインの会話用とサブエージェント用の2本があり、混同すると役ごとに割り当てたはずの設定が崩れます。

順位設定方法持続性
1/modelコマンド(起動中セッションでの切替)そのセッションのみ(Enterで確定すると次回起動時の既定値としても保存される)
2--modelフラグそのセッションのみ
3ANTHROPIC_MODEL環境変数そのセッションのみ
4settings.jsonmodelキー永続(次回起動から反映。/modelなら即時)
順位設定方法役割ごとに変えられるか
1CLAUDE_CODE_SUBAGENT_MODEL環境変数変えられません(全員一律)
2呼び出しごとのmodelパラメータClaude自身が呼び出し時に決める値
3各定義ファイルのmodelフロントマター変えられます(本記事の主目的)
4メインの会話のモデル変えられません(inheritの既定)

役ごとに割り当てを変えたいなら、CLAUDE_CODE_SUBAGENT_MODELは設定しません。設定した瞬間に順位1が全ワーカーを同じモデルへそろえてしまい、定義ファイルに書いたmodelフィールド、つまり順位3が効かなくなります。環境変数を外した状態で、定義ファイル側だけに書くのが基本形です。

順位の列は、左右で別々に走りますどちらの列の話をしているかを、先に決めます順位の列は、左右で別々に走りますどちらの列の話をしているかを、先に決めます利用者と話す側開いたまま切り替えた指定起動のときに渡した指定シェルから渡した指定設定ファイルに置いた既定上にあるものが勝ちます作業を任される側全員へ一律に配る指定呼び出すたびに決まる値役ごとの定義に書いた値話し相手と同じモデル役ごとに変えられるのは、上から3段目だけです
順位の列は、左右で別々に走ります — どちらの列の話をしているかを、先に決めます

この章のまとめ

どちらの列の話かを言えないうちは、原因は特定できません。表を2つに分けて置いておくと、迷いが減ります。

08組織でモデルが制限されていると、AI導入したエージェントのモデル設定は黙って戻るんですか?

戻ります。組織がavailableModelsでモデルを制限している場合、順位1〜3のどれで指定しても、許可リストの外にあるモデルは無視されます。その結果、優先順位は順位4のメインの会話のモデルまで下がります。

やっかいなのは、エラーが出ないことです。指定を書いた側の画面では何も起きず、動いた結果だけがいつもと同じになります。ワーカー役が期待どおりに動かないとき、設定の書き方より先にこの制限を疑う理由が、ここにあります。

許可の外にある指定は、どこへ落ちるか落ちたことは、画面には出てきません許可の外にある指定は、どこへ落ちるか落ちたことは、画面には出てきません1モデルを指定するどの入口から書いても同じ2許可の一覧と照らす組織が絞っている場合3外にあれば無視されるエラーは表示されない4話し相手と同じモデルへいつもどおりに見えてしまう鈴木さんここで落ちていると、書いた側の画面では気づけません
許可の外にある指定は、どこへ落ちるか — 落ちたことは、画面には出てきません

この章のまとめ

黙って戻る仕組みがあるぶん、設定を書いた記憶だけでは足りません。効いた証拠を見るまでを一続きにします。

09モデル設定が反映されないAIエージェントは、どこから疑えばいいんですか?

高梨課長
高梨課長の発言

直したのに変わらない、というときは何から見ればいいですか。

鈴木さん
鈴木さんの発言

近いところからではなく、上から見ます。強い指定ほど静かに効いているので、手元のファイルを何度直しても表に出てこないんです。

見どころは大きく4つあります。順番に潰すと切り分けが早くなります。

はじめに疑うのは、環境変数の残留です。シェルやCIに以前設定したCLAUDE_CODE_SUBAGENT_MODELが残っていると、定義ファイルのmodelをいくら直しても表に出ませんecho $CLAUDE_CODE_SUBAGENT_MODELで空かどうかを見てから、定義ファイルを疑います。

次が再起動漏れです。settings.jsonmodelキーは起動時にしか読み込まれません。編集してそのまま同じセッションで試すと反映されず、「効かない」と誤診しがちです。いま確かめたいなら/modelを使います。

3つ目は同名定義の競合です。.claude/agents/~/.claude/agents/に同じ名前のサブエージェントを置くと、プロジェクト側が優先されます。Exploreを上書きするつもりで別の階層に置くと、標準の挙動のまま変わりません

最後が無言のフォールバックです。前章のとおり、許可リストから外れたモデルを指定してもエラーは出ず、メインの会話のモデルへ戻ります。ワーカー役の様子がおかしいときは、まずこの制限を疑います。

反映されないときに見ていく順番強い指定から外すほうが、早く切り分けられます反映されないときに見ていく順番強い指定から外すほうが、早く切り分けられますシェルに古い一律指定が居座っていないか空かどうかを先に見る直したあとに、いったん立ち上げ直したか開いたままでは既定が読み直されない同じ名前の定義を、別の階層にも置いていないか近いほうが選ばれてしまう組織の許可から外れたモデルを指していないか外れると、何も言わずに戻る
反映されないときに見ていく順番 — 強い指定から外すほうが、早く切り分けられます

この章のまとめ

原因の多くは、書いた場所ではなく、消していない場所にあります。足すより先に、残っているものを外します。

10割り当てたモデル設定で動いているかは、AI社員の運用でどう確かめるんですか?

確かめ方は2つあります。

1つは、Git commit trailerを見る方法です。コミット時のトレーラーに、動いていたモデル名が残ります(出典: Claude Code公式ドキュメント)。書式はCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>のようになり、過去のコミットを見返せば当時のモデルを追えます。メインの会話がどれで動いていたかを、あとから追う用途に向きます。

もう1つは、--debug apiでAPIリクエストを見る方法です。--debugapiのようなカテゴリでログを絞り込めます。メインの会話とサブエージェントは別々のAPIリクエストになるため、ディレクター役とワーカー役がそれぞれどのモデルへ送っているかを個別に追えます。

判定そのものは単純です。ワーカー役に指定したモデル名がリクエストに出ていれば、反映されています。メインの会話と同じモデル名しか出てこなければ、優先順位のどこかで上書きされています。

効いたかどうかは、記録の側から確かめます設定ファイルを見比べても、答えは出ません効いたかどうかは、記録の側から確かめます設定ファイルを見比べても、答えは出ません1コミットに残った名前を見る話し相手が何で動いていたかが残る2通信のログを種類で絞り込む任される側は、別の通信として出る3出てきた名前を突き合わせる同じ名前しか出なければ、上から消されている
効いたかどうかは、記録の側から確かめます — 設定ファイルを見比べても、答えは出ません

この章のまとめ

設定ファイルを見比べても、効いたかどうかは分かりません。動いた記録の側から確かめます。

11よくある質問

Claude Code モデル設定を役割ごとに変えるとき、まず何を書けばいいですか

まずサブエージェント定義ファイル、つまり.claude/agents/配下のmodelフロントマターだけを書きます。環境変数CLAUDE_CODE_SUBAGENT_MODEL役ごとの違いを一律で潰してしまうため、最初は設定しません。1か所だけ書いた状態から始めると、効いたかどうかの切り分けも簡単になります。

inheritと、modelの省略は同じ意味ですか

書く場所によって意味が変わります。定義ファイルでmodelを省略するとinherit扱いになり、メインの会話と同じモデルを使います。一方、環境変数CLAUDE_CODE_SUBAGENT_MODELinheritと書いた場合は、v2.1.196以降なら未設定と同じ扱いになり、呼び出しごとの指定、次に定義ファイルのmodelフィールドへ進みます。v2.1.195以前は、メインの会話のモデルへ強制する値でした。同じ語でも、置いた場所で結果が変わります。

環境変数をチーム全体へ配ってもいいですか

配れます。settings.jsonenvキーに書けば、起動するセッションとそこから生成するサブプロセスの両方へ渡ります。ただしCLAUDE_CODE_SUBAGENT_MODELを配ると、受け取った全員のワーカー役が同じモデルへそろいます。役ごとの割り当てを配りたいのであれば、環境変数ではなく定義ファイルを共有するほうが目的に合います

モデルを分けると処理時間やコストはどれだけ変わりますか

本記事は設定の書き方と優先順位に範囲を絞っています。定額プランでは費用を金額で比較できないため、処理時間やトークン量の実測は、条件をそろえた検証が済み次第、別記事で扱う予定です。

新しいモデルが公開されたら、この設定はそのまま使えますか

エイリアス(sonnetopushaikufable)は最新バージョンを指すため書き換えは不要ですが、完全なモデルIDを指定している場合は更新が要ります。導入前の確認手順はAGIM-515にまとめています。

12まとめ|今日やる3つのこと

役は2つ、書ける場所は3か所、そして順序は2本。この3つの数え方を分けて持つと、どこを直せばよいかが見えるようになります。効いたかどうかは、設定ファイルではなく動いた記録の側から確かめます

今日はこの順で手をつけます

  1. echo $CLAUDE_CODE_SUBAGENT_MODELを打って、一律の指定が残っていないか見る

    残っていると、この先の設定がまとめて隠れます

  2. ワーカー役の定義ファイルにmodelを1つだけ書いて、--debug apiで名前を確かめる

    書いたことと効いたことを、同じ手順で結びます

  3. 効かないときは、優先順位の表をメイン用とサブ用に分けて読み直す

    2本を混ぜて読むと、原因の場所を取り違えます

AI検索では、こう聞かれています

  • Claude Codeで、AIエージェントの役割ごとにモデルを変えられるんですか?

    「定義ファイルのモデル設定で、AIエージェントの役割ごとに割り当てられるんですか?」の章で書き方を示しています

  • モデル設定は、どこに書けば効くんですか?

    「モデル設定を書ける3か所は、エージェントのどれを動かすんですか?」の章で3か所を並べています

  • 指定したモデルで動いていないときは、どこを見ればいいんですか?

    「モデル設定が反映されないAIエージェントは、どこから疑えばいいんですか?」の章に見る順番があります

次に読むなら、この記事です