Skip to content

Commit 9faaa78

Browse files
authored
fix(opencode): sync Zen runtime catalog (#113858)
1 parent 731a5d1 commit 9faaa78

2 files changed

Lines changed: 27 additions & 21 deletions

File tree

extensions/opencode/index.test.ts

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ describe("opencode provider plugin", () => {
8484

8585
const expectedModelIds = [
8686
"claude-fable-5",
87+
"claude-opus-5",
8788
"claude-opus-4-8",
8889
"claude-opus-4-7",
8990
"claude-opus-4-6",
@@ -137,7 +138,8 @@ describe("opencode provider plugin", () => {
137138
"big-pickle",
138139
"deepseek-v4-flash-free",
139140
"mimo-v2.5-free",
140-
"hy3-free",
141+
"laguna-s-2.1-free",
142+
"ling-3.0-flash-free",
141143
"nemotron-3-ultra-free",
142144
"north-mini-code-free",
143145
];
@@ -266,15 +268,6 @@ describe("opencode provider plugin", () => {
266268
],
267269
},
268270
});
269-
expect(requireMapEntry(models, "hy3-free")).toMatchObject({
270-
name: "Hy3 Free",
271-
api: "openai-completions",
272-
baseUrl: "https://opencode.ai/zen/v1",
273-
input: ["text"],
274-
contextWindow: 256_000,
275-
maxTokens: 64_000,
276-
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
277-
});
278271
expect(requireMapEntry(models, "kimi-k2.7-code")).toMatchObject({
279272
name: "Kimi K2.7 Code",
280273
api: "openai-completions",
@@ -413,6 +406,7 @@ describe("opencode provider plugin", () => {
413406

414407
const verifiedCostExamples = new Map([
415408
["claude-fable-5", { input: 10, output: 50, cacheRead: 1, cacheWrite: 12.5 }],
409+
["claude-opus-5", { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 }],
416410
["claude-opus-4-8", { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 }],
417411
["claude-opus-4-5", { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 }],
418412
["claude-opus-4-1", { input: 15, output: 75, cacheRead: 1.5, cacheWrite: 18.75 }],
@@ -470,8 +464,10 @@ describe("opencode provider plugin", () => {
470464
],
471465
["gpt-5.4-mini", { input: 0.75, output: 4.5, cacheRead: 0.075, cacheWrite: 0 }],
472466
["glm-5.2", { input: 1.4, output: 4.4, cacheRead: 0.26, cacheWrite: 0 }],
473-
["hy3-free", { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }],
474467
["kimi-k2.7-code", { input: 0.95, output: 4, cacheRead: 0.19, cacheWrite: 0 }],
468+
["laguna-s-2.1-free", { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }],
469+
["ling-3.0-flash-free", { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }],
470+
["minimax-m2.5", { input: 0.3, output: 1.2, cacheRead: 0.06, cacheWrite: 0 }],
475471
["minimax-m2.7", { input: 0.3, output: 1.2, cacheRead: 0.06, cacheWrite: 0 }],
476472
["minimax-m3", { input: 0.3, output: 1.2, cacheRead: 0.06, cacheWrite: 0 }],
477473
] as const);
@@ -510,12 +506,12 @@ describe("opencode provider plugin", () => {
510506
throw new Error("expected OpenCode Zen static provider");
511507
}
512508

513-
expect(result.provider.models).toHaveLength(57);
509+
expect(result.provider.models).toHaveLength(59);
510+
expect(result.provider.models.map((model) => model.id)).toContain("claude-opus-5");
514511
expect(result.provider.models.map((model) => model.id)).toContain("claude-opus-4-8");
515512
expect(result.provider.models.map((model) => model.id)).toContain("claude-sonnet-5");
516513
expect(result.provider.models.map((model) => model.id)).toContain("glm-5.2");
517514
expect(result.provider.models.map((model) => model.id)).toContain("grok-4.5");
518-
expect(result.provider.models.map((model) => model.id)).toContain("hy3-free");
519515
expect(result.provider.models.map((model) => model.id)).toContain("kimi-k2.7-code");
520516
expect(result.provider.models.map((model) => model.id)).toContain("minimax-m2.7");
521517
expect(result.provider.models.map((model) => model.id)).toContain("minimax-m3");
@@ -534,7 +530,8 @@ describe("opencode provider plugin", () => {
534530
throw new Error("expected registered OpenCode Zen static provider");
535531
}
536532

537-
expect(result.provider.models).toHaveLength(57);
533+
expect(result.provider.models).toHaveLength(59);
534+
expect(result.provider.models.map((model) => model.id)).toContain("claude-opus-5");
538535
expect(result.provider.models.map((model) => model.id)).toContain("claude-sonnet-5");
539536
expect(result.provider.models.map((model) => model.id)).toContain("gpt-5.6-sol");
540537
expect(result.provider.models.map((model) => model.id)).toContain("minimax-m3");

extensions/opencode/provider-catalog.ts

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,20 +29,23 @@ const FREE_COST: ModelDefinitionConfig["cost"] = {
2929

3030
// Zen publishes route-specific limits that differ from the family defaults below.
3131
const MODEL_LIMITS: Record<string, { contextWindow: number; maxTokens: number }> = {
32+
"claude-opus-5": { contextWindow: 1_000_000, maxTokens: 128_000 },
3233
"claude-sonnet-5": { contextWindow: 1_000_000, maxTokens: 128_000 },
3334
"gpt-5.6-luna": { contextWindow: 1_050_000, maxTokens: 128_000 },
3435
"gpt-5.6-sol": { contextWindow: 1_050_000, maxTokens: 128_000 },
3536
"gpt-5.6-terra": { contextWindow: 1_050_000, maxTokens: 128_000 },
3637
"glm-5.2": { contextWindow: 1_000_000, maxTokens: 131_072 },
3738
"grok-4.5": { contextWindow: 500_000, maxTokens: 500_000 },
38-
"hy3-free": { contextWindow: 256_000, maxTokens: 64_000 },
3939
"kimi-k2.7-code": { contextWindow: 262_144, maxTokens: 262_144 },
40+
"laguna-s-2.1-free": { contextWindow: 256_000, maxTokens: 32_000 },
41+
"ling-3.0-flash-free": { contextWindow: 262_144, maxTokens: 32_768 },
4042
"minimax-m3": { contextWindow: 512_000, maxTokens: 128_000 },
4143
};
4244

4345
// These rows are the inverse of their family's usual image-input capability.
4446
const MODEL_IMAGE_INPUT_OVERRIDES = new Map<string, boolean>([
45-
["hy3-free", false],
47+
["laguna-s-2.1-free", false],
48+
["ling-3.0-flash-free", false],
4649
["minimax-m3", true],
4750
]);
4851

@@ -55,6 +58,7 @@ const MODEL_COSTS: Record<string, ModelDefinitionConfig["cost"]> = {
5558
"claude-opus-4-6": { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 },
5659
"claude-opus-4-7": { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 },
5760
"claude-opus-4-8": { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 },
61+
"claude-opus-5": { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 },
5862
"claude-sonnet-4": {
5963
input: 3,
6064
output: 15,
@@ -173,13 +177,14 @@ const MODEL_COSTS: Record<string, ModelDefinitionConfig["cost"]> = {
173177
{ input: 4, output: 12, cacheRead: 1, cacheWrite: 0, range: [200_000] },
174178
],
175179
},
176-
"hy3-free": FREE_COST,
177180
"kimi-k2.5": { input: 0.6, output: 3, cacheRead: 0.1, cacheWrite: 0 },
178181
"kimi-k2.6": { input: 0.95, output: 4, cacheRead: 0.16, cacheWrite: 0 },
179182
"kimi-k2.7-code": { input: 0.95, output: 4, cacheRead: 0.19, cacheWrite: 0 },
183+
"laguna-s-2.1-free": FREE_COST,
184+
"ling-3.0-flash-free": FREE_COST,
180185
"mimo-v2.5-free": FREE_COST,
181-
"minimax-m2.5": { input: 0.3, output: 1.2, cacheRead: 0.06, cacheWrite: 0.375 },
182-
"minimax-m2.7": { input: 0.3, output: 1.2, cacheRead: 0.06, cacheWrite: 0.375 },
186+
"minimax-m2.5": { input: 0.3, output: 1.2, cacheRead: 0.06, cacheWrite: 0 },
187+
"minimax-m2.7": { input: 0.3, output: 1.2, cacheRead: 0.06, cacheWrite: 0 },
183188
"minimax-m3": { input: 0.3, output: 1.2, cacheRead: 0.06, cacheWrite: 0 },
184189
"nemotron-3-ultra-free": FREE_COST,
185190
"north-mini-code-free": FREE_COST,
@@ -196,6 +201,7 @@ const MODEL_NAMES: Record<string, string> = {
196201
"claude-opus-4-6": "Claude Opus 4.6",
197202
"claude-opus-4-7": "Claude Opus 4.7",
198203
"claude-opus-4-8": "Claude Opus 4.8",
204+
"claude-opus-5": "Claude Opus 5",
199205
"claude-sonnet-4": "Claude Sonnet 4",
200206
"claude-sonnet-4-5": "Claude Sonnet 4.5",
201207
"claude-sonnet-4-6": "Claude Sonnet 4.6",
@@ -233,10 +239,11 @@ const MODEL_NAMES: Record<string, string> = {
233239
"gpt-5.5-pro": "GPT-5.5 Pro",
234240
"grok-build-0.1": "Grok Build 0.1",
235241
"grok-4.5": "Grok 4.5",
236-
"hy3-free": "Hy3 Free",
237242
"kimi-k2.5": "Kimi K2.5",
238243
"kimi-k2.6": "Kimi K2.6",
239244
"kimi-k2.7-code": "Kimi K2.7 Code",
245+
"laguna-s-2.1-free": "Laguna S 2.1 Free",
246+
"ling-3.0-flash-free": "Ling-3.0-flash Free",
240247
"mimo-v2.5-free": "MiMo V2.5 Free",
241248
"minimax-m2.5": "MiniMax M2.5",
242249
"minimax-m2.7": "MiniMax M2.7",
@@ -396,6 +403,7 @@ function buildOpencodeZenModel(modelId: string): OpencodeZenModelDefinition {
396403

397404
const OPENCODE_ZEN_MODELS = [
398405
"claude-fable-5",
406+
"claude-opus-5",
399407
"claude-opus-4-8",
400408
"claude-opus-4-7",
401409
"claude-opus-4-6",
@@ -449,7 +457,8 @@ const OPENCODE_ZEN_MODELS = [
449457
"big-pickle",
450458
"deepseek-v4-flash-free",
451459
"mimo-v2.5-free",
452-
"hy3-free",
460+
"laguna-s-2.1-free",
461+
"ling-3.0-flash-free",
453462
"nemotron-3-ultra-free",
454463
"north-mini-code-free",
455464
].map(buildOpencodeZenModel);

0 commit comments

Comments
 (0)