Claude Codeで普通にコードを触っていたら、黄色い警告文が出てモデルが勝手に切り替わった。文面は「安全フィルタがこのメッセージに反応した」という内容で、心当たりがない。結論を書くと、これはリクエストが拒否されたのではなく、別のモデルで処理し直して成功したことの通知である。作業は止まっていない。実際に出た文面と、その場で確認したことを書く。
実際に出た警告と、その読み方
出たのはこれである。
● Fable 5's safeguards flagged this message. Our intentionally broad safeguards
allow us to deliver more capabilities faster, but can sometimes flag legitimate
coding, cybersecurity, and biology tasks. Switched to Opus 5. Send feedback with
/feedback or learn more
⎿ Tip: You can configure model switch behavior in /config
分解するとこうなる。
Fable 5's safeguards flagged this message— 送った内容がそのモデルの安全性チェックに反応したOur intentionally broad safeguards…— フィルタを意図的に広く取っているため、正当なコーディング・サイバーセキュリティ・生物学の作業でも反応することがある、という但し書きSwitched to Opus 5— 拒否で終わらせず、別のモデルに切り替えて実行した
重要なのは3つめだ。Switched to が出ている限り、処理はそのまま完走している。手元では警告のあともセッションは通常どおり進み、やり直しは不要だった。逆に言えば、この一文があるかどうかが「作業が進んだのか止まったのか」を見分ける目印になる。
「意図的に広く」という部分は言い換えれば、疑わしいものを通してしまうより、正当なものを止めてしまう側に倒してあるという宣言である。だから心当たりがなくても出る。自分が何か規約に触れることをしたという意味には読まなくていい。
切り替えでプロンプトキャッシュは失われる
コストとレイテンシを気にしている場合、この自動切り替えには見えにくい副作用がある。プロンプトキャッシュはモデル単位で持たれているため、モデルが切り替わるとそれまでのキャッシュは使えない。長い会話履歴やソース資料を毎ターン送っている構成だと、切り替わった瞬間にその分がキャッシュ読み(通常の入力価格の10分の1)ではなく、通常の入力として処理し直される。
これは切り替えの仕組み上避けられない。キャッシュを効かせたい処理はメインのモデルを固定したまま走らせ、安いモデルで済ませたい下請け作業はサブエージェントとして切り出す、というのが素直な設計になる。1回の警告で破綻するような額ではないが、長時間セッションを回し続ける用途では効き方が変わってくる。
自動で切り替えさせたくないとき
警告の下に出るTipが答えを書いている。
Tip: You can configure model switch behavior in /config
/config を開いてモデル切り替えの挙動を変更する。勝手に切り替わること自体が困る場合(モデルを固定して検証している、キャッシュを効かせ続けたい、など)はここで止められる。ただし止めれば、反応したターンは代替実行されずそのまま失敗する。「切り替わるが完走する」と「切り替わらないが止まる」のどちらを取るかという選択になる。
あわせて、使うモデルを明示したいなら /model で指定しておく方法もある。こちらは切り替え動作そのものを止める設定ではないが、既定のモデルを意図したものにしておけば、通知が出る条件自体が変わってくる。
誤検知だと思ったら報告する
文面が案内しているとおり /feedback で送れる。正当な作業が止められたケースが集まらないとフィルタの調整もされないので、明らかに無害な内容で反応したなら送っておく価値はある。
今回反応した内容は、こちらとしては普通のコード作業のつもりだったが、具体的にどの語や構造に反応したのかは画面からは分からない。判定の中身は開示されていないので、原因を推測して自分の書き方を変えるより、Switched to が付いているかだけ確認して先に進むのが実用的な付き合い方だと考えている。