diff --git a/src/renderer/src/aiCore/clients/gemini/GeminiAPIClient.ts b/src/renderer/src/aiCore/clients/gemini/GeminiAPIClient.ts index 8cb46143b2..549e931966 100644 --- a/src/renderer/src/aiCore/clients/gemini/GeminiAPIClient.ts +++ b/src/renderer/src/aiCore/clients/gemini/GeminiAPIClient.ts @@ -686,16 +686,19 @@ export class GeminiAPIClient extends BaseApiClient< toolCalls: FunctionCall[] ): Content[] { const parts: Part[] = [] + const modelParts: Part[] = [] if (output) { - parts.push({ + modelParts.push({ text: output }) } + toolCalls.forEach((toolCall) => { - parts.push({ + modelParts.push({ functionCall: toolCall }) }) + parts.push( ...toolResults .map((ts) => ts.parts) @@ -703,10 +706,22 @@ export class GeminiAPIClient extends BaseApiClient< .filter((p) => p !== undefined) ) - const lastMessage = currentReqMessages[currentReqMessages.length - 1] - if (lastMessage) { - lastMessage.parts?.push(...parts) + const userMessage: Content = { + role: 'user', + parts: [] } + + if (modelParts.length > 0) { + currentReqMessages.push({ + role: 'model', + parts: modelParts + }) + } + if (parts.length > 0) { + userMessage.parts?.push(...parts) + currentReqMessages.push(userMessage) + } + return currentReqMessages } @@ -747,7 +762,7 @@ export class GeminiAPIClient extends BaseApiClient< } }) } - return [messageParam, ...(sdkPayload.history || [])] + return [...(sdkPayload.history || []), messageParam] } private async uploadFile(file: FileType): Promise { diff --git a/src/renderer/src/aiCore/middleware/core/McpToolChunkMiddleware.ts b/src/renderer/src/aiCore/middleware/core/McpToolChunkMiddleware.ts index fa0cc2cf61..893018d4c5 100644 --- a/src/renderer/src/aiCore/middleware/core/McpToolChunkMiddleware.ts +++ b/src/renderer/src/aiCore/middleware/core/McpToolChunkMiddleware.ts @@ -255,6 +255,10 @@ function buildParamsWithToolResults( // 从回复中构建助手消息 const newReqMessages = apiClient.buildSdkMessages(currentReqMessages, output, toolResults, toolCalls) + if (output && ctx._internal.toolProcessingState) { + ctx._internal.toolProcessingState.output = undefined + } + // 估算新增消息的 token 消耗并累加到 usage 中 if (ctx._internal.observer?.usage && newReqMessages.length > currentReqMessages.length) { try {