diff --git a/CHANGELOG.md b/CHANGELOG.md index e19554671..304505ec0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - Onboarding/Models: add first-class Z.AI (GLM) auth choice (`zai-api-key`) + `--zai-api-key` flag. - Agents: add human-delay pacing between block replies (modes: off/natural/custom, per-agent configurable). (#446) — thanks @tony-freedomology. - Onboarding/Models: add catalog-backed default model picker to onboarding + configure. (#611) — thanks @jonasjancarik. +- Agents/OpenCode Zen: update fallback models + defaults, keep legacy alias mappings. (#669) — thanks @magimetal. ### Fixes - Auto-reply: prefer `RawBody` for command/directive parsing (WhatsApp + Discord) and prevent fallback runs from clobbering concurrent session updates. (#643) — thanks @mcinteerj. diff --git a/src/agents/opencode-zen-models.test.ts b/src/agents/opencode-zen-models.test.ts index 208ac18bb..4fcbe3395 100644 --- a/src/agents/opencode-zen-models.test.ts +++ b/src/agents/opencode-zen-models.test.ts @@ -12,6 +12,14 @@ describe("resolveOpencodeZenAlias", () => { expect(resolveOpencodeZenAlias("opus")).toBe("claude-opus-4-5"); }); + it("keeps legacy aliases working", () => { + expect(resolveOpencodeZenAlias("sonnet")).toBe("claude-opus-4-5"); + expect(resolveOpencodeZenAlias("haiku")).toBe("claude-opus-4-5"); + expect(resolveOpencodeZenAlias("gpt4")).toBe("gpt-5.1"); + expect(resolveOpencodeZenAlias("o1")).toBe("gpt-5.2"); + expect(resolveOpencodeZenAlias("gemini-2.5")).toBe("gemini-3-pro"); + }); + it("resolves gpt5 alias", () => { expect(resolveOpencodeZenAlias("gpt5")).toBe("gpt-5.2"); }); @@ -88,5 +96,12 @@ describe("OPENCODE_ZEN_MODEL_ALIASES", () => { expect(OPENCODE_ZEN_MODEL_ALIASES.gemini).toBe("gemini-3-pro"); expect(OPENCODE_ZEN_MODEL_ALIASES.glm).toBe("glm-4.7-free"); expect(OPENCODE_ZEN_MODEL_ALIASES.minimax).toBe("minimax-m2.1-free"); + + // Legacy aliases (kept for backward compatibility). + expect(OPENCODE_ZEN_MODEL_ALIASES.sonnet).toBe("claude-opus-4-5"); + expect(OPENCODE_ZEN_MODEL_ALIASES.haiku).toBe("claude-opus-4-5"); + expect(OPENCODE_ZEN_MODEL_ALIASES.gpt4).toBe("gpt-5.1"); + expect(OPENCODE_ZEN_MODEL_ALIASES.o1).toBe("gpt-5.2"); + expect(OPENCODE_ZEN_MODEL_ALIASES["gemini-2.5"]).toBe("gemini-3-pro"); }); }); diff --git a/src/agents/opencode-zen-models.ts b/src/agents/opencode-zen-models.ts index 4df00c4d9..3cdcd0753 100644 --- a/src/agents/opencode-zen-models.ts +++ b/src/agents/opencode-zen-models.ts @@ -27,12 +27,29 @@ export const OPENCODE_ZEN_MODEL_ALIASES: Record = { // Claude opus: "claude-opus-4-5", "opus-4.5": "claude-opus-4-5", + "opus-4": "claude-opus-4-5", + + // Legacy Claude aliases (OpenCode Zen rotates model catalogs; keep old keys working). + sonnet: "claude-opus-4-5", + "sonnet-4": "claude-opus-4-5", + haiku: "claude-opus-4-5", + "haiku-3.5": "claude-opus-4-5", // GPT-5.x family gpt5: "gpt-5.2", "gpt-5": "gpt-5.2", "gpt-5.1": "gpt-5.1", + // Legacy GPT aliases (keep old config/docs stable; map to closest current equivalents). + gpt4: "gpt-5.1", + "gpt-4": "gpt-5.1", + "gpt-mini": "gpt-5.1-codex-mini", + + // Legacy O-series aliases (no longer in the Zen catalog; map to a strong default). + o1: "gpt-5.2", + o3: "gpt-5.2", + "o3-mini": "gpt-5.1-codex-mini", + // Codex family codex: "gpt-5.1-codex", "codex-mini": "gpt-5.1-codex-mini", @@ -45,6 +62,11 @@ export const OPENCODE_ZEN_MODEL_ALIASES: Record = { flash: "gemini-3-flash", "gemini-flash": "gemini-3-flash", + // Legacy Gemini 2.5 aliases (map to the nearest current Gemini tier). + "gemini-2.5": "gemini-3-pro", + "gemini-2.5-pro": "gemini-3-pro", + "gemini-2.5-flash": "gemini-3-flash", + // GLM (free + alpha) glm: "glm-4.7-free", "glm-free": "glm-4.7-free", @@ -161,6 +183,7 @@ function buildModelDefinition(modelId: string): ModelDefinitionConfig { id: modelId, name: formatModelName(modelId), api: resolveOpencodeZenModelApi(modelId), + // Treat Zen models as reasoning-capable so defaults pick thinkLevel="low" unless users opt out. reasoning: true, input: supportsImageInput(modelId) ? ["text", "image"] : ["text"], cost: MODEL_COSTS[modelId] ?? DEFAULT_COST,