Skip to content

Commit 140ab34

Browse files
Merge pull request #1409 from corbitsdev/cl-10534-model-protocols
fix(provider): align opencode-go model protocols with zen and upstream
2 parents d88ebad + b488984 commit 140ab34

3 files changed

Lines changed: 117 additions & 16 deletions

File tree

‎packages/opencode-go/src/endpoint.test.ts‎

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,19 @@ describe("protocolForGoModel", () => {
1717
expect(protocolForGoModel("muse-spark-1.3-contributor")).toBe("responses");
1818
expect(protocolForGoModel("muse-spark-1.2-contributor")).toBe("responses");
1919
expect(protocolForGoModel("minimax-m3")).toBe("messages");
20+
expect(protocolForGoModel("minimax-m2.7")).toBe("messages");
21+
expect(protocolForGoModel("minimax-m2.5")).toBe("messages");
22+
expect(protocolForGoModel("qwen3.8-max")).toBe("messages");
23+
expect(protocolForGoModel("grok-4.5")).toBe("responses");
24+
expect(protocolForGoModel("grok-4.7")).toBe("responses");
25+
expect(protocolForGoModel("gpt-6-luna")).toBe("responses");
26+
expect(protocolForGoModel("claude-haiku-5-5")).toBe("messages");
27+
expect(protocolForGoModel("qwen3.8-flash")).toBe("messages");
28+
expect(protocolForGoModel("glm-5.3")).toBe("chat-completions");
29+
expect(protocolForGoModel("deepseek-v4.1-flash")).toBe("chat-completions");
30+
expect(protocolForGoModel("mimo-v2.6-flash")).toBe("chat-completions");
31+
expect(protocolForGoModel("hy4-preview")).toBe("chat-completions");
32+
expect(protocolForGoModel("space-bunny")).toBe("chat-completions");
2033
});
2134

