Skip to content

feat(chat): stream messages - #43

Merged
Heyflyingpig merged 4 commits into
developfrom
feat(chat)/stream-messages
Aug 5, 2026
Merged

feat(chat): stream messages#43
Heyflyingpig merged 4 commits into
developfrom
feat(chat)/stream-messages

Conversation

@Heyflyingpig

Copy link
Copy Markdown
Owner
  • 变更基线:当前分支为 feat(chat)/stream-messages,本批次包含 b1fdf197817336f8c8378 三个提交,覆盖 Agent 流式事件、SSE 传输、聊天时间线展示和对应测试。
  • 后端 LangGraph 事件适配:
    • LangGraphEventAdapter 将 LangGraph v2 tasksupdatesmessagescustom 多流转换为稳定的公开事件协议。
    • 根图 task 生命周期转换为 node_start/node_end,同名节点重复进入时根据 job、attempt 和 task 生成不同的阶段实例,避免重试或循环阶段互相覆盖。
    • 显式读取 route_decisionfold_decision 生成 progress/decision 事件;不根据展示消息内容推断路由。
    • MCP/RAG 子图节点折叠到父级 mcp/rag 阶段,工具事件只保留工具名、参数字段名和“调用完成/调用失败”摘要,不输出参数值、完整工具结果、原始 Prompt、ToolMessage、文件正文或内部 attempt。
    • 普通问答和报告追问仅生成公开文字增量,planner、报告生成等不应进入用户文本流的节点会被过滤;内部异常统一转换为有限的脱敏错误类别。
    • LangGraph 节点和 Runnable 包装器保留原始 config,并通过 custom 事件表达真实 attempt 开始/失败;只有失败后确实再次开始时才生成 node_retry,最终失败不会被误报为重试。
  • Worker 持久化与顺序保证:
    • 新增 OrderedEventWriter,每个 job 使用一个事件队列和单一消费协程,保证阶段、文字和终态事件按源顺序写入 analysis_job_events
    • 文字 token 按批次起始时间 150ms 或累计 384 字符触发 text_delta 刷新;切换文字流、阶段结束、重试和终态事件前先刷新未落库文字。
    • 文字批次使用独立的 stream_id 和数据库序号,重试时只废弃失败流,不影响新流;终态继续沿用当前 worker/attempt fencing 和聊天保存事务边界。
    • SSE 事件接口从数据库事件表读取,支持 Last-Event-ID 断线续传;发送给普通用户前移除内部 attempt 字段。
  • 前端事件消费:
    • 聊天页由 POST /api/agent/jobs 创建任务,再通过 GET /api/agent/jobs/<job_id>/events 建立 EventSource;支持节点开始、阶段详情、工具摘要、重试、文字增量、终态、失败和重连状态。
    • stream_state.js 按数据库事件 ID 去重,并按 step_id + stream_id + sequence 去重文字批次;普通文字使用草稿节点流式渲染,终态到达后校正草稿,报告和因果图结果仍只渲染一次。
    • 文字增量在前端仅按完整缓冲区重新渲染 Markdown,避免重复 SSE 或重试事件造成重复文本。
  • 聊天时间线视觉与交互:
    • 普通 AI 回答和时间线入口去除背景框、边框和阴影;顶部显示客户端总耗时,阶段详情使用缩进和左侧细线表达层级。
    • 父级和子级统一使用右三角/倒三角,完成阶段不显示成功图标,处理中保留转圈,失败和重试自动展开相关详情。
    • 移除页面中的“思考过程”标题,展开后直接显示阶段文本;时间线创建时默认展开,任务完成后继续保持展开。
    • 抵消聊天区域通用 20px flex 间距在“已处理”入口和第一个阶段之间产生的额外空白;点击父级展开符号后滚动到聊天末端,并在布局更新后再次校正。
  • 测试与文档:
    • tests/unit/agent/test_stream_events.py 覆盖阶段实例、公开文字节点过滤、重试语义、显式 State 路由、工具字段脱敏、SSE 公开 payload 以及真实 LangGraph v2 tasks/custom 流。
    • tests/unit/agent/test_ordered_event_writer.py 覆盖 150ms 刷新、384 字符阈值、阶段/终态前刷新、流独立序号和事件顺序。
    • tests/unit/frontend/chat_stream_state.test.cjs 覆盖 SSE ID 去重、文字批次去重、失败流丢弃和终态草稿校正。
    • AGENTS.md 已同步更新 worker 多流协议、用户可见事件边界和敏感内容过滤说明。
  • 当前验证:已完成 script.js Node 语法检查、前端 4 项单元测试和 git diff --check;后端测试应在仓库要求的 Docker 测试环境中继续执行,以补足真实依赖链验证。
  • 已知边界:analysis_job_events 已保存任务事件,可供 SSE 断线续传和管理员任务详情读取;但 /api/load_session 当前只恢复 chat_messages,前端刷新或重新打开历史会话时尚未按 session_id -> analysis_jobs -> analysis_job_events 重建聊天时间线,因此思考阶段会消失。该问题属于历史时间线恢复功能,尚未在本批次实现。

@Heyflyingpig Heyflyingpig self-assigned this Aug 5, 2026
@Heyflyingpig Heyflyingpig changed the title Feat(chat)/stream messages feat(chat)/stream messages Aug 5, 2026
@Heyflyingpig Heyflyingpig changed the title feat(chat)/stream messages Feat(chat): stream messages Aug 5, 2026
@Heyflyingpig Heyflyingpig changed the title Feat(chat): stream messages feat(chat): stream messages Aug 5, 2026
@Heyflyingpig
Heyflyingpig merged commit cbab340 into develop Aug 5, 2026
2 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant