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:latest | 9.6 GB | 128K | Text, Image |
gemma4:e2b | 7.2 GB | 128K | Text, Image |
gemma4:e4b | 9.6 GB | 128K | Text, Image |
gemma4:26b | 18 GB | 256K | Text, Image |
gemma4:31b | 20 GB | 256K | Text, Image |
今回は OpenClaw の設定上、モデル ID を gemma4 として登録しています。
{
"id": "gemma4",
"name": "gemma4",
"reasoning": true,
"input": [
"text"
],
"contextWindow": 131072,
"maxTokens": 8192
}Ollama 側では gemma4 は gemma4:latest を指します。現時点では gemma4:latest は gemma4:e4b と同じ 9.6GB / 128K コンテキストのモデルです。
26B や 31B も魅力的ですが、ダウンロードサイズ、起動時間、VRAM 余裕を考えると、普段使いには gemma4 / gemma4:e4b がちょうどよさそうです。
実行環境
手順は Linux + systemd + GPU の環境を前提にしています。
PC スペックの詳細は前回の記事を参照してください。今回も前回と同じく、VRAM 24GB の環境で検証しています。
セットアップ手順
1. Ollama のインストール
公式スクリプトでインストールします。
curl -fsSL https://ollama.com/install.sh | sh2. Gemma 4 のダウンロード
OpenClaw の実設定ではモデル ID を gemma4 にしているので、Ollama 側も同じ名前で pull します。
ollama pull gemma4gemma4 は latest タグを指します。明示したい場合は以下でも構いません。
ollama pull gemma4:e4b3. 単体で起動確認
まずは Ollama 単体で返答するか確認します。
ollama run gemma4systemd drop-in で起動直後に VRAM へ常駐させる
Ollama はデフォルトでは、一定時間リクエストがないとモデルをメモリからアンロードします。
ローカルエージェント用途では、初回リクエストのたびにモデルロードで待たされるのがつらいので、WSL 起動直後にモデルをプリロードし、そのまま VRAM に常駐させます。
なぜ drop-in 方式にするのか
/etc/systemd/system/ollama.service 本体を直接編集すると、Ollama のアップグレード時に上書きされる可能性があります。
systemd の drop-in override を使えば、本体ファイルを触らずに環境変数や追加コマンドだけを差し込めます。
今回の override.conf は以下です。
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 でモデルの状態を確認します。
ollama ps自分の環境では以下のようになりました。
NAME ID SIZE PROCESSOR CONTEXT UNTIL
gemma4:latest c6eb396dbd59 16 GB 100% GPU 131072 ForeverUNTIL が Forever になっていれば KEEP_ALIVE=-1 が効いています。
VRAM 使用量は約 17.1GB でした。VRAM 24GB の環境では、まだ余裕があります。
OpenClaw の Gemma 4 関連設定
ここからは実際の ~/.openclaw/openclaw.json のうち、Gemma 4 / Ollama に関係する部分だけを抜粋します。
models.providers.ollamaagents.defaults.modelagents.defaults.modelsとagents.list
トークン、外部サービス連携、ブラウザ連携など、今回の Gemma 4 切り替えに直接関係しない設定は載せません。
Ollama provider
Ollama provider は以下のようにしています。
{
"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 にしています。
{
"agents": {
"defaults": {
"model": {
"primary": "local",
"fallbacks": []
},
"models": {
"ollama/gemma4": {
"alias": "local"
}
}
},
"list": [
{
"id": "main",
"model": "local"
}
]
}
}ここで重要なのは以下です。
primaryは"local"localはollama/gemma4の aliasmainagent の model も"local"
つまり、OpenClaw の通常運用は gemma4 です。
fallbacks を空にしておくことで、通常運用をローカルモデルに固定しやすくなります。必要なときだけ別モデルを明示的に選ぶ運用にできます。
最小構成の openclaw.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。どうしても詰まったら明示的に別モデルで相談」という切り分けがよさそうです。