feat(chat): chat_messages.turn_id 列 + DTO(写入接线留待下一步)
迁移 0018:ALTER TABLE chat_messages ADD COLUMN turn_id TEXT NOT NULL DEFAULT ''
(与 persona_id / client_msg_id / document 同族:不用 NULL,空串 = 不属于任何已知回合 ⇒ 旧行零迁移、键省略)。
存储层全链路带 turn_id(列清单唯一一份 ⇒ List/ListAfter/Recent/Search/FindByClientMsgID 自动同源);
新增 history/turn_id.go:ensureTurnIDColumn(既有库幂等前滚)+ SetMessagesTurnID
(第二段补写:单事务参数化、先到先得 WHERE turn_id = ''、幂等、未知 id 忽略)。
DTO:historyMessage.TurnID(json turnId,omitempty)⇒ REST 列表 / admin 渠道日志 / WS 握手回放 /
message_persisted / channel_persisted / message_edited 一次全覆盖。
写入面:persistUserMessages 读 ctx 回合标识;persistAssistantReply 增可选尾参(既有调用点零改动);
withTurnID / turnIDFrom / assignTurnID / turnIDOfLeg。
⚠️ 编排器把 turnId 交给落库的 4 处(新起一路 / 续跑路 / 被 steer 吃进 / 助手回复)尚未接线
(那些文件当时被另一路占用);当前生产行为 turn_id 仍为 ''。清单已在切片报告里精确到文件:行。
13 新用例 + 5 条变异(INSERT 不带列 / DTO 不回填 / 去掉 omitempty / 去掉先到先得 / 不回滚前滚)。
为守 session_persist.go ≤500 行,turnId 一节拆到新文件 session_turn_id.go。
This commit is contained in:
1 parent
354b08a45f
commit
d64b26d499
12 files changed
+950
-16
No files matched your search
@@ -93,7 +93,21 @@ type historyMessage struct {
|
||||
// 这类脆弱匹配),也能在重连后从读接口收敛。它为空时省略,而空意味着
|
||||
// 「这条消息没有幂等键」(老客户端、IM 镜像、历史行)。
|
||||
ClientMsgID string `json:"clientMsgId,omitempty"`
|
||||
CreatedAt int64 `json:"createdAt"`
|
||||
// TurnID 是这条消息所属的那一**路**回合的权威标识(design/15 §2.5.9):
|
||||
// 编排器生成,与该路全部流帧 / `turn_begin` 帧壳上的 turnId **同值**。
|
||||
// 同一路的 user 行与 assistant 行因此带同一个值,客户端据此
|
||||
// - 精确配对「回复 ↔ 提问」;
|
||||
// - 在**重连 / 回放**时从历史行恢复回复侧的分组小标(真并行下同一会话有两个
|
||||
// 交错的回答,只按顺序渲染会配错)。
|
||||
//
|
||||
// 它为空时省略,而空意味着「这一行不属于任何已知的回合」:加入该列之前的历史
|
||||
// 行、以及未经编排器的写入路径(IM 镜像等)都是这种情形,读起来与以往逐字
|
||||
// 相同。排队 / 被转向吃进的消息在**落库那一刻**也还没有自己的路(那时它由哪
|
||||
// 一路回答尚未确定),因此它们的那一帧 `message_persisted` 不带 turnId ——
|
||||
// 客户端从 `turn_begin`(帧壳 turnId + data.messageIds)得知归属,行本身随后
|
||||
// 由它实际被处理的那一路补写。
|
||||
TurnID string `json:"turnId,omitempty"`
|
||||
CreatedAt int64 `json:"createdAt"`
|
||||
}
|
||||
|
||||
// handleHistorySessions 先返回主会话,再返回每个子会话(最旧
|
||||
@@ -432,7 +446,11 @@ func toHistoryMessage(m history.Message) historyMessage {
|
||||
// (协同 G4),读接口(GET /sessions/{id}/messages)与
|
||||
// `message_persisted` 帧因此给出同一个答案。
|
||||
ClientMsgID: m.ClientMsgID,
|
||||
CreatedAt: m.CreatedAt,
|
||||
// TurnID 同理一并回填:读接口、WS 握手回放、`message_persisted` 与
|
||||
// `message_edited` 四条面共用本映射,因此它们对「这条消息属于哪一路」
|
||||
// 永远给出同一个答案(design/15 §2.5.9)。
|
||||
TurnID: m.TurnID,
|
||||
CreatedAt: m.CreatedAt,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user