Skip to content

OpenClawのデフォルトモデルをGemma 4 + Ollamaに切り替える

公開日: 2026-04-08

前回の記事では qwen3:14b で OpenClaw をローカル動作させてみました。

ローカルLLMでも OpenClaw を動かせることは確認できたものの、最終的には賢さの面でクラウドLLMに戻してしまいました。

しかし、2026年4月4日にClaudeのサブスクリプションで OpenClaw 等の第三者エージェントフレームワーク経由で利用することができなくなりました。

そこでちょうど Google が Gemma 4 を発表していたので、今回は Ollama 経由で Gemma 4 を使う構成にしました。

Gemma 4: Byte for byte, the most capable open models

どのモデルを使うか

Ollama Library に掲載されている Gemma 4 の主なタグは以下です。

gemma4 - Ollama Library

タグサイズコンテキスト入力
gemma4:latest9.6 GB128KText, Image
gemma4:e2b7.2 GB128KText, Image
gemma4:e4b9.6 GB128KText, Image
gemma4:26b18 GB256KText, Image
gemma4:31b20 GB256KText, Image

今回は OpenClaw の設定上、モデル ID を gemma4 として登録しています。

json
{
  "id": "gemma4",
  "name": "gemma4",
  "reasoning": true,
  "input": [
    "text"
  ],
  "contextWindow": 131072,
  "maxTokens": 8192
}

Ollama 側では gemma4gemma4:latest を指します。現時点では gemma4:latestgemma4:e4b と同じ 9.6GB / 128K コンテキストのモデルです。

26B や 31B も魅力的ですが、ダウンロードサイズ、起動時間、VRAM 余裕を考えると、普段使いには gemma4 / gemma4:e4b がちょうどよさそうです。

実行環境

手順は Linux + systemd + GPU の環境を前提にしています。

PC スペックの詳細は前回の記事を参照してください。今回も前回と同じく、VRAM 24GB の環境で検証しています。

セットアップ手順

1. Ollama のインストール

公式スクリプトでインストールします。

bash
curl -fsSL https://ollama.com/install.sh | sh

2. Gemma 4 のダウンロード

OpenClaw の実設定ではモデル ID を gemma4 にしているので、Ollama 側も同じ名前で pull します。

bash
ollama pull gemma4

gemma4latest タグを指します。明示したい場合は以下でも構いません。

bash
ollama pull gemma4:e4b

3. 単体で起動確認

まずは Ollama 単体で返答するか確認します。

bash
ollama run gemma4

systemd drop-in で起動直後に VRAM へ常駐させる

Ollama はデフォルトでは、一定時間リクエストがないとモデルをメモリからアンロードします。

ローカルエージェント用途では、初回リクエストのたびにモデルロードで待たされるのがつらいので、WSL 起動直後にモデルをプリロードし、そのまま VRAM に常駐させます。

なぜ drop-in 方式にするのか

/etc/systemd/system/ollama.service 本体を直接編集すると、Ollama のアップグレード時に上書きされる可能性があります。

systemd の drop-in override を使えば、本体ファイルを触らずに環境変数や追加コマンドだけを差し込めます。

今回の override.conf は以下です。

bash
sudo install -d -m 755 /etc/systemd/system/ollama.service.d

sudo tee /etc/systemd/system/ollama.service.d/override.conf >/dev/null <<'EOF'
[Service]
Environment="OLLAMA_KEEP_ALIVE=-1"
Environment="OLLAMA_CONTEXT_LENGTH=131072"

ExecStartPost=/bin/sh -c 'for i in $(seq 1 30); do curl -sf http://127.0.0.1:11434/api/tags >/dev/null 2>&1 && exit 0; sleep 1; done; exit 1'
ExecStartPost=-/usr/bin/curl -sf -o /dev/null -X POST -H "Content-Type: application/json" -d "{\"model\":\"gemma4\",\"keep_alive\":-1}" http://127.0.0.1:11434/api/generate
EOF

sudo systemctl daemon-reload
sudo systemctl restart ollama

各行の役割は以下です。

  • OLLAMA_KEEP_ALIVE=-1
    モデルを無期限でメモリに保持します。

  • OLLAMA_CONTEXT_LENGTH=131072
    128K コンテキストで使うための設定です。VRAM に余裕がない場合は 32768 などに下げたほうが安全です。

  • 1 つ目の ExecStartPost
    Ollama API が応答するまで最大 30 秒待ちます。タイムアウトした場合は exit 1 で失敗扱いにします。

  • 2 つ目の ExecStartPost
    /api/generate にリクエストを送り、gemma4 を事前ロードします。先頭の - により、このプリロードが失敗しても Ollama サービス自体は落とさないようにしています。

