Dynamic Workflow 架构拆解

对 动态工作流 的机制深挖(2026-08-31 query 归档):workflow 到底是什么、和 subagent 什么关系、runtime 住在哪、tool schema 长什么样。结论先行:Workflow 是一个 schema 平平、实现极重的 Claude Code 内建工具;模型吐 tool call,CLI 解析并执行工具代码,代码里再递归调模型。升级的不是 subagent 这个兵种,是指挥系统——编排从”主 agent 即兴逐轮委派”变成”一份确定性脚本”。

官方四件套对照:谁持有计划

SubagentsSkillsAgent teamsWorkflows
是什么Claude 起的 workerClaude 遵循的指令lead agent 监督 peer 会话runtime 执行的脚本
谁定下一步Claude,逐轮Claude,按 promptlead agent,逐轮脚本
中间结果在哪Claude 的 contextClaude 的 context共享任务列表脚本变量
可复用的是什么worker 定义指令团队定义编排本身
规模每轮几次委派同 subagent少数长时 peer每 run 数十~数百 agent
中断重来该轮重来该轮队友继续跑同 session 可恢复

原文:“A workflow script holds the loop, the branching, and the intermediate results itself, so Claude’s context holds only the final answer.”——计划进了代码,主上下文只装最终答案。

分层:一次 workflow 调用的完整链路

① CLI 组请求(tools 清单含 Workflow + schema)→ ② 模型吐 tool_use {name:"Workflow", input:{script}} → ③ CLI 解析 tool call:权限评估 → 语法预检 → workflow runtime 沙箱执行 JS(注入 agent/parallel/pipeline/phase/log/args)→ 每个 agent() = CLI 再起一轮完整子 agent 会话(递归①②③)→ ④ 异步返回 async_launched + taskId,终值晚点作为任务完成事件送达。

要点:对模型来说 Workflow 毫不特殊(tools 清单里一条 名字+schema,与 Bash/Read 平级),所有魔法在 CLI 侧的工具实现;agent() 无神秘机制,就是同一台 CLI 递归跑子会话——CLI 身兼对话宿主与每个 subagent 的宿主,执行的是一棵 agent 会话树。

依赖方向:CLI 是原生宿主,SDK 是壳

Agent SDK 打包并 spawn Claude Code 二进制当引擎(“The SDK bundles a native Claude Code binary… SDK v0.3.191 bundles Claude Code v2.1.191”,版本同步)。所以”SDK 的 Workflow 工具”与”CLI 里的 dynamic workflow”是同一份实现、同一个 runtime;在 CLI 里用时根本不经过 SDK 层。一句话:不是 CLI 背后调 SDK,而是 SDK 背后调 CLI。

Workflow tool schema(Agent SDK ≥v0.3.149)

Input(script / name / scriptPath 至少给一个):script(内联,必须以字面量 meta 块开头)· name(内建或已保存 workflow)· scriptPath(磁盘路径,优先级最高)· args(任意 JSON → 脚本全局 args)· resumeFromRunId(续跑:输入未变的 agent() 吃缓存,限同 session)· title/description(忽略,meta 块说了算)。

Output:status(async_launched 进程内 / remote_launched 派发远端 session)· taskId · runId(续跑句柄;remote run 改用 sessionUrl)· transcriptDir · scriptPath(本次脚本落盘路径)· warning / error(语法失败时 status 仍是 launched 但 error 非空——先查 error 再当已启动)。

两个闭环:脚本资产化(跑一次 → 拿 scriptPath → 手改 → 重调,不必重发脚本)与远端模式(remote_launched:协调态与执行面都可不在本机,呼应 Agent 状态分层)。

收敛判定:没有统一谓词

官方文档未定义 answers_converge 的通用判定;停止条件写在每次生成的脚本里,按任务从四种模式选:checker 转绿或停止进展 / 发现枯竭(新轮无新发现)/ 投票 + 交叉核查(deep-research 型)/ 对抗幸存(无人能推翻)。兜底:1000 agents/run 硬上限 + Large workflow 警告(>25 agents 或预计 >1.5M tokens,仅提示不拦截)。

与普通 subagent 委派的本质差

之前 = REPL 里手敲函数调用:每轮往返烧主上下文,任务大了会漂;现在 = 写个程序再运行:循环/分支/中间结果在脚本变量不进主上下文、确定性执行(runtime 禁 Date.now/Math.random 保证重放)、断点可续。质量模式(独立验证 / 对抗 / 收敛)是脚本让它们变便宜(parallel() + filter 几行即可),非 runtime 强制。边界:每个 agent 都是一次完整模型调用,是重武器——官方建议 scoped task 试水,size guideline 默认 medium(<15 agents)。

来源与相关页面