Agent 会话要按树保存而不是消息列表

**一轮 Agent 对话不是「用户消息 + AI 回复」,所以 `AiMessage(role, content)` 这种表结构装不下它。** 一条会话里还有 Tool Call、Tool Result、压缩摘要、分支和「当前激活的节点」—— 它是一棵可以恢复的会话树。

消息列表装不下的东西

内容为什么必须存
Tool Call / Tool Result决定模型下一轮看到什么;丢了就复现不出当时的判断
压缩摘要(compaction)长会话的历史已被替换成摘要,不存就无法恢复上下文
分支 / 当前 leaf会话可以从某个节点分叉,得知道「现在在哪一支」
模型切换、活动工具同一会话可能换过模型

典型一轮的实际结构:用户说「帮我润色当前笔记」→ Agent 调读取工具 → 工具返回正文 → Agent 调写入工具 → 工具返回待确认提案 → Agent 回复「已准备好修改,请确认」。这些都要按类型落库,服务重启后据此重建上下文,而不是只靠内存。

与之配套的执行状态

会话内容之外还要有「这一轮请求」的状态记录(如 AiTurn):请求幂等 ID、状态(running / succeeded / failed / interrupted)、执行者、lease 过期时间、对应的用户/助手节点、最终输出、错误码。

它解决三件事:浏览器超时重试同一请求不会重复执行(幂等)、进程崩溃后能判断这轮是否还活着(lease 可接管)、失败可归因(错误码与输出分离)。

相关