[bug] 打开大会话时 history 页把全部 assistant/chunk 送进浏览器,UI 看起来像没回复 — 附可 cherry-pick 修复 #3797
Replies: 4 comments 2 replies
|
先不要再点开那个大会话:新开一个 session 继续。旧日志还在 |
|
感谢指到同一条症状。#1706 / #3726 / #2119 / #2654 报的都是「一页 history 被 这条不是重复贴同一份补丁。相对 #2598,这里多了三处,所以先不关:
实时 mux、磁盘日志、导出都不变。Maintainer 可以直接 cherry-pick 这条,或在 #2598 上收这三处。 Same symptom as #1706 / #3726 / #2598. Keeping this thread open because the patch differs from #2598: keep in-progress chunks, leave the client |
|
补充一个更底层的相关案例(attach 解码路径,传输层修复覆盖不到)。 Related discussions(同一根源:chunk 全量物化)
以上都聚焦 history 传输 / UI 渲染 层。下面这个案例是更底层的 attach 解码路径:即使 history 不再送 chunk 进浏览器,会话打开时仍会全量解码展开,导致内存爆炸与 GC 停顿——现有修复覆盖不到。 现象单会话 94.9MB(
实测数据(同会话,删除 chunk 后对比)
reasoning 完整保留在 建议
|
|
@linxhen-ux 感谢 checklist — 已按你 8/24 建议单独开帖挂 invariant,避免和 #3797 的 history 分页修复混在一起: → #4544 attach/resume 全量解码 chunk 致 OOM/超时 checklist 原文已迁入 #4544(署名 @linxhen-ux)。#3797 仍只管 @linxhen-ux: checklist moved to #4544 (attach/open-resume layer). #3797 stays scoped to history pagination only. |
Uh oh!
There was an error while loading. Please reload this page.
摘要 / Summary
session.history按追加来源的user/message/assistant/message计数分页,但返回该裁切内的全部原始事件。生产环境的assistant/message会在sourceEventSeqs列出整段assistant/chunktoken 流,一次编程回合就能有数千条分片。于是默认 50 条(甚至只请求 20 条)消息的尾页会变成上万个事件、数兆字节。Web 客户端
session.open要等这页返回才把openState翻成open。请求进行期间实时session/event被缓冲,转录看起来冻结:点开旧会话失败,或发出「你好」像没有回复。宿主其实已经在数秒内跑完 turn。session.historypages by append-origin message count, then returns every raw event in that cut. A production assistant message lists itsassistant/chunkseqs insourceEventSeqs, so one coding turn can add thousands of chunks. A 20-message page measured 12,780 events / 2.4MB and took ~3.5s locally; over high-latency Tailscale the browser never finishes folding.session.promptstill succeeds on the host.复现 / Repro
session.history(maxMessages: 20)返回上万assistant/chunk。assistant/message(以及进行中步骤的分片),打开和后续 turn 立即可见。对照:空白新会话工作正常;同一条
session.prompt在宿主日志里有完整assistant/message。根因 / Root cause
packages/host/apiproxy/src/api-proxy.ts的paginate()按消息边界裁切后,historyPage原样送达整段 raw range。磁盘上的packChunks(text-chunks行)在读取时已经解码成逐条assistant/chunk。客户端PAGE_MESSAGES = 50,doOpen在history()完成前不会安装窗口。这不是 mux / WebSocket 升级失败:实时通道仍是 101,问题是历史页体积 + 打开路径。
修复 / Fix (cherry-pick ready)
833140a63a—fix(apiproxy): omit settled assistant/chunk events from history pageshistoryPage仍按消息边界裁切(compaction 的sourceEventSeqs分组不变),然后去掉其追加来源assistant/message已在本页上的内部assistant/chunk。进行中步骤(还没有最终消息)保留全部分片。原始裁切的首尾事件保留,因此客户端beforeSeq与实时尾 seq 缺口检查仍指向同一区间。实时 mux 帧不变。验收 / Acceptance
pnpm exec vitest run packages/host/apiproxy/tests/api-proxy-view.spec.ts通过。已完成步骤不再送达内部 chunk;进行中步骤保留 chunk;maxMessages: 1时原始裁切首个 chunk 仍在,用该 seq 做loadOlder不会把已省略的内部分片再送一遍。All reactions