目次
OpenClaw を Local LLM だけで使用する
Local Model の設定
設定可能な Model は 3種類あります。メインで使うエージェント用モデル、画像認識に使う Image Model、メモリ検索に使う Embedding Model。
| 2026/03/16 08:50 | |
| 2026/02/21 12:18 | |
| 2026/03/22 17:48 |
Embedding Model は小さくても構わないので、もし OpenClaw を走らせている PC が十分な性能であれば Local の CPU 上で動かすこともできます。
Timeout 対策
使用するモデルの生成速度が 10~20 token/s の場合 Agent が timeout する場合があります。
agents.defaults.timeutSeconds = 1800 のように、timeoutSecounds を大きめの値に設定しておくことをお勧めします。
{ "agents": { "defaults": { "timeoutSeconds": 1800 } } }
Context Window Size
入力プロンプトは非常に長くなりますので、できるだけ 64K 以上に設定しておくことをお勧めします。 Compaction 後でも 20k くらいあります。
Contxt Window Size を増やすとその分メモリや VRAM を消費するので注意が必要です。 速度も落ちます。
Local LLM 用 PC の分離と Prefill 時間
OpenClaw の場合コンテキスト長が非常に長くなるので、前段階の入力プロンプト処理 (Prefill) にかなり時間がかかります。 通常のビデオカード + システム RAM の構成では 10分以上待たされることもあります。
llama.cpp / LMStudio にはこの時間を短縮するための仕組みがあり、同一コンテキストの場合に前回のリクエストで生成された KV Cache を再利用できます。 最善ケースでは追加のプロンプト分しか計算しないので、10~20 token/s の Local LLM でも割とすぐにレスポンスが返ってくるようになります。
ただし定期的に Heartbeat/Cron や Subagent が走ると、その都度キャッシュが上書きされて再び長時間の Prefill が始まります。 llama.cpp / LMStudio ではスロット毎に複数のキャッシュを保持できるのですが、最大コンテキスト長に制限がかかり、また Heartbeat とのスロット競合が起こったりします。
これを防ぐ方法として複数の Local LLM 用 PC を使って用途毎に分ける方法があります。 以下のようにそれぞれ別の PC を割り当てて Prefill の待ち時間を最小にすることができます。
PC 2台の場合
- Subagent を使わない場合は、Main と Heartbeat に分けます
- Subagent を使う場合は Main+Heartbeat と Subagent に分けます
PC 3台の場合
- Main, Heartbeat, Subagent
もし Subagent を複数使いたい場合
Subagent に複数の Model を指定できないので、Subagent の代わりに Codex cli 等の別のツールを使います。
- Main+Heartbeat, Subagent, Codex
注意点
Mac で LMStudio を使う場合は必ず gguf モデルを使ってください。 MLX の方が生成速度が速いかもしれませんが、KV cache が再利用されないので毎回 Prefill が走り 5~10分待たされる可能性があります。
設定ファイル
{ "agents": { "defaults": { "model": { "primary": "llamacpp-pc1/qwen3.5-122b-a10b" ← main で使う PC1 }, "subagents": { "model": "llamacpp-pc3/qwen3.5-122b-a10b", ← subagent で使う PC3 "runTimeoutSeconds": 0, "maxConcurrent": 1 }, "heartbeat": { "model": "llamacpp-pc2/qwen3.5-122b-a10b" ← heartbeat で使う PC2 }, "maxConcurrent": 3, "timeoutSeconds": 1800 } }, "models": { "providers": { "llamacpp-pc1": { "baseUrl": "http://<PC1-IPADDR>:8080/v1", ~ }, "llamacpp-pc2": { "baseUrl": "http://<PC2-IPADDR>:8080/v1", ~ }, "llamacpp-pc3": { "baseUrl": "http://<PC3-IPADDR>:8080/v1", ~ } } } }
PC1/PC2/PC3 での実行例。それぞれ Context Length を 64K にしつつ PC を分けることでキャッシュを再利用できるようにしています。
PC1 : RAM 128GB + VRAM 16GB (Main)
llama-server --model Qwen3.5-122B-A10B-UD-Q4_K_XL-00001-of-00003.gguf --mmproj mmproj-BF16.gguf --alias Qwen3.5-122B-A10B -t 8 --ctx-size 65536 --temp 1.0 --min-p 0.0 --top-p 0.95 --top-k 20 --host 0.0.0.0 --port 8080
PC2 : RAM 128GB + VRAM 16GB (Heartbeat)
Heartbeat は main と同じコンテキストで実行するため ctx は同じサイズが望ましいです。agents.defaults.heartbeat.isolatedSession = true にすれば別セッションにできますが、この場合コンテキストが共有されません。
llama-server --model Qwen3.5-122B-A10B-Q4_K_M-00001-of-00002.gguf --alias Qwen3.5-122B-A10B -t 16 --ctx-size 65536 --temp 0.6 --min-p 0.0 --top-p 0.95 --top-k 20 --host 0.0.0.0 --port 8080
PC3 : RAM 96GB + VRAM 16GB (Subagent)
Subagent は別コンテキストで実行されるため、メモリが足りない場合は main と ctx サイズが異なっていても構いません。 Subagent は main と並列に実行されます。
llama-server --model Qwen3.5-122B-A10B-Q4_K_M-00001-of-00002.gguf --alias Qwen3.5-122B-A10B -t 8 --ctx-size 65536 --temp 0.6 --min-p 0.0 --top-p 0.95 --top-k 20 --host 0.0.0.0 --port 8080
Streaming
生成速度が 10~15 token/s など遅い場合は、Streaming 対応のチャットアプリケーションでストリーミングの有効化がお勧めです。 かなり体感速度が変わります。
Slack の場合 channels.slack.streaming = “partial”
全ローカルモデルの設定例
{ "agents": { "defaults": { "model": { "primary": "llamacpp-pc1/gpt-oss-120b" ← Main モデル }, "imageModel": { "primary": "lmstudio-pc4/qwen/qwen3.5-9b" ← 画像認識用モデル (Main モデルが画像入力できない場合のみ) }, "subagents": { "model": "llamacpp-pc3/NVIDIA-Nemotron-3-Super-120B-A12B", ← Subagent 用モデル "runTimeoutSeconds": 0, "maxConcurrent": 1 }, "heartbeat": { "every": "30m", "ddirectPolicy": "allow", "model": "llamacpp-pc2/Qwen3.5-122B-A10B" ← Heartbeat 用モデル }, "memorySearch": { "fallback": "none", "model": "qwen3-embedding:0.6b", ← 埋め込みモデル "provider": "openai", "remote": { "apiKey": "ollama", "baseUrl": "http://127.0.0.1:11434/v1" ← 埋め込みモデル用設定 } }, "maxConcurrent": 3, "timeoutSeconds": 1800, "worksapce": "/home/openclaw/.openclaw/workspace", "compaction": { "mode": "safeguard" } } }, "models": { "providers": { "llamacpp-pc1": { "baseUrl": "http://<PC1-IPADDR>:8080/v1", ← Main モデル用設定 "api": "openai-completions", "apiKey": "llama.cpp", "models": [ { "id": "gpt-oss-120b", "name": "gpt-oss-120b", "contextWindow": 65536, "maxTokens": 32768, "cost": { "cacheRead": 0, "cacheWrite": 0, "input": 0, "output": 0 }, "input": [ "text" ], "reasoning": true } ] }, "llamacpp-pc2": { "baseUrl": "http://<PC2-IPADDR>:8080/v1", ← Heatbeat モデル用設定 "api": "openai-completions", "apiKey": "llama.cpp", "models": [ { "id": "Qwen3.5-122B-A10B", "name": "Qwen3.5-122B-A10B", "contextWindow": 65536, "maxTokens": 32768, "cost": { "cacheRead": 0, "cacheWrite": 0, "input": 0, "output": 0 }, "input": [ "text", "image" ], "reasoning": true } ] }, "llamacpp-pc3": { "baseUrl": "http://<PC3-IPADDR>:8080/v1", ← Subagent モデル用設定 "api": "openai-completions", "apiKey": "llama.cpp", "models": [ { "id": "NVIDIA-Nemotron-3-Super-120B-A12B", "name": "NVIDIA-Nemotron-3-Super-120B-A12B", "contextWindow": 65536, "maxTokens": 32768, "cost": { "cacheRead": 0, "cacheWrite": 0, "input": 0, "output": 0 }, "input": [ "text" ], "reasoning": true } ] }, "lmstudio-pc4": { "baseUrl": "http://<PC4-IPADDR>:1234/v1", ← 画像認識モデル用設定 "api": "openai-completions", "apiKey": "lmstudio", "models": [ { "id": "qwen/qwen3.5-9b", "name": "qwen/qwen3.5-9b", "contextWindow": 16384, "maxTokens": 16384, "cost": { "cacheRead": 0, "cacheWrite": 0, "input": 0, "output": 0 }, "input": [ "text", "image" ], "reasoning": true } ] } } }, ~ }
※ それぞれバラバラのモデルを割り当てているのは説明のためで、これがお勧めの組み合わせというわけではありません。
