本站每篇文章都有五种语言版本,发布前每个版本单独检查:翻译准不准、有没有机器腔、藏没藏隐形字符。一篇文章就是十五次检查,过去 Claude Code 一项项按顺序做,所有中间报告都堆进同一个会话的上下文。Claude Code workflow 正好解决这个问题,使用方式是:Claude 写一个 JavaScript 脚本,运行时按脚本在后台启动子代理,回到对话里的只有最终结果。
下面根据 Claude Code 文档 说明这个 workflow 模式是什么,它和子代理、技能(skill)、agent teams 有什么区别,怎么启动,什么时候开始不划算。所有内容都按 2026 年 11 月 3 日的文档核对过,我用的是 Claude Code 2.1.316。所有付费套餐都能用 workflow,Anthropic API、Amazon Bedrock、Google Cloud Agent Platform 和 Microsoft Foundry 也支持。Pro 套餐需要在 /config 里打开 Dynamic workflows 这一项。
Claude Code workflow 是什么:计划搬进代码#
子代理、技能和 agent teams,Claude Code 以前就能启动。区别在于由谁掌握计划。前三种方式里,编排者是 Claude 本身:它在对话过程中决定下一个启动谁,每个结果都落进它的上下文。到了 workflow,循环、分支和中间数据都存在脚本的变量里。
| 子代理 | 技能 | Agent teams | Workflow | |
|---|---|---|---|---|
| 谁决定下一步 | Claude,一轮一轮地 | Claude,按说明 | 主导 agent | 脚本 |
| 中间结果放在哪 | Claude 的上下文 | Claude 的上下文 | 共享任务列表 | 脚本变量 |
| 可以复用什么 | worker 的描述 | 说明 | 团队组成 | 编排本身 |
| 规模 | 一轮几个任务 | 同子代理 | 几个长时会话 | 几十到几百个 agent |
| 中断之后 | 这一轮重新开始 | 这一轮重新开始 | 成员继续工作 | 在同一会话中继续 |
常有人问 workflow 和技能有什么区别,答案也在这里。技能是一段文字,由 Claude 读完自己执行。workflow 由运行时执行,Claude 只看到答案。
规模倒不是重点。工作顺序既然写在代码里,就能把质量检查也写进去:一批 agent 找问题,另一批独立地尝试推翻,只有经得住的才进报告。或者从三个角度各写一份计划,再由第四个 agent 比较。
如何使用 Claude Code workflow:三种启动方式#
内置的 /deep-research。 想亲眼看看这个模式,这是最快的办法。命令把网络搜索分到几个方向,交叉核对找到的来源,对每条结论投票,最后返回带链接的报告。没通过核对的结论会被剔除。如果某条结论因为限额或 API 错误没能核对,它会被标成“未核实”,而不是“已推翻”。
/deep-research What changed in the Node.js permission model between v20 and v22?在提示词里提出来。 在提示词开头写上 ultracode,或者用自己的话直接要求(“use a workflow”),Claude 就会为这个任务写一个脚本,不再一步步地做。高亮的关键词可以只对当前提示词取消:macOS 上按 Option+W,Windows 和 Linux 上按 Alt+W。
这个词只在人亲手输入的提示词里生效。来自 claude -p 的提示词、定时任务、webhook 或 pull request 里的评论,即使含有 ultracode,也不会启动 workflow。
整个会话都打开。 这是第三种方式,单独说。
Claude Code 的 ultracode:是什么,什么时候该关#
/effort ultracode 是会话设置,不改变 effort 等级。打开后,由 Claude 自己判断哪个任务需要 workflow,一个请求可能变成连续三次运行:弄懂代码、做修改、再检查修改。用 claude --effort ultracode 启动时,还会额外把等级设为 xhigh。关闭命令是 /effort ultracode off。
ultracode 打开后会拿掉三道保险:Large workflow 警告、Agent tool 的并发子代理上限,以及 auto 模式下首次运行的确认。文档写得很直白:订阅用户开着这种会话,会更快撞上每日或每周限额。日常工作,比如改一处代码、审一个文件、写封信,我不会打开它。
脚本长什么样#
脚本通常是 Claude 写的,但读一读有好处:运行前 Claude Code 会显示各个阶段,并允许打开代码(View raw script 或 Ctrl+G)。下面是我为多语言检查写的草稿。它是照着文档拼出来的,还没在真实文章上跑过:
export const meta = {
name: 'article-locale-review',
description: 'Review every locale of an article against the Russian source',
phases: [{ title: 'Review' }, { title: 'Verify' }],
}
const FINDINGS = {
type: 'object',
required: ['findings'],
properties: {
findings: {
type: 'array',
items: {
type: 'object',
required: ['locale', 'quote', 'problem'],
properties: {
locale: { type: 'string' },
quote: { type: 'string' },
problem: { type: 'string' },
},
},
},
},
}
const VERDICT = {
type: 'object',
required: ['isReal', 'reason'],
properties: { isReal: { type: 'boolean' }, reason: { type: 'string' } },
}
const LOCALES = ['en', 'es', 'ja', 'zh-CN']
phase('Review')
const reviews = await pipeline(LOCALES, locale =>
agent(
`Compare content/articles/ru/general/${args.slug}.mdx with ` +
`content/articles/${locale}/general/${args.slug}.mdx. ` +
`List omissions, additions and mistranslations. Do not edit files.`,
{ label: locale, schema: FINDINGS },
),
)
phase('Verify')
const findings = reviews.filter(Boolean).flatMap(r => r.findings)
const verdicts = await parallel(
findings.map(f => () =>
agent(`Try to refute this translation issue: ${JSON.stringify(f)}`, {
label: `verify:${f.locale}`,
schema: VERDICT,
}).then(v => (v ? { ...f, ...v } : null)),
),
)
return verdicts.filter(v => v?.isReal)agent() 启动一个子代理,pipeline() 为列表里的每个元素各启动一个 agent,parallel() 一次跑一组并行任务并等它们全部结束。phase() 在进度窗口里给 agent 分组,args 是运行已保存命令时传入的输入(“Run /article-locale-review on slug claude-code-workflows”)。
注意 filter(Boolean)。被停止的 agent,或者遇到无法恢复的 API 错误而失败的 agent,会返回 null,pipeline() 会把这个 null 留在数组里。schema 则强制子代理返回指定结构的 JSON:连续五次失败后,调用会带着最后一次校验错误失败。
成功的运行可以存成命令:/workflows,选中这次运行,按 s。文件会存到项目的 .claude/workflows/(克隆仓库的人都能看到),或者 ~/.claude/workflows/(只有你自己能用,但任何项目里都能用)。
第一次运行前最好知道的限制#
- 运行中无法插手。 workflow 只会在两种情况下自己暂停:agent 请求权限,或等待限额重置。如果阶段之间需要审批,就把每个阶段做成单独的一次运行。
- 脚本本身什么都不碰。 读文件、改文件的是 agent,脚本只负责协调。
import()被禁止,Date.now()、Math.random()和不带参数的new Date()会抛错:重新运行时,agent 必须按同样的顺序被调用。时间要通过args传进去。 - 上限。 最多 16 个并行 agent(
CLAUDE_CODE_WORKFLOW_MAX_CONCURRENT_AGENTS,取值 1 到 256),单个parallel()或pipeline()最多 4096 个元素,一次运行最多 1000 个 agent。 - 失败后重跑比想象的贵。 重新运行时,已完成的 agent 直接返回保存的结果。但如果脚本依次启动了 A、B、C、D,而 B 失败了,重跑时只有 A 从缓存取,B、C、D 都要重新跑,哪怕 C 和 D 当时已经跑完。
- 卡住的 agent 会自动重启,最多五次。耗时长的任务可以在
agent()里用stallMs多给一些时间。 - 撞上订阅限额。 运行会等待重置,然后自己继续,但前提是:交互式会话、开启了
autoContinueAtUsageLimit、重置发生在 24 小时内,而且最多两次。在claude -p和后台会话里,agent 会直接失败。
如果关闭会话时选择了停止任务,运行会随会话一起停下。保存的结果还在:执行 claude --resume,再让 Claude 重新运行 workflow。
workflow 要花多少#
一次运行消耗的 token 明显多于在对话里做同样的事,而且全部计入套餐限额。agent 超过 25 个,或预计用量超过 150 万 token 时,Claude Code 会把这次运行标为 Large workflow。这只是警告,不会阻止运行。
Claude 大致规划多少个 agent,参考值 workflowSizeGuideline 给出方向:
| 取值 | agent 数量 |
|---|---|
small | 少于 5 |
medium | 少于 10 |
large | 少于 50 |
unrestricted | 视任务而定 |
默认是 medium,Pro 套餐从 2.1.271 版起默认 small。修改方法是 /config workflowSizeGuideline=small。这只是给模型的建议,如果提示词里明确要求更多,Claude 会听提示词的。
还有一处省钱的地方容易忘。同一次运行中,模型、effort 等级、工具、schema 和工作目录都相同的 agent 共用一份提示词缓存,所以 Claude Code 会让它们最多等五秒,直到第一个开始返回结果。缓存保留五分钟,subagentPromptCacheTtl: "1h" 能把它延长到一小时,写入价格更高。
文档里有条建议我很认同:先在小范围上跑 workflow。用一个文件夹代替整个仓库,用一个窄问题代替宽泛的问题。/workflows 会显示每个 agent 的 token 消耗,运行随时可以停,已完成的部分不会丢。
workflow 在哪里划算#
判断标准很简单:对很多对象做同一种操作,再交叉检查结果。比如审查所有 route handler 有没有漏掉鉴权,在隔离副本里迁移五百个文件,一轮轮找 flaky 测试,直到新一轮什么都找不到。如果这类工作里的 agent 要写共享文件,它们需要和人一样的纪律:要么隔离,要么用 claim 申领代替静默覆盖。
对我来说是两套流程。一套是检查每篇文章的五个语言版本,上面已经写了。另一套是检查我所有网站的安全补丁:每个仓库一个 agent 核对版本和 Dockerfile,另一个复查它的发现。两套都要反复做,现在都在吃会话上下文。
而一封求职信、改一个函数、一篇文章,这些都不需要 workflow。跑一遍更便宜,效果也不差。至于每个 agent 都需要的项目知识,workflow 也帮不上忙:这些知识照样得找地方放,比如通过 MCP 接入 Claude Code 的 wiki。如果 agent 越来越多,又在认真写代码,瓶颈可能变成 git 本身。Anthropic 就遇到了这种情况,用自己的系统替换了 git。
我建议这样开始:/config workflowSizeGuideline=small,然后对一个你本来就打算搜半小时的问题跑 /deep-research,再到 /workflows 里看看花了多少。



