From 63fb3e8c411fdb899634a1ff295eff9ac48512d3 Mon Sep 17 00:00:00 2001 From: Sawyer Cutler Date: Sun, 11 Oct 2026 22:38:45 -0700 Subject: [PATCH 1/3] fix(provider): align opencode-go model protocols with zen and upstream --- packages/opencode-go/src/endpoint.test.ts | 37 ++++++++++++++++++++--- packages/opencode-go/src/models.ts | 10 +++--- src/config/inference-sources.test.ts | 13 ++++++-- src/provider/cache-ttl.test.ts | 2 +- src/session/cache-ttl-resume.test.ts | 2 +- 5 files changed, 51 insertions(+), 13 deletions(-) diff --git a/packages/opencode-go/src/endpoint.test.ts b/packages/opencode-go/src/endpoint.test.ts index 645a0d3fb..b79570262 100644 --- a/packages/opencode-go/src/endpoint.test.ts +++ b/packages/opencode-go/src/endpoint.test.ts @@ -16,7 +16,12 @@ describe("protocolForGoModel", () => { expect(protocolForGoModel("gpt-5.6-luna")).toBe("responses"); expect(protocolForGoModel("muse-spark-1.3-contributor")).toBe("responses"); expect(protocolForGoModel("muse-spark-1.2-contributor")).toBe("responses"); - expect(protocolForGoModel("minimax-m3")).toBe("messages"); + expect(protocolForGoModel("minimax-m3")).toBe("chat-completions"); + expect(protocolForGoModel("minimax-m2.7")).toBe("chat-completions"); + expect(protocolForGoModel("minimax-m2.5")).toBe("chat-completions"); + expect(protocolForGoModel("qwen3.8-max")).toBe("chat-completions"); + expect(protocolForGoModel("grok-4.5")).toBe("responses"); + expect(protocolForGoModel("qwen3.7-max")).toBe("messages"); }); test("returns undefined for unknown models", () => { @@ -25,7 +30,7 @@ describe("protocolForGoModel", () => { test("catalog covers chat-completions and messages at minimum", () => { const protocols = new Set( - ["kimi-k2.7-code", "gpt-5.6-luna", "minimax-m3"].map((id) => + ["kimi-k2.7-code", "gpt-5.6-luna", "qwen3.7-max"].map((id) => protocolForGoModel(id), ), ); @@ -63,12 +68,35 @@ describe("resolveGoEndpoint", () => { }); test("routes messages models to anthropic base", () => { - const ep = resolveGoEndpoint("minimax-m3"); + const ep = resolveGoEndpoint("qwen3.7-max"); expect(ep.adapter).toBe("anthropic"); expect(ep.protocol).toBe("messages"); expect(ep.baseURL).toBe("https://opencode.ai/zen/go"); }); + test("routes MiniMax models to openai-compatible base (CL-10534)", () => { + for (const id of ["minimax-m3", "minimax-m2.7", "minimax-m2.5"]) { + const ep = resolveGoEndpoint(id); + expect(ep.adapter).toBe("openai-compatible"); + expect(ep.protocol).toBe("chat-completions"); + expect(ep.baseURL).toContain("/zen/go/v1"); + } + }); + + test("routes grok-4.5 to openai-responses adapter (CL-10534)", () => { + const ep = resolveGoEndpoint("grok-4.5"); + expect(ep.adapter).toBe("openai-responses"); + expect(ep.protocol).toBe("responses"); + expect(ep.baseURL).toContain("/zen/go/v1"); + }); + + test("routes qwen3.8-max to openai-compatible base (CL-10534)", () => { + const ep = resolveGoEndpoint("qwen3.8-max"); + expect(ep.adapter).toBe("openai-compatible"); + expect(ep.protocol).toBe("chat-completions"); + expect(ep.baseURL).toContain("/zen/go/v1"); + }); + test("unknown models default to chat-completions", () => { const ep = resolveGoEndpoint("future-model"); expect(ep.adapter).toBe("openai-compatible"); @@ -135,7 +163,8 @@ describe("buildGoCatalogEntry", () => { const entry = buildGoCatalogEntry(); expect(entry.name).toBe("opencode-go"); expect(entry.models.length).toBeGreaterThan(0); - expect(entry.protocols["minimax-m3"]).toBe("messages"); + expect(entry.protocols["minimax-m3"]).toBe("chat-completions"); + expect(entry.protocols["qwen3.7-max"]).toBe("messages"); expect(entry.protocols["kimi-k2.7-code"]).toBe("chat-completions"); }); }); diff --git a/packages/opencode-go/src/models.ts b/packages/opencode-go/src/models.ts index 4d49c6b29..35bcce8fb 100644 --- a/packages/opencode-go/src/models.ts +++ b/packages/opencode-go/src/models.ts @@ -12,7 +12,7 @@ interface GoModel { } export const OPENCODE_GO_MODELS = [ - { id: "grok-4.5", name: "Grok 4.5", protocol: "chat-completions" }, + { id: "grok-4.5", name: "Grok 4.5", protocol: "responses" }, { id: "gpt-5.6-luna", name: "GPT 5.6 Luna", protocol: "responses" }, { id: "muse-spark-1.3-contributor", @@ -45,10 +45,10 @@ export const OPENCODE_GO_MODELS = [ }, { id: "mimo-v2.5", name: "MiMo-V2.5", protocol: "chat-completions" }, { id: "mimo-v2.5-pro", name: "MiMo-V2.5-Pro", protocol: "chat-completions" }, - { id: "minimax-m3", name: "MiniMax M3", protocol: "messages" }, - { id: "minimax-m2.7", name: "MiniMax M2.7", protocol: "messages" }, - { id: "minimax-m2.5", name: "MiniMax M2.5", protocol: "messages" }, - { id: "qwen3.8-max", name: "Qwen3.8 Max", protocol: "messages" }, + { id: "minimax-m3", name: "MiniMax M3", protocol: "chat-completions" }, + { id: "minimax-m2.7", name: "MiniMax M2.7", protocol: "chat-completions" }, + { id: "minimax-m2.5", name: "MiniMax M2.5", protocol: "chat-completions" }, + { id: "qwen3.8-max", name: "Qwen3.8 Max", protocol: "chat-completions" }, { id: "qwen3.7-max", name: "Qwen3.7 Max", protocol: "messages" }, { id: "qwen3.7-plus", name: "Qwen3.7 Plus", protocol: "messages" }, { id: "qwen3.6-plus", name: "Qwen3.6 Plus", protocol: "messages" }, diff --git a/src/config/inference-sources.test.ts b/src/config/inference-sources.test.ts index 5035abcd9..c67664611 100644 --- a/src/config/inference-sources.test.ts +++ b/src/config/inference-sources.test.ts @@ -470,6 +470,15 @@ describe("protocol flag routing", () => { expect(chat?.baseURL).toBe("https://opencode.ai/zen/go/v1"); expect(chat?.model).toBe("kimi-k2.7-code"); + const minimax = buildInferenceSourceForRef( + { provider: "opencode-go", model: "minimax-m3" }, + ctx, + undefined, + ); + expect(minimax?.provider).toBe("opencode-go"); + expect(minimax?.baseURL).toBe("https://opencode.ai/zen/go/v1"); + expect(minimax?.model).toBe("minimax-m3"); + const responses = buildInferenceSourceForRef( { provider: "opencode-go", model: "gpt-5.6-luna" }, ctx, @@ -479,13 +488,13 @@ describe("protocol flag routing", () => { expect(responses?.baseURL).toBe("https://opencode.ai/zen/go/v1"); const messages = buildInferenceSourceForRef( - { provider: "opencode-go", model: "minimax-m3" }, + { provider: "opencode-go", model: "qwen3.7-max" }, ctx, undefined, ); expect(messages?.provider).toBe("opencode-go-messages"); expect(messages?.baseURL).toBe("https://opencode.ai/zen/go"); - expect(messages?.model).toBe("minimax-m3"); + expect(messages?.model).toBe("qwen3.7-max"); }); }); diff --git a/src/provider/cache-ttl.test.ts b/src/provider/cache-ttl.test.ts index c987d8c9f..fd5351348 100644 --- a/src/provider/cache-ttl.test.ts +++ b/src/provider/cache-ttl.test.ts @@ -115,7 +115,7 @@ describe("anthropic cache-write stamp", () => { }), buildGoSource({ id: "opencode-go", - model: "minimax-m3", + model: "qwen3.7-max", sessionId: "sess-go", }), buildAnthropicSource({ diff --git a/src/session/cache-ttl-resume.test.ts b/src/session/cache-ttl-resume.test.ts index 1e1c36685..abd2a35a8 100644 --- a/src/session/cache-ttl-resume.test.ts +++ b/src/session/cache-ttl-resume.test.ts @@ -280,7 +280,7 @@ describe("resumed Anthropic cache write does not compact", () => { }), buildGoSource({ id: "opencode-go", - model: "minimax-m3", + model: "qwen3.7-max", sessionId: "sess-go", }), buildAnthropicSource({ From 521a6eeb93f17efcae52d65b9132d6ee601475b6 Mon Sep 17 00:00:00 2001 From: Sawyer Cutler Date: Sun, 11 Oct 2026 23:29:18 -0700 Subject: [PATCH 2/3] fix(provider): align opencode-go protocols with live Go gateway docs --- packages/opencode-go/src/endpoint.test.ts | 82 +++++++++++++++-------- packages/opencode-go/src/models.ts | 58 ++++++++++++++-- src/config/inference-sources.test.ts | 28 ++++---- src/provider/cache-ttl.test.ts | 2 +- src/session/cache-ttl-resume.test.ts | 2 +- 5 files changed, 121 insertions(+), 51 deletions(-) diff --git a/packages/opencode-go/src/endpoint.test.ts b/packages/opencode-go/src/endpoint.test.ts index b79570262..db1879043 100644 --- a/packages/opencode-go/src/endpoint.test.ts +++ b/packages/opencode-go/src/endpoint.test.ts @@ -16,12 +16,20 @@ describe("protocolForGoModel", () => { expect(protocolForGoModel("gpt-5.6-luna")).toBe("responses"); expect(protocolForGoModel("muse-spark-1.3-contributor")).toBe("responses"); expect(protocolForGoModel("muse-spark-1.2-contributor")).toBe("responses"); - expect(protocolForGoModel("minimax-m3")).toBe("chat-completions"); - expect(protocolForGoModel("minimax-m2.7")).toBe("chat-completions"); - expect(protocolForGoModel("minimax-m2.5")).toBe("chat-completions"); - expect(protocolForGoModel("qwen3.8-max")).toBe("chat-completions"); + expect(protocolForGoModel("minimax-m3")).toBe("messages"); + expect(protocolForGoModel("minimax-m2.7")).toBe("messages"); + expect(protocolForGoModel("minimax-m2.5")).toBe("messages"); + expect(protocolForGoModel("qwen3.8-max")).toBe("messages"); expect(protocolForGoModel("grok-4.5")).toBe("responses"); - expect(protocolForGoModel("qwen3.7-max")).toBe("messages"); + expect(protocolForGoModel("grok-4.7")).toBe("responses"); + expect(protocolForGoModel("gpt-6-luna")).toBe("responses"); + expect(protocolForGoModel("claude-haiku-5-5")).toBe("messages"); + expect(protocolForGoModel("qwen3.8-flash")).toBe("messages"); + expect(protocolForGoModel("glm-5.3")).toBe("chat-completions"); + expect(protocolForGoModel("deepseek-v4.1-flash")).toBe("chat-completions"); + expect(protocolForGoModel("mimo-v2.6-flash")).toBe("chat-completions"); + expect(protocolForGoModel("hy4-preview")).toBe("chat-completions"); + expect(protocolForGoModel("space-bunny")).toBe("chat-completions"); }); test("returns undefined for unknown models", () => { @@ -30,7 +38,7 @@ describe("protocolForGoModel", () => { test("catalog covers chat-completions and messages at minimum", () => { const protocols = new Set( - ["kimi-k2.7-code", "gpt-5.6-luna", "qwen3.7-max"].map((id) => + ["kimi-k2.7-code", "gpt-5.6-luna", "minimax-m3"].map((id) => protocolForGoModel(id), ), ); @@ -68,33 +76,50 @@ describe("resolveGoEndpoint", () => { }); test("routes messages models to anthropic base", () => { - const ep = resolveGoEndpoint("qwen3.7-max"); - expect(ep.adapter).toBe("anthropic"); - expect(ep.protocol).toBe("messages"); - expect(ep.baseURL).toBe("https://opencode.ai/zen/go"); + for (const id of [ + "minimax-m3", + "minimax-m2.7", + "minimax-m2.5", + "qwen3.8-max", + "qwen3.8-flash", + "claude-haiku-5-5", + "qwen3.7-max", + ]) { + const ep = resolveGoEndpoint(id); + expect(ep.adapter).toBe("anthropic"); + expect(ep.protocol).toBe("messages"); + expect(ep.baseURL).toBe("https://opencode.ai/zen/go"); + } }); - test("routes MiniMax models to openai-compatible base (CL-10534)", () => { - for (const id of ["minimax-m3", "minimax-m2.7", "minimax-m2.5"]) { + test("routes responses models to openai-responses adapter (live Go docs)", () => { + for (const id of ["grok-4.7", "grok-4.6", "grok-4.5", "gpt-6-luna"]) { const ep = resolveGoEndpoint(id); - expect(ep.adapter).toBe("openai-compatible"); - expect(ep.protocol).toBe("chat-completions"); + expect(ep.adapter).toBe("openai-responses"); + expect(ep.protocol).toBe("responses"); expect(ep.baseURL).toContain("/zen/go/v1"); } }); - test("routes grok-4.5 to openai-responses adapter (CL-10534)", () => { - const ep = resolveGoEndpoint("grok-4.5"); - expect(ep.adapter).toBe("openai-responses"); - expect(ep.protocol).toBe("responses"); - expect(ep.baseURL).toContain("/zen/go/v1"); - }); - - test("routes qwen3.8-max to openai-compatible base (CL-10534)", () => { - const ep = resolveGoEndpoint("qwen3.8-max"); - expect(ep.adapter).toBe("openai-compatible"); - expect(ep.protocol).toBe("chat-completions"); - expect(ep.baseURL).toContain("/zen/go/v1"); + test("routes new chat-completions models to openai-compatible base (live Go docs)", () => { + for (const id of [ + "glm-5.3-flash", + "glm-5.3", + "longcat-2.0", + "longcat-2.5-preview-free", + "step-5-preview-free", + "deepseek-v4.1-flash", + "deepseek-v4-flash-vision-exp", + "mimo-v2.6-flash", + "mimo-v2.6-pro", + "hy4-preview", + "space-bunny", + ]) { + const ep = resolveGoEndpoint(id); + expect(ep.adapter).toBe("openai-compatible"); + expect(ep.protocol).toBe("chat-completions"); + expect(ep.baseURL).toContain("/zen/go/v1"); + } }); test("unknown models default to chat-completions", () => { @@ -163,8 +188,9 @@ describe("buildGoCatalogEntry", () => { const entry = buildGoCatalogEntry(); expect(entry.name).toBe("opencode-go"); expect(entry.models.length).toBeGreaterThan(0); - expect(entry.protocols["minimax-m3"]).toBe("chat-completions"); - expect(entry.protocols["qwen3.7-max"]).toBe("messages"); + expect(entry.protocols["minimax-m3"]).toBe("messages"); + expect(entry.protocols["qwen3.8-max"]).toBe("messages"); + expect(entry.protocols["grok-4.5"]).toBe("responses"); expect(entry.protocols["kimi-k2.7-code"]).toBe("chat-completions"); }); }); diff --git a/packages/opencode-go/src/models.ts b/packages/opencode-go/src/models.ts index 35bcce8fb..68fd832fa 100644 --- a/packages/opencode-go/src/models.ts +++ b/packages/opencode-go/src/models.ts @@ -2,6 +2,11 @@ // Selectable ids come from live GET /zen/go/v1/models in the host; this // packaged list is used when that fetch has not succeeded. Protocol // routing stays here. Live ids absent from PROTOCOL_BY_ID use Chat Completions. +// +// Protocol per id mirrors the Go gateway endpoint table +// (https://opencode.ai/docs/go/#endpoints, verified 11/10/2026). The Go +// gateway is NOT protocol-identical to the Zen gateway: MiniMax and Qwen3.8 +// Max speak the Anthropic Messages API on Go but Chat Completions on Zen. export type GoProtocol = "chat-completions" | "responses" | "messages"; @@ -12,7 +17,11 @@ interface GoModel { } export const OPENCODE_GO_MODELS = [ + // OpenAI Responses API + { id: "grok-4.7", name: "Grok 4.7", protocol: "responses" }, + { id: "grok-4.6", name: "Grok 4.6", protocol: "responses" }, { id: "grok-4.5", name: "Grok 4.5", protocol: "responses" }, + { id: "gpt-6-luna", name: "GPT 6 Luna", protocol: "responses" }, { id: "gpt-5.6-luna", name: "GPT 5.6 Luna", protocol: "responses" }, { id: "muse-spark-1.3-contributor", @@ -24,6 +33,19 @@ export const OPENCODE_GO_MODELS = [ name: "Muse Spark 1.2 Contributor", protocol: "responses", }, + // Anthropic Messages API + { id: "claude-haiku-5-5", name: "Claude Haiku 5.5", protocol: "messages" }, + { id: "minimax-m3", name: "MiniMax M3", protocol: "messages" }, + { id: "minimax-m2.7", name: "MiniMax M2.7", protocol: "messages" }, + { id: "minimax-m2.5", name: "MiniMax M2.5", protocol: "messages" }, + { id: "qwen3.8-max", name: "Qwen3.8 Max", protocol: "messages" }, + { id: "qwen3.8-flash", name: "Qwen3.8 Flash", protocol: "messages" }, + { id: "qwen3.7-max", name: "Qwen3.7 Max", protocol: "messages" }, + { id: "qwen3.7-plus", name: "Qwen3.7 Plus", protocol: "messages" }, + { id: "qwen3.6-plus", name: "Qwen3.6 Plus", protocol: "messages" }, + // OpenAI Chat Completions API + { id: "glm-5.3-flash", name: "GLM-5.3-Flash", protocol: "chat-completions" }, + { id: "glm-5.3", name: "GLM-5.3", protocol: "chat-completions" }, { id: "glm-5.2", name: "GLM-5.2", protocol: "chat-completions" }, { id: "glm-5.1", name: "GLM-5.1", protocol: "chat-completions" }, { id: "kimi-k3", name: "Kimi K3", protocol: "chat-completions" }, @@ -33,6 +55,22 @@ export const OPENCODE_GO_MODELS = [ protocol: "chat-completions", }, { id: "kimi-k2.6", name: "Kimi K2.6", protocol: "chat-completions" }, + { id: "longcat-2.0", name: "LongCat-2.0", protocol: "chat-completions" }, + { + id: "longcat-2.5-preview-free", + name: "LongCat 2.5 Preview Free", + protocol: "chat-completions", + }, + { + id: "step-5-preview-free", + name: "Step 5 Preview Free", + protocol: "chat-completions", + }, + { + id: "deepseek-v4.1-flash", + name: "DeepSeek V4.1 Flash", + protocol: "chat-completions", + }, { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", @@ -43,16 +81,22 @@ export const OPENCODE_GO_MODELS = [ name: "DeepSeek V4 Flash", protocol: "chat-completions", }, + { + id: "deepseek-v4-flash-vision-exp", + name: "DeepSeek V4 Flash Vision Exp", + protocol: "chat-completions", + }, + { + id: "mimo-v2.6-flash", + name: "MiMo-V2.6-Flash", + protocol: "chat-completions", + }, + { id: "mimo-v2.6-pro", name: "MiMo-V2.6-Pro", protocol: "chat-completions" }, { id: "mimo-v2.5", name: "MiMo-V2.5", protocol: "chat-completions" }, { id: "mimo-v2.5-pro", name: "MiMo-V2.5-Pro", protocol: "chat-completions" }, - { id: "minimax-m3", name: "MiniMax M3", protocol: "chat-completions" }, - { id: "minimax-m2.7", name: "MiniMax M2.7", protocol: "chat-completions" }, - { id: "minimax-m2.5", name: "MiniMax M2.5", protocol: "chat-completions" }, - { id: "qwen3.8-max", name: "Qwen3.8 Max", protocol: "chat-completions" }, - { id: "qwen3.7-max", name: "Qwen3.7 Max", protocol: "messages" }, - { id: "qwen3.7-plus", name: "Qwen3.7 Plus", protocol: "messages" }, - { id: "qwen3.6-plus", name: "Qwen3.6 Plus", protocol: "messages" }, + { id: "hy4-preview", name: "Hy4 Preview", protocol: "chat-completions" }, { id: "hy3", name: "Hy3", protocol: "chat-completions" }, + { id: "space-bunny", name: "Space Bunny", protocol: "chat-completions" }, ] as const satisfies readonly GoModel[]; export type GoModelId = (typeof OPENCODE_GO_MODELS)[number]["id"]; diff --git a/src/config/inference-sources.test.ts b/src/config/inference-sources.test.ts index c67664611..88856c800 100644 --- a/src/config/inference-sources.test.ts +++ b/src/config/inference-sources.test.ts @@ -470,15 +470,6 @@ describe("protocol flag routing", () => { expect(chat?.baseURL).toBe("https://opencode.ai/zen/go/v1"); expect(chat?.model).toBe("kimi-k2.7-code"); - const minimax = buildInferenceSourceForRef( - { provider: "opencode-go", model: "minimax-m3" }, - ctx, - undefined, - ); - expect(minimax?.provider).toBe("opencode-go"); - expect(minimax?.baseURL).toBe("https://opencode.ai/zen/go/v1"); - expect(minimax?.model).toBe("minimax-m3"); - const responses = buildInferenceSourceForRef( { provider: "opencode-go", model: "gpt-5.6-luna" }, ctx, @@ -487,14 +478,23 @@ describe("protocol flag routing", () => { expect(responses?.provider).toBe("openai-responses"); expect(responses?.baseURL).toBe("https://opencode.ai/zen/go/v1"); - const messages = buildInferenceSourceForRef( - { provider: "opencode-go", model: "qwen3.7-max" }, + const minimax = buildInferenceSourceForRef( + { provider: "opencode-go", model: "minimax-m3" }, + ctx, + undefined, + ); + expect(minimax?.provider).toBe("opencode-go-messages"); + expect(minimax?.baseURL).toBe("https://opencode.ai/zen/go"); + expect(minimax?.model).toBe("minimax-m3"); + + const qwenMax = buildInferenceSourceForRef( + { provider: "opencode-go", model: "qwen3.8-max" }, ctx, undefined, ); - expect(messages?.provider).toBe("opencode-go-messages"); - expect(messages?.baseURL).toBe("https://opencode.ai/zen/go"); - expect(messages?.model).toBe("qwen3.7-max"); + expect(qwenMax?.provider).toBe("opencode-go-messages"); + expect(qwenMax?.baseURL).toBe("https://opencode.ai/zen/go"); + expect(qwenMax?.model).toBe("qwen3.8-max"); }); }); diff --git a/src/provider/cache-ttl.test.ts b/src/provider/cache-ttl.test.ts index fd5351348..c987d8c9f 100644 --- a/src/provider/cache-ttl.test.ts +++ b/src/provider/cache-ttl.test.ts @@ -115,7 +115,7 @@ describe("anthropic cache-write stamp", () => { }), buildGoSource({ id: "opencode-go", - model: "qwen3.7-max", + model: "minimax-m3", sessionId: "sess-go", }), buildAnthropicSource({ diff --git a/src/session/cache-ttl-resume.test.ts b/src/session/cache-ttl-resume.test.ts index abd2a35a8..1e1c36685 100644 --- a/src/session/cache-ttl-resume.test.ts +++ b/src/session/cache-ttl-resume.test.ts @@ -280,7 +280,7 @@ describe("resumed Anthropic cache write does not compact", () => { }), buildGoSource({ id: "opencode-go", - model: "qwen3.7-max", + model: "minimax-m3", sessionId: "sess-go", }), buildAnthropicSource({ From b488984c53d7b96bfdcb57a8915047a8e5ec0481 Mon Sep 17 00:00:00 2001 From: Sawyer Cutler Date: Mon, 12 Oct 2026 16:30:31 -0700 Subject: [PATCH 3/3] refactor(provider): drop protocol-map narration --- packages/opencode-go/src/models.ts | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/packages/opencode-go/src/models.ts b/packages/opencode-go/src/models.ts index 68fd832fa..ecce3b046 100644 --- a/packages/opencode-go/src/models.ts +++ b/packages/opencode-go/src/models.ts @@ -2,11 +2,7 @@ // Selectable ids come from live GET /zen/go/v1/models in the host; this // packaged list is used when that fetch has not succeeded. Protocol // routing stays here. Live ids absent from PROTOCOL_BY_ID use Chat Completions. -// -// Protocol per id mirrors the Go gateway endpoint table -// (https://opencode.ai/docs/go/#endpoints, verified 11/10/2026). The Go -// gateway is NOT protocol-identical to the Zen gateway: MiniMax and Qwen3.8 -// Max speak the Anthropic Messages API on Go but Chat Completions on Zen. +// MiniMax and Qwen3.8 Max are messages on Go, unlike Zen chat-completions. export type GoProtocol = "chat-completions" | "responses" | "messages"; @@ -17,7 +13,6 @@ interface GoModel { } export const OPENCODE_GO_MODELS = [ - // OpenAI Responses API { id: "grok-4.7", name: "Grok 4.7", protocol: "responses" }, { id: "grok-4.6", name: "Grok 4.6", protocol: "responses" }, { id: "grok-4.5", name: "Grok 4.5", protocol: "responses" }, @@ -33,7 +28,6 @@ export const OPENCODE_GO_MODELS = [ name: "Muse Spark 1.2 Contributor", protocol: "responses", }, - // Anthropic Messages API { id: "claude-haiku-5-5", name: "Claude Haiku 5.5", protocol: "messages" }, { id: "minimax-m3", name: "MiniMax M3", protocol: "messages" }, { id: "minimax-m2.7", name: "MiniMax M2.7", protocol: "messages" }, @@ -43,7 +37,6 @@ export const OPENCODE_GO_MODELS = [ { id: "qwen3.7-max", name: "Qwen3.7 Max", protocol: "messages" }, { id: "qwen3.7-plus", name: "Qwen3.7 Plus", protocol: "messages" }, { id: "qwen3.6-plus", name: "Qwen3.6 Plus", protocol: "messages" }, - // OpenAI Chat Completions API { id: "glm-5.3-flash", name: "GLM-5.3-Flash", protocol: "chat-completions" }, { id: "glm-5.3", name: "GLM-5.3", protocol: "chat-completions" }, { id: "glm-5.2", name: "GLM-5.2", protocol: "chat-completions" },