builtin-agent: ReAct loop turns as CAS chain #433

Closed
opened 2026-05-23 10:03:25 +00:00 by xingyue · 0 comments
Owner

动机

当前 builtin agent 的 ReAct loop 过程不透明:

  • loop 跑了多少轮、每轮 LLM 说了什么、调了哪些 tool,只能靠 stderr log(还会被 execFileSync 吃掉)
  • 崩溃/超时后无法恢复
  • step details 需要额外拼装

方案

将每个 turn 存为一个 CAS node,形成 chain(与 thread step chain 同构):

TurnNode {
  role: "assistant"
  content: string           // LLM 原始输出
  toolCalls: ToolCall[]     // 本轮调用的 tools
  toolResults: ToolResult[] // tool 返回结果
  prev: string | null       // 上一个 turn node 的 CAS hash
}

收益

  1. 实时可观测 — 每 turn 写入 CAS,随时 cas get 查看进度和轮数
  2. 崩溃恢复 — 进程挂了,从最后一个 turn node hash 恢复 messages 继续跑
  3. step details 直接 walk — turn chain 就是 detail,不需要额外的 detail 存储逻辑
  4. debug 友好 — 事后可以完整回溯每轮 LLM 的思考和 tool 调用

实现要点

  • runLoop 每完成一轮(LLM 响应 + tool 执行),立即 cas.put(turnNode)
  • 最终 step 的 detail hash 指向最后一个 turn node
  • 现有的 buildStepDetail 可以简化为 walk turn chain
  • 考虑 session resume 时从 turn chain 重建 messages(和 step chain 重建 history 同构)

Ref: #428 狗粮测试中发现 loop 过程不可观测

## 动机 当前 builtin agent 的 ReAct loop 过程不透明: - loop 跑了多少轮、每轮 LLM 说了什么、调了哪些 tool,只能靠 stderr log(还会被 execFileSync 吃掉) - 崩溃/超时后无法恢复 - step details 需要额外拼装 ## 方案 将每个 turn 存为一个 CAS node,形成 chain(与 thread step chain 同构): ``` TurnNode { role: "assistant" content: string // LLM 原始输出 toolCalls: ToolCall[] // 本轮调用的 tools toolResults: ToolResult[] // tool 返回结果 prev: string | null // 上一个 turn node 的 CAS hash } ``` ## 收益 1. **实时可观测** — 每 turn 写入 CAS,随时 `cas get` 查看进度和轮数 2. **崩溃恢复** — 进程挂了,从最后一个 turn node hash 恢复 messages 继续跑 3. **step details 直接 walk** — turn chain 就是 detail,不需要额外的 detail 存储逻辑 4. **debug 友好** — 事后可以完整回溯每轮 LLM 的思考和 tool 调用 ## 实现要点 - `runLoop` 每完成一轮(LLM 响应 + tool 执行),立即 `cas.put(turnNode)` - 最终 step 的 detail hash 指向最后一个 turn node - 现有的 `buildStepDetail` 可以简化为 walk turn chain - 考虑 session resume 时从 turn chain 重建 messages(和 step chain 重建 history 同构) Ref: #428 狗粮测试中发现 loop 过程不可观测
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: uncaged/workflow#433