auto判定とローカルLLM

更新: 2026-10-23
Claude Code権限モードOllamaローカルLLMauto mode

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行を抜いた。

設定判定役への要求の宛先何も設定していないClaude Sonnet 5(公式の既定)ANTHROPIC_DEFAULT_SONNET_MODELその値CLAUDE_CODE_AUTO_MODE_MODELその値で上書き(v2.1.302以降)を設定している例外: 値がSonnet 5.5かOpus 5.5ならSonnet 5を設定しているミニの入口は、この行に当たる
判定役の宛先は、環境変数で変わる。モデル名の変数をすべてローカルに向けると、判定役もローカルに向く。

公式の表には、このほかの条件もある(判定用のモデルを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だった。

通常の1通 約5.6千規則だけ 約2万判定役への要求 約3.4万01万2万3万4万トークン毎秒164毎秒205毎秒340約9.8千約1.2万約2.0万
60秒で読める量(棒)と、要求の大きさ(点線)。判定役への要求の約3.4万トークンは、どの速度でも棒の右にある。
読み込み速度約5.6千の通常の要求約2万の規則だけ約3.4万の判定役への要求
毎秒16434秒122秒207秒
毎秒20527秒98秒166秒
毎秒34016秒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は使えない

関連

WIKI一覧へ