⚡

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 をお使いの方は、以下の手順で設定できます。

  1. Preferences → Features → Snippets
  2. + で新規 Collection 作成(名前: Claude Code)
  3. 各スニペットを追加:
    • Keyword: cc-r-haiku
    • Snippet: claude --resume "" --model haiku
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