fix(opencode-zen): keep legacy aliases + rationale (#669) (thanks @magimetal)

This commit is contained in:
Peter Steinberger
2026-01-10 18:25:43 +01:00
parent 738269eb74
commit 2d105d16f8
3 changed files with 39 additions and 0 deletions

View File

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

View File

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

View File

@@ -27,12 +27,29 @@ export const OPENCODE_ZEN_MODEL_ALIASES: Record<string, string> = {
// 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<string, string> = {
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,