From de8b06defeb49e65bdeba0cdb611e8ac2f611ecd Mon Sep 17 00:00:00 2001 From: zhangxunhui Date: Tue, 27 Jan 2026 17:26:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=89=8D=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/chat/index.html | 4 ++-- static/chat/script.js | 34 ++++++++++++++++++++++++++++++---- static/chat/style.css | 1 + 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/static/chat/index.html b/static/chat/index.html index cdcbdee..7f19eae 100644 --- a/static/chat/index.html +++ b/static/chat/index.html @@ -4,8 +4,8 @@ RAG 聊天助手 - - + + diff --git a/static/chat/script.js b/static/chat/script.js index 8b677d3..08adc65 100644 --- a/static/chat/script.js +++ b/static/chat/script.js @@ -4,6 +4,7 @@ let currentUser = null; // 当前登录用户对象 let isStreaming = false; let currentStreamResponse = null; let currentStreamReader = null; +let currentAssistantMessageElement = null; // 保存当前助手消息元素 // API 基础 URL const API_BASE_URL = '/'; @@ -746,6 +747,7 @@ async function handleStreamResponse(response) { // 创建助手消息容器 const now = new Date().toISOString(); messageElement = createAssistantMessageContainer(now); + currentAssistantMessageElement = messageElement; // 保存到全局变量 try { while (true) { @@ -765,9 +767,16 @@ async function handleStreamResponse(response) { } catch (error) { console.error('Error reading stream:', error); - updateAssistantMessageContent(messageElement, `流式响应错误: ${error.message}`); + // 检查是否是用户主动取消的错误 + if (error.name === 'AbortError' || error.message.includes('cancel')) { + // 用户主动取消,不显示错误消息 + } else { + // 其他错误,显示错误消息 + updateAssistantMessageContent(messageElement, `流式响应错误: ${error.message}`); + } } finally { reader.releaseLock(); + currentAssistantMessageElement = null; // 重置全局变量 } } @@ -782,7 +791,7 @@ function createAssistantMessageContainer(time) {
-
+
@@ -835,12 +844,29 @@ async function stopStreamResponse() { currentStreamResponse = null; currentStreamReader = null; - // 隐藏打字指示器 - hideTypingIndicator(); + // 更新助手消息内容,替换打字指示器 + let assistantMessageElement = currentAssistantMessageElement; + // 如果 currentAssistantMessageElement 为 null,尝试查找最新的助手消息元素 + if (!assistantMessageElement) { + const messageElements = elements.messagesContainer.querySelectorAll('.message.assistant'); + if (messageElements.length > 0) { + assistantMessageElement = messageElements[messageElements.length - 1]; + } + } + + if (assistantMessageElement) { + updateAssistantMessageContent(assistantMessageElement, '流式响应已中止'); + } + + // 重置全局变量 + currentAssistantMessageElement = null; // 更新按钮状态 updateSendButtonState(false); + // 滚动到底部 + scrollToBottom(); + } catch (error) { console.error('Error stopping stream:', error); } diff --git a/static/chat/style.css b/static/chat/style.css index 2ec9752..5ffbb52 100644 --- a/static/chat/style.css +++ b/static/chat/style.css @@ -490,6 +490,7 @@ body { .message.text .typing-dots .dot:nth-child(3) { animation-delay: 0s; + transform: translateY(0); } @keyframes typing {