agent-Specialization/docs
2026-04-26 23:49:04 +08:00
..
analysis-conversation-loading.md docs(analysis): add polling and conversation behavior notes 2026-04-04 19:47:28 +08:00
analysis-stop-button.md docs(analysis): add polling and conversation behavior notes 2026-04-04 19:47:28 +08:00
analysis-task-recovery.md docs(analysis): add polling and conversation behavior notes 2026-04-04 19:47:28 +08:00
mcp-tool-config-guide.md feat: add MCP management and host-only runtime policy 2026-04-26 23:49:04 +08:00
README.md docs(analysis): add polling and conversation behavior notes 2026-04-04 19:47:28 +08:00

AI Agent 系统对话区域功能分析文档

本目录包含对 AI Agent 系统对话显示区域的详细功能分析,用于识别历史包袱和需要改造为纯轮询模式的部分。

📋 分析文档列表

已完成的分析

  1. 停止按钮和运行状态机制 (22KB)

    • 停止按钮的显示/隐藏逻辑
    • 运行状态的设置和清除
    • WebSocket vs REST API 的停止机制
    • 已知问题:状态同步、竞态条件、页面刷新恢复
  2. 对话记录加载机制 (21KB)

    • 切换对话时的加载流程
    • 历史消息的数据结构
    • 防止重复加载的机制
    • 初始化阶段的特殊处理
  3. 运行中对话恢复机制 (20KB)

    • 页面刷新后的任务恢复
    • _rebuildingFromScratch 标志的作用
    • 历史事件的重放机制
    • 轮询的恢复逻辑
  4. 思考块机制 (分析已完成)

    • 思考块的创建和内容追加
    • 展开/折叠逻辑(流式输出 vs 历史加载)
    • 自动折叠机制1秒延迟
    • 无打字机效果,直接追加内容
  5. 工具块机制 (分析已完成)

    • 工具块的创建和状态变化preparing → running → completed/failed
    • tool_intent 的打字机效果0.5-1秒
    • 工具块的堆叠和融合机制
    • toolActionIndex 注册机制
    • append_payload 和 modify_payload 处理
  6. 模型输出内容显示 (分析已完成)

    • 文本流式显示text_start/chunk/end
    • Markdown 渲染marked.js + Prism.js + KaTeX
    • 代码块的语法高亮和复制功能
    • 双事件监听系统可能导致复制bug
    • 图片和视频的显示

⏸️ 未完成的分析

  1. 子智能体机制 (分析中断)
    • waitingForSubAgent 状态
    • sub_agent_waiting 事件
    • WebSocket 在子智能体场景下的特殊作用

🎯 重点关注的问题区域

1. 停止按钮Bug最多

主要问题:

  • 前端在后端确认前就清理状态,导致同步问题
  • 多个布尔标志taskInProgress, streamingMessage, stopRequested难以维护
  • 存在竞态条件
  • 页面刷新后状态恢复复杂

涉及文件:

  • static/src/components/input/InputComposer.vue - 停止按钮UI
  • static/src/app/methods/message.ts - 停止逻辑
  • static/src/stores/task.ts - 任务状态管理
  • server/tasks.py - 后端停止处理

2. 思考块和工具块

展开/折叠机制:

  • 流式输出时思考块自动展开1秒后折叠
  • 历史加载时:所有块默认折叠
  • 用户手动点击:状态存储在 expandedBlocks Set不持久化

打字机效果:

  • 思考块:无打字机效果,直接追加
  • 工具块 intent0.5-1秒打字机效果
  • 历史加载时:跳过打字机效果

堆叠机制:

  • 连续的思考/工具块会被分组
  • 默认显示最后6个其余折叠
  • 使用 ResizeObserver 跟踪高度变化

3. 对话恢复机制

_rebuildingFromScratch 标志:

  • 用于区分"从头重建"和"增量恢复"
  • 影响思考块展开、工具意图动画、生成标签显示
  • 页面刷新后,如果历史不完整,从 offset=0 重放所有事件

轮询恢复:

  • 150ms 间隔轮询
  • 通过 lastEventIndex 避免重复处理
  • 支持从任意 offset 恢复

4. 代码块复制功能

可能的Bug原因

  • 双事件监听系统(全局 + Vue方法
  • Clipboard API 权限问题
  • HTML 实体编码/解码问题
  • 流式输出时按钮添加时机

实现位置:

  • static/index.html - 全局事件监听
  • static/src/app/methods/ui.ts - Vue 复制方法
  • static/src/app/bootstrap.ts - Markdown 渲染初始化

🔄 WebSocket vs 轮询模式

当前状态

系统已设置 usePollingMode: true,大部分聊天事件通过 REST API 轮询处理。

WebSocket 仍在使用的场景:

  1. 子智能体通知(sub_agent_waiting
  2. 配额更新(quota_update
  3. 系统消息(system_message
  4. 错误处理(error

事件过滤机制:

if (ctx.usePollingMode && !ctx.waitingForSubAgent) {
    // 跳过 WebSocket 事件处理
    return;
}

需要改造的部分

完全移除 WebSocket 依赖:

  1. 删除 useLegacySocket.ts 中的聊天事件处理(~1200行
  2. 删除流式文本处理代码(streamingState~500行
  3. 统一停止逻辑到 REST API
  4. 子智能体通知改为 SSEServer-Sent Events

后端改造:

  1. server/socket_handlers.py - 简化为仅处理连接管理
  2. server/tasks.py - 添加任务清理、重试、优先级
  3. server/chat_flow.py - 移除 WebSocket emit

📊 代码统计

前端关键文件

文件 行数 功能 需要改造
useLegacySocket.ts 1706 WebSocket 事件处理 删除聊天事件
taskPolling.ts 989 轮询事件处理 ⚠️ 修复bug
task.ts (store) 296 任务状态管理 ⚠️ 添加重试
ChatArea.vue ~800 对话显示 ⚠️ 修复UI bug
InputComposer.vue ~200 输入框和停止按钮 ⚠️ 简化状态

后端关键文件

文件 行数 功能 需要改造
socket_handlers.py 353 WebSocket 处理 移除聊天事件
tasks.py 380 任务管理 ⚠️ 增强功能
chat_flow.py 241 聊天流程 ⚠️ 移除 WebSocket

🚀 重构优先级

优先级1必须做

  1. 修复停止按钮的状态同步问题
  2. 修复代码块复制功能
  3. 修复重复推送内容的问题
  4. 修复任务无法结束的问题

优先级2建议做

  1. 删除 useLegacySocket.ts 中的聊天事件处理
  2. 统一停止逻辑到 REST API
  3. 添加轮询重试机制
  4. 任务清理机制

优先级3可选

  1. WebSocket 改为 SSE
  2. 任务存储改为 Redis
  3. 改进错误提示

📝 使用说明

  1. 阅读分析文档:按照上述列表顺序阅读各个分析文档
  2. 对比实际网页:在浏览器中打开系统,对比文档描述和实际行为
  3. 标记问题点记录不一致的地方、bug、历史包袱
  4. 制定重构计划:根据优先级制定具体的重构步骤

🔗 相关资源


生成时间: 2026-04-04 分析工具: Claude Code + 7个并行子智能体 总分析时间: ~15分钟