2235
test("returns undefined for unknown models", () => {
@@ -63,10 +76,50 @@ describe("resolveGoEndpoint", () => {
6376
});
6477

6578
test("routes messages models to anthropic base", () => {
66-
const ep = resolveGoEndpoint("minimax-m3");
67-
expect(ep.adapter).toBe("anthropic");
68-
expect(ep.protocol).toBe("messages");
69-
expect(ep.baseURL).toBe("https://opencode.ai/zen/go");
79+
for (const id of [
80+
"minimax-m3",
81+
"minimax-m2.7",
82+
"minimax-m2.5",
83+
"qwen3.8-max",
84+
"qwen3.8-flash",
85+
"claude-haiku-5-5",
86+
"qwen3.7-max",
87+
]) {
88+
const ep = resolveGoEndpoint(id);
89+
expect(ep.adapter).toBe("anthropic");
90+
expect(ep.protocol).toBe("messages");
91+
expect(ep.baseURL).toBe("https://opencode.ai/zen/go");
92+
}
93+
});
94+
95+
test("routes responses models to openai-responses adapter (live Go docs)", () => {
96+
for (const id of ["grok-4.7", "grok-4.6", "grok-4.5", "gpt-6-luna"]) {
97+
const ep = resolveGoEndpoint(id);
98+
expect(ep.adapter).toBe("openai-responses");
99+
expect(ep.protocol).toBe("responses");
100+
expect(ep.baseURL).toContain("/zen/go/v1");
101+
}
102+
});
103+
104+
test("routes new chat-completions models to openai-compatible base (live Go docs)", () => {
105+
for (const id of [
106+
"glm-5.3-flash",
107+
"glm-5.3",
108+
"longcat-2.0",
109+
"longcat-2.5-preview-free",
110+
"step-5-preview-free",
111+
"deepseek-v4.1-flash",
112+
"deepseek-v4-flash-vision-exp",
113+
"mimo-v2.6-flash",
114+
"mimo-v2.6-pro",
115+
"hy4-preview",
116+
"space-bunny",
117+
]) {
118+
const ep = resolveGoEndpoint(id);
119+
expect(ep.adapter).toBe("openai-compatible");
120+
expect(ep.protocol).toBe("chat-completions");
121+
expect(ep.baseURL).toContain("/zen/go/v1");
122+
}
70123
});
71124

72125
test("unknown models default to chat-completions", () => {
@@ -136,6 +189,8 @@ describe("buildGoCatalogEntry", () => {
136189
expect(entry.name).toBe("opencode-go");
137190
expect(entry.models.length).toBeGreaterThan(0);
138191
expect(entry.protocols["minimax-m3"]).toBe("messages");
192+
expect(entry.protocols["qwen3.8-max"]).toBe("messages");
193+
expect(entry.protocols["grok-4.5"]).toBe("responses");
139194
expect(entry.protocols["kimi-k2.7-code"]).toBe("chat-completions");
140195
});
141196
});

‎packages/opencode-go/src/models.ts‎

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Selectable ids come from live GET /zen/go/v1/models in the host; this
33
// packaged list is used when that fetch has not succeeded. Protocol
44
// routing stays here. Live ids absent from PROTOCOL_BY_ID use Chat Completions.
5+
// MiniMax and Qwen3.8 Max are messages on Go, unlike Zen chat-completions.
56

67
export type GoProtocol = "chat-completions" | "responses" | "messages";
78

@@ -12,7 +13,10 @@ interface GoModel {
1213
}
1314

1415
export const OPENCODE_GO_MODELS = [
15-
{ id: "grok-4.5", name: "Grok 4.5", protocol: "chat-completions" },
16+
{ id: "grok-4.7", name: "Grok 4.7", protocol: "responses" },
17+
{ id: "grok-4.6", name: "Grok 4.6", protocol: "responses" },
18+
{ id: "grok-4.5", name: "Grok 4.5", protocol: "responses" },
19+
{ id: "gpt-6-luna", name: "GPT 6 Luna", protocol: "responses" },
1620
{ id: "gpt-5.6-luna", name: "GPT 5.6 Luna", protocol: "responses" },
1721
{
1822
id: "muse-spark-1.3-contributor",
@@ -24,6 +28,17 @@ export const OPENCODE_GO_MODELS = [
2428
name: "Muse Spark 1.2 Contributor",
2529
protocol: "responses",
2630
},
31+
{ id: "claude-haiku-5-5", name: "Claude Haiku 5.5", protocol: "messages" },
32+
{ id: "minimax-m3", name: "MiniMax M3", protocol: "messages" },
33+
{ id: "minimax-m2.7", name: "MiniMax M2.7", protocol: "messages" },
34+
{ id: "minimax-m2.5", name: "MiniMax M2.5", protocol: "messages" },
35+
{ id: "qwen3.8-max", name: "Qwen3.8 Max", protocol: "messages" },
36+
{ id: "qwen3.8-flash", name: "Qwen3.8 Flash", protocol: "messages" },
37+
{ id: "qwen3.7-max", name: "Qwen3.7 Max", protocol: "messages" },
38+
{ id: "qwen3.7-plus", name: "Qwen3.7 Plus", protocol: "messages" },
39+
{ id: "qwen3.6-plus", name: "Qwen3.6 Plus", protocol: "messages" },
40+
{ id: "glm-5.3-flash", name: "GLM-5.3-Flash", protocol: "chat-completions" },
41+
{ id: "glm-5.3", name: "GLM-5.3", protocol: "chat-completions" },
2742
{ id: "glm-5.2", name: "GLM-5.2", protocol: "chat-completions" },
2843
{ id: "glm-5.1", name: "GLM-5.1", protocol: "chat-completions" },
2944
{ id: "kimi-k3", name: "Kimi K3", protocol: "chat-completions" },
@@ -33,6 +48,22 @@ export const OPENCODE_GO_MODELS = [
3348
protocol: "chat-completions",
3449
},
3550
{ id: "kimi-k2.6", name: "Kimi K2.6", protocol: "chat-completions" },
51+
{ id: "longcat-2.0", name: "LongCat-2.0", protocol: "chat-completions" },
52+
{
53+
id: "longcat-2.5-preview-free",
54+
name: "LongCat 2.5 Preview Free",
55+
protocol: "chat-completions",
56+
},
57+
{
58+
id: "step-5-preview-free",
59+
name: "Step 5 Preview Free",
60+
protocol: "chat-completions",
61+
},
62+
{
63+
id: "deepseek-v4.1-flash",
64+
name: "DeepSeek V4.1 Flash",
65+
protocol: "chat-completions",
66+
},
3667
{
3768
id: "deepseek-v4-pro",
3869
name: "DeepSeek V4 Pro",
@@ -43,16 +74,22 @@ export const OPENCODE_GO_MODELS = [
4374
name: "DeepSeek V4 Flash",
4475
protocol: "chat-completions",
4576
},
77+
{
78+
id: "deepseek-v4-flash-vision-exp",
79+
name: "DeepSeek V4 Flash Vision Exp",
80+
protocol: "chat-completions",
81+
},
82+
{
83+
id: "mimo-v2.6-flash",
84+
name: "MiMo-V2.6-Flash",
85+
protocol: "chat-completions",
86+
},
87+
{ id: "mimo-v2.6-pro", name: "MiMo-V2.6-Pro", protocol: "chat-completions" },
4688
{ id: "mimo-v2.5", name: "MiMo-V2.5", protocol: "chat-completions" },
4789
{ id: "mimo-v2.5-pro", name: "MiMo-V2.5-Pro", protocol: "chat-completions" },
48-
{ id: "minimax-m3", name: "MiniMax M3", protocol: "messages" },
49-
{ id: "minimax-m2.7", name: "MiniMax M2.7", protocol: "messages" },
50-
{ id: "minimax-m2.5", name: "MiniMax M2.5", protocol: "messages" },
51-
{ id: "qwen3.8-max", name: "Qwen3.8 Max", protocol: "messages" },
52-
{ id: "qwen3.7-max", name: "Qwen3.7 Max", protocol: "messages" },
53-
{ id: "qwen3.7-plus", name: "Qwen3.7 Plus", protocol: "messages" },
54-
{ id: "qwen3.6-plus", name: "Qwen3.6 Plus", protocol: "messages" },
90+
{ id: "hy4-preview", name: "Hy4 Preview", protocol: "chat-completions" },
5591
{ id: "hy3", name: "Hy3", protocol: "chat-completions" },
92+
{ id: "space-bunny", name: "Space Bunny", protocol: "chat-completions" },
5693
] as const satisfies readonly GoModel[];
5794

5895
export type GoModelId = (typeof OPENCODE_GO_MODELS)[number]["id"];

‎src/config/inference-sources.test.ts‎

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -478,14 +478,23 @@ describe("protocol flag routing", () => {
478478
expect(responses?.provider).toBe("openai-responses");
479479
expect(responses?.baseURL).toBe("https://opencode.ai/zen/go/v1");
480480

481-
const messages = buildInferenceSourceForRef(
481+
const minimax = buildInferenceSourceForRef(
482482
{ provider: "opencode-go", model: "minimax-m3" },
483483
ctx,
484484
undefined,
485485
);
486-
expect(messages?.provider).toBe("opencode-go-messages");
487-
expect(messages?.baseURL).toBe("https://opencode.ai/zen/go");
488-
expect(messages?.model).toBe("minimax-m3");
486+
expect(minimax?.provider).toBe("opencode-go-messages");
487+
expect(minimax?.baseURL).toBe("https://opencode.ai/zen/go");
488+
expect(minimax?.model).toBe("minimax-m3");
489+
490+
const qwenMax = buildInferenceSourceForRef(
491+
{ provider: "opencode-go", model: "qwen3.8-max" },
492+
ctx,
493+
undefined,
494+
);
495+
expect(qwenMax?.provider).toBe("opencode-go-messages");
496+
expect(qwenMax?.baseURL).toBe("https://opencode.ai/zen/go");
497+
expect(qwenMax?.model).toBe("qwen3.8-max");
489498
});
490499
});
491500

0 commit comments

Comments
 (0)