Files
HomeAgent/cmd/gui/renderer
JianFeeeee ee2d43dcbc perf(gui): 流式渲染判据改看 _streaming,不再依赖 chatLoading
## 现象
旁观 agent 响应其它渠道(memo / QQ / email)时,聊天页每秒全量重渲多次,
消息越多越卡。

## 根因
流式分支判据写的是 `state.chatLoading && ...`,而 chatLoading 只在
「用户从 GUI 自己发消息」(sendChat)时置 true。旁观路径(agent 响应
memo/QQ/email,GUI 仅通过 SSE 收流式帧)下它恒为 false ⇒ 判据恒假 ⇒
每个 content_delta / reasoning_delta / tool_call 帧都掉进「非流式」分支,
走**全量** innerHTML 重建。

而且它出现**三处**,只改一处无效:
  · rerenderChatIfActive(决定走 renderChatStreamChunk 还是 renderChat)
  · renderChat 内部的 streamingLast(决定单条消息的渲染分支)
  · 工具 pill 的「进行中」收集(旁观时列表恒空,看不到 agent 在做什么)

## 实测(本机 Electron + 192.168.2.60,真实凭据,同一条消息)
  修复前:1.7~2 秒内 13~26 次全量重渲,间隔 10~30ms
  修复后:同一场景降到 5 次(含轮询触发的)
200 条消息时单次全量重建实测 235ms —— 这是「聊天卡得没有用的欲望」的直接来源。

## 改法
所有 SSE 流式帧创建的 assistant 消息都带 _streaming:true
(content_delta / reasoning_delta / tool_call / agent_output 五个 push 点),
收尾时才置 _final。所以正确判据是「最后一条是尚未收尾的流式 assistant」,
即用 last._streaming 取代 state.chatLoading。

保留 chatLoading 的两处语义不同,未动:
  · 「思考中」占位气泡:只在用户自己发消息后等待时显示,旁观不需要
  · sendChat / interruptChat 自身的并发保护

判据:cmd/gui npm test 全绿。
2026-10-01 22:02:37 +08:00
..