diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index 0ebd8bbf59fe..e927af4ab26a 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -1000,7 +1000,11 @@ export function providerOptions(model: Provider.Model, options: { [x: string]: a } 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 e195d9b17720..2d83b01b93d6 100644 --- a/packages/opencode/test/provider/transform.test.ts +++ b/packages/opencode/test/provider/transform.test.ts @@ -3113,3 +3113,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) + }) +})