From 4f02ace7de3f83a4c07db06d7656ed802f8a003e Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sun, 12 Apr 2026 02:28:36 +0900 Subject: [PATCH] fix(shared): guard maxOutputTokens <= 0 in model settings compatibility (#3305) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When model metadata reports maxOutputTokens as 0 or negative, the clamp logic would set maxTokens to 0 and break generation. Added a positive-value guard so invalid metadata is ignored and the user-requested maxTokens is preserved. 🤖 Generated with OhMyOpenCode assistance https://github.com/code-yeongyu/oh-my-opencode --- .../model-settings-compatibility.test.ts | 24 +++++++++++++++++++ src/shared/model-settings-compatibility.ts | 1 + 2 files changed, 25 insertions(+) diff --git a/src/shared/model-settings-compatibility.test.ts b/src/shared/model-settings-compatibility.test.ts index d9b8a455d..6e7a7b590 100644 --- a/src/shared/model-settings-compatibility.test.ts +++ b/src/shared/model-settings-compatibility.test.ts @@ -486,6 +486,30 @@ describe("resolveCompatibleModelSettings", () => { ]) }) + test("#given capabilities.maxOutputTokens is 0 #then maxTokens preserved unchanged", () => { + const result = resolveCompatibleModelSettings({ + providerID: "openai", + modelID: "gpt-5.4", + desired: { maxTokens: 200_000 }, + capabilities: { maxOutputTokens: 0 }, + }) + + expect(result.maxTokens).toBe(200_000) + expect(result.changes).toEqual([]) + }) + + test("#given capabilities.maxOutputTokens is -1 #then maxTokens preserved unchanged", () => { + const result = resolveCompatibleModelSettings({ + providerID: "openai", + modelID: "gpt-5.4", + desired: { maxTokens: 200_000 }, + capabilities: { maxOutputTokens: -1 }, + }) + + expect(result.maxTokens).toBe(200_000) + expect(result.changes).toEqual([]) + }) + // Passthrough: undefined desired values produce no changes test("no-op when desired settings are empty", () => { const result = resolveCompatibleModelSettings({ diff --git a/src/shared/model-settings-compatibility.ts b/src/shared/model-settings-compatibility.ts index f39875f43..974d75619 100644 --- a/src/shared/model-settings-compatibility.ts +++ b/src/shared/model-settings-compatibility.ts @@ -165,6 +165,7 @@ export function resolveCompatibleModelSettings( if ( maxTokens !== undefined && input.capabilities?.maxOutputTokens !== undefined && + input.capabilities.maxOutputTokens > 0 && maxTokens > input.capabilities.maxOutputTokens ) { changes.push({