把编排写进脚本:动态工作流一次跑上百个子代理,先管住三件事
子代理一次派三个五个还行,派到三十个就乱了。谁先跑、失败了从哪里接、中间结果放哪,全靠模型逐轮判断,判断本身也在烧上下文。Claude Code 的动态工作流换了条路:把编排写成脚本,运行时在后台执行,中间结果留在脚本变量里,主会话只收最终结果。[1][2]
代价是编排细节从模型手里转到你手里。开跑前我会先确认三件事:谁持有计划、中断后重跑哪些、钱花在哪。
计划在脚本里,判断在代理里#
子代理、Skill、代理团队和工作流的差别不在能力,在谁决定下一步跑什么。前三者由模型逐轮决定,中间结果进上下文窗口;工作流由脚本决定,中间结果留在脚本变量里。[1] 官方给的典型场景是全库缺陷扫描、五百个文件的迁移、需要互相校验来源的调研。[1][2]
代理还是子代理那一套:独立上下文、可限制工具,工作流按脚本调度它们。[1][4] 内置质量模式也可以抄:让独立代理互相反驳发现,再决定上报哪条。[1]
Codex 的口径相反,编排仍交给模型逐轮做,Skill 装可复用流程、子代理丢噪声大的活。[5]
并发 16、单次列表 4096、单次运行 1000#
三条硬上限:同时最多 16 个代理,CPU 少时更少;单次 parallel() 或 pipeline() 最多 4096 个条目;一次运行总计 1000 个代理。[1] 脚本本身没有文件系统和 shell 权限,读写与执行都由代理做,出现 import() 会在运行前失败。[1]
运行中途不接受输入,只有代理的权限提示能暂停它。要在两阶段之间人工签字,就把每个阶段做成独立工作流。[1]
中断之后重跑哪些,决定你花两遍钱#
重放按代理启动顺序走:已完成的返回保存结果,但第一个提示发生变化的代理、以及它之后的代理都会重跑,哪怕上次已经完成;停止时仍运行的代理重新开始;失败的代理重跑,它之后启动的也全部重跑,单独停掉某个代理也算失败。[1]
代价因此不对称:脚本按 A、B、C、D 启动,B 挂了就是 C 和 D 陪着重来。[1] 我会把便宜、易失败的探查放前面,把昂贵或会产生写入的步骤挪到后面,必要时拆成几个小工作流。
Date.now()、Math.random() 和无参 new Date() 在脚本里会抛错,这样重放时才能产生同样的 agent() 调用;要时间戳就通过 args 传。[1]
快速上手:先拿一个小目录试一次#
第一次别拿整个仓库开刀。下面这几步都能随时退出,不会改你的代码。
先把规模调到最小:/config workflowSizeGuideline=small 对应少于 5 个代理,默认是 medium。[1]
然后只审计一个小目录,并把反驳写进提示:
ultracode: 只审计 src/routes/auth/ 下的路由处理是否缺少鉴权检查,每条发现都要由一个独立代理尝试反驳
ultracode 只在你手敲的提示里生效,claude -p、定时任务或 webhook 转发进来的文本不会触发。[1]
审批时 Ctrl+G 能把脚本原文拉进编辑器,Tab 可以改提示,看不懂就选 No。[1]
跑起来之后盯着进度:
/workflows
进度页列出各阶段的代理数、token 总量和耗时,常用按键四个:p 暂停或恢复,x 停掉选中的代理,r 重跑一个代理,s 把这次运行的脚本存成命令。[1] 存的位置有两种,项目里的 .claude/workflows/ 随仓库共享,~/.claude/workflows/ 只对自己可见,之后用 /<name> 调用,参数从脚本里的 args 读。[1]
成本先做两件事:永远先跑小切片再决定全量,[1] 以及缓存规则:模型、effort、工具、输出 schema 和工作目录相同的代理共享 prompt 缓存前缀,扇出时除第一个之外的代理最多等 5 秒才启动,等待时长由 CLAUDE_CODE_WORKFLOW_PREFIX_STAGGER_MS 控制,默认 5000 毫秒;子代理的缓存默认保 5 分钟,可以设 subagentPromptCacheTtl 到 1 小时,但 API 对 1 小时缓存写入收费更高。[1] 跑完看 /usage,最近用量按 Skill、子代理、插件和 MCP 服务器列出占比,长上下文或者缓存命中失败超过近期用量 10% 会被标出来。[3]
一次运行排到 25 个代理以上,或者预测 token 超过 150 万,任务面板会显示 Large workflow 警告并指你去 /workflows 停掉它;它只提示不限制,设了 size guideline 后阈值按那个值算。[1]
退路有三种,都持久生效:/config 里关掉 Dynamic workflows、在 ~/.claude/settings.json 写 "disableWorkflows": true、或者设环境变量 CLAUDE_CODE_DISABLE_WORKFLOWS=1;组织级需要在 managed settings 里关。[1]
agent() 带 schema 会让子代理返回结构化 JSON,schema 自相矛盾在启动前就报错,输出连续五次验证不过才算失败,次数由 MAX_STRUCTURED_OUTPUT_RETRIES 控制;被中断或拦下的调用返回 null,收尾记得 filter(Boolean)。[1]
什么时候不值得#
改一句文案、修一个确定的类型报错,写脚本编排比直接改慢。值得上工作流的是:一次对话装不下,或者同一步骤要在很多对象上重复。[1] 别把工作流当并行提款机,把不可逆的写操作也丢进去,脚本没有 shell 权限不代表它派出去的代理没有。
1000 个代理、4096 个条目这类数字不会给你意外。[1] 真要出事,多半是恢复语义上的误判:你以为只重跑失败的那一个。
Sources#
[1] https://code.claude.com/docs/en/workflows — Orchestrate subagents at scale with dynamic workflows [2] https://code.claude.com/docs/en/agents — Run agents in parallel - Claude Code Docs [3] https://code.claude.com/docs/en/costs — Manage costs - Claude Code Docs [4] https://code.claude.com/docs/en/sub-agents — Create custom subagents - Claude Code Docs [5] https://developers.openai.com/codex/concepts/customization — Customization - Codex | OpenAI Developers