ユーザ用ツール

サイト用ツール


ai:openclaw:localllmonly

OpenClaw を Local LLM だけで使用する

Local Model の設定

設定可能な Model は 3種類あります。メインで使うエージェント用モデル、画像認識に使う Image Model、メモリ検索に使う Embedding Model。

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
          }
        ]
      }
    }
  },}

※ それぞれバラバラのモデルを割り当てているのは説明のためで、これがお勧めの組み合わせというわけではありません。

ai/openclaw/localllmonly.txt · 最終更新: by oga

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki