Claude Code /model の罠を回避する安全なモデル切り替え術
この記事は誰のためのものか
- Claude Code で複数セッションを同時に動かす開発者
-
/modelで変更したら他のセッションまで影響を受けた経験がある人 - モデル切り替えの手間を減らしたい人
きっかけ:Haiku のはずが Opus だった
先日、こんなことがあった。
軽めの実装タスクを Haiku で進めていた。「簡単な修正だし、Haiku で十分」と思って作業していたら、なんだか応答が遅い。
ステータスバーを見ると、Opus になっている。
「あれ、Haiku にしたはずなのに...」
別のターミナルで動かしていたセッションを思い出した。そっちでは設計レビューのために /model opus を実行していた。
まさか、と思って確認すると、両方のセッションが Opus に変わっていた。
逆のパターンも経験した。複雑なアーキテクチャ設計を Opus に相談していたはずが、いつの間にか Haiku に切り替わっていて、回答の質が明らかに落ちていた。別セッションで誰か(自分)が /model haiku を実行したせいだった。
なぜこれが起きるのか
公式ドキュメントによると、/model は「現在のセッションのみ」に影響するとされています。
ところが実際には、複数インスタンス間でモデル設定が漏れる現象が起きているようです。
GitHub Issue での報告
この問題は GitHub でも複数報告されています。
Issue #7341: Unexpected Model Switching Between Terminal Sessions
Session 1 (ghostty, macOS): Running task with Sonnet 4
Session 2 (VSCode): Running task with Opus 4.1
When returning to Session 1, the model switched from Sonnet to Opus without user action
関連 Issue として、#3559(Persistent Model Selection Across Concurrent CLI Sessions)や #961(Concurrent Claude Sessions Overwriting Configuration File)もリンクされています。
根本原因:共有ディレクトリへの排他制御なし
Issue #4014 では、根本原因についての分析があります。
問題の構造:
- 全インスタンスが ~/.claude/ に状態を書き込む
- プロセス間の排他制御(ロック)がない
- 設定ファイルが上書きされる「Context Bleeding」が発生
要するに、/model を実行すると、意図せずグローバルな設定ファイルが更新されてしまい、他のインスタンスがそれを読み込んでしまうことがあるようです。
安全なモデル指定:3つの方法
では、どうすればこの問題を回避できるのでしょうか。モデルを指定する方法は3つあります。
| 方法 | 用途 | 安全性 |
|---|---|---|
--model で起動 |
新規セッション | ◎ |
--resume --model で再開 |
セッション再開時 | ◎ |
/model で変更 |
セッション中 | △(他セッションに影響する可能性) |
おすすめは、起動時に --model フラグで指定する方法です。この方法なら、その時点でモデルが確定するため、/model のように後から変更するより安全です。
# 新規セッション
claude --model haiku
# セッション再開(モデル指定あり)
claude --resume "feature-auth" --model sonnet
なお、短縮形(opus, sonnet, haiku)が使えるので、フルネームを覚える必要はありません。
スニペットで爆速化する
とはいえ、毎回 claude --resume "セッション名" --model haiku と打つのは面倒ですよね。
そこで、スニペットツールを使って自動展開するのがおすすめです。数文字入力するだけでコマンドが展開されます。
命名規則
| Prefix | 意味 | 例 |
|---|---|---|
cc-r- |
resume + セッション名を手入力 | cc-r-haiku |
cc-rp- |
resume + ピッカーで選択 | cc-rp-sonnet |
覚え方はシンプルです:
-
cc= Claude Code -
r= resume -
p= picker
登録するスニペット(6個)
登録するスニペットは以下の6個です。
パターン1: セッション名を指定して再開
# cc-r-haiku → 展開後、カーソルが "" 内に移動
claude --resume "" --model haiku
# cc-r-sonnet
claude --resume "" --model sonnet
# cc-r-opus
claude --resume "" --model opus
パターン2: ピッカーで選択して再開
# cc-rp-haiku
claude --resume --model haiku
# cc-rp-sonnet
claude --resume --model sonnet
# cc-rp-opus
claude --resume --model opus
スニペットツールでの設定
具体的な設定方法を紹介します。
Alfred(macOS)
Alfred をお使いの方は、以下の手順で設定できます。
- Preferences → Features → Snippets
-
+ で新規 Collection 作成(名前:
Claude Code) - 各スニペットを追加:
-
Keyword:
cc-r-haiku -
Snippet:
claude --resume "" --model haiku
-
Keyword:
Alfred でカーソル位置を指定する
展開後にカーソルを "" の中に移動させたい場合、{cursor} プレースホルダーを使います:
claude --resume "{cursor}" --model haiku
他のツール
Alfred 以外のツールでも同様の設定が可能です。
| ツール | 対応 OS | 設定方法 |
|---|---|---|
| Raycast | macOS | Extensions → Snippets |
| Espanso | macOS / Linux / Windows | YAML で設定 |
| TextExpander | macOS / Windows | GUI で設定 |
参考までに、Espanso の場合は以下のように設定します(~/.config/espanso/match/claude.yml):
matches:
- trigger: "cc-rp-haiku"
replace: "claude --resume --model haiku"
- trigger: "cc-rp-sonnet"
replace: "claude --resume --model sonnet"
- trigger: "cc-rp-opus"
replace: "claude --resume --model opus"
実践ワークフロー
実際の使い方の例を紹介します。
朝: cc-rp-sonnet と入力
↓ ピッカーで昨日のセッションを選択
↓ Sonnet で作業開始
設計フェーズ完了、実装フェーズへ
↓ quit でセッション終了
cc-r-haiku "feature-auth" と入力
↓ 同じセッションを Haiku で再開
↓ 軽量な実装作業
複雑な問題に遭遇
↓ quit → cc-r-opus "feature-auth"
↓ Opus に切り替えて深い分析
ポイントは、セッション中に /model で切り替えるのではなく、一度 quit で終了してから --model 付きで再開することです。この方法なら、他のセッションへの影響を避けられます。
まとめ
この記事では、Claude Code の /model コマンドの問題と、その回避策を紹介しました。
-
/modelは便利ですが、複数セッション環境では他セッションに影響する既知のバグがあります - 安全なのは、起動時に
--modelフラグで指定する方法です - スニペット 6 個を登録しておけば、モデル切り替えの手間を最小化できます
| スニペット | 用途 |
|---|---|
cc-r-haiku |
セッション名指定 + Haiku |
cc-r-sonnet |
セッション名指定 + Sonnet |
cc-r-opus |
セッション名指定 + Opus |
cc-rp-haiku |
ピッカー選択 + Haiku |
cc-rp-sonnet |
ピッカー選択 + Sonnet |
cc-rp-opus |
ピッカー選択 + Opus |
複数セッションで並行作業している方は、ぜひ試してみてください。
Discussion