对话时间线与多分支(设计见 docs/agent-loop-concurrency-design.md §12)
Agent 的持久状态 = 对话历史(ChatMemory 中的 append-only 日志), 日志本身就是 timeline;分支 = fork-as-new-conversation——前缀复制到 新 conversation-id + 一条血缘记录。所有既有组件(memory filter / PauseStore / react 循环)按 conversation-id 工作,换分支即换 conv-id 建 agent,无组件感知"树"。
一致性不变量:合法的 fork/rollback 点只有 turn 边界与暂停点 (屏障才是一致快照点)。fork 暂停中的会话(全量前缀)自动连带复制 PauseStore 快照——两个分支可各自 resume 不同决策(HITL 决策分支)。
用法: (def deps {:memory mem :pause-store ps :branch (in-memory-branch-store)}) (fork! deps "main" {}) ;; 全量分支(含暂停快照) (fork! deps "main" {:at 4 :as "exp"}) ;; 前 4 条消息处开分支 (rollback! deps "main" 4) ;; 破坏性截断("重新生成") (ancestry deps "exp") ;; 血缘回溯 (prune! deps "exp") ;; 删分支(有子分支拒绝)
对话时间线与多分支(设计见 docs/agent-loop-concurrency-design.md §12)
Agent 的持久状态 = 对话历史(ChatMemory 中的 append-only 日志),
日志本身就是 timeline;分支 = fork-as-new-conversation——前缀复制到
新 conversation-id + 一条血缘记录。所有既有组件(memory filter /
PauseStore / react 循环)按 conversation-id 工作,换分支即换 conv-id
建 agent,无组件感知"树"。
一致性不变量:**合法的 fork/rollback 点只有 turn 边界与暂停点**
(屏障才是一致快照点)。fork 暂停中的会话(全量前缀)自动连带复制
PauseStore 快照——两个分支可各自 resume 不同决策(HITL 决策分支)。
用法:
(def deps {:memory mem :pause-store ps :branch (in-memory-branch-store)})
(fork! deps "main" {}) ;; 全量分支(含暂停快照)
(fork! deps "main" {:at 4 :as "exp"}) ;; 前 4 条消息处开分支
(rollback! deps "main" 4) ;; 破坏性截断("重新生成")
(ancestry deps "exp") ;; 血缘回溯
(prune! deps "exp") ;; 删分支(有子分支拒绝)(ancestry {:keys [branch]} conv-id)自身到根的血缘链 [自身记录 父记录 ...](根会话无记录,链止于最老的 fork)。
自身到根的血缘链 [自身记录 父记录 ...](根会话无记录,链止于最老的 fork)。
分支血缘记录 {:id :parent :fork-point :created-at}。
分支血缘记录 {:id :parent :fork-point :created-at}。
(branch-children store conv-id)直接子分支的记录列表。
直接子分支的记录列表。
(delete-branch! store conv-id)删除该会话的血缘记录。返回 nil。
删除该会话的血缘记录。返回 nil。
(get-branch store conv-id)查该会话的血缘记录;根会话(非 fork 产物)为 nil。
查该会话的血缘记录;根会话(非 fork 产物)为 nil。
(record-branch! store branch-rec)登记一条血缘。返回 nil。
登记一条血缘。返回 nil。
(fork! {:keys [memory pause-store branch]} src-conv-id & [{:keys [at as]}])在 src-conv-id 上开分支:前缀复制到新 conversation-id + 血缘记录。
deps: {:memory ChatMemory必填 :pause-store 可选 :branch 可选} opts:
全量 fork 且源处于暂停时,PauseStore 快照连带复制(快照属于日志尖端; 部分前缀 fork 不带)——两个分支可各自 resume 不同决策。
返回新 conversation-id。
在 src-conv-id 上开分支:前缀复制到新 conversation-id + 血缘记录。
deps: {:memory ChatMemory必填 :pause-store 可选 :branch 可选}
opts:
- :at 前缀长度(消息条数);缺省全量。**合法 fork 点是 turn 边界/暂停点**
(§12.2 不变量,:at 应落在完整 turn 的消息边界上,由调用方保证)
- :as 新 conversation-id;缺省随机
全量 fork 且源处于暂停时,PauseStore 快照连带复制(快照属于日志尖端;
部分前缀 fork 不带)——两个分支可各自 resume 不同决策。
返回新 conversation-id。(lineage {:keys [branch]} conv-id)该会话的血缘记录 {:id :parent :fork-point :created-at};根会话为 nil。
该会话的血缘记录 {:id :parent :fork-point :created-at};根会话为 nil。
(prune! {:keys [memory pause-store branch]} conv-id)删除分支:历史 + 暂停快照 + 血缘记录。有直接子分支时拒绝 (先 prune 子分支,或改挂血缘后再删)。
删除分支:历史 + 暂停快照 + 血缘记录。有直接子分支时拒绝 (先 prune 子分支,或改挂血缘后再删)。
(rollback! {:keys [memory pause-store]} conv-id n)破坏性截断:conv-id 的历史保留前 n 条("重新生成"场景;要无损请用 fork!)。 同时清除该会话的暂停快照(日志尖端已变,未决暂停失效)。 实现为 clear + 重写(现有 ChatMemory 协议即可;非原子,勿并发使用)。
破坏性截断:conv-id 的历史保留前 n 条("重新生成"场景;要无损请用 fork!)。 同时清除该会话的暂停快照(日志尖端已变,未决暂停失效)。 实现为 clear + 重写(现有 ChatMemory 协议即可;非原子,勿并发使用)。
(sqlite-branch-store db-path)SQLite 后端的 BranchStore(可与 ChatMemory / PauseStore 同库不同表)。
SQLite 后端的 BranchStore(可与 ChatMemory / PauseStore 同库不同表)。
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |