chore(ollama): update suggested onboarding models (#62626)

Merged via squash.

Prepared head SHA: 48c083b88a
Co-authored-by: BruceMacD <5853428+BruceMacD@users.noreply.github.com>
Co-authored-by: BruceMacD <5853428+BruceMacD@users.noreply.github.com>
Reviewed-by: @BruceMacD
This commit is contained in:
Bruce MacDonald
2026-04-07 11:42:29 -07:00
committed by GitHub
parent 23ab290a71
commit 86f35a9bc0
8 changed files with 30 additions and 33 deletions

View File

@@ -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 Mistrals 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

View File

@@ -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`

View File

@@ -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
```

View File

@@ -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,
});
});

View File

@@ -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";

View File

@@ -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);

View File

@@ -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,
});

View File

@@ -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";