From 1408b822cac8bd902a825af1547970e829f716b4 Mon Sep 17 00:00:00 2001 From: SuYao Date: Tue, 17 Jun 2025 23:11:12 +0800 Subject: [PATCH] fix: update buildSdkMessages to handle undefined output in API clients (#7293) * fix: update buildSdkMessages to handle undefined output in API clients * fix: update vision model check to include model name in regex validation --- src/renderer/src/aiCore/clients/BaseApiClient.ts | 2 +- .../src/aiCore/clients/openai/OpenAIApiClient.ts | 6 +++++- .../aiCore/clients/openai/OpenAIResponseAPIClient.ts | 10 +++++++++- .../aiCore/middleware/core/McpToolChunkMiddleware.ts | 4 ++-- src/renderer/src/config/models.ts | 10 ++++++---- 5 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/renderer/src/aiCore/clients/BaseApiClient.ts b/src/renderer/src/aiCore/clients/BaseApiClient.ts index 19e455026d..5daa073f38 100644 --- a/src/renderer/src/aiCore/clients/BaseApiClient.ts +++ b/src/renderer/src/aiCore/clients/BaseApiClient.ts @@ -110,7 +110,7 @@ export abstract class BaseApiClient< abstract buildSdkMessages( currentReqMessages: TMessageParam[], - output: TRawOutput | string, + output: TRawOutput | string | undefined, toolResults: TMessageParam[], toolCalls?: TToolCall[] ): TMessageParam[] diff --git a/src/renderer/src/aiCore/clients/openai/OpenAIApiClient.ts b/src/renderer/src/aiCore/clients/openai/OpenAIApiClient.ts index f9c4372c7b..b4f6d3891e 100644 --- a/src/renderer/src/aiCore/clients/openai/OpenAIApiClient.ts +++ b/src/renderer/src/aiCore/clients/openai/OpenAIApiClient.ts @@ -337,10 +337,14 @@ export class OpenAIAPIClient extends OpenAIBaseClient< public buildSdkMessages( currentReqMessages: OpenAISdkMessageParam[], - output: string, + output: string | undefined, toolResults: OpenAISdkMessageParam[], toolCalls: OpenAI.Chat.Completions.ChatCompletionMessageToolCall[] ): OpenAISdkMessageParam[] { + if (!output && toolCalls.length === 0) { + return [...currentReqMessages, ...toolResults] + } + const assistantMessage: OpenAISdkMessageParam = { role: 'assistant', content: output, diff --git a/src/renderer/src/aiCore/clients/openai/OpenAIResponseAPIClient.ts b/src/renderer/src/aiCore/clients/openai/OpenAIResponseAPIClient.ts index 958fde9ec3..c36b084cde 100644 --- a/src/renderer/src/aiCore/clients/openai/OpenAIResponseAPIClient.ts +++ b/src/renderer/src/aiCore/clients/openai/OpenAIResponseAPIClient.ts @@ -227,10 +227,18 @@ export class OpenAIResponseAPIClient extends OpenAIBaseClient< public buildSdkMessages( currentReqMessages: OpenAIResponseSdkMessageParam[], - output: string, + output: string | undefined, toolResults: OpenAIResponseSdkMessageParam[], toolCalls: OpenAIResponseSdkToolCall[] ): OpenAIResponseSdkMessageParam[] { + if (!output && toolCalls.length === 0) { + return [...currentReqMessages, ...toolResults] + } + + if (!output) { + return [...currentReqMessages, ...(toolCalls || []), ...(toolResults || [])] + } + const assistantMessage: OpenAIResponseSdkMessageParam = { role: 'assistant', content: [{ type: 'input_text', text: output }] diff --git a/src/renderer/src/aiCore/middleware/core/McpToolChunkMiddleware.ts b/src/renderer/src/aiCore/middleware/core/McpToolChunkMiddleware.ts index 3dd046c12e..fa0cc2cf61 100644 --- a/src/renderer/src/aiCore/middleware/core/McpToolChunkMiddleware.ts +++ b/src/renderer/src/aiCore/middleware/core/McpToolChunkMiddleware.ts @@ -153,7 +153,7 @@ function createToolHandlingTransform( if (toolResult.length > 0) { const output = ctx._internal.toolProcessingState?.output - const newParams = buildParamsWithToolResults(ctx, currentParams, output!, toolResult, toolCalls) + const newParams = buildParamsWithToolResults(ctx, currentParams, output, toolResult, toolCalls) await executeWithToolHandling(newParams, depth + 1) } } catch (error) { @@ -243,7 +243,7 @@ async function executeToolUseResponses( function buildParamsWithToolResults( ctx: CompletionsContext, currentParams: CompletionsParams, - output: SdkRawOutput | string, + output: SdkRawOutput | string | undefined, toolResults: SdkMessageParam[], toolCalls: SdkToolCall[] ): CompletionsParams { diff --git a/src/renderer/src/config/models.ts b/src/renderer/src/config/models.ts index cbbbc1a25e..2ffdac76c2 100644 --- a/src/renderer/src/config/models.ts +++ b/src/renderer/src/config/models.ts @@ -184,7 +184,7 @@ const visionAllowedModels = [ 'deepseek-vl(?:[\\w-]+)?', 'kimi-latest', 'gemma-3(?:-[\\w-]+)', - 'doubao-1.6-seed(?:-[\\w-]+)' + 'doubao-seed-1[.-]6(?:-[\\w-]+)' ] const visionExcludedModels = [ @@ -238,7 +238,8 @@ export const FUNCTION_CALLING_MODELS = [ 'glm-4(?:-[\\w-]+)?', 'learnlm(?:-[\\w-]+)?', 'gemini(?:-[\\w-]+)?', // 提前排除了gemini的嵌入模型 - 'grok-3(?:-[\\w-]+)?' + 'grok-3(?:-[\\w-]+)?', + 'doubao-seed-1[.-]6(?:-[\\w-]+)?' ] const FUNCTION_CALLING_EXCLUDED_MODELS = [ @@ -2320,7 +2321,8 @@ export const GEMINI_SEARCH_MODELS = [ 'gemini-2.5-pro-preview-03-25', 'gemini-2.5-pro-preview-05-06', 'gemini-2.5-flash-preview', - 'gemini-2.5-flash-preview-04-17' + 'gemini-2.5-flash-preview-04-17', + 'gemini-2.5-flash-preview-05-20' ] export const OPENAI_NO_SUPPORT_DEV_ROLE_MODELS = ['o1-preview', 'o1-mini'] @@ -2365,7 +2367,7 @@ export function isVisionModel(model: Model): boolean { // } if (model.provider === 'doubao') { - return VISION_REGEX.test(model.name) || model.type?.includes('vision') || false + return VISION_REGEX.test(model.name) || VISION_REGEX.test(model.id) || model.type?.includes('vision') || false } return VISION_REGEX.test(model.id) || model.type?.includes('vision') || false