Agent Loop 适合下一步取决于新发现的开放任务。但代码审查、迁移或发布检查常有固定流程:并行检查多个维度,验证发现,合并结果,再输出统一结构。若顺序只存在聊天历史里,失败后很难继续。

Workflow 把固定编排写成宿主保存的可信脚本。模型只选择名称、参数和可选续跑 ID,不能提交任意可执行代码。

Workflow(name, args) → 可信 registry → parallel/pipeline/agent → journal → 结果

为什么编排不只靠模型逐轮决定

开放探索需要模型调整路径;固定流程更需要并行、稳定结果结构、中断续跑,以及独立于对话的进度。Workflow 不取代 Agent,而是把多个 Agent 调用放进确定性的宿主控制流。

Registry 是信任边界

模型 schema 只接受 nameargsresume_from_run_id。元数据与函数来自宿主 WORKFLOWS registry,并在启动前校验。安全 slug、描述和 phases 都不是模型临时构造。

这防止“运行 workflow”退化成“提交任意代码”。但 Workflow 脚本仍是高权限宿主代码,需要代码审查与版本管理。

课程中的 Workflow Agent 只看到 args 传入内容,没有文件或 Shell 工具;默认并发上限为 8,每次运行最多 1000 次 Agent 调用,JSON Schema 校验器也只实现了教学所需的部分类型。

核心编排原语

原语作用
agent()子 Agent 调用,可要求结构化输出
parallel()并行启动并等待全部结果
pipeline()每个 item 独立通过多个 stage
phase() / log()记录阶段和进度

下一步依赖上一阶段全部结果时用 parallel 屏障;每个 item 可独立流过步骤时用 pipeline

结构化输出也必须校验

agent(schema=...) 要求 JSON,并由运行时解析验证。第一次不合法可提示重试一次,再失败则明确终止。模型输出与工具参数一样不可信,不能直接交给下游代码。

Journal 让运行可续

每次运行保存快照、输出、 JSONL journal 和锁。agent() 完成立即记录结果;恢复同一 run 时脚本重跑,但命中 journal 的稳定调用直接返回缓存。

调用键不能依赖并发完成顺序。课程根据调用类型、标签、prompt 和 schema 计算稳定哈希,避免 parallelpipeline 调度变化让缓存错位。

恢复前要验证名称、参数、快照和 journal,并用 run lock 防止两个进程同时续跑。调用内容变化时,相关步骤应重新执行。

适配器会等待整次 Workflow 结束后才让这次工具调用返回。事件名 async_launched 描述生命周期,不表示 Workflow 已脱离宿主工具调用在后台运行。

中间结果不要全部塞回对话

Workflow 内部变量和 journal 保存中间结果,主 Agent 只接收启动信息、最终结果和任务状态。这样避免多 Agent 输出填满 messages,同时保留审计和恢复线索。

建议覆盖的测试

  • 未注册或元数据无效的 workflow 启动前拒绝;
  • parallelpipeline 语义稳定;
  • 不合 schema 的输出会重试并失败;
  • journal 每步落盘,恢复正确命中缓存;
  • 稳定 key 不依赖并发顺序;
  • 同一 run 不能并发恢复;
  • 进度与最终事件包含 run ID。

小结

Workflow Runtime 把“单步由模型决定”和“流程由代码保证”分层。可信注册表限定脚本,编排原语组织并行,schema 稳定数据,journal 与锁提供恢复。它适合重复且结构固定的流程,不替代开放探索。

参考资料