快速结论:这个报错通常出现在 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,SHAd6cfa75d931dc36885906d45a741d972a1c6447d。 - 检查缓存中的
tool_call_id是否真实存在,避免把工具调用链接重建后再判断。 - 确认 SuperJSON 的
Date与undefined注解已正确还原,否则可能影响离线重放结论。
解决步骤
- 先确认问题是否属于显示解析层:在只读检查中确认目标成员回复存在于
messageMap,但在递归遍历的flatList中缺失。 - 可优先尝试升级到包含 PR #20364 的版本。该 PR 让
FlatListBuilder在 group 之后立即遍历中间链步骤的orchestrationRole: 'member'子消息,成员回复会渲染一次并位于下一个 user 轮次之前,成员自己的 tool 步骤也会一并带上。 - 如果暂时无法升级,可在本地分支尝试 Issue 中验证过的窄修复 commit
f015635af27e451c06844718800b8a984e7a123b;该 commit 调整 assistant-group collector 与中间 assistant 恢复逻辑,保留 processed-message、thread、chronology、active-branch 原有保护,且不改变已存储的 parent 关系。 - 注意不要优先采用 PR #19566:Issue 中的独立复测显示,该 PR 虽通过原始五消息 fixture,但归档缩减缓存和新增的七消息嵌套调用 fixture 仍会丢失成员回复。
- 修复后按原会话重建显示列表,检查成员回复是否出现且仅出现一次,同时确认 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 续写同时显示。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。

![[Bug] callAgent: the called agent runs on the caller's model, its own model/provider are ignored (v2.2.17)](https://www.chat-gpts.plus/wp-content/uploads/2026/10/19542-c368b10e-768x403.jpg)
