Skip to content

用切面组合审批与工具调用 ​

Pulse 负责图的执行和可靠发布,Durable 负责检查点与恢复;审批状态、事件关联、工具目录和业务循环可由宿主通过已有机制组合。本页说明已验收的两种用法及其边界。

审批等待与恢复 ​

先把构建、审批后的部署接成普通静态图。在部署节点外装一个切面:它先读取已确认的构建成果,再检查业务系统中的批准记录;批准后才调用 next(rc)。

在 next 前等待尚未占用节点业务额度。短等待可直接使用能响应 rc.Context().Done() 的等待逻辑,其他独立节点仍能运行。等待条件的含义由切面掌握;节点 Snapshot 此时可以仍是 pending,不代表引擎已登记一个审批任务。

长等待要释放进程和独占 Session 时,可以由宿主执行以下协议:

  1. 可靠保存业务等待记录,带稳定 RunID、步骤与审批关联标识。
  2. 宿主取消本次 Execution,并等 Run 返回,释放本轮资源及 Session。应用任务保持 waiting,本次 Execution 的终态是 canceled。
  3. 审批事件到达后,宿主重建同一版本、同一输入的图,用原 RunID 调用 Resume。
  4. 未完成节点重新进入切面,切面重查批准记录后推进;已经确认的上游不重做。

等待记录与检查点属于两个提交位置。宿主必须能修复“已登记等待、尚未取消”的中断窗口,并在唤醒重复到达时协调同一 RunID。示例用本机文件保存应用记录,验证正常进程退出后的可读性,不承诺断电持久性,也没有把两份记录变成原子事务。

不要用普通的“还在等待”业务 error 代替宿主取消。 普通错误是失败,会确认失败尝试;恢复不能刷新已耗尽的根尝试预算。正常等待也不应被标成 skipped,否则它表示的是这一步本轮没有值,无法替代待批准状态。

仓库的真实子进程用例会依次启动暂停进程、批准后的恢复进程、完成后的再次恢复进程,核对构建只执行一次、审批切面进入两次、部署只执行一次,以及稳定根作用域不变:

sh
go test -race -count=1 -timeout=60s -run '^Test(ApprovalAspectResumeAcrossProcesses|BusinessWaitingErrorDoesNotSuspendRun)$' ./integration

用例见 integration/approval_resume_test.go。它证明现有切面与 Cancel/Resume 可以完成该宿主协议;内置审批目录、Signal、统一唤醒服务和跨机器领取/租约仍是另行设计的能力。

在一个节点内循环调用 Graph 工具 ​

一个 ReAct 形状节点可以自己保存本轮循环变量,按业务决策选择工具。工具可登记为一个调用函数,内部为可复用 Graph 创建新的 Execution、提供本轮 Inputs、等待完成并读取声明出口。连续两次调用同一工具图得到的是两份独立 Execution,不修改图定义,也不重开槽位。

Pulse 的 组合用例 使用确定性决策替身调用工具图两次,并验证额度为 1 时等待切面允许独立节点推进;不依赖远端模型。独立工具根执行有自己的执行环境,不能把它当成静态 Sub 继承整棵树的额度或持久作用域。

如果循环所在节点尚未完成检查点就退出,该节点会从函数开头重进。要保证每一轮已完成工具调用都能单独恢复,宿主需要稳定的轮次/调用身份及相应持久记录,例如显式启动独立 Durable 运行;普通内存循环不会自动获得这项保证。工具带来的外部副作用仍由业务幂等或事务协议保护。

目标 v0.1.0 · Go 1.26+ · Pulse v0.5.0 · 发布状态见 GitHub Releases · MIT