You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[性能] Chat 折叠只隐藏不卸载:把渲染窗口收缩为「最新 N 轮 + 1 个折叠行」(含实现与实测)
#7579
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
现象
长任务会话跑久之后前端越来越卡,最终卡死(#359、#452)。本机复现后定位到渲染路径,方案已实现并测试通过,因本仓库 PR 通道未开放,按维护者建议的渠道放到这里。
根因:折叠不等于不渲染
packages/client/ui-chat/src/client/chat/ChatView.tsx对整个已加载窗口逐个渲染ChatNodeSeat:而
ChatNodeSeat在 Turn 过程折叠时只做hidden="until-found"(searchable-hidden.ts),子树保持挂载。packages/client/ui-chat/README.md原文写得很明确:于是「折叠已完成轮次」只是绘制层面的隐藏,不是渲染层面的隐藏:
O(已加载节点数)O(已加载节点数)两者都随会话时长单调增长。跑几小时到几天的任务,前端占用持续上涨——这与
#359里「3,242 条 reasoning-chunks 实时累积渲染」、#370里「一次返回 37MB 历史」是同一类问题的不同切面。packages/client/ui-trajectory早就为同样原因做了虚拟化(e2e 断言MAX_MOUNTED_ROWS = 160)。Chat 一直没有对等机制。方案:把渲染窗口收缩为「最新 N 轮 + 1 个折叠行」
在 render 期对已加载 order 做一次纯投影:
DEFAULT_WINDOW_TURNS = 5轮保留各自 seat;TranscriptFoldRow,行上data-transcript-fold-turns汇报它代表多少轮;窗口 + 1,与会话长度无关。解析不到 Turn 的行(头部 session 级 section,含 System prompt 行)保持挂载:它们是固定几行、不是每轮成本,去掉还会改变 transcript 呈现。
折叠行每次把窗口上抬一页(5 轮),上限 8 页。这是纯渲染决策——那些轮次已经在内存里,不发历史请求。到顶后由既有的「加载更早」分页接管,所以挂载预算无法被无限点开。
导航与预算对齐:rail 点击或 pending jump 的目标轮次若「已加载但未被 seat」,原先找不到 anchor 会静默失效,现在改为上抬预算并重新武装 jump(原有落地修正照常执行)。揭示路径经 latest-ref 读取,避免分页 commit 打断进行中的 busy 标记。
实测
pnpm vitest run ui-chat/teststsc -b tsconfig.client.jsontests/apply-inject有 1 处既有错误,stash 前后一致)data-transcript-fold-turns=35承载,不落地为 DOM关键断言(
chat-view.client.spec.tsx):代码
packages/client/ui-chat/src/client/chat/transcript-window.ts(纯投影 + 分页换算)packages/client/ui-chat/src/client/chat/TranscriptFoldRow.tsx/.module.cssChatView.tsx、locale.ts(2 条中英文案)、chat-view.client.spec.tsxtranscript-window.client.spec.ts分支(可直接
git fetch查看,基于0.1.6-alpha.2;ChatView.tsx与当前 master 有冲突需重做植入):局限(有意不做)
TranscriptFoldGroup上叠加。若维护者认可方向,PR 通道开放时我可以直接提 PR(补丁与测试已就绪)。
All reactions