From 026644f0b2b1df3915da63fc7980f305d44a466b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B5=A9=E6=9D=B0?= Date: Sat, 11 Apr 2026 16:34:46 +0800 Subject: [PATCH] fix: handle invalid maxOutputTokens value (0 or undefined) Fixes #21858 Fixes #21522 - Returns OUTPUT_TOKEN_MAX when model.limit.output is 0, undefined, or negative - Adds unit tests for maxOutputTokens function --- packages/opencode/src/provider/transform.ts | 6 ++- .../opencode/test/provider/transform.test.ts | 48 +++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index 11183209921..f77378b867f 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -945,7 +945,11 @@ export namespace ProviderTransform { } export function maxOutputTokens(model: Provider.Model): number { - return Math.min(model.limit.output, OUTPUT_TOKEN_MAX) || OUTPUT_TOKEN_MAX + const output = model.limit.output + if (!output || output <= 0) { + return OUTPUT_TOKEN_MAX + } + return Math.min(output, OUTPUT_TOKEN_MAX) } export function schema(model: Provider.Model, schema: JSONSchema.BaseSchema | JSONSchema7): JSONSchema7 { diff --git a/packages/opencode/test/provider/transform.test.ts b/packages/opencode/test/provider/transform.test.ts index 0aee396f44a..a44849b3899 100644 --- a/packages/opencode/test/provider/transform.test.ts +++ b/packages/opencode/test/provider/transform.test.ts @@ -2837,3 +2837,51 @@ describe("ProviderTransform.variants", () => { }) }) }) + +describe("ProviderTransform.maxOutputTokens", () => { + const OUTPUT_TOKEN_MAX = 32000 + + const createMockModel = (overrides: any = {}) => ({ + id: "test/model", + providerID: "test", + api: { id: "test", url: "https://test.com", npm: "@ai-sdk/test" }, + name: "Test Model", + capabilities: { reasoning: false, toolcall: true, attachment: true }, + limit: { context: 128000, output: 8192 }, + status: "active", + options: {}, + headers: {}, + ...overrides, + }) + + test("should return model output limit when valid", () => { + const model = createMockModel({ limit: { context: 200000, output: 64000 } }) + const result = ProviderTransform.maxOutputTokens(model) + // Should be min of model output limit (64000) and OUTPUT_TOKEN_MAX (32000) + expect(result).toBe(32000) + }) + + test("should return OUTPUT_TOKEN_MAX when model limit.output is undefined", () => { + const model = createMockModel({ limit: { context: 128000 } }) + const result = ProviderTransform.maxOutputTokens(model) + expect(result).toBe(OUTPUT_TOKEN_MAX) + }) + + test("should return OUTPUT_TOKEN_MAX when model limit.output is 0", () => { + const model = createMockModel({ limit: { context: 128000, output: 0 } }) + const result = ProviderTransform.maxOutputTokens(model) + expect(result).toBe(OUTPUT_TOKEN_MAX) + }) + + test("should return OUTPUT_TOKEN_MAX when model limit.output is negative", () => { + const model = createMockModel({ limit: { context: 128000, output: -1 } }) + const result = ProviderTransform.maxOutputTokens(model) + expect(result).toBe(OUTPUT_TOKEN_MAX) + }) + + test("should return min of model limit and OUTPUT_TOKEN_MAX", () => { + const model = createMockModel({ limit: { context: 128000, output: 16000 } }) + const result = ProviderTransform.maxOutputTokens(model) + expect(result).toBe(16000) + }) +})