问题描述
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) 把全部历史回复当作"未发送"补发到微信。每轮微信对话都会触发一次全量历史重发。
复现步骤
- 正常使用微信桥接对话若干轮
- 重启 omp(或
omp -c 恢复会话)
- 微信发送任意新消息
- 观察:pi 回复后,历史所有回复被依次重发
期望行为
重启/恢复会话后,只处理新消息并只发送本次回复,不重发任何历史消息。
环境
- pi-wechat-assistant 0.3.0
- omp(oh-my-pi),
omp -c 恢复会话
问题描述
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)恢复会话后,
agent_end事件的event.messages包含整个会话历史(含所有历史 assistant 回复),而sentCount只统计本次 turn 的增量 →slice(sentCount)把全部历史回复当作"未发送"补发到微信。每轮微信对话都会触发一次全量历史重发。复现步骤
omp -c恢复会话)期望行为
重启/恢复会话后,只处理新消息并只发送本次回复,不重发任何历史消息。
环境
omp -c恢复会话