From dbd117a538ea777ef2d5a027af01747f04282f74 Mon Sep 17 00:00:00 2001 From: R44VC0RP Date: Fri, 30 Jan 2026 15:52:06 -0500 Subject: [PATCH] fix(provider): exclude chat models from textVerbosity setting GPT-5.x chat models (e.g. gpt-5.2-chat-latest) only support 'medium' verbosity, but the transform code was incorrectly setting 'low' for them. The condition checked for 'gpt-5-chat' (dash) but missed 'gpt-5.2-chat' (dot-versioned chat models). Added check for '-chat' suffix to exclude all chat model variants. Fixes #9969 --- packages/opencode/src/provider/transform.ts | 3 + .../opencode/test/provider/transform.test.ts | 72 +++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index 6ca089c2f0d..dcc2605ab64 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -594,9 +594,12 @@ export namespace ProviderTransform { result["reasoningEffort"] = "medium" } + // Only set textVerbosity for non-chat gpt-5.x models + // Chat models (e.g. gpt-5.2-chat-latest) only support "medium" verbosity if ( input.model.api.id.includes("gpt-5.") && !input.model.api.id.includes("codex") && + !input.model.api.id.includes("-chat") && input.model.providerID !== "azure" ) { result["textVerbosity"] = "low" diff --git a/packages/opencode/test/provider/transform.test.ts b/packages/opencode/test/provider/transform.test.ts index 1d69a2a2951..b818ab98cfa 100644 --- a/packages/opencode/test/provider/transform.test.ts +++ b/packages/opencode/test/provider/transform.test.ts @@ -103,6 +103,78 @@ describe("ProviderTransform.options - setCacheKey", () => { }) }) +describe("ProviderTransform.options - gpt-5 textVerbosity", () => { + const sessionID = "test-session-123" + + const createGpt5Model = (apiId: string) => + ({ + id: `openai/${apiId}`, + providerID: "openai", + api: { + id: apiId, + url: "https://api.openai.com", + npm: "@ai-sdk/openai", + }, + name: apiId, + capabilities: { + temperature: true, + reasoning: true, + attachment: true, + toolcall: true, + input: { text: true, audio: false, image: true, video: false, pdf: false }, + output: { text: true, audio: false, image: false, video: false, pdf: false }, + interleaved: false, + }, + cost: { input: 0.03, output: 0.06, cache: { read: 0.001, write: 0.002 } }, + limit: { context: 128000, output: 4096 }, + status: "active", + options: {}, + headers: {}, + }) as any + + test("gpt-5.2 should have textVerbosity set to low", () => { + const model = createGpt5Model("gpt-5.2") + const result = ProviderTransform.options({ model, sessionID, providerOptions: {} }) + expect(result.textVerbosity).toBe("low") + }) + + test("gpt-5.1 should have textVerbosity set to low", () => { + const model = createGpt5Model("gpt-5.1") + const result = ProviderTransform.options({ model, sessionID, providerOptions: {} }) + expect(result.textVerbosity).toBe("low") + }) + + test("gpt-5.2-chat-latest should NOT have textVerbosity set (only supports medium)", () => { + const model = createGpt5Model("gpt-5.2-chat-latest") + const result = ProviderTransform.options({ model, sessionID, providerOptions: {} }) + expect(result.textVerbosity).toBeUndefined() + }) + + test("gpt-5.1-chat-latest should NOT have textVerbosity set (only supports medium)", () => { + const model = createGpt5Model("gpt-5.1-chat-latest") + const result = ProviderTransform.options({ model, sessionID, providerOptions: {} }) + expect(result.textVerbosity).toBeUndefined() + }) + + test("gpt-5.2-chat should NOT have textVerbosity set", () => { + const model = createGpt5Model("gpt-5.2-chat") + const result = ProviderTransform.options({ model, sessionID, providerOptions: {} }) + expect(result.textVerbosity).toBeUndefined() + }) + + test("gpt-5-chat should NOT have textVerbosity set", () => { + const model = createGpt5Model("gpt-5-chat") + const result = ProviderTransform.options({ model, sessionID, providerOptions: {} }) + expect(result.textVerbosity).toBeUndefined() + }) + + test("gpt-5.2-codex should NOT have textVerbosity set (codex models excluded)", () => { + const model = createGpt5Model("gpt-5.2-codex") + const result = ProviderTransform.options({ model, sessionID, providerOptions: {} }) + expect(result.textVerbosity).toBeUndefined() + }) +}) + describe("ProviderTransform.maxOutputTokens", () => { test("returns 32k when modelLimit > 32k", () => { const modelLimit = 100000