动态工作流:大规模编排子代理
动态工作流是一个 JavaScript 脚本,用于大规模编排子代理。Claude 会为你描述的任务编写脚本,运行时在后台执行它,而你的会话保持响应。
当任务需要比单次对话能协调的更多代理,或者你希望将编排逻辑固化为可阅读和重复运行的脚本时,就使用工作流。典型场景包括:全代码库的 Bug 扫描、500 个文件的迁移、需要交叉验证来源的研究问题,以及在确定方案之前从多个独立角度起草的复杂计划。
本页面涵盖以下内容:
何时使用工作流
子代理、技能、代理团队和工作流都可以运行多步骤任务。区别在于谁持有计划:
| 子代理 | 技能 | 代理团队 | 工作流 | |
|---|---|---|---|---|
| 是什么 | Claude 派生的工作者 | Claude 遵循的指令 | 一个主导代理监督同级会话 | 运行时执行的脚本 |
| 谁决定下一步运行什么 | Claude,逐轮决策 | Claude,遵循提示词 | 主导代理,逐轮决策 | 脚本 |
| 中间结果存放位置 | Claude 的上下文窗口 | Claude 的上下文窗口 | 共享任务列表 | 脚本变量 |
| 什么是可重复的 | 工作者定义 | 指令 | 团队定义 | 编排本身 |
| 规模 | 每轮几个委托任务 | 同子代理 | 少量长期运行的同级代理 | 每次运行数十到数百个代理 |
| 中断 | 重新开始本轮 | 重新开始本轮 | 队友继续运行 | 在同一次会话中可恢复 |
工作流将计划转移到代码中。使用子代理、技能和代理团队时,Claude 是编排者:它逐轮决定下一步派生或分配什么,每个结果都落在上下文窗口中。工作流脚本自身持有循环、分支和中间结果,因此 Claude 的上下文只包含最终答案。
将计划转移到代码中还能让工作流应用可重复的质量模式,而不仅仅是运行更多代理:它可以让独立代理对彼此的发现进行对抗性审查再上报,或者从多个角度起草方案并互相权衡,这样你得到的结果比单次通过更可信。
运行内置工作流
最快体验工作流的方式是运行 /deep-research,这是 Claude Code 内置的工作流,用于跨多个来源研究问题。你会看到代理在后台按阶段工作,而会话保持空闲,最后你会收到一份报告,而不是逐轮的转录。
- 输入
/deep-research <你的问题> - Claude 写出工作流脚本
- 运行时在后台执行
- 结果以报告形式返回
要为自己的任务运行工作流,可以让 Claude 编写一个,当运行结果符合预期后,可以将其保存为自己的命令。
内置工作流
Claude Code 内置了 /deep-research 工作流:
| 命令 | 功能 |
|---|---|
/deep-research <问题> | 从多个角度对问题进行网络搜索展开,获取并交叉检查找到的来源,对每个声明投票,返回一篇带引用的报告,过滤掉未通过交叉检查的声明。需要 WebSearch 工具可用 |
你保存的工作流同样会成为命令,出现在 / 自动补全中,与内置工作流并列。
观察运行过程
工作流在后台运行,因此代理工作时会话保持响应。随时运行 /workflows 列出正在运行和已完成的工作流,然后选择一个打开其进度视图。
/workflows
进度视图显示每个阶段及其代理数量、Token 总数和耗时。底部列出每个操作对应的按键:
| 按键 | 操作 |
|---|---|
↑ / ↓ | 选择一个阶段或代理 |
Enter 或 → | 深入查看选中的阶段,然后进入代理查看其提示词、最近的工具调用和结果 |
Esc | 返回上一层 |
j / k | 当代理详情内容溢出时滚动 |
p | 暂停或恢复运行 |
x | 停止选中的代理,或当焦点在运行上时停止整个工作流 |
r | 重新启动选中的运行中代理 |
s | 保存运行的脚本为命令 |
让 Claude 编写工作流
有两种方式让 Claude 为你的任务编写工作流:
- 在提示词中要求工作流:在提示词中包含
workflow一词,Claude 会为该任务编写一个工作流。 - 让 Claude 通过 Ultracode 自行决定:设置
/effort ultracode,Claude 会为会话中每个实质性任务规划一个工作流。
你还可以运行已存在的工作流命令:内置工作流(如 /deep-research),或你已保存的命令。
在提示词中要求工作流
要作为工作流运行单个任务而不改变会话的 effort 级别,在提示词中的任意位置包含 workflow 一词。
Run a workflow to audit every API endpoint under src/routes/ for missing auth checks
Claude Code 会高亮输入中的该词,Claude 会为该任务编写工作流脚本,而不是逐轮处理。如果你本意不是启动工作流,按 Option+W(macOS)或 Alt+W(Windows/Linux)取消当前提示词的高亮,或者在光标位于高亮词后时按退格键。要完全阻止该词触发,在 /config 中关闭 Workflow 关键字触发器。
如果运行结果符合预期,你可以将其保存为命令。
如果你已经用其他方式构建了编排器,比如一个子代理提示词文件夹或一个展开工作的技能,你可以把 Claude 指向它,并要求一个实现相同功能的工作流。
让 Claude 通过 Ultracode 自行决定
Ultracode 是 Claude Code 的一个设置,结合了 xhigh 推理 effort 和自动工作流编排。开启后,Claude 会为每个实质性任务规划工作流,而不是等你要求。
/effort ultracode
开启 Ultracode 后,Claude 自行决定何时任务需要工作流。一个请求可能变成连续多个工作流:一个理解代码、一个进行修改、一个验证修改。这适用于会话中的每个任务,因此每个请求消耗的 Token 更多、耗时更长。
Ultracode 在当前会话中持续,开启新会话时重置。回到日常工作时用 /effort high 降级。它仅在支持 xhigh effort 的模型上可用;其他模型的 /effort 菜单不提供此选项。
运行前批准计划
在 CLI 中,每次运行的提示词会显示计划的阶段和以下选项:
- Yes, run it:启动运行
- Yes, and don’t ask again for
<name>in<path>:启动,并且之后在此项目中对这个工作流不再询问 - View raw script:在决定之前阅读脚本
- No:取消
Ctrl+G 在编辑器中打开脚本。Tab 允许在运行开始前调整提示词。
是否看到此提示取决于你的权限模式:
| 权限模式 | 何时提示 |
|---|---|
| Default、accept edits | 每次运行,除非你已对该工作流在此项目中选择了 Yes, and don’t ask again |
| Auto | 仅首次启动。任何 Yes 会在用户设置中记录同意,后续启动直接开始。开启 Ultracode 时完全跳过 |
Bypass permissions、claude -p、Agent SDK | 从不。运行立即开始 |
在桌面应用中,会显示一个批准卡片,包含工作流名称、阶段列表和 Token 消耗提醒,操作选项为 Once、Always 和 Deny。进度视图出现在后台任务侧栏中。
你的权限模式仅控制以上的启动提示。工作流派生的子代理始终以 acceptEdits 模式运行,并继承你的工具白名单,无论你的会话模式如何。文件编辑自动批准。
Shell 命令、网络抓取和不在白名单中的 MCP 工具在运行中仍可能提示你。为避免长时间运行时出现这种情况,在开始前将代理需要的命令添加到白名单。
在 claude -p 和 Agent SDK 中没有可提示的人,因此工具调用遵循你配置的权限规则,不会出现交互确认。
保存工作流以便复用
当 Claude 为你将重复执行的任务编写了工作流,你可以将该运行的脚本保存为命令。一个像每次分支都运行的审查流程,之后就会每次都执行相同的编排。
运行 /workflows,选择你要保留的运行,按 s。在保存对话框中,Tab 在两个保存位置之间切换:
.claude/workflows/(项目内):与克隆仓库的每个人共享~/.claude/workflows/(用户主目录):在所有项目中可用,仅自己可见
按 Enter 保存。工作流在之后的会话中通过 /<name> 运行,无论来自哪个位置。
如果项目工作流和个人工作流同名,项目中的那个优先运行。
给已保存的工作流传入参数
已保存的工作流可以通过 args 参数接收输入。脚本将其读取为名为 args 的全局变量。用它在调用时提供研究问题、目标路径列表或配置对象,而不是每次运行时编辑脚本。
以下提示词用一个 Issue 编号列表运行已保存的工作流:
> Run /triage-issues on issues 1024, 1025, and 1030
Claude 将列表作为结构化数据传入,脚本可以直接对 args 调用数组和对象方法,无需先解析。如果省略 args,脚本内该全局变量为 undefined。
了解工作流如何运行
工作流运行时在隔离环境中执行脚本,与你的对话分离。中间结果留在脚本变量中,而不是进入 Claude 的上下文。
每次运行将其脚本写入 ~/.claude/projects/ 下你会话目录中的一个文件。Claude 在运行开始时接收该路径,因此你可以向它询问。你可以打开该文件阅读 Claude 编写的编排逻辑、与之前运行的脚本做 diff,或编辑它并让 Claude 从编辑后的版本重新启动。
运行时跟踪每个代理的结果随着运行进展,这使得运行在同一会话内可恢复。
行为与限制
运行时施加以下约束:
| 约束 | 原因 |
|---|---|
| 运行中无用户输入 | 只有代理权限提示可以暂停运行。如需阶段间签字确认,将每个阶段作为独立的工作流运行 |
| 工作流本身无直接文件系统或 Shell 访问 | 代理进行读取、写入和运行命令。脚本协调代理 |
| 最多 16 个并发代理,CPU 核心有限的机器上更少 | 限制本地资源使用 |
| 每次运行最多 1,000 个代理 | 防止失控循环 |
管理运行
启动运行后,通过 /workflows 视图管理它,或在输入框下方的任务面板中展开其进度行。
暂停后恢复
停止运行后可以恢复:已完成的代理返回其缓存结果,其余代理实时运行。从 /workflows 选择暂停的运行并按 p 来恢复,或让 Claude 用相同的脚本重新启动工作流。
恢复仅在同一 Claude Code 会话内有效。如果在工作流运行期间退出 Claude Code,下次会话将从头启动工作流。
成本
一个工作流会派生许多代理,因此单次运行消耗的 Token 可能比在对话中完成相同任务更多。运行会计入你计划的用量和速率限制,与任何其他会话一样。
在对大型任务投入之前,先在小范围上试运行工作流:一个目录而非整个仓库,或一个窄问题而非宽泛问题。/workflows 视图显示每个代理的 Token 用量随运行进展,你可以随时在那里停止运行而不丢失已完成的工作。运行时的代理上限限制了单次运行可以派生的代理数量,从而限制了失控脚本的成本。
工作流中的每个代理使用你会话的模型,除非脚本将某个阶段路由到不同的模型。控制模型成本的方法:
- 在大型运行前检查
/model(如果你通常在日常工作中切换到较小的模型) - 在描述任务时,让 Claude 对不需要最强模型的阶段使用较小的模型
关闭工作流
工作流在 CLI、桌面应用、IDE 扩展、非交互模式(claude -p)和 Agent SDK 中均可用。关闭设置在所有界面上统一生效。
对自己关闭工作流:
- 在
/config中将 Dynamic workflows 切换为关闭。跨会话持久化。 - 在
~/.claude/settings.json中设置"disableWorkflows": true。跨会话持久化。 - 设置
CLAUDE_CODE_DISABLE_WORKFLOWS=1。在启动时读取,因此在你设置的任何位置都生效。
为整个组织关闭工作流,在托管设置中设置 "disableWorkflows": true,或使用 Claude Code 管理员设置页面上的切换按钮。
当工作流被禁用时,内置工作流命令不可用,workflow 关键词不再触发运行,ultracode 从 /effort 菜单中移除。