AI 对话框 - 生产环境因网络抖动有时候会多回复一次对话中的后几个字
生产环境使用 solid_cable(DB 轮询)且设置了 message_retention: 1.day。当 WebSocket 因网络抖动短暂断连后重新连接时,SolidCable 会将保留窗口内未送达的消息重放给客户端。
此时 pendingAssistantEl 已被 finalizeAssistantMessage 清为 null,重放的最后几个 assistant_chunk 就会触发 ensurePendingAssistant() 创建新气泡,把最后一段文字单独显示出来。
修复方案:在 handleCableMessage 里,处理 assistant_chunk / assistant_started 时判断是否处于 loading 状态(即当前对话是否仍在进行中),如果不是则丢弃这些过期消息。
根本原因总结:
- 生产环境
solid_cable开启了message_retention: 1.day+polling_interval: 0.1s - WebSocket 断线重连后,SolidCable 会把保留期内未送达的广播重新投递
assistant_finished已将pendingAssistantEl清为null,随后重放的assistant_chunk触发ensurePendingAssistant()创建了新气泡,只显示最后一小段文字
修复逻辑:在收到 assistant_started / assistant_chunk / assistant_finished 时,先检查 this.isLoading。send() 时置为 true,finalizeAssistantMessage / failAssistantMessage 时 setLoading(false) 将其置回 false。因此,重连后重放的过期流式消息会被直接丢弃,不会产生多余气泡。