工具执行期间流式正文反复出现又消失——用户以为出错了
- Dominant language
- TypeScript
- Stars
- 0
- Forks
- 0
- Avg merge
- 1h 7m
- Merged PRs (30d)
- 969
Description
## 人类实测(2026-09-11,devapp)
> 在 tools 的执行的过程中出现,streaming 过来到客户端的内容,会有波动,**出来又消失了,然后继续出来新的内容,然后又消失**,作为用户会很困惑。
即:工具执行期间,助手正文在客户端**反复出现又被抹掉**,不是单调增长。
## 为什么这条重要
用户判断「系统是不是在正常工作」靠的就是**正文在稳定增长**。内容忽有忽无,比完全不显示更糟——用户会以为出错了、以为自己看错了、或者反复刷新。这与本仓一族问题同源:**用户分不清系统状态**(#3186 / #3212 ② / #3302 / #3311 / #3320 / #3372)。
## 首要嫌疑(写成可证伪形式,**请先验证再动手,不要照抄**)
**假说 A —— 正文有两个来源,重读状态把在途流式文本抹掉了。**
已知事实(今天另一条线在 #3316 的诊断中确认):**工具事件是从线程状态重建的(`extractToolCallEvents`),SSE 帧只是「去重读状态」的触发器**。若正文也走同一条重建路径,则每次重读拿到的快照**尚未包含在途增量** ⇒ 已显示的文本被抹掉 ⇒ 下一个增量再补回来 ⇒ 反复闪烁。
- 若成立 ⇒ 抹掉的时刻应与状态重读/工具事件到达的时刻**一一对应**;且抹掉后重新长出的内容**与之前重复**。
- 若不成立(抹掉与重读无时间相关性,或抹掉后内容不重复)⇒ A 被推翻。
**假说 B —— 组件 key 变动导致重挂载。** 本仓栽过同型:Next 动态段 page 级挂载每次切换都重挂载;#3302 的审批组件挂载门一变就卸载、本地 state 清零。
- 若成立 ⇒ DOM 上那个正文节点的身份(identity)在闪烁时刻发生变化,而不只是内容变化。
**假说 C —— 多个流并发写同一个正文缓冲**(例如 skill 活动流与主正文流互相覆盖)。
- 若成立 ⇒ 闪烁只在有并发工具/技能活动时出现,纯文本轮次不出现。
**判别方法**:三个假说的区分点是**「抹掉的时刻与什么相关」**和**「抹掉后长出的内容是否与之前重复」**。请在**真实链路**上逐帧取证(记录代理 / MutationObserver / 逐帧 DOM 快照),不要从代码结构推断。
## 判据要求(本任务最容易做错的地方)
- **断言必须落在「正文的可见文本长度随时间单调不减」**上——这正是本仓已有的一条判据形态:`copilotkit-v2-stream-frame-timing.spec.ts:77` 的「assistant 正文的 DOM 文本长度随时间逐步增长,不是一次性跳变」。**注意那条 spec 今天在 `chat-read` 车道上是红的**(run 34500470766),**先确认它红的是不是同一件事**——若是,本 issue 就是它的根因,别重复造判据。
- **不能只判「最终文本正确」**——闪烁过程结束后最终态往往是对的,那种断言在本缺陷下**无法被证伪**。必须判**过程**。
- **三步反证**:造出缺陷形状(让一次重读覆盖在途文本)→ 断言变红并贴真实输出 → 撤掉 → 恢复绿。**只贴绿不算数**(本仓已九次「全绿但空转」)。
## 纪律提醒
本仓头号病是「同一事实声明在两处」(已**十二例**),而「流式正文 vs 落库正文」**正是被记录过的其中一例**。若查明是 A,修法应收敛成单一权威来源,**不要在重读那侧加特判去躲开在途文本**。
Contributor guide
No contributing guide indexed for this repository
Research direction
Start by running copilotkit-v2-stream-frame-timing.spec.ts:77 in the chat-read lane and confirm whether its failure matches this issue. Then capture the real streaming path with an agent, MutationObserver, or frame-by-frame DOM snapshots while tools run, correlating text removal with state rereads, DOM identity changes, and concurrent streams. Done means a reproducible regression test proves visible assistant text never decreases during streaming and passes after the underlying cause is fixed.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- frontend, testing-qa
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 38/100