[Bug] Single-member speak reply missing from group chat in v2.2.18-canary.10

这个报错通常出现在 LobeChat 群聊场景:成员(member)通过单成员 speak 回复后,消息已写入 messageMap ,但在构建显示列表时被 flatList 丢弃,导致界面看不到该成员回复。优先排查是否为 messageMap 中有、 flatList 中没有的解析层丢弃问题。

快速结论:这个报错通常出现在 LobeChat 群聊场景:成员(member)通过单成员 speak 回复后,消息已写入 messageMap,但在构建显示列表时被 flatList 丢弃,导致界面看不到该成员回复。优先排查是否为 messageMap 中有、flatList 中没有的解析层丢弃问题。

适用环境:macOS 桌面应用 v2.2.18-canary.10;只读检查用 CLI 0.0.54;离线测试运行时 Node.js 26.0.0(TypeScript 源码转译后本地执行);源码标签 v2.2.18-canary.10,源码 SHA d6cfa75d931dc36885906d45a741d972a1c6447d。受影响会话创建于 9 月 11 日、升级前已存在。

最快修复方案:升级到包含修复 PR #20364 的版本;该 PR 让 FlatListBuilder 在群组之后立即遍历中间链步骤中 orchestrationRole: 'member' 的子消息,使成员回复重新进入显示列表。如无法升级,可临时参考 Issue 中 Dante 的窄修复 commit f015635af27e451c06844718800b8a984e7a123b(仅解析显示层修复,非官方发布版本)。

注意事项:该修复只解决显示解析层,Issue 明确说明不承诺模型上下文恢复;后续的 member-start 失败是另一个未解决问题;修复尚未在正式发布的桌面构建中做端到端验证,且作者未附加私有缓存。

问题场景

用户在 macOS 桌面应用升级到 LobeChat v2.2.18-canary.10 后,打开一个已存在的群聊会话。群聊中 supervisor 先发起带 speak 调用的 assistant 消息,随后有 tool result、supervisor 后续消息,以及一条 parentId 指向 supervisor 调用消息的成员 assistant 回复。用户在界面中只能看到 supervisor 群组内容,成员的 speak 回复不显示,但该回复实际存储在已持久化的消息和桌面消息缓存中。

报错原文

[Bug] Single-member speak reply missing from group chat in v2.2.18-canary.10

Target in `messageMap`: yes.
Target anywhere in `flatList`, recursively including nested entries: no.

原因分析

根据 Issue 讨论链确认的根因:自 #16363 起,服务端 speak 会有意把成员回复挂到 supervisor 的 tool-call 消息下,用于让广播以气泡内 council 形式渲染。当 supervisor 通过 tool result 继续时,collector 会把这次 speak 轮次折叠进 assistant group 作为中间步骤;而 continuation 遍历只访问 group tail 和 tool 消息,#18806 的恢复逻辑也只重新接纳中间步骤的 user 子消息。因此单成员 speak 回复被孤立,无法进入 flatList。广播 council 有显式收集逻辑,不受影响。

环境排查

  • 确认桌面应用版本是否为 v2.2.18-canary.10 或包含修复 PR #20364 的版本。
  • 确认问题会话是否包含形如 user → supervisor speak call → tool result → supervisor follow-up → member reply 的消息结构。
  • 用只读方式检查 messageMap 与 flatList,确认目标回复是否在 messageMap 中存在、在递归检查的 flatList 中缺失。
  • 若自行复现,Issue 环境为 Node.js 26.0.0;离线测试使用源码标签 v2.2.18-canary.10,SHA d6cfa75d931dc36885906d45a741d972a1c6447d。
  • 检查缓存中的 tool_call_id 是否真实存在,避免把工具调用链接重建后再判断。
  • 确认 SuperJSON 的 Date 与 undefined 注解已正确还原,否则可能影响离线重放结论。

解决步骤

  1. 先确认问题是否属于显示解析层:在只读检查中确认目标成员回复存在于 messageMap,但在递归遍历的 flatList 中缺失。
  2. 可优先尝试升级到包含 PR #20364 的版本。该 PR 让 FlatListBuilder 在 group 之后立即遍历中间链步骤的 orchestrationRole: 'member' 子消息,成员回复会渲染一次并位于下一个 user 轮次之前,成员自己的 tool 步骤也会一并带上。
  3. 如果暂时无法升级,可在本地分支尝试 Issue 中验证过的窄修复 commit f015635af27e451c06844718800b8a984e7a123b;该 commit 调整 assistant-group collector 与中间 assistant 恢复逻辑,保留 processed-message、thread、chronology、active-branch 原有保护,且不改变已存储的 parent 关系。
  4. 注意不要优先采用 PR #19566:Issue 中的独立复测显示,该 PR 虽通过原始五消息 fixture,但归档缩减缓存和新增的七消息嵌套调用 fixture 仍会丢失成员回复。
  5. 修复后按原会话重建显示列表,检查成员回复是否出现且仅出现一次,同时确认 supervisor call、tool result、follow-up 均各自保留一次。

验证方法

使用 Issue 提供的五消息合成 fixture 走 packages/conversation-flow/src/parse.ts 的 parse 路径:修复前 member-reply 只存在于 messageMap、不存在于递归检查的 flatList;修复后成员回复应恰好出现一次,且 supervisor follow-up 仍然存在。再用归档的真实桌面缓存(先还原 SuperJSON 注解,并视需要先跑 reconcileAssistantToolLinks)复测,成员回复应从显示输出中缺失变为出现一次且完整保留,既有显示行保持不变、输入消息不被修改。若在桌面应用验证,Issue 中的期望结果是:一条成员回复与完整的 supervisor 续写同时显示。

参考来源

lobehub/lobe-chat #19552

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 27410

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注