diff --git a/mini-program/src/pages/main/ScriptView.vue b/mini-program/src/pages/main/ScriptView.vue index cabb065..fb8a5c1 100644 --- a/mini-program/src/pages/main/ScriptView.vue +++ b/mini-program/src/pages/main/ScriptView.vue @@ -611,6 +611,10 @@ const sendChat = async () => { if (!chatInput.value.trim() || generating.value) return const content = chatInput.value.trim() chatInput.value = '' + + // 仅在 generationPhase === 'done' 时处理;生成流程中底部输入栏不显示,但防御性 short-circuit + if (generationPhase.value !== 'done') return + const messageId = currentVersionMessageId.value const userMessageRes = await createMessage({ @@ -622,15 +626,21 @@ const sendChat = async () => { }) const userMessageId = userMessageRes.data?.id - messages.value.push({ - id: userMessageId, - conversationId: conversationId.value, + // 用户消息追加到统一对话流 resultMessages + resultMessages.value.push({ + id: userMessageId || createMessageId(), + role: 'user', + kind: 'text', content, - sender: 'user', - type: 'chat' + pending: false, + time: formatMessageTime(), + submitted: false, + confirmed: false }) + keepResultAtBottom() generating.value = true + generationStatus.value = 'streaming' await streamScriptChat({ operationType: 'chat', conversationId: conversationId.value, @@ -638,13 +648,21 @@ const sendChat = async () => { userMessageId, content, scriptId: scriptId.value, - onDelta: () => {}, + onDelta: (delta) => { + // 往最后一条 AI 小说消息追加 delta + const lastAssistant = [...resultMessages.value].reverse().find(m => m.role === 'assistant' && m.kind === 'novel') + if (lastAssistant) { + lastAssistant.content += delta + } + }, onDone: () => { generating.value = false + generationStatus.value = 'idle' loadMessages() }, onError: (error) => { generating.value = false + generationStatus.value = 'idle' uni.showToast({ title: error || '生成失败', icon: 'none' }) } })