Skip to content

重启/恢复会话后微信重复发送历史消息 #4

Description

@midmirror

问题描述

omp/pi 会话重启或恢复(omp -c / continue)后,微信端反复收到此前已发送过的历史回复。每次微信发来新消息触发一轮 agent 后,历史回复会被再次全部重发。

根因(两处独立问题)

1. getUpdates 游标仅存内存(src/client.ts

this.cursor 只在 WeixinClient 实例内存中,未持久化。进程重启后游标为空,getupdates 带空 get_updates_buf 请求 → 微信 iLink Bot 服务端把缓存的历史消息全部重放 → agent 重新处理并重发回复。

2. agent_end 补发逻辑在全量会话上 slice(src/index.ts

const allReplies = extractAllAssistantReplies(turn.messages)  // 提取 event.messages 中所有 assistant 回复
const newReplies = allReplies.slice(turn.sentCount)           // 减去本次已发,剩余全部补发
await queue.sendRepliesToWechat(newReplies, turn.targetUser)

恢复会话后,agent_end 事件的 event.messages 包含整个会话历史(含所有历史 assistant 回复),而 sentCount 只统计本次 turn 的增量 → slice(sentCount) 把全部历史回复当作"未发送"补发到微信。每轮微信对话都会触发一次全量历史重发。

复现步骤

  1. 正常使用微信桥接对话若干轮
  2. 重启 omp(或 omp -c 恢复会话)
  3. 微信发送任意新消息
  4. 观察:pi 回复后,历史所有回复被依次重发

期望行为

重启/恢复会话后,只处理新消息并只发送本次回复,不重发任何历史消息。

环境

  • pi-wechat-assistant 0.3.0
  • omp(oh-my-pi),omp -c 恢复会话

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions