fix: 恢复 addResultMessage + 渲染层过滤,避免重复气泡同时支持后续 loading

This commit is contained in:
2026-07-20 22:57:24 +08:00
parent 4afc632cac
commit f8d6e881df
+24 -3
View File
@@ -114,7 +114,7 @@
<view class="conversation compact"> <view class="conversation compact">
<view <view
v-for="msg in resultMessages" v-for="msg in visibleResultMessages"
:key="msg.id" :key="msg.id"
> >
<view v-if="msg.role === 'user' && msg.kind === 'text'" class="chat-bubble user"> <view v-if="msg.role === 'user' && msg.kind === 'text'" class="chat-bubble user">
@@ -944,12 +944,32 @@ const generationCopy = computed(() => {
// chat 视图 loading 显示条件:等待首个 assistant 响应期间 // chat 视图 loading 显示条件:等待首个 assistant 响应期间
// - generationPhase === 'generating':生成流程未完成 // - generationPhase === 'generating':生成流程未完成
// 渲染层过滤:去掉"紧跟在已提交 card 后、内容等于 card.answer"的 user 消息,避免重复气泡
// 这样 showChatLoading 仍能根据"最后一条是 user"正确判断等待状态
const visibleResultMessages = computed(() => {
const list = resultMessages.value
if (!list || list.length < 2) return list
return list.filter((m, idx) => {
if (!(m.role === 'user' && m.kind === 'text')) return true
// 向前查找最近的 card 消息
for (let i = idx - 1; i >= 0; i--) {
const prev = list[i]
if (prev.kind === 'card') {
// 是已提交 card 且内容相同 → 过滤
if (prev.submitted && prev.answer && m.content === prev.answer) return false
return true
}
}
return true
})
})
// - generationStatus !== 'failed':非失败状态 // - generationStatus !== 'failed':非失败状态
// - 最后一条消息是 user:说明还没收到 assistant 响应(card/outline/novel // - 最后一条消息是 user:说明还没收到 assistant 响应(card/outline/novel
const showChatLoading = computed(() => { const showChatLoading = computed(() => {
if (generationPhase.value !== 'generating') return false if (generationPhase.value !== 'generating') return false
if (generationStatus.value === 'failed') return false if (generationStatus.value === 'failed') return false
const list = resultMessages.value const list = visibleResultMessages.value
if (!list || !list.length) return false if (!list || !list.length) return false
const lastMsg = list[list.length - 1] const lastMsg = list[list.length - 1]
return lastMsg && lastMsg.role === 'user' return lastMsg && lastMsg.role === 'user'
@@ -1753,8 +1773,9 @@ const submitClarification = (answer) => {
const label = option?.label || answer const label = option?.label || answer
if (card) { if (card) {
card.submitted = true card.submitted = true
card.answer = label // 显示用 label(中文);答案已在卡片中显示,无需额外用户气泡 card.answer = label // 显示用 label(中文);答案已在卡片中显示,但同时添加 user 消息让 loading 能正确判断等待状态
} }
addResultMessage({ role: 'user', kind: 'text', content: label })
answeringClarification.value = true answeringClarification.value = true
currentStreamTask.value = followupStream({ currentStreamTask.value = followupStream({
sessionId: novelSessionId.value, sessionId: novelSessionId.value,