CHAPTER 12 · STAGE 03 · 理解可靠性与扩展

Subagent、Job、Workflow、Goal 和 Skill

AgentLoop 的职责应保持在“调用模型、执行工具、根据欠账继续或停止”。子 Agent、后台任务、工作流、长期目标和技能加载都通过现有 Service 与事件扩展。

这些功能为什么不属于 AgentLoop

AgentLoop 的职责应保持在“调用模型、执行工具、根据欠账继续或停止”。子 Agent、后台任务、工作流、长期目标和技能加载都通过现有 Service 与事件扩展。

如果每个新产品功能都在 Loop 中加分支,循环会逐渐绑定所有业务能力,无法替换,也难以验证生命周期。理解这些高级功能的重点不是记 API,而是观察它们怎样组合已有扩展点。

Subagent:把一部分工作委托给另一个 Agent

Subagent 是可选 Capability Seam。ctx.subagents 保存具名 Provider,Provider 可以在同进程创建 child Agent、Fork 父 Session、通过 ACP 驱动外部 Agent,或委托给 Codex、Claude Code 等产品。

面向模型的 tool-subagent 是 Consumer。模型调用委托工具时,Consumer 选择配置的 Provider,Provider 创建或连接 child,父 Session 通过 Tool Result 获得可见结果。

Subagent 不改变父 AgentLoop 的基本步骤:父模型仍然发出 Tool Call,工具执行只是把工作交给另一个 Agent。

多 Provider 为什么可以同时存在

一个部署可能同时提供 in-process 和 external Provider。ctx.subagents 因此像 LLM Registry 一样按名字注册多个实现,而不是只挂一个当前 Service。

选择 Provider 是配置和工具暴露策略的一部分。不同 Provider 可以拥有不同持续会话、取消和报告能力,但都要满足共同的委托结果语义。

Child Session 与 Delegation Depth

同进程 child 通常拥有自己的 Session id 和 scoped Context。Header 记录 parentSession、origin 和 delegationDepth,确保恢复后仍知道 lineage 和递归深度。

Depth 不能只存在于运行时变量,否则 child Resume 后会被错误当作顶层 Agent,递归预算失效。

Continuable Child

有些 Provider 支持在第一次委托后继续与同一 child 对话。系统需要持久 descriptor、激活管理和控制工具,才能在重启或再次调用时找到正确 child。

“列表中看到 child”不自动证明它可继续。展示 metadata、Provider descriptor 和当前激活状态属于不同事实。

Job:后台工作的通用生命周期

ctx.jobs 管理长时间运行的后台任务,Tool Consumer 提供 job_output、job_list、job_kill 等控制。

后台 Job 必须有 owner、状态、输出收集、取消与清理。把 Promise 放进全局 Map 但没有 owner,会在 Agent 释放后留下孤儿工作。

Subagent 可以建立在 Job 之上,但 Job 本身不理解模型、Session 或 child Agent;它只是通用后台运行机制。

Workflow:受控执行一段结构化流程

Workflow Service 负责运行动态脚本或结构化步骤,worker-thread Provider 提供隔离执行环境,面向模型的 workflow Tool 是 Consumer。

工作流内部可以调用经过限制的工具、创建结构化子任务并要求明确输出。最终结果仍要通过 Tool Result 回到父 Step,不能绕开 Session 记录。

Workflow 解决“把多个动作组织成程序”,Subagent 解决“把任务委托给另一个 Agent”。二者可能组合,但不是同一抽象。

Goal:同一 Session 内的持续目标状态

ctx.goals 保存同一 Session 的目标及生命周期。Goal Tool 让模型读写目标,Goal Round Driver 可以在 Agent 生命周期事件上安排下一轮。

Goal 不等于外部项目管理任务,也不等于 Agent Inbox。它是可持久化领域状态,驱动器仍通过公开 Agent API 安排后续工作。

Goal 状态若会影响模型必须能够从 Session 或持久领域事件重建,不能只存在于 Driver 的布尔变量。

Skill:按需加载的指导内容

Skill Provider Registry 发现可用 Skill,Tool Consumer 向模型提供 catalog/loader 能力。调用 Skill 时,内容被注入 Agent 的后续请求,而不是让 AgentLoop 直接读取任意目录。

Provider 可以来自本地文件系统、嵌入资源或远程目录。Consumer 依赖统一注册表,因此新增 Provider 不需要修改 Skill Tool。

Skill 是模型可见指导内容,加载后必须进入可重建的 Session 输入;只在一个临时 prompt 变量里拼接会破坏 Resume。

Plan Mode:协作状态加独立策略

Plan Mode 记录用户与 Agent 当前处于计划协作阶段,并通过提示词、命令和退出 Tool 提供交互。

它不应成为一个绕过安全的全局开关。工具权限和沙箱仍是独立轴:处于 Plan Mode 可以影响策略,但安全限制不能仅靠一段提示词。

Schedule:未来时间如何唤醒原 Session

Schedule Tool 创建 Session-local reminder。时间到达后,插件通过 followup 或 inject 把通知送回原 Agent;是否立即唤醒取决于当前状态和消息语义。

调度器属于插件,不要求 AgentLoop 内建 cron 分支。持久 reminder 需要在 Session 恢复时重新建立计时状态,并明确冷 Session 不运行时的语义。

共同设计模式

这些高级能力看似不同,却重复使用同一套模式:

  1. Service Definition 声明稳定 API。
  2. 一个或多个 Provider 实现运行机制。
  3. Tool、Command 或 Driver 作为 Consumer。
  4. Agent 通过 followup、steer 或 inject 接收后续输入。
  5. 模型可见事实写入 Session。
  6. effect 和 handle 管理资源所有权。
  7. 取消等待后台工作达到 quiescence。

掌握模式后,读新功能时先找角色,而不是先读所有类。

源码阅读入口

  • Subagent:packages/subagent/README.zh.md
  • Job:packages/jobs/README.md
  • Workflow:packages/workflow/README.md
  • Goal:packages/goal/README.md
  • Skill:packages/skill/README.zh.md
  • Plan:packages/plan/README.md
  • Schedule:packages/schedule/README.md

本篇练习

  1. 比较 Subagent 与 Workflow:谁拥有 child conversation,谁拥有结构化执行脚本?
  2. 解释为什么 delegationDepth 需要持久化。
  3. 为一个“十分钟后提醒我检查测试”功能选择 Tool、Schedule Service 和 Agent API 的连接方式。
  4. 找到一个高级功能,证明它没有修改 AgentLoop 主逻辑。

验收标准:看到一个高级功能时,能拆出 Service、Provider、Consumer、持久事实和生命周期所有者。