From 08330a9351142275fe9d44de744888c9ea495a67 Mon Sep 17 00:00:00 2001 From: Wenjie Zhang Date: Wed, 25 Mar 2026 13:46:52 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BF=AE=E5=A4=8D=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E6=88=AA=E6=96=AD=E9=97=AE=E9=A2=98=E5=B9=B6?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=89=8D=E7=AB=AF=E6=B5=81=E5=BC=8F=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E4=BD=93=E9=AA=8C=EF=BC=8C=E6=96=B0=E5=A2=9E=E6=B5=81?= =?UTF-8?q?=E5=B9=B3=E6=BB=91=E8=B0=83=E5=BA=A6=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/develop-guides/roadmap.md | 2 + web/src/components/AgentChatComponent.vue | 15 +- web/src/components/BasicSettingsSection.vue | 225 ++++------ web/src/components/SettingsModal.vue | 4 +- web/src/composables/useAgentRunStream.js | 6 +- web/src/composables/useAgentStreamHandler.js | 17 +- web/src/composables/useAgentThreadState.js | 20 +- web/src/composables/useStreamSmoother.js | 433 +++++++++++++++++++ 8 files changed, 577 insertions(+), 145 deletions(-) create mode 100644 web/src/composables/useStreamSmoother.js diff --git a/docs/develop-guides/roadmap.md b/docs/develop-guides/roadmap.md index 844fc671..b3aff4e1 100644 --- a/docs/develop-guides/roadmap.md +++ b/docs/develop-guides/roadmap.md @@ -30,6 +30,8 @@ ## v0.6 +- 修复 AgentPanel 文件下载截断问题:viewer 下载接口对线程 `user-data` 文件改为直接返回实际文件,避免复用 sandbox 预览读取链路导致下载内容不完整 +- 优化前端流式消息体验:新增通用 `useStreamSmoother` 调度层,统一平滑 Agent runs SSE、普通聊天流与审批恢复流中的 `loading` chunk,按帧释放文本增量,改善消息输出“一顿一顿”的观感 - 统一沙盒虚拟路径前缀默认值为 `/home/yuxi/user-data`,修正生产环境仍使用旧版 `/mnt/user-data` 的不一致配置;同时收紧 sandbox provisioner 对 Docker host bind 路径的归一化逻辑,保留 Docker Desktop for Windows 兼容 - 修复沙盒文件读取错误提示不准确的问题:`read_file` 不再把所有读取异常都显示为 `file not found`,改为区分无效路径、目录路径、权限不足、实际读取失败;同时对图片、PDF 等二进制文件返回明确提示,避免误报与乱码文本 - 新增 Agent runs 沙盒文件生成 E2E 脚本:通过管理员账号登录、创建 thread、调用 Agent 生成并执行冒泡排序脚本,然后仅通过线程文件 API 校验脚本文件与输出结果文件是否成功落盘 diff --git a/web/src/components/AgentChatComponent.vue b/web/src/components/AgentChatComponent.vue index 381de4f6..3aeb060a 100644 --- a/web/src/components/AgentChatComponent.vue +++ b/web/src/components/AgentChatComponent.vue @@ -245,6 +245,7 @@ import { useApproval } from '@/composables/useApproval' import { useAgentThreadState } from '@/composables/useAgentThreadState' import { useAgentRunStream } from '@/composables/useAgentRunStream' import { useAgentStreamHandler } from '@/composables/useAgentStreamHandler' +import { useStreamSmoother } from '@/composables/useStreamSmoother' import { useAgentMentionConfig } from '@/composables/useAgentMentionConfig' import AgentPanel from '@/components/AgentPanel.vue' import UserInfoComponent from '@/components/UserInfoComponent.vue' @@ -304,9 +305,15 @@ const chatState = reactive({ // 以threadId为键的线程状态 threadStates: {} }) +const streamSmoother = useStreamSmoother({ + getThreadState: (threadId) => chatState.threadStates[threadId] || null +}) const { getThreadState, resetOnGoingConv, stopThreadStream } = useAgentThreadState({ chatState, - getCurrentThreadId: () => chatState.currentThreadId + getCurrentThreadId: () => chatState.currentThreadId, + onStopThread: (threadId) => streamSmoother.flushThread(threadId), + onBeforeResetThread: (threadId) => streamSmoother.resetThread(threadId), + onBeforeCleanupThread: (threadId) => streamSmoother.resetThread(threadId) }) // 组件级别的线程和消息状态 @@ -861,7 +868,8 @@ const { handleAgentResponse, handleStreamChunk } = useAgentStreamHandler({ processApprovalInStream, currentAgentId, supportsTodo, - supportsFiles + supportsFiles, + streamSmoother }) const { startRunStream, resumeActiveRunForThread, stopRunStreamSubscription } = useAgentRunStream({ getThreadState, @@ -872,7 +880,8 @@ const { startRunStream, resumeActiveRunForThread, stopRunStreamSubscription } = fetchThreadMessages, fetchAgentState, resetOnGoingConv, - onScrollToBottom: () => scrollController.scrollToBottom() + onScrollToBottom: () => scrollController.scrollToBottom(), + streamSmoother }) // 发送消息并处理流式响应 diff --git a/web/src/components/BasicSettingsSection.vue b/web/src/components/BasicSettingsSection.vue index caa3ed35..1df373d2 100644 --- a/web/src/components/BasicSettingsSection.vue +++ b/web/src/components/BasicSettingsSection.vue @@ -1,114 +1,115 @@