From 48c083b88ae26d76ad9a6086efe43629ec124fb2 Mon Sep 17 00:00:00 2001 From: Bruce MacDonald Date: Tue, 7 Apr 2026 11:10:12 -0700 Subject: [PATCH] Ollama: update suggested onboarding models --- CHANGELOG.md | 5 +--- docs/help/faq.md | 2 +- docs/providers/ollama.md | 16 ++++++------- extensions/ollama/index.test.ts | 4 ++-- extensions/ollama/src/defaults.ts | 2 +- extensions/ollama/src/provider-models.test.ts | 8 +++---- extensions/ollama/src/setup.test.ts | 24 +++++++++---------- extensions/ollama/src/setup.ts | 2 +- 8 files changed, 30 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c23113989a9..551c5b7b175 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ Docs: https://docs.openclaw.ai - Tools/media: document per-provider music and video generation capabilities, and add shared live video-to-video sweep coverage for providers that support local reference clips. - Compaction: add pluggable compaction provider registry so plugins can replace the built-in summarization pipeline. Configure via `agents.defaults.compaction.provider`; falls back to LLM summarization on provider failure. (#56224) Thanks @DhruvBhatia0. - Discord/events: allow `event-create` to accept a cover image URL or local file path, load and validate PNG/JPG/GIF event cover media, and pass the encoded image payload through Discord admin action/runtime paths. (#60883) Thanks @bittoby. +- Providers/Ollama: update suggested onboarding models to gemma4 (local), glm-5.1 and minimax-m2.7 (cloud). (#62626) Thanks @BruceMacD. ### Fixes @@ -89,12 +90,8 @@ Docs: https://docs.openclaw.ai - Providers/Mistral: send `reasoning_effort` for `mistral/mistral-small-latest` (Mistral Small 4) with thinking-level mapping, and mark the catalog entry as reasoning-capable so adjustable reasoning matches Mistral’s Chat Completions API. (#62162) Thanks @neeravmakwana. - OpenAI TTS/Groq: send `wav` to Groq-compatible speech endpoints, honor explicit `responseFormat` overrides on OpenAI-compatible paths, and only mark voice-note output as voice-compatible when the actual format is `opus`. (#62233) Thanks @neeravmakwana. - BlueBubbles/network: respect explicit private-network opt-out for loopback and private `serverUrl` values across account resolution, status probes, monitor startup, and attachment downloads, while keeping public-host attachment hostname pinning intact. (#59373) Thanks @jpreagan. -<<<<<<< HEAD - Agents/heartbeat: keep heartbeat runs pinned to the main session so active subagent transcripts are not overwritten by heartbeat status messages. (#61803) thanks @100yenadmin. - Agents/compaction: stop compaction-wait aborts from re-entering prompt failover and replaying completed tool turns. (#62600) Thanks @i-dentifier. -======= -- Approvals/runtime: move native approval lifecycle assembly into shared core bootstrap/runtime seams driven by channel capabilities and runtime contexts, and remove the legacy bundled approval fallback wiring. (#62135) Thanks @gumadeiras. ->>>>>>> 367f6afaf1 (Approvals: finish capability cutover and Matrix parity) ## 2026.4.5 diff --git a/docs/help/faq.md b/docs/help/faq.md index 8988c499b2b..0b9bdda16a5 100644 --- a/docs/help/faq.md +++ b/docs/help/faq.md @@ -2254,7 +2254,7 @@ for usage/billing and raise limits as needed. Quickest setup: 1. Install Ollama from `https://ollama.com/download` - 2. Pull a local model such as `ollama pull glm-4.7-flash` + 2. Pull a local model such as `ollama pull gemma4` 3. If you want cloud models too, run `ollama signin` 4. Run `openclaw onboard` and choose `Ollama` 5. Pick `Local` or `Cloud + Local` diff --git a/docs/providers/ollama.md b/docs/providers/ollama.md index 1428daa06af..1e7e3b6f7c8 100644 --- a/docs/providers/ollama.md +++ b/docs/providers/ollama.md @@ -57,7 +57,7 @@ openclaw onboard --non-interactive \ 2. Pull a local model if you want local inference: ```bash -ollama pull glm-4.7-flash +ollama pull gemma4 # or ollama pull gpt-oss:20b # or @@ -78,12 +78,12 @@ openclaw onboard - `Local`: local models only - `Cloud + Local`: local models plus cloud models -- Cloud models such as `kimi-k2.5:cloud`, `minimax-m2.5:cloud`, and `glm-5:cloud` do **not** require a local `ollama pull` +- Cloud models such as `kimi-k2.5:cloud`, `minimax-m2.7:cloud`, and `glm-5.1:cloud` do **not** require a local `ollama pull` OpenClaw currently suggests: -- local default: `glm-4.7-flash` -- cloud defaults: `kimi-k2.5:cloud`, `minimax-m2.5:cloud`, `glm-5:cloud` +- local default: `gemma4` +- cloud defaults: `kimi-k2.5:cloud`, `minimax-m2.7:cloud`, `glm-5.1:cloud` 5. If you prefer manual setup, enable Ollama for OpenClaw directly (any value works; Ollama doesn't require a real key): @@ -99,7 +99,7 @@ openclaw config set models.providers.ollama.apiKey "ollama-local" ```bash openclaw models list -openclaw models set ollama/glm-4.7-flash +openclaw models set ollama/gemma4 ``` 7. Or set the default in config: @@ -108,7 +108,7 @@ openclaw models set ollama/glm-4.7-flash { agents: { defaults: { - model: { primary: "ollama/glm-4.7-flash" }, + model: { primary: "ollama/gemma4" }, }, }, } @@ -229,7 +229,7 @@ Once configured, all your Ollama models are available: ## Cloud models -Cloud models let you run cloud-hosted models (for example `kimi-k2.5:cloud`, `minimax-m2.5:cloud`, `glm-5:cloud`) alongside your local models. +Cloud models let you run cloud-hosted models (for example `kimi-k2.5:cloud`, `minimax-m2.7:cloud`, `glm-5.1:cloud`) alongside your local models. To use cloud models, select **Cloud + Local** mode during setup. The wizard checks whether you are signed in and opens a browser sign-in flow when needed. If authentication cannot be verified, the wizard falls back to local model defaults. @@ -355,7 +355,7 @@ To add models: ```bash ollama list # See what's installed -ollama pull glm-4.7-flash +ollama pull gemma4 ollama pull gpt-oss:20b ollama pull llama3.3 # Or another model ``` diff --git a/extensions/ollama/index.test.ts b/extensions/ollama/index.test.ts index 5e4b1581296..bbaec49bf0a 100644 --- a/extensions/ollama/index.test.ts +++ b/extensions/ollama/index.test.ts @@ -115,13 +115,13 @@ describe("ollama plugin", () => { await provider.onModelSelected?.({ config, - model: "ollama/glm-4.7-flash", + model: "ollama/gemma4", prompter, }); expect(ensureOllamaModelPulledMock).toHaveBeenCalledWith({ config, - model: "ollama/glm-4.7-flash", + model: "ollama/gemma4", prompter, }); }); diff --git a/extensions/ollama/src/defaults.ts b/extensions/ollama/src/defaults.ts index ff3f78e0327..5ac438bdea7 100644 --- a/extensions/ollama/src/defaults.ts +++ b/extensions/ollama/src/defaults.ts @@ -9,5 +9,5 @@ export const OLLAMA_DEFAULT_COST = { cacheWrite: 0, }; -export const OLLAMA_DEFAULT_MODEL = "glm-4.7-flash"; +export const OLLAMA_DEFAULT_MODEL = "gemma4"; export const DEFAULT_OLLAMA_EMBEDDING_MODEL = "nomic-embed-text"; diff --git a/extensions/ollama/src/provider-models.test.ts b/extensions/ollama/src/provider-models.test.ts index 98b676c127f..bf1b568454a 100644 --- a/extensions/ollama/src/provider-models.test.ts +++ b/extensions/ollama/src/provider-models.test.ts @@ -41,7 +41,7 @@ describe("ollama provider models", () => { }); it("sets models with vision capability from /api/show capabilities", async () => { - const models: OllamaTagModel[] = [{ name: "kimi-k2.5:cloud" }, { name: "glm-5:cloud" }]; + const models: OllamaTagModel[] = [{ name: "kimi-k2.5:cloud" }, { name: "glm-5.1:cloud" }]; const fetchMock = vi.fn(async (input: string | URL | Request, init?: RequestInit) => { const url = requestUrl(input); if (!url.endsWith("/api/show")) { @@ -54,7 +54,7 @@ describe("ollama provider models", () => { capabilities: ["vision", "thinking", "completion", "tools"], }); } - if (body.name === "glm-5:cloud") { + if (body.name === "glm-5.1:cloud") { return jsonResponse({ model_info: { "glm5.context_length": 202752 }, capabilities: ["thinking", "completion", "tools"], @@ -73,7 +73,7 @@ describe("ollama provider models", () => { capabilities: ["vision", "thinking", "completion", "tools"], }, { - name: "glm-5:cloud", + name: "glm-5.1:cloud", contextWindow: 202752, capabilities: ["thinking", "completion", "tools"], }, @@ -88,7 +88,7 @@ describe("ollama provider models", () => { ]); expect(visionModel.input).toEqual(["text", "image"]); - const textModel = buildOllamaModelDefinition("glm-5:cloud", 202752, ["completion", "tools"]); + const textModel = buildOllamaModelDefinition("glm-5.1:cloud", 202752, ["completion", "tools"]); expect(textModel.input).toEqual(["text"]); const noCapabilities = buildOllamaModelDefinition("unknown-model", 65536); diff --git a/extensions/ollama/src/setup.test.ts b/extensions/ollama/src/setup.test.ts index 4b4df938243..eed31d6773b 100644 --- a/extensions/ollama/src/setup.test.ts +++ b/extensions/ollama/src/setup.test.ts @@ -105,7 +105,7 @@ describe("ollama setup", () => { }); const modelIds = result.config.models?.providers?.ollama?.models?.map((m) => m.id); - expect(modelIds?.[0]).toBe("glm-4.7-flash"); + expect(modelIds?.[0]).toBe("gemma4"); }); it("puts suggested cloud model first in remote mode", async () => { @@ -128,7 +128,7 @@ describe("ollama setup", () => { it("mode selection affects model ordering (local)", async () => { const prompter = createModePrompter("local"); - const fetchMock = createOllamaFetchMock({ tags: ["llama3:8b", "glm-4.7-flash"] }); + const fetchMock = createOllamaFetchMock({ tags: ["llama3:8b", "gemma4"] }); vi.stubGlobal("fetch", fetchMock); const result = await promptAndConfigureOllama({ @@ -139,7 +139,7 @@ describe("ollama setup", () => { }); const modelIds = result.config.models?.providers?.ollama?.models?.map((m) => m.id); - expect(modelIds?.[0]).toBe("glm-4.7-flash"); + expect(modelIds?.[0]).toBe("gemma4"); expect(modelIds).toContain("llama3:8b"); }); @@ -194,7 +194,7 @@ describe("ollama setup", () => { } as unknown as WizardPrompter; const fetchMock = createOllamaFetchMock({ - tags: ["llama3:8b", "glm-4.7-flash", "deepseek-r1:14b"], + tags: ["llama3:8b", "gemma4", "deepseek-r1:14b"], }); vi.stubGlobal("fetch", fetchMock); @@ -209,10 +209,10 @@ describe("ollama setup", () => { expect(modelIds).toEqual([ "kimi-k2.5:cloud", - "minimax-m2.5:cloud", - "glm-5:cloud", + "minimax-m2.7:cloud", + "glm-5.1:cloud", "llama3:8b", - "glm-4.7-flash", + "gemma4", "deepseek-r1:14b", ]); expect(models?.find((model) => model.id === "kimi-k2.5:cloud")?.input).toEqual([ @@ -261,8 +261,8 @@ describe("ollama setup", () => { vi.stubGlobal("fetch", fetchMock); await ensureOllamaModelPulled({ - config: createDefaultOllamaConfig("ollama/glm-4.7-flash"), - model: "ollama/glm-4.7-flash", + config: createDefaultOllamaConfig("ollama/gemma4"), + model: "ollama/gemma4", prompter, }); @@ -273,12 +273,12 @@ describe("ollama setup", () => { it("skips pull when model is already available", async () => { const prompter = {} as unknown as WizardPrompter; - const fetchMock = createOllamaFetchMock({ tags: ["glm-4.7-flash"] }); + const fetchMock = createOllamaFetchMock({ tags: ["gemma4"] }); vi.stubGlobal("fetch", fetchMock); await ensureOllamaModelPulled({ - config: createDefaultOllamaConfig("ollama/glm-4.7-flash"), - model: "ollama/glm-4.7-flash", + config: createDefaultOllamaConfig("ollama/gemma4"), + model: "ollama/gemma4", prompter, }); diff --git a/extensions/ollama/src/setup.ts b/extensions/ollama/src/setup.ts index 3830faea9fe..328d32d69fe 100644 --- a/extensions/ollama/src/setup.ts +++ b/extensions/ollama/src/setup.ts @@ -20,7 +20,7 @@ import { } from "./provider-models.js"; const OLLAMA_SUGGESTED_MODELS_LOCAL = [OLLAMA_DEFAULT_MODEL]; -const OLLAMA_SUGGESTED_MODELS_CLOUD = ["kimi-k2.5:cloud", "minimax-m2.5:cloud", "glm-5:cloud"]; +const OLLAMA_SUGGESTED_MODELS_CLOUD = ["kimi-k2.5:cloud", "minimax-m2.7:cloud", "glm-5.1:cloud"]; const OLLAMA_CONTEXT_ENRICH_LIMIT = 200; type OllamaMode = "remote" | "local";