From 2b93f2d16da3aa097dd1d4675f33e9bd799d14fb Mon Sep 17 00:00:00 2001 From: imranshaiedi-byte Date: Mon, 15 Jun 2026 22:26:05 +0800 Subject: [PATCH 1/4] fix(opencode): expose High/Max thinking variants for GLM-5.2 --- packages/opencode/src/provider/transform.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index 027efc0974b0..48cc375debda 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -677,6 +677,15 @@ export function variants(model: Provider.Model): Record Date: Sat, 20 Jun 2026 16:48:32 -0500 Subject: [PATCH 2/4] fix(opencode): handle GLM-5.2 provider variants --- packages/opencode/src/provider/transform.ts | 20 ++++-- .../opencode/test/provider/transform.test.ts | 64 +++++++++++++++++++ 2 files changed, 79 insertions(+), 5 deletions(-) diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index 48cc375debda..8f21f298d9f0 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -677,22 +677,32 @@ export function variants(model: Provider.Model): Record { expect(result).toEqual({}) }) + test("glm-5.2 returns native effort variants for openai-compatible providers", () => { + const model = createMockModel({ + id: "zhipuai/glm-5.2", + providerID: "zhipuai", + api: { + id: "glm-5.2", + url: "https://open.bigmodel.cn/api/paas/v4", + npm: "@ai-sdk/openai-compatible", + }, + }) + expect(ProviderTransform.variants(model)).toEqual({ + high: { reasoningEffort: "high" }, + max: { reasoningEffort: "max" }, + }) + }) + + test("glm-5.2 returns openrouter effort variants for openrouter", () => { + const model = createMockModel({ + id: "openrouter/z-ai/glm-5.2", + providerID: "openrouter", + api: { + id: "z-ai/glm-5.2", + url: "https://openrouter.ai/api/v1", + npm: "@openrouter/ai-sdk-provider", + }, + }) + expect(ProviderTransform.variants(model)).toEqual({ + high: { reasoning: { effort: "high" } }, + xhigh: { reasoning: { effort: "xhigh" } }, + }) + }) + + test("glm-5.2 returns effort variants for anthropic-compatible providers", () => { + const model = createMockModel({ + id: "zai-coding-plan/glm-5.2", + providerID: "zai-coding-plan", + api: { + id: "glm-5.2", + url: "https://api.z.ai/api/anthropic", + npm: "@ai-sdk/anthropic", + }, + }) + expect(ProviderTransform.variants(model)).toEqual({ + high: { effort: "high" }, + max: { effort: "max" }, + }) + }) + + test("glm-5.2 falls back to provider defaults for other packages", () => { + const model = createMockModel({ + id: "test/glm-5.2", + api: { + id: "glm-5.2", + url: "https://api.test.com", + npm: "@ai-sdk/amazon-bedrock", + }, + }) + expect(ProviderTransform.variants(model)).toEqual({ + low: { reasoningConfig: { type: "enabled", maxReasoningEffort: "low" } }, + medium: { reasoningConfig: { type: "enabled", maxReasoningEffort: "medium" } }, + high: { reasoningConfig: { type: "enabled", maxReasoningEffort: "high" } }, + }) + }) + test("mistral models with reasoning support return variants", () => { const model = createMockModel({ id: "mistral/mistral-small-latest", From a30ab81f1fa443fdbc3a2c71360f90850c59a413 Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Sat, 20 Jun 2026 16:51:21 -0500 Subject: [PATCH 3/4] fix(opencode): recognize GLM-5.2 model IDs --- packages/opencode/src/provider/transform.ts | 10 ++-- .../opencode/test/provider/transform.test.ts | 48 +++++++++++++++++++ 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index 8f21f298d9f0..c6f4b4fe4c1e 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -539,6 +539,7 @@ const GPT5_FAMILY_RE = /(?:^|\/)gpt-5(?:[.-]|$)/ const GPT5_VERSION_RE = /(?:^|\/)gpt-5[.-](\d+)(?:[.-]|$)/ const GPT5_PRO_RE = /(?:^|\/)gpt-5[.-]?pro(?:[.-]|$)/ const GPT5_VERSIONED_PRO_RE = /(?:^|\/)gpt-5[.-]\d+[.-]pro(?:[.-]|$)/ +const GLM52_RE = /(?:^|[\/_-])glm[-_.]?5(?:[._-]|p)2(?:\D|$)/ function gpt5Version(apiId: string) { return Number(GPT5_VERSION_RE.exec(apiId)?.[1]) || undefined @@ -666,6 +667,7 @@ export function variants(model: Provider.Model): Record { }) }) + for (const id of [ + "fireworks-ai/accounts/fireworks/models/glm-5p2", + "venice/zai-org-glm-5-2", + "umans-ai/umans-glm-5.2", + ]) { + test(`recognizes GLM-5.2 model ID ${id}`, () => { + const model = createMockModel({ + id, + api: { + id: id.slice(id.indexOf("/") + 1), + url: "https://api.test.com", + npm: "@ai-sdk/openai-compatible", + }, + }) + expect(ProviderTransform.variants(model)).toEqual({ + high: { reasoningEffort: "high" }, + max: { reasoningEffort: "max" }, + }) + }) + } + + test("recognizes GLM-5.2 from the API ID when the configured model ID is an alias", () => { + const model = createMockModel({ + id: "custom/my-glm", + api: { + id: "accounts/fireworks/models/glm-5p2", + url: "https://api.fireworks.ai/inference/v1", + npm: "@ai-sdk/openai-compatible", + }, + }) + expect(ProviderTransform.variants(model)).toEqual({ + high: { reasoningEffort: "high" }, + max: { reasoningEffort: "max" }, + }) + }) + + test("does not recognize GLM-5.20 as GLM-5.2", () => { + const model = createMockModel({ + id: "zhipuai/glm-5.20", + api: { + id: "glm-5.20", + url: "https://open.bigmodel.cn/api/paas/v4", + npm: "@ai-sdk/openai-compatible", + }, + }) + expect(ProviderTransform.variants(model)).toEqual({}) + }) + test("glm-5.2 returns openrouter effort variants for openrouter", () => { const model = createMockModel({ id: "openrouter/z-ai/glm-5.2", From fda0e354d3fd76e3a4b529b9b1d46a26cfb7c3ee Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Sat, 20 Jun 2026 16:53:40 -0500 Subject: [PATCH 4/4] refactor(opencode): simplify GLM-5.2 matching --- packages/opencode/src/provider/transform.ts | 5 ++-- .../opencode/test/provider/transform.test.ts | 28 ++++--------------- 2 files changed, 9 insertions(+), 24 deletions(-) diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index c6f4b4fe4c1e..2aa6d7ca78be 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -539,7 +539,6 @@ const GPT5_FAMILY_RE = /(?:^|\/)gpt-5(?:[.-]|$)/ const GPT5_VERSION_RE = /(?:^|\/)gpt-5[.-](\d+)(?:[.-]|$)/ const GPT5_PRO_RE = /(?:^|\/)gpt-5[.-]?pro(?:[.-]|$)/ const GPT5_VERSIONED_PRO_RE = /(?:^|\/)gpt-5[.-]\d+[.-]pro(?:[.-]|$)/ -const GLM52_RE = /(?:^|[\/_-])glm[-_.]?5(?:[._-]|p)2(?:\D|$)/ function gpt5Version(apiId: string) { return Number(GPT5_VERSION_RE.exec(apiId)?.[1]) || undefined @@ -667,7 +666,9 @@ export function variants(model: Provider.Model): Record id.includes(name) || model.api.id.toLowerCase().includes(name), + ) if ( model.api.id.toLowerCase().includes("minimax-m3") && ["@ai-sdk/anthropic", "@ai-sdk/openai-compatible"].includes(model.api.npm) diff --git a/packages/opencode/test/provider/transform.test.ts b/packages/opencode/test/provider/transform.test.ts index 044b14442674..14d6f83b708d 100644 --- a/packages/opencode/test/provider/transform.test.ts +++ b/packages/opencode/test/provider/transform.test.ts @@ -2710,16 +2710,12 @@ describe("ProviderTransform.variants", () => { }) }) - for (const id of [ - "fireworks-ai/accounts/fireworks/models/glm-5p2", - "venice/zai-org-glm-5-2", - "umans-ai/umans-glm-5.2", - ]) { - test(`recognizes GLM-5.2 model ID ${id}`, () => { + test("recognizes GLM-5.2 provider model IDs", () => { + for (const id of ["accounts/fireworks/models/glm-5p2", "zai-org-glm-5-2", "umans-glm-5.2"]) { const model = createMockModel({ - id, + id: `test/${id}`, api: { - id: id.slice(id.indexOf("/") + 1), + id, url: "https://api.test.com", npm: "@ai-sdk/openai-compatible", }, @@ -2728,8 +2724,8 @@ describe("ProviderTransform.variants", () => { high: { reasoningEffort: "high" }, max: { reasoningEffort: "max" }, }) - }) - } + } + }) test("recognizes GLM-5.2 from the API ID when the configured model ID is an alias", () => { const model = createMockModel({ @@ -2746,18 +2742,6 @@ describe("ProviderTransform.variants", () => { }) }) - test("does not recognize GLM-5.20 as GLM-5.2", () => { - const model = createMockModel({ - id: "zhipuai/glm-5.20", - api: { - id: "glm-5.20", - url: "https://open.bigmodel.cn/api/paas/v4", - npm: "@ai-sdk/openai-compatible", - }, - }) - expect(ProviderTransform.variants(model)).toEqual({}) - }) - test("glm-5.2 returns openrouter effort variants for openrouter", () => { const model = createMockModel({ id: "openrouter/z-ai/glm-5.2",