auto判定とローカルLLM
Claude Codeのautoモードは、Bashを実行するたびに、判定役のモデルへ要求を送って安全性を確かめる。判定役の宛先が環境変数でローカルLLMに向くと、読み込みが遅く、要求が60秒で切れて「判定できない」で止まる。ミニ(Mac mini)のOllamaで起きた。経緯は開発日記の権限の自動判定が60秒で切れたにある。ここでは、宛先の決まり方、60秒で読める量の見積もり、見分け方、直し方だけを書く。
何が起きるか
- sshなどのBashが、「安全性を判定できない」という趣旨の理由で止まる。理由には、判定役のモデル名が出る
- 公式ドキュメントでは、この種のメッセージは判定役への要求の失敗を指し、「たいていは一時的」と書かれている。ローカルLLMでは、一時的ではなく、構造的に起きる
ollama.logでは、/v1/messagesの500が、所要時間59.9秒台から1分0秒台に揃って並ぶ。軽い要求の200(18〜42秒)と交互に出る
判定役の宛先は何で決まるか
公式ドキュメント(権限モードのページ、2026-10-23に確認)の記述のうち、ローカルLLMの入口に関わる3行を抜いた。
公式の表には、このほかの条件もある(判定用のモデルをAnthropic側で設定している場合など)。ここでは抜いていない。公式の表は、上から見て最初に合う行が採用される。
宛先のエンドポイントは、ANTHROPIC_BASE_URL と同じ場所になる。公式リポジトリのIssue(#84417)で、メンテナーが次の点を回答している(2026年8月16日)。
- 2.1.210以降、判定役は、使っているエンドポイントに
claude-sonnet-5というモデルIDで要求する。ローカルのモデルなら、そのモデルが判定役として動く - 要求が失敗するのは、サーバーが忙しいか、エラーを返したとき。失敗の種別(
timed out、overloadedなど)は、2.1.229でメッセージに付くようになった - 回避策は、
availableModelsの許可リストをローカルのモデルだけにするか、ANTHROPIC_DEFAULT_SONNET_MODELをローカルのモデルIDにすること - Claude以外の自己ホストのモデルは、autoモードの対応構成ではない
同じ回答には、判定役がセッションのモデルに従うよう変える可能性にも触れられている。今後、挙動が変わるかもしれない。
判定役が見るものも、公式ドキュメントにある。ユーザーのメッセージ、読み取り以外のツール呼び出し、CLAUDE.mdの内容で、ツールの結果は取り除かれる。判定の規則は claude auto-mode defaults で表示できる。
60秒で読める量を見積もる
見積もりの式は1つだけ。読み込み速度(トークン/秒)× 60秒 = 60秒で読める量。 ミニのQwen3.8 27B(GGUF)では、10/22の調査で毎秒205〜340トークン、直近12件の記録で毎秒164〜333だった。
| 読み込み速度 | 約5.6千の通常の要求 | 約2万の規則だけ | 約3.4万の判定役への要求 |
|---|---|---|---|
| 毎秒164 | 34秒 | 122秒 | 207秒 |
| 毎秒205 | 27秒 | 98秒 | 166秒 |
| 毎秒340 | 16秒 | 59秒 | 100秒 |
60秒を超える欄は、規則だけでも3行中2行ある。この表は、上限が60秒であることを前提にした見積もりで、規則の約2万トークンは、バイト数(82,941)を4で割った概算である。
自分の環境で確かめる
1. 規則の大きさ。
claude auto-mode defaults | wc -c
手元のClaude Code 2.1.308では、82,941バイトだった。
2. 60秒で切れた500の数(Ollama)。
grep -a "/v1/messages" ~/Library/Logs/ollama.log | grep -aE "\| 500 \| +(59\.9|1m0)" | wc -l
ミニでは、全期間で70件だった。クライアントが接続を閉じたときの499(| 499 |)は、同じログで2件だけ。500と499は別のものとして数える。
3. 60秒の時点で、どこまで読めていたか(llama.cpp、GGUFのモデル)。
grep -a "progress = " ~/Library/Logs/ollama.log | grep -aE "t = +(59|60)\.[0-9]+ s" | tail
行の n_tokens が、60秒で読めた量。ミニでは60件あり、直近12件は5,120〜19,968トークンで、6件が12,288だった。
4. 宛先。 公式ドキュメントの手順で、判定役の要求にどのモデルが使われたかを見る。
claude --permission-mode auto --debug-file classifier-debug.log
Bashで読み取り専用でないコマンドを1つ実行させ、ログから classifier_request_started を探す。同じ行の model= の値が、判定役のモデル(公式ドキュメントの手順。この記事の筆者はまだ実行していない)。
手っ取り早く疑うなら、起動スクリプトの中で、モデル名の環境変数を設定していないかを見る。環境変数の一覧は出さず、スクリプトだけを検索する。
grep -n "ANTHROPIC_" mini-claude.sh
直す
manualにする。 claude --permission-mode manual で起動する。--help の選択肢は acceptEdits / auto / bypassPermissions / manual / dontAsk / plan。公式ドキュメントでは、manual は設定値 default の別名で、シェルコマンドの前に人へ確認する。判定役を呼ばない。
許可リストは狭く足す。 manualでは、毎回の確認が増える。止めたくない固定のコマンドだけを、完全な形で許可リストに足す。ミニへのトンネルを張るsshの例(IPとユーザーは伏せた)。
"Bash(ssh -f -N -o BatchMode=yes -o ExitOnForwardFailure=yes -o ServerAliveInterval=30 -o ConnectTimeout=5 -L 127.0.0.1:11435:127.0.0.1:11434 <ユーザー>@<ミニのIP>:*)"
任意のsshを通す書き方にはしない。
判定役のモデルIDだけを変える(使っていない)。 公式ドキュメントでは、v2.1.302以降、CLAUDE_CODE_AUTO_MODE_MODEL で、判定役のモデルIDを指定できる。ただし、判定役の要求が ANTHROPIC_BASE_URL の向き先に届くことが、Issue(#78372)で報告されている。モデルIDを変えても、ローカル以外に届くとは限らない。試していない。
気をつけること
- 起動スクリプトの変更は、開き直したウィンドウにだけ効く(記録による)。開いたままの窓は、古い設定のまま動き続けうる。変更のあとも60秒の500が出ていないか、上のコマンド2で数え直す
- 共有しているモデルに、測定用の要求を直接足さない。ミニで試したところ、4分以上返らず、止めた。速度は、ログから読む
確かめていないこと
- 60秒の上限の出どころ。 Claude Code側かOllama側かは分かっていない。公式ドキュメントには、秒数の記載がない。ログは、499ではなく500
- manualにしたあとで、60秒の500が減ったか
CLAUDE_CODE_AUTO_MODE_MODELが、要求の宛先まで変えるか。 公式ドキュメントはモデルIDの指定とだけ書いている。上のIssueの報告は、別の環境での観察で、試していない- MLX版(gemma4)の挙動。 ログの形式も違う(
Prompt processing progress processed=… total=…)ので、コマンド3は使えない
関連
- 権限の自動判定が60秒で切れた ローカルLLMを判定役にした代償 — 経緯と、ログの日別集計、直したあとも続いていた症状
- OpenClawの切り分け — ミニのエージェントが動かないときの、層ごとの切り分け
- MCPツール反映漏れ — 設定を変えたのに、動いている側が古いままだった別の例