もし起動直後のモデルロードが重く、他の作業に影響する場合は、2 つ目の ExecStartPost を外して、必要なときだけロードする運用でもよいと思います。

動作確認

ollama ps でモデルの状態を確認します。

bash
ollama ps

自分の環境では以下のようになりました。

text
NAME              ID              SIZE     PROCESSOR    CONTEXT    UNTIL
gemma4:latest     c6eb396dbd59    16 GB    100% GPU     131072     Forever

UNTILForever になっていれば KEEP_ALIVE=-1 が効いています。

VRAM 使用量は約 17.1GB でした。VRAM 24GB の環境では、まだ余裕があります。

OpenClaw の Gemma 4 関連設定

ここからは実際の ~/.openclaw/openclaw.json のうち、Gemma 4 / Ollama に関係する部分だけを抜粋します。

  1. models.providers.ollama
  2. agents.defaults.model
  3. agents.defaults.modelsagents.list

トークン、外部サービス連携、ブラウザ連携など、今回の Gemma 4 切り替えに直接関係しない設定は載せません。

Ollama provider

Ollama provider は以下のようにしています。

json
{
  "models": {
    "mode": "merge",
    "providers": {
      "ollama": {
        "baseUrl": "http://127.0.0.1:11434/v1",
        "apiKey": "ollama-local",
        "api": "ollama",
        "models": [
          {
            "id": "gemma4",
            "name": "gemma4",
            "reasoning": true,
            "input": [
              "text"
            ],
            "cost": {
              "input": 0,
              "output": 0,
              "cacheRead": 0,
              "cacheWrite": 0
            },
            "contextWindow": 131072,
            "maxTokens": 8192
          }
        ]
      }
    }
  }
}

Agent defaults

既定モデルは local alias にしています。

json
{
  "agents": {
    "defaults": {
      "model": {
        "primary": "local",
        "fallbacks": []
      },
      "models": {
        "ollama/gemma4": {
          "alias": "local"
        }
      }
    },
    "list": [
      {
        "id": "main",
        "model": "local"
      }
    ]
  }
}

ここで重要なのは以下です。

  • primary"local"
  • localollama/gemma4 の alias
  • main agent の model も "local"

つまり、OpenClaw の通常運用は gemma4 です。

fallbacks を空にしておくことで、通常運用をローカルモデルに固定しやすくなります。必要なときだけ別モデルを明示的に選ぶ運用にできます。

最小構成の openclaw.json 抜粋

json
{
  "models": {
    "mode": "merge",
    "providers": {
      "ollama": {
        "baseUrl": "http://127.0.0.1:11434/v1",
        "apiKey": "ollama-local",
        "api": "ollama",
        "models": [
          {
            "id": "gemma4",
            "name": "gemma4",
            "reasoning": true,
            "input": [
              "text"
            ],
            "cost": {
              "input": 0,
              "output": 0,
              "cacheRead": 0,
              "cacheWrite": 0
            },
            "contextWindow": 131072,
            "maxTokens": 8192
          }
        ]
      }
    }
  },
  "agents": {
    "defaults": {
      "model": {
        "primary": "local",
        "fallbacks": []
      },
      "models": {
        "ollama/gemma4": {
          "alias": "local"
        }
      }
    },
    "list": [
      {
        "id": "main",
        "model": "local"
      }
    ]
  },
  "plugins": {
    "entries": {
      "ollama": {
        "enabled": true
      }
    }
  }
}

前回の記事でも触れた通り、OpenClaw の agents.defaults.models では <プロバイダー名>/<モデルID> の形式で alias を指定します。

今回の例では、プロバイダー名が ollama、モデルIDが gemma4 なので、agent 側のキーは ollama/gemma4 になります。

使ってみた体感

率直な感想として、qwen3:14b より扱いやすい と感じました。

もちろん、これは自分の作業内容での体感であり、厳密なベンチマークではありません。特にエージェント用途では、単発のベンチマークスコアよりも、tool calling の安定性、指示追従、長い文脈で破綻しないか、コード編集時の一貫性などが重要になります。

その観点では、gemma4 は軽さと賢さのバランスがよいです。

特に良かった点は以下です。

  • 初回ロード後の応答が速い
  • 128K コンテキストを使える
  • ローカルなので API 料金を気にしなくてよい

一方で、クラウド最上位モデルほど万能ではありません。複雑な設計判断や長いデバッグでは、まだ失敗することがあります。

そのため、自分の運用では「普段のエージェント作業は local、つまり Gemma 4。どうしても詰まったら明示的に別モデルで相談」という切り分けがよさそうです。