diff --git a/CHANGELOG.md b/CHANGELOG.md index 51124675b..558f67cb3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ Docs: https://docs.clawd.bot ### Fixes - Config: avoid stack traces for invalid configs and log the config path. - Doctor: warn when gateway.mode is unset with configure/config guidance. +- OpenCode Zen: route models to the Zen API shape per family so proxy endpoints are used. (#1416) - macOS: include Textual syntax highlighting resources in packaged app to prevent chat crashes. (#1362) - Cron: cap reminder context history to 10 messages and honor `contextMessages`. (#1103) Thanks @mkbehr. - Exec approvals: treat main as the default agent + migrate legacy default allowlists. (#1417) Thanks @czekaj. diff --git a/src/agents/opencode-zen-models.test.ts b/src/agents/opencode-zen-models.test.ts index e732bae44..d46b0ac6b 100644 --- a/src/agents/opencode-zen-models.test.ts +++ b/src/agents/opencode-zen-models.test.ts @@ -44,6 +44,8 @@ describe("resolveOpencodeZenModelApi", () => { expect(resolveOpencodeZenModelApi("minimax-m2.1-free")).toBe("anthropic-messages"); expect(resolveOpencodeZenModelApi("gemini-3-pro")).toBe("google-generative-ai"); expect(resolveOpencodeZenModelApi("gpt-5.2")).toBe("openai-responses"); + expect(resolveOpencodeZenModelApi("alpha-gd4")).toBe("openai-completions"); + expect(resolveOpencodeZenModelApi("big-pickle")).toBe("openai-completions"); expect(resolveOpencodeZenModelApi("glm-4.7-free")).toBe("openai-completions"); expect(resolveOpencodeZenModelApi("some-unknown-model")).toBe("openai-completions"); }); diff --git a/src/agents/opencode-zen-models.ts b/src/agents/opencode-zen-models.ts index 6eb87b855..bf1734d5e 100644 --- a/src/agents/opencode-zen-models.ts +++ b/src/agents/opencode-zen-models.ts @@ -87,19 +87,19 @@ export function resolveOpencodeZenAlias(modelIdOrAlias: string): string { } /** - * OpenCode Zen routes models to different APIs based on model family. + * OpenCode Zen routes models to specific API shapes by family. */ export function resolveOpencodeZenModelApi(modelId: string): ModelApi { const lower = modelId.toLowerCase(); - if (lower.startsWith("claude-") || lower.startsWith("minimax") || lower.startsWith("alpha-gd4")) { + if (lower.startsWith("gpt-")) { + return "openai-responses"; + } + if (lower.startsWith("claude-") || lower.startsWith("minimax-")) { return "anthropic-messages"; } if (lower.startsWith("gemini-")) { return "google-generative-ai"; } - if (lower.startsWith("gpt-")) { - return "openai-responses"; - } return "openai-completions"; }