动态工作流通过 Claude 编写的一段可重复运行的脚本,来编排大量子代理。可将其用于代码库审计、大规模迁移以及交叉验证研究。
动态工作流目前处于研究预览版。它们需要 Claude Code v2.1.154 或更高版本,并可在所有付费方案、Anthropic API 访问、Amazon Bedrock、Google Cloud Vertex AI 和 Microsoft Foundry 上使用。在 Pro 版中,可从 /config 的 Dynamic workflows 行中将其开启。
动态工作流是一种 JavaScript 脚本,可在大规模上编排 子代理。Claude 会根据你描述的任务编写脚本,而运行时会在后台执行,期间你的会话仍保持响应。 当一项任务需要协调的代理数量超过一次对话所能驾驭的范围时,或者你希望把编排逻辑固化成可阅读、可重复运行的脚本时,就应考虑使用工作流。典型示例包括:对整个代码库进行漏洞/缺陷排查、涉及 500 个文件的迁移、需要将多个来源相互交叉核验的研究问题,以及值得先从多个独立角度起草再做取舍的复杂方案。 本页将介绍如何:
子代理、技能、代理团队 和工作流都可以执行多步骤任务。区别在于由谁掌握计划:
| 子代理 | 技能 | 代理团队 | 工作流 | |
|---|---|---|---|---|
| 它是什么 | Claude 生成的工作者 | Claude 遵循的指令 | 监督同伴会话的主代理 | 由运行时执行的脚本 |
| 谁决定下一步运行什么 | Claude,逐轮决定 | Claude,按提示执行 | 主代理,逐轮决定 | 脚本 |
| 中间结果存放在哪里 | Claude 的上下文窗口 | Claude 的上下文窗口 | 共享任务列表 | 脚本变量 |
| 什么是可重复的 | 工作者定义 | 指令 | 团队定义 | 编排本身 |
| 规模 | 每轮可委派少量任务 | 与子代理相同 | 少量长期运行的同伴 | 每次运行可调度数十到数百个代理 |
| 中断后 | 重新开始该轮 | 重新开始该轮 | 同伴继续运行 | 可在同一会话中恢复 |
工作流会把计划迁移到代码里。使用子代理、技能和代理团队时,Claude 充当编排者:它逐轮决定接下来生成或分配什么,而每个结果都会进入上下文窗口。工作流脚本本身则持有循环、分支和中间结果,因此 Claude 的上下文只需保留最终答案。 把计划迁移到代码里,也让工作流不仅能“多跑一些代理”,还能应用可重复的质量模式:例如先让彼此独立的代理对对方的发现进行对抗式审查,再进行汇报;或者从多个角度起草方案并相互权衡,从而得到比单次处理更可靠的结果。
最快了解工作流实际效果的方法,是运行 /deep-research。它是 Claude Code 内置的 工作流,用于围绕一个问题从多个来源进行调查。你会看到代理在后台分阶段推进,而你的会话始终保持可用,最后只收到一份报告,而不是逐轮对话记录。
使用你想调查的问题运行 /deep-research。它会从多个角度展开网页搜索,抓取并交叉核验找到的来源,最后综合生成一份带引用的报告。
/deep-research Node.js 的权限模型在 v20 和 v22 之间发生了哪些变化?
Claude Code 会询问是否允许该工作流。选择 Yes 继续。具体提示取决于你的权限模式。有关各模式选项,请参见 运行前批准计划。
运行会在后台开始。执行 /workflows,使用方向键选中该运行,然后按 Enter 打开其进度视图:
/workflows
该视图会显示每个阶段及其代理数量、token 总数和已用时间。深入任一阶段可查看其中的代理以及每个代理的发现。完整控制项见 查看运行。你也可以在输入框下方的任务面板中查看:运行进行时那里会显示一行进度摘要。按下方向键向下聚焦它,然后按 Enter 展开。
当运行完成后,报告会进入你的会话。报告会标注每条结论分别来自哪些来源,而未通过交叉核验的结论已被过滤掉。
如需为你自己的任务运行工作流,可先 让 Claude 编写一个;而当某次运行达成了你想要的效果后,你还可以将其 保存为可复用命令。
Claude Code 内置了 /deep-research 作为工作流:
| 命令 | 功能 |
|---|---|
| /deep-research | 围绕一个问题从多个角度展开网页搜索,抓取并交叉核验找到的来源,对每条结论进行投票,并返回一份带引用的报告;未通过交叉核验的结论会被过滤掉。需要可用的 WebSearch 工具 |
你自己 保存 的工作流也会以同样方式变成命令,并在 / 自动补全中与内置命令一起显示。
工作流在后台运行,因此代理工作时会话仍保持响应。随时运行 /workflows 可列出正在运行和已完成的工作流,然后选择其中一个打开其进度视图。
/workflows
进度视图会显示每个阶段及其代理数量、token 总数和已用时间。页脚列出各操作对应的按键:
| 按键 | 操作 |
|---|---|
| ↑ / ↓ | 选择一个阶段或代理 |
| Enter 或 → | 深入所选阶段,再深入某个代理以查看其提示词、最近的工具调用和结果 |
| Esc | 返回上一级 |
| j / k | 在代理详情内容超出显示范围时滚动 |
| p | 暂停或恢复运行 |
| x | 停止所选代理;若焦点在运行上,则停止整个工作流 |
| r | 重新启动所选正在运行的代理 |
| s | 将本次运行的脚本保存为命令 |
你可以通过两种方式让 Claude 为你的任务编写工作流:
/effort ultracode,Claude 会为会话中的每个实质性任务规划工作流。你也可以运行一个已存在的工作流命令:例如 内置工作流 /deep-research,或你已 保存 的工作流。
如果你想在不改变会话 effort 等级的情况下,将单个任务作为工作流运行,只需在提示词中包含关键词 ultracode。用自己的话来请求也可以,例如“使用工作流”或“运行工作流”,Claude 会将明确请求视为同样的主动开启。v2.1.160 之前,字面触发关键词是 workflow;自然语言请求在两个版本中都有效。
ultracode: 审计 src/routes/ 下每个 API 端点是否缺少认证检查
Claude Code 会在你的输入中高亮该关键词,而 Claude 会为该任务编写工作流脚本,而不是逐轮处理。如果你并不想启动工作流,可在 macOS 上按 Option+W,或在 Windows 和 Linux 上按 Alt+W,以取消该提示中的高亮;或者在光标正好位于高亮关键词后面时按退格键。若想彻底不让该关键词触发,请在 /config 中关闭 Ultracode keyword trigger。
如果运行结果符合预期,之后你可以 将其保存为命令。
如果你已经用其他方式构建了编排器,例如一组子代理提示词文件夹,或一个负责拆分任务的技能,也可以让 Claude 指向它,并要求编写一个实现同样功能的工作流。
Ultracode 是 Claude Code 的一项设置,它将 xhigh 推理力度 与自动工作流编排结合起来。开启后,Claude 会为每个实质性任务规划工作流,而不是等你主动提出。
/effort ultracode
开启 ultracode 后,Claude 会自行判断何时需要工作流。一次请求可能连续变成多个工作流:一个用于理解代码,一个用于实施更改,一个用于验证结果。这适用于会话中的每个任务,因此每次请求会比低 effort 等级消耗更多 token,耗时也更长。
Ultracode 仅在当前会话生效,开启新会话时会重置。回到常规工作时,可用 /effort high 切回。它仅适用于支持 xhigh effort 的模型;在其他模型上,/effort 菜单不会提供该选项。
在 CLI 中,每次运行前的提示会显示计划中的阶段以及以下选项:
Ctrl+G 会在你的编辑器中打开脚本。Tab 可让你在运行开始前调整提示词。
是否会看到此提示,取决于你的 权限模式:
| 权限模式 | 何时提示 |
|---|---|
| 默认、接受编辑 | 每次运行都会提示,除非你已选择 “Yes, and don’t ask again for that workflow in this project” |
| 自动 | 仅首次启动时提示。任何一次 Yes 都会在你的用户设置中记录同意,之后的启动不再提示;若开启 ultracode,则完全跳过 |
| 绕过权限、claude -p、Agent SDK | 从不提示。运行会立即开始 |
在 Desktop 应用中,会显示一张批准卡片,包含工作流名称、阶段列表和 token 使用提醒,并提供 Once、Always 和 Deny 操作。进度视图会出现在后台任务侧边栏中。
你的权限模式只控制上面的启动提示。工作流生成的子代理始终以 acceptEdits 模式运行,并继承你的 工具允许列表,无论你的会话模式如何。文件编辑会自动批准。
Shell 命令、网页抓取以及不在允许列表中的 MCP 工具仍可能在运行过程中向你请求确认。为了避免长任务中途被打断,可在开始前先把代理所需的命令加入允许列表。
在 claude -p 和 Agent SDK 中,没有人可供提示,因此工具调用会依据你配置的权限规则执行,不会进行交互式确认。
当 Claude 为一个你会重复执行的任务编写了工作流时,你可以把那次运行的脚本保存为命令。比如你在每个分支上都要做的审查,就可以每次都运行同样的编排。
运行 /workflows,选中要保留的那次运行,然后按 s。在保存对话框中,按 Tab 可在两个保存位置之间切换:
.claude/workflows/:与克隆该仓库的所有人共享~/.claude/workflows/:在所有项目中都可用,仅你本人可见按 Enter 保存。以后在任一位置,该工作流都会作为 / 在后续会话中运行。
如果项目工作流和个人工作流同名,则运行项目工作流。
已保存的工作流可以通过 args 参数接收输入。脚本会将其作为名为 args 的全局变量读取。可在调用时用它传入研究问题、目标路径列表或配置对象,而不必每次运行都修改脚本。
下面的提示词会用一组 issue 编号运行一个已保存的工作流:
> 运行 /triage-issues,处理 issue 1024、1025 和 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工作流可在 CLI、Desktop 应用、IDE 扩展、带 claude -p 的 非交互模式 以及 Agent SDK 中使用。相同的禁用设置适用于所有界面。
若要为你自己关闭工作流:
/config 中关闭 Dynamic workflows。该设置会跨会话保留。~/.claude/settings.json 中设置 "disableWorkflows": true。该设置会跨会话保留。CLAUDE_CODE_DISABLE_WORKFLOWS=1。它会在启动时读取,因此你在哪儿设置都生效。若要为整个组织关闭工作流,可在 托管设置 中设置 "disableWorkflows": true,或者使用 Claude Code 管理员设置 页面上的开关。
当工作流被禁用时,内置工作流命令不可用,ultracode 关键词不再触发运行,且 /effort 菜单中会移除 ultracode。