KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA
11. 把脚本放进 API 和 worker — keel 龙骨
前面的 Harness 可以在单进程中运行。进入真实项目后,你还要处理请求生命周期、后台任务、持久化状态和多个 worker 并发。
前面的 Harness 可以在单进程中运行。进入真实项目后,你还要处理请求生命周期、后台任务、持久化状态和多个 worker 并发。
API 和 worker 分工
flowchart LR
C[HTTP Client] --> A[API]
A --> R[(Run Store)]
A --> Q[Job Queue]
Q --> W[Harness Worker]
W --> M[Model Adapter]
W --> T[Tool Executor]
W --> R
W --> E[(Event Store)]
C --> S[Event Stream]
E --> S
API 不应该在请求线程里无限等待所有模型和工具步骤。它可以创建 run_id,返回运行状态,让 worker 推进任务,客户端通过查询或事件流观察进度。
最小持久化对象
| 对象 | 关键字段 | 用途 |
|---|---|---|
| Run | run_id、owner、status、deadline |
当前运行和权限 |
| Step | run_id、step、decision、status |
恢复和诊断 |
| Event | sequence、type、payload_ref |
观测和回放 |
| Idempotency | call_id、key、result |
防止重复副作用 |
| Approval | call_id、approver、expires_at |
恢复审批后的动作 |
worker 恢复必须先检查状态
worker 重启后不能默认从头执行。它应先读取:
- 运行是否已经 completed、failed 或 cancelled;
- 当前 step 是否已有成功的 ToolResult;
- 是否存在未过期的 approval;
- 工具调用是否有幂等记录;
- deadline 是否已经过去。
只有通过这些检查,才可以继续下一步。
服务化仍然不改变核心边界
无论代码部署成一个脚本、API 还是队列 worker,下面几条都不变:
- 模型输出先进入内部协议;
- Action 必须经过策略;
- 工具结果写入状态和事件;
- 停止条件由 Harness 控制;
- 身份和作用域来自认证系统;
- 记忆、工具和多 Agent 是接入点,不是权限替代品。
本章自测
如果客户端断开连接,运行是否应该取消?不一定。客户端连接生命周期和 Agent 运行生命周期可以不同,需要业务明确选择,并通过事件让客户端稍后重新观察。