From ca40f6ea7a58485bc622ad4de83119a602ffdf0f Mon Sep 17 00:00:00 2001 From: Ryanba <92616678+Gujiassh@users.noreply.github.com> Date: Tue, 25 Aug 2026 20:37:27 +0800 Subject: [PATCH] fix(providers): support OpenAI models requiring max_completion_tokens (#2251) --- .../libs/providers/providers/openai/index.ts | 1 + .../validators/openai-compatible.test.ts | 44 ++++++++++++++++++- .../providers/validators/openai-compatible.ts | 5 ++- 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/packages/stage-ui/src/libs/providers/providers/openai/index.ts b/packages/stage-ui/src/libs/providers/providers/openai/index.ts index 6dc4c08dc..73ae6ea61 100644 --- a/packages/stage-ui/src/libs/providers/providers/openai/index.ts +++ b/packages/stage-ui/src/libs/providers/providers/openai/index.ts @@ -62,6 +62,7 @@ export const providerOpenAI = defineProvider({ validators: { ...createOpenAICompatibleValidators({ checks: [ProviderValidationCheck.Connectivity, ProviderValidationCheck.ModelList, ProviderValidationCheck.ChatCompletions], + chatCompletionTokenParameter: 'max_completion_tokens', }), }, }) diff --git a/packages/stage-ui/src/libs/providers/validators/openai-compatible.test.ts b/packages/stage-ui/src/libs/providers/validators/openai-compatible.test.ts index df9f7948f..ede01d781 100644 --- a/packages/stage-ui/src/libs/providers/validators/openai-compatible.test.ts +++ b/packages/stage-ui/src/libs/providers/validators/openai-compatible.test.ts @@ -4,6 +4,7 @@ import type { ProviderExtraMethods, ProviderInstance } from '../types' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { providerOpenAI } from '../providers/openai' import { ProviderValidationCheck } from '../types' import { createOpenAICompatibleValidators } from './openai-compatible' @@ -34,10 +35,10 @@ async function getProviderValidators(options?: Parameters { - const config: TestConfig = { + const config = { apiKey: 'test-key', baseUrl: 'https://example.com/v1/', - } + } satisfies TestConfig const provider: ProviderInstance = { model: () => ({ apiKey: config.apiKey, @@ -143,6 +144,7 @@ describe('createOpenAICompatibleValidators', () => { expect(result.valid).toBe(true) expect(generateTextMock).toHaveBeenCalledWith(expect.objectContaining({ model: 'seed-2-0-pro-260328', + max_tokens: 16, })) }) @@ -171,4 +173,42 @@ describe('createOpenAICompatibleValidators', () => { max_tokens: 16, })) }) + + it('uses max_completion_tokens when the provider requires the newer parameter', async () => { + listModelsMock.mockResolvedValue([ + { id: 'gpt-5' }, + ]) + + const [, chatValidator] = await getProviderValidators({ + checks: [ProviderValidationCheck.Connectivity, ProviderValidationCheck.ChatCompletions], + chatCompletionTokenParameter: 'max_completion_tokens', + }) + + const result = await chatValidator.validator(config, provider, providerExtra, { t: mockT }) + + expect(result.valid).toBe(true) + expect(generateTextMock).toHaveBeenCalledWith(expect.objectContaining({ + model: 'gpt-5', + max_completion_tokens: 16, + })) + expect(generateTextMock.mock.calls[0][0]).not.toHaveProperty('max_tokens') + }) + + it('configures the OpenAI provider validation with max_completion_tokens', async () => { + listModelsMock.mockResolvedValue([ + { id: 'gpt-5' }, + ]) + + const validators = await Promise.all((providerOpenAI.validators?.validateProvider || []).map(create => create({ t: mockT }))) + const chatValidator = validators.find(validator => validator.id === 'openai-compatible:check-chat-completions') + + expect(chatValidator).toBeDefined() + const result = await chatValidator!.validator(config, provider, providerExtra, { t: mockT }) + + expect(result.valid).toBe(true) + expect(generateTextMock).toHaveBeenCalledWith(expect.objectContaining({ + max_completion_tokens: 16, + })) + expect(generateTextMock.mock.calls[0][0]).not.toHaveProperty('max_tokens') + }) }) diff --git a/packages/stage-ui/src/libs/providers/validators/openai-compatible.ts b/packages/stage-ui/src/libs/providers/validators/openai-compatible.ts index e82e2c2cb..8cb330f9d 100644 --- a/packages/stage-ui/src/libs/providers/validators/openai-compatible.ts +++ b/packages/stage-ui/src/libs/providers/validators/openai-compatible.ts @@ -22,6 +22,7 @@ interface OpenAICompatibleValidationOptions string modelListFailureReason?: (input: { config: TConfig, error: unknown, errorMessage: string }) => string + chatCompletionTokenParameter?: 'max_tokens' | 'max_completion_tokens' } function extractStatusCode(error: unknown): number | null { @@ -145,7 +146,9 @@ export function createOpenAICompatibleValidators