Appearance
Telegram 消息被错误回复替换(edit-in-place 竞态问题)
问题
当模型调用失败、触发限速或下游出现错误时,Telegram 中已成功发送的消息(包括流式输出的部分回复)被通用错误消息覆盖替换,而不是保留原始内容并另起一条新消息报告错误。
具体表现:
- 用户提问,Agent 开始流式输出回复
- 模型中途遇到错误(超时、限速、provider 报错等)
- Telegram 中原本已发出的部分回复内容消失,被替换为错误提示文字
另一变体:发送文件(含图片说明)后,Agent 的文字回复把文件消息覆盖掉,文件从聊天界面消失。
根本原因
Telegram 支持通过 editMessageText 原地编辑已发送消息。OpenClaw 的 Telegram 适配器利用这一特性实现"流式/思考中"UX:
- 收到用户消息后立即发送一条占位消息(如 "⏳ 正在处理...")
- 逐步用最新的局部输出编辑替换该消息(live streaming)
- 完成时发送最终结果
问题在于:当出现错误时,错误处理路径同样走了 editMessageText,导致已经发出的正式内容被错误消息覆盖。
解决方案
临时 Hotfix(等待官方升级)
在 openclaw.json 中禁用 Telegram 的实时预览流式输出:
json5
{
channels: {
telegram: {
streaming: "off",
},
},
}设为 "off" 后,OpenClaw 不再通过原地编辑发送预览,而是完成后统一发新消息,从根本上避免了覆盖问题。
或者改用 progress 模式
json5
{
channels: {
telegram: {
streaming: "progress",
},
},
}生成过程中只显示进度文本,完成时发送最终结果,比 "off" 更友好。
官方修复
该问题已在后续版本修复。升级到最新版本后,大多数用户不再复现。建议先升级再观察。