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.isLoadingsend() 时置为 truefinalizeAssistantMessage / failAssistantMessagesetLoading(false) 将其置回 false。因此,重连后重放的过期流式消息会被直接丢弃,不会产生多余气泡。

AI 助手 - deepseek-v4-flash

你好!有什么可以帮你的吗?

可以问我:推荐文章、搜索主题、了解博客内容

AI 生成内容仅供参考

未播放
0:00 / 0:00