diff --git a/mini-program/src/pages/main/ScriptView.vue b/mini-program/src/pages/main/ScriptView.vue index 6decd1d..11413d3 100644 --- a/mini-program/src/pages/main/ScriptView.vue +++ b/mini-program/src/pages/main/ScriptView.vue @@ -114,7 +114,7 @@ @@ -944,12 +944,32 @@ const generationCopy = computed(() => { // chat 视图 loading 显示条件:等待首个 assistant 响应期间 // - 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':非失败状态 // - 最后一条消息是 user:说明还没收到 assistant 响应(card/outline/novel) const showChatLoading = computed(() => { if (generationPhase.value !== 'generating') return false if (generationStatus.value === 'failed') return false - const list = resultMessages.value + const list = visibleResultMessages.value if (!list || !list.length) return false const lastMsg = list[list.length - 1] return lastMsg && lastMsg.role === 'user' @@ -1753,8 +1773,9 @@ const submitClarification = (answer) => { const label = option?.label || answer if (card) { card.submitted = true - card.answer = label // 显示用 label(中文);答案已在卡片中显示,无需额外用户气泡 + card.answer = label // 显示用 label(中文);答案已在卡片中显示,但同时添加 user 消息让 loading 能正确判断等待状态 } + addResultMessage({ role: 'user', kind: 'text', content: label }) answeringClarification.value = true currentStreamTask.value = followupStream({ sessionId: novelSessionId.value,