From 3602dad5e844e241c73a2543d804d88cc539d5aa Mon Sep 17 00:00:00 2001 From: bielie Date: Wed, 18 Feb 2026 17:31:50 +0800 Subject: [PATCH] Adjust Claude prefill merge handling and remove BOM --- modules/streaming-generation.js | 42 +++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/modules/streaming-generation.js b/modules/streaming-generation.js index b795050..96e3fa6 100644 --- a/modules/streaming-generation.js +++ b/modules/streaming-generation.js @@ -136,18 +136,13 @@ class StreamingGeneration { const opts = { ...baseOptions, ...this.resolveCurrentApiAndModel(baseOptions) }; const modelLower = String(opts.model || '').toLowerCase(); - const isClaudeThinkingModel = - modelLower.includes('claude') && - modelLower.includes('thinking') && - !modelLower.includes('nothinking'); + const isClaudeModel = modelLower.includes('claude'); - if (isClaudeThinkingModel && Array.isArray(messages) && messages.length > 0) { - const lastMsg = messages[messages.length - 1]; - if (lastMsg?.role === 'assistant') { - console.log('[xbgen] Claude Thinking 模型:移除 assistant prefill'); - messages.pop(); + if (isClaudeModel && Array.isArray(messages) && messages.length > 0) { + if (this._mergeAssistantPrefillIntoPrevious(messages)) { + console.log('[xbgen] Claude model: merged trailing assistant prefill into previous message'); } - } + } const source = { openai: chat_completion_sources.OPENAI, @@ -805,6 +800,32 @@ class StreamingGeneration { return ''; } + _mergeAssistantPrefillIntoPrevious(messages) { + if (!Array.isArray(messages) || messages.length < 2) return false; + const lastMsg = messages[messages.length - 1]; + if (lastMsg?.role !== 'assistant') return false; + + const assistantText = this._extractTextFromMessage(lastMsg).trim(); + const previousMsg = messages[messages.length - 2]; + if (!previousMsg) return false; + + if (assistantText) { + const mergedText = `assistant:\n${assistantText}`; + if (typeof previousMsg.content === 'string') { + previousMsg.content = previousMsg.content + ? `${previousMsg.content}\n\n${mergedText}` + : mergedText; + } else if (Array.isArray(previousMsg.content)) { + previousMsg.content.push({ type: 'text', text: `\n\n${mergedText}` }); + } else { + previousMsg.content = mergedText; + } + } + + messages.pop(); + return true; + } + _getLastMessagesSnapshot() { const ctx = getContext(); const list = Array.isArray(ctx?.chat) ? ctx.chat : []; @@ -1494,3 +1515,4 @@ if (typeof window !== 'undefined') { eventSource: (window)?.eventSource || eventSource }); } +