From 9d063bb0f91cb1f9a71014060ac628186bef0f53 Mon Sep 17 00:00:00 2001 From: luy <12696648@qq.com> Date: Thu, 28 Aug 2025 04:29:12 +0800 Subject: [PATCH] fix: Correctly parse Gemini reasoning for both new `thought` field and legacy `` tags. --- .../providers/geminiProvider.ts | 75 +++++++------------ 1 file changed, 27 insertions(+), 48 deletions(-) diff --git a/src/main/presenter/llmProviderPresenter/providers/geminiProvider.ts b/src/main/presenter/llmProviderPresenter/providers/geminiProvider.ts index a01420db7..a10ee538b 100644 --- a/src/main/presenter/llmProviderPresenter/providers/geminiProvider.ts +++ b/src/main/presenter/llmProviderPresenter/providers/geminiProvider.ts @@ -934,6 +934,7 @@ export class GeminiProvider extends BaseLLMProvider { let isInThinkTag = false let toolUseDetected = false let usageMetadata: GenerateContentResponseUsageMetadata | undefined + let isNewThoughtFormatDetected = false // 流处理循环 for await (const chunk of result) { @@ -987,6 +988,7 @@ export class GeminiProvider extends BaseLLMProvider { for (const part of chunk.candidates[0].content.parts) { // 检查是否是思考内容 (新格式) if ((part as any).thought === true && part.text) { + isNewThoughtFormatDetected = true thoughtContent += part.text } else if (part.text) { content += part.text @@ -1012,71 +1014,48 @@ export class GeminiProvider extends BaseLLMProvider { type: 'reasoning', reasoning_content: thoughtContent } - thoughtContent = '' // 清空已发送的思考内容 } if (!content) continue - buffer += content - - // 处理思考标签 - if (buffer.includes('') && !isInThinkTag) { - const thinkStart = buffer.indexOf('') + if (isNewThoughtFormatDetected) { + yield { + type: 'text', + content: content + } + } else { + buffer += content - // 发送标签前的文本 - if (thinkStart > 0) { - yield { - type: 'text', - content: buffer.substring(0, thinkStart) + if (buffer.includes('') && !isInThinkTag) { + const thinkStart = buffer.indexOf('') + if (thinkStart > 0) { + yield { type: 'text', content: buffer.substring(0, thinkStart) } } + buffer = buffer.substring(thinkStart + 7) + isInThinkTag = true } - buffer = buffer.substring(thinkStart + 7) - isInThinkTag = true - continue - } - - // 处理思考标签结束 - if (isInThinkTag && buffer.includes('')) { - const thinkEnd = buffer.indexOf('') - const reasoningContent = buffer.substring(0, thinkEnd) - - // 发送推理内容 - if (reasoningContent) { - yield { - type: 'reasoning', - reasoning_content: reasoningContent + if (isInThinkTag && buffer.includes('')) { + const thinkEnd = buffer.indexOf('') + const reasoningContent = buffer.substring(0, thinkEnd) + if (reasoningContent) { + yield { + type: 'reasoning', + reasoning_content: reasoningContent + } } + buffer = buffer.substring(thinkEnd + 8) + isInThinkTag = false } - buffer = buffer.substring(thinkEnd + 8) - isInThinkTag = false - - // 如果还有剩余内容,继续处理 - if (buffer) { + if (!isInThinkTag && buffer) { yield { type: 'text', content: buffer } buffer = '' } - - continue - } - - // 如果在思考标签内,不输出内容 - if (isInThinkTag) { - continue - } - - // 正常输出文本内容 - yield { - type: 'text', - content: content } - - // 内容已经发送,清空buffer避免重复 - buffer = '' } if (usageMetadata) { @@ -1091,7 +1070,7 @@ export class GeminiProvider extends BaseLLMProvider { } // 处理剩余缓冲区内容 - if (buffer) { + if (!isNewThoughtFormatDetected && buffer) { if (isInThinkTag) { yield { type: 'reasoning',