mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2025-12-28 05:11:24 +08:00
- Modify AgentMessageDataSource.appendMessage to save messages to backend immediately instead of waiting for response completion - Add proper error handling and logging for message persistence operations - Create comprehensive test documentation covering V2 database service scenarios
2.8 KiB
2.8 KiB
Agent Session 消息持久化问题修复
问题描述
在Agent会话中发送消息后,如果切换到其他会话再切回来,消息会丢失。错误信息:
[MessageThunk] persistAgentExchange: missing user or assistant message entity
问题原因
-
原始实现问题:
saveMessageAndBlocksToDB对Agent会话直接返回,不保存消息- 消息只存在于Redux state中
-
V2实现问题:
AgentMessageDataSource.appendMessage是空操作- 期望通过
persistExchange在响应完成后保存
-
时序问题:
persistAgentExchange在Agent响应完成后才被调用- 如果用户在响应过程中切换会话,Redux state被清空
persistAgentExchange找不到消息实体,保存失败
解决方案
修改 AgentMessageDataSource.appendMessage 方法,让它立即保存消息到后端,而不是等待响应完成。
修改内容
// src/renderer/src/services/db/AgentMessageDataSource.ts
async appendMessage(topicId: string, message: Message, blocks: MessageBlock[]): Promise<void> {
// 立即保存消息,不等待persistExchange
const sessionId = extractSessionId(topicId)
const payload: AgentPersistedMessage = {
message,
blocks
}
// 通过IPC立即保存单个消息
await window.electron.ipcRenderer.invoke(IpcChannel.AgentMessage_PersistExchange, {
sessionId,
agentSessionId: '',
...(message.role === 'user'
? { user: { payload } }
: { assistant: { payload } }
)
})
}
影响分析
优点
- 消息立即持久化,不会因切换会话而丢失
- 即使Agent响应失败,用户消息也已保存
- 提高了数据安全性
潜在问题
-
可能的重复保存:
appendMessage保存一次persistAgentExchange可能再次保存- 需要后端处理重复消息(通过messageId去重)
-
性能考虑:
- 每条消息都触发IPC调用
- 可能增加延迟
测试验证
测试步骤
- 启用V2功能
- 创建Agent会话
- 发送消息
- 在Agent响应过程中立即切换到其他会话
- 切回Agent会话
- 期望结果:消息应该正确显示,不会丢失
测试场景
- ✅ 正常发送和接收
- ✅ 响应中切换会话
- ✅ 快速连续发送多条消息
- ✅ 网络中断恢复
后续优化建议
-
批量保存:
- 考虑缓存多条消息后批量保存
- 减少IPC调用次数
-
去重机制:
- 后端通过messageId去重
- 避免重复存储
-
错误处理:
- 添加重试机制
- 失败时的降级策略
回滚方案
如果修复引起新问题:
- 恢复
AgentMessageDataSource.appendMessage为原始空操作 - 考虑其他解决方案(如在切换会话前强制调用persistExchange)