description: "工作流编排能力:运行由模型编写的、扇出 subagent 的脚本,供选择或构建在 ctx.workflowEngine 之上的用户与维护者阅读。"
English | 中文
运行一段纯 JavaScript 编排脚本,将工作扇出给 subagent,并返回脚本的最终 JSON 值。脚本可以使用 agent()、parallel()、pipeline()、phase() 和 log();模型通常通过 workflow 工具访问它们。每次运行都归调用方所有,将每个子 agent(智能体)归属于调用它的 agent,在失败或取消时以结果兑现而不拒绝,并在有界宽限期内完成 dispose(资源释放)。调用方必须提供执行引擎,因此可以更换隔离策略而不改变可见行为。
当任务分解为许多独立部分、适合用一段脚本统一协调——例如跨多个文件的审计、一次迁移、多角度研究——且模型明确要求工作流式编排时,运行工作流。一两项委派时,优先使用普通 subagent 调用。
模型通过 dsh-tool-workflow 的 workflow 工具触达该能力;该工具拥有调用 schema 与结果包络,引擎提供其下的执行。一次工具调用提交 meta、script 与可选 args,运行完成时返回 { runId, agentsStarted, result }。工具会阻塞父级轮次直到整个工作流结算,因此模型只看到最终结果,永远不会看到中间子 agent 消息。
编排脚本是纯 JavaScript 脚本体(不是 TypeScript),以顶层 await 运行并以 return <json-value> 结尾。meta 身份块与任何 args 都以普通 JSON 数据到达——绝不作为代码求值。执行期间脚本调用提供的钩子:agent(prompt, opts) 启动一个 subagent,并以其最终文本、或在提供 schema 时以经过校验的结构化值兑现;parallel() 与 pipeline() 组合独立工作;phase() 与 log() 为观察者叙述进度。
// Script body — runs with top-level await, ends with a JSON return value:
const reviews = await parallel([
() => agent('Review src/a.ts for correctness'),
() => agent('Review src/b.ts for correctness'),
])
return { reviewed: reviews.length }
脚本结算时,运行的 result 以返回值、结束原因和已启动的子 agent 数量兑现。脚本不返回值时得到 null。
插件消费方可以直接启动运行:ctx.workflowEngine.start({ script, meta, args?, parent, signal? })。parent 把每个子 agent 归属于调用它的 agent;signal 在中止时取消运行。start() 在运行存在之前校验 meta 块并解析脚本,因此格式错误的请求会立即以违规清单失败。
返回的运行公开 id、meta、result、cancel(reason?) 与 dispose()。result 绝不拒绝:脚本失败以 stopReason: 'error' 兑现,取消以 'cancelled' 兑现。调用方拥有该运行——每条路径都要调用 dispose();它会取消剩余工作,并在有界宽限期内等待脚本与子 agent 完全停稳。
无法解析的脚本、格式错误的 meta 块、不可用的提供方路由或不受支持的单次运行限制,都会在运行存在之前被同步拒绝;workflow 工具把这些报告为模型可以修正的错误。执行期间,钩子误用——错误参数、未知选项、不支持的 schema、超出上限——会明确终止脚本,而不会转为逐项 null。普通子 agent 失败不是基础设施错误:agent() 以 null 兑现,由脚本决定如何处理。
当包级契约不够用时阅读以下页面。它们从共享工作流模型逐步进入当前引擎与面向模型的消费方。
间接地,通过其消费方 dsh-tool-workflow 与一个工作流引擎,由它们渲染父级工具结果与子 agent 请求。
不会直接导致失效;请求前缀的任何变化均由上述消费方与引擎负责。
这些限制说明该能力尚未支持什么。它们是当前约束,不是任务积压。
workflow() 钩子。