Anthropic 团队成员 Thariq 在这篇文章中详细介绍了 Claude Code 最新发布的动态工作流功能——Claude 能根据任务实时生成 JavaScript 工作流脚本,动态创建多个带独立上下文窗口的子代理协同工作。 为什么做? 传统单上下文窗口处理复杂任务会出三大问题:代理惰性(中途停摆)、自我偏好偏差、目标漂移。多代理协作 + 独立上下文,一次性解决。
怎么工作? 工作流就是一个 JS 文件,内含生成和协调子代理的函数。可动态选模型、可独立工作树、可中断恢复、可保存分享复用为 Skill。
常用模式: 分类-行动、扇出-合成、对抗性验证、生成-过滤、锦标赛、循环直至完成。
适用场景: 大规模代码迁移、深度研究核查、海量排序、根因分析、方案评估、模型智能路由——任何需要高可靠、多轮验证、并行处理的复杂任务。
动态工作流把 Claude 从「单线程执行者」升级为「能自主组建团队的超级协调者」,Claude Code 正式进入可编程代理团队时代。
以下是原文:
上周,我们在 Claude Code 中发布了动态工作流功能。Claude 现在可以根据当前任务,实时编写自己的“马具”(harness),量身定制。
虽然默认的 Claude Code 马具是为编码任务设计的,但它对许多其他类型的任务也非常有用——因为很多任务本质上都类似于编码任务。不过,对于某些特定类别的任务,我们之前必须在 Claude Code 基础上构建自定义马具,才能达到最佳性能,例如研究、安全分析、代理团队或代码审查。
现在,通过工作流,您可以动态创建马具,让 Claude 原生地在 Claude Code 内部解决所有这些问题以及更多问题。您还可以与他人分享和复用这些工作流。
在这篇文章中,我将分享我最初使用工作流的经验和心得,帮助您充分利用这一功能。
不过,最佳实践仍在不断发展!动态工作流通常会消耗更多 token,因此请仔细考虑何时以及如何使用它们。
注意:这篇帖子也已在 Claude Blog 上发布。
示例提示
在深入技术细节之前,我想先分享一些示例提示,帮助您思考工作流的各种可能性:
- “这个测试大约 50 次运行中会失败 1 次。设置一个工作流来复现它,形成理论,并在工作树中对抗性测试它们 /goal 直到某个理论成功为止才停止。”
- “使用工作流,浏览我最近 50 个会话,从中挖掘我反复犯的错误,并将 recurring 的那些转为 CLAUDE.md 规则。”
- “使用工作流,搜索过去六个月 Slack 中的 #incidents,找出反复出现的根本原因(目前还没有人提交 ticket)。”
- “拿我的商业计划书,运行一个工作流,让不同代理分别从投资者、客户和竞争对手的角度把它撕碎。”
- “这里有一文件夹 80 份简历,使用工作流为后端职位对它们进行排序,并双重检查前十名。用 AskUserQuestion 工具按照评分标准面试我。”
- “我需要给这个 CLI 工具起个名字。使用工作流头脑风暴一大堆选项,然后举办一场锦标赛选出前 3 名。”
- “使用工作流,把我们的 User 模型重命名为 Account,到处都改过来。”
- “浏览我的博客草稿,使用工作流对照代码库验证每一个技术声明,我不想发布任何错误内容。”
动态工作流的工作原理
动态工作流会执行一个 JavaScript 文件,其中包含几个特殊函数,用于生成和协调子代理:
动态工作流还包含标准的 JavaScript 函数(如 JSON、Math、Array),便于处理数据。特别有用的是,动态工作流可以决定每个代理使用哪种模型,以及子代理是否在自己的工作树中运行,从而让 Claude 自主选择所需的智能水平和隔离程度。
如果工作流被中断(例如用户操作或退出终端),恢复会话后,工作流可以从中断处继续执行。
为什么需要动态工作流
当您让默认的 Claude Code 马具完成一项任务时,它需要在同一个上下文窗口中同时进行规划和执行。对于许多编码任务来说,这非常高效,但对于长期运行、大规模并行或高度结构化的对抗性任务,有时会失效。
原因在于:Claude 在单个上下文窗口中处理复杂任务的时间越长,就越容易陷入以下几种特定失败模式:
- 代理惰性(Agentic laziness):Claude 在特别复杂的多部分任务中途停止,仅完成部分进度(如安全审查的 50 项中只做了 20 项)就宣布任务完成。
- 自我偏好偏差(Self-preferential bias):Claude 倾向于偏好自己的结果或发现,尤其是在要求它按照评分标准验证或判断时。
- 目标漂移(Goal drift):经过多次交互后,对原始目标的忠实度逐渐降低,尤其是在上下文压缩之后。每一次总结都会有信息损失,边缘情况要求或“不要做 X”的约束可能丢失。
创建工作流可以有效对抗这些问题:它能编排多个拥有独立上下文窗口的 Claude,每个子代理都有专注且隔离的目标。
动态工作流 vs 静态工作流
您之前可能已经使用 Claude Agent SDK 或 claude -p 创建过静态工作流,来协调多个 Claude Code 实例。
但静态工作流为了适配所有边缘情况,通常会比较通用。而现在有了 Claude Opus 4.8 和动态工作流,Claude 已经足够智能,可以为您特定用例编写完全量身定制的马具。
使用动态工作流的有用模式
您只需直接让 Claude 创建一个工作流即可开始使用,或者使用触发词“ultracode”来确保 Claude Code 创建工作流。
但建立对动态工作流工作方式的心智模型,将帮助您判断何时使用,以及如何通过提示引导 Claude。以下是 Claude 在构建工作流时常用并组合的几种模式:
- 分类-行动(Classify-and-act)
用一个分类代理决定任务类型,然后根据类型路由到不同代理或行为;或者在最后用分类器决定输出格式。
- 扇出-合成(Fan-out-and-synthesize)
把任务拆分成许多小步骤,每个步骤运行一个代理,最后合成结果。特别适合步骤数量多、或每个步骤都需要干净独立上下文窗口的情况(防止相互干扰或交叉污染)。合成步骤是一个屏障——它会等待所有扇出代理完成,再把结构化输出合并成一个结果。
- 对抗性验证(Adversarial verification)
每个生成的代理,都再生成一个独立的代理,按照评分标准或准则对其输出进行对抗性验证。
- 生成-过滤(Generate-and-filter)
针对一个主题生成多个想法,然后通过评分标准、验证、去重,只保留最高质量、经过测试的想法。
- 锦标赛(Tournament)
不是分工,而是让代理竞争。生成 N 个代理,每个用不同方法尝试同一任务,然后通过评判代理进行成对判断,直到选出优胜者。
- 循环直到完成(Loop until done)
对于工作量未知的任务,不是固定次数,而是循环生成代理,直到满足停止条件(例如没有新发现,或日志中不再有错误)。
使用场景
发挥创意,思考何时让 Claude Code 创建动态工作流。我发现工作流在非技术工作中甚至更有用。
迁移和重构
Bun 项目就是用工作流把 Zig 代码全部重写为 Rust 的(详情可阅读 Jarred 的 X 线程)。关键是把任务分解成一系列需要处理的步骤(如调用点、失败测试、模块等)。为每个修复在工作树中生成一个子代理来完成修复,然后让另一个代理进行对抗性审查,最后合并。建议告诉代理不要使用资源密集型命令,以便在不耗尽机器资源的情况下实现最大并行化。
深度研究
我们在 Claude Code 中发布了深度研究技能(/deep-research),它就使用了动态工作流:扇出网络搜索、获取来源、对抗性验证声明,最后合成带引用的报告。
您不仅可以用于网页搜索,还可以让 Claude 从 Slack 上下文生成状态报告,或通过深入探索代码库来研究某个功能的工作原理。
深度验证
如果您有一份报告,想检查并溯源其中每一个事实声明,可以生成一个工作流:一个代理先识别所有事实声明,然后为每个声明生成子代理进行详细检查。您还可以再加一个验证代理,确保来源子代理提供的是高质量来源。
排序
当您有一长列项目,需要按某种定性指标排序(Claude Code 擅长评估),例如按 bug 严重程度排序支持工单。如果直接在一次提示中排序 1000+ 行,质量会下降且无法放入上下文。这时可以运行锦标赛、成对比较代理流水线(成对判断比绝对打分更可靠),或者并行分桶排序后再合并。每次比较都是独立代理,只有运行顺序留在上下文中,循环保持确定性。
记忆与规则遵守
如果您发现某些规则即使放进 CLAUDE.md,Claude 还是会遗漏或出错,可以创建一个工作流,列出必须由验证代理检查的规则(每个规则一个验证器)。还可以创建一个怀疑者人格的子代理来审查规则,避免过多误报。
反向操作也行:从最近会话和代码审查评论中挖掘您反复犯的错误,用并行代理聚类,对每个候选规则进行对抗性验证(这个规则是否能防止真实错误?),然后把存活的规则提炼回 CLAUDE.md。
根本原因调查
调试时最好提出多个独立假设并分别测试,但在单一上下文窗口中,Claude 容易出现自我偏好偏差。
工作流可以通过结构化方式避免这一点:从不相交的证据中生成假设(例如日志、文件、数据分别由不同代理处理)。每个假设再面对验证者和反驳者的面板。
这不仅限于代码。工作流可用于销售(三月销售额为什么下降?)、数据工程(这个流水线为什么失败?)或任何事后分析。
大规模分流
每个团队都有支持队列、bug 报告或其他 backlog,无法完全靠人工处理。
分流工作流会对每个条目进行分类、与已跟踪内容去重,并采取行动(尝试修复或升级给人工)。
一个实用模式是“隔离”(quarantine):禁止读取不受信任公开内容的代理执行高权限操作,这些操作由专门负责执行的代理完成。
将分流工作流与 /loop 搭配,可让 Claude 持续运行。
探索与品味
当探索不同解决方案,尤其是基于品味的设计或命名时,工作流非常有用。您可以给审查代理一个“好解决方案”的评分标准,任务在审查代理认为已满足标准时完成。解决方案也可以通过基于评分标准的锦标赛来排序或选择。
评估(Evals)
您可以通过在工作树中生成独立代理,再生成比较代理,按照评分标准比较和评分特定输出,从而运行轻量级评估。例如,评估并优化您创建的某个技能。
模型与智能路由
创建一个针对您任务的分类代理,决定使用哪种模型。这在任务涉及大量工具调用时特别有用——先进行研究,就能找到最适合的模型。
例如,“解释 auth 模块如何工作”这个任务,最佳模型取决于 auth 模块的文件数量和代码库复杂度。分类代理可以先完成研究,再路由到 Sonnet 或 Opus。
什么时候不使用动态工作流
工作流是新功能。虽然在很多场景下能带来超预期效果,但并非每个任务都需要,而且可能会消耗大量 token。
最好创造性地使用工作流,去推动 Claude Code 做您以前没做过的事。对于常规编码任务,问问自己:它真的需要更多算力吗?例如,大多数传统编码任务并不需要 5 个审查者的面板。
构建动态工作流的提示技巧
提示
详细、具体地使用上面提到的技巧来提示动态工作流,能得到最佳效果。
工作流不只适用于大型任务。您可以提示模型使用“快速工作流”,例如快速对抗性审查某个假设。
与 /goal 和 /loop 结合
当工作流可以重复执行(如分流、研究、验证)时,搭配 /loop 定时运行,并用 /goal 设置严格的完成要求。
Token 使用预算
您可以为动态工作流设置明确的 token 预算,限制任务消耗量。例如提示“使用 10k token”,就会设置上限。
保存和分享动态工作流
在工作流菜单中按“s”即可保存。您可以把它们签入 ~/.claude/workflows,或通过 skill 分发。
要通过 skill 分享,请把 JavaScript 工作流文件放入 skill 文件夹,并在 SKILL.MD 中引用。为了更灵活,您可以提示 Claude 把 skill 中的工作流视为模板,而不是必须逐字运行的脚本。
一个全新的世界
工作流是扩展 Claude Code 的全新有力方式。我鼓励您把它当作起点——如何最佳使用它,还有很多值得探索的地方。欢迎告诉我们您的发现。