From 6034e58b43676b8f995c162c65574294ccbf0c24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=9D=E5=B0=98?= <237809796@qq.com> Date: Fri, 19 Jun 2026 20:04:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D:=20flushCurrentText=20?= =?UTF-8?q?=E5=90=91=E5=89=8D=E6=89=BE=E9=9D=9E=20isError=20=E5=8D=A0?= =?UTF-8?q?=E4=BD=8D(UX-260619-06=20MED-1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CR-12 审查 🟡 MED-1:AiStreamRetry→AiError 链路,末条 isError 气泡致 flush 跳过, 占位 assistant(部分回复)未填充,currentText 清空丢。 修:flushCurrentText 从末尾向前找第一个非 isError assistant 写入 (跳 AiStreamRetry 错误气泡,写其前占位)。 vue-tsc EXIT 0 --- src/composables/ai/useAiEvents.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/composables/ai/useAiEvents.ts b/src/composables/ai/useAiEvents.ts index b546105..8f49982 100644 --- a/src/composables/ai/useAiEvents.ts +++ b/src/composables/ai/useAiEvents.ts @@ -129,9 +129,16 @@ export function friendlyError(raw: string): string { /** 把流式累积的 currentText 回填到最后一条 assistant 消息(AiAgentRound/AiCompleted/AiError 收尾共用) */ export function flushCurrentText() { if (!state.currentText) return - const last = state.messages[state.messages.length - 1] - // 跳过 isError 气泡(AiStreamRetry 错误气泡):避免部分回复覆盖错误提示 - if (last && last.role === 'assistant' && !last.isError) last.content = state.currentText + // 从末尾向前找最后一个非 isError assistant 气泡写入。跳过 AiStreamRetry 错误气泡 + // (isError),写入其前的占位 assistant,保留部分回复(UX-260619-06 MED-1)。 + for (let i = state.messages.length - 1; i >= 0; i--) { + const m = state.messages[i] + if (m.role !== 'assistant') break // 遇 user/tool 停,占位不在其后 + if (!m.isError) { + m.content = state.currentText + break + } + } } /** token 用量展示开关(读 appSettings,与 Settings.vue 共享 key `df-show-token-usage`) */