Skip to content

Telegram 消息被错误回复替换(edit-in-place 竞态问题)

问题

当模型调用失败、触发限速或下游出现错误时,Telegram 中已成功发送的消息(包括流式输出的部分回复)被通用错误消息覆盖替换,而不是保留原始内容并另起一条新消息报告错误。

具体表现:

  1. 用户提问,Agent 开始流式输出回复
  2. 模型中途遇到错误(超时、限速、provider 报错等)
  3. Telegram 中原本已发出的部分回复内容消失,被替换为错误提示文字

另一变体:发送文件(含图片说明)后,Agent 的文字回复把文件消息覆盖掉,文件从聊天界面消失。

根本原因

Telegram 支持通过 editMessageText 原地编辑已发送消息。OpenClaw 的 Telegram 适配器利用这一特性实现"流式/思考中"UX:

  1. 收到用户消息后立即发送一条占位消息(如 "⏳ 正在处理...")
  2. 逐步用最新的局部输出编辑替换该消息(live streaming)
  3. 完成时发送最终结果

问题在于:当出现错误时,错误处理路径同样走了 editMessageText,导致已经发出的正式内容被错误消息覆盖。

解决方案

临时 Hotfix(等待官方升级)

openclaw.json 中禁用 Telegram 的实时预览流式输出:

json5
{
  channels: {
    telegram: {
      streaming: "off",
    },
  },
}

设为 "off" 后,OpenClaw 不再通过原地编辑发送预览,而是完成后统一发新消息,从根本上避免了覆盖问题。

或者改用 progress 模式

json5
{
  channels: {
    telegram: {
      streaming: "progress",
    },
  },
}

生成过程中只显示进度文本,完成时发送最终结果,比 "off" 更友好。

官方修复

该问题已在后续版本修复。升级到最新版本后,大多数用户不再复现。建议先升级再观察。