Replies: 1 comment
|
根因已在 #5919 定位: 间歇性的解释:只有 follow 快照窗口内存在未结算 attempt(原生 chunk 记录含普通对象)时才触发——模型流式输出相位必卡,工具执行间隙/回合结束后正常;“运行中 agent 的会话更常见”正是这个相位相关性的体现(个别未运行会话中招,对应快照里残留的未结算 attempt)。本地在安装包上对该比较做空白归一化后,Firefox 症状消失。 |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
[Bug] Firefox 特有:会话历史在"载入历史…"处无限卡住
环境
0.1.7-rc.1http://127.0.0.1:3080(用户级 systemd 服务,dsh web --no-open启动)症状
在 Firefox 的 Web GUI 中,切换到某个会话时,历史有时会无限卡在"载入历史…"。侧边栏的会话列表能正常加载,只有历史内容区一直不出现。
复现步骤
dsh web --no-open(或启动该服务)。http://127.0.0.1:3080/?token=…。我用 CUA 复现:启动 Firefox → 打开 GUI → 选中一个会话 → 主内容区 30 秒以上一直停在"载入历史…"。
已验证的事实(对运行中的服务直接做传输/RPC 测试)
这些排除了"服务端/数据/传输"故障:
ws://host/api/remote.mux升级(带 Firefox 式Origin、Sec-Fetch-Site: same-origin、Sec-Fetch-Mode: websocket、Cookie)101 Switching Protocolssession/follow首帧(快照)running: false(未在运行)remote.muxWebSocket结论:服务端响应很快、快照很小、会话甚至没在运行。问题出在 Firefox 客户端一侧。
根因分析
"载入历史…"这行文字在会话历史流处于 pending 状态时渲染(
dsh-client-ui-chat中openState === "loading")。历史是通过 WebSocket mux 加载的:有两个根因与现有证据吻合:
根因一:
RemoteStreamMuxClient在 WebSocket 连接失败后不会自动重连(主要怀疑对象)文件:
packages/client/runtime/src/client/stream-client.ts(安装版为dsh-api-gateway/lib/types/client/stream-client.js)的maintain():connect()失败后,keepAlive被清空,但没有任何东西再调用maintain()。唯一的重连触发点是 HTTP 连接层的onReconnectRequested。所以一旦 WebSocket 失败/断开,而 HTTP RPC 仍健康(这也是为什么会话列表还能加载),之后每一次session/follow打开都会在waitForSocket()里永远阻塞。这正好解释了间歇性和仅 Firefox:它取决于 Firefox 的 WebSocket 何时断开(空闲超时、网络闪断,或 Firefox 自身行为),Chrome 不会以同样的方式断开。刷新页面会重新初始化 mux,从而"修复"——与报告的现象一致。
根因二:
session.history分页只按消息数、不按事件数(已知问题)文件:
packages/host/apiproxy/src/api-proxy.ts的paginate()。一条流式消息会为每个 chunk 追加一个assistant/chunk事件,因此 50 条消息的一页可能解析出数万事件/数 MB。客户端在主线程逐条回放整窗,可能把标签页卡死。这已在 #2119 / #1706 中记录。建议修复
修复一:mux 自动重连
maintain()中,connect()失败后用退避调度一次重连,而不是只清keepAlive。waitForSocket()中,若 socket 未就绪且没有进行中的连接尝试,主动触发maintain(),让新打开的流能"踢"起连接。修复二:限制历史页大小
paginate()中,除了按消息数上限外,再加一个事件数上限(MAX_PAGE_EVENTS,例如 20 000),仍在消息边界切页,保证loadOlder/hasMore继续可用。assistant/message完整重述的旧消息组,裁剪其冗余的assistant/chunk事件,只保留最新在播消息组的 chunk 原文。在 Bug: session.history tail page returns unbounded payloads with high reasoning effort (27k events / 5.1 MB → main-thread freeze) #2119 中实测可减少 87–98% 载荷。相关
All reactions