编排实战:手把手拆解一条 Command → Agent → Skill 流水线

一句命令进去,一张天气卡片出来。逐文件拆解一套真实在跑的三层编排:谁被允许干什么、谁被禁止干什么、数据怎么流。

Claude Code
返回文章列表

到上一篇为止,这个系列的零件全部讲完了:Command、Agent、Skill 各是什么(第 3 篇),分身怎么配(第 4 篇),技能怎么写(第 5 篇),Hooks 怎么强制(第 6 篇),权限怎么放(第 7 篇)。都是零件,这篇组装。

素材仓库里有一套完整在跑的示范系统:输入一句 /weather-orchestrator,它问你用摄氏还是华氏,然后自动查迪拜实时气温,最后在项目里生成一张 SVG 天气卡片和一份摘要。整个流程没有一个环节靠 AI“自觉”,每个角色都被配置和契约按在地上。

我们把它一层层拆开,看完你就能照着改出自己的流水线。

先看输入和输出

在 Claude Code 里输入:

/weather-orchestrator

发生三件事:它先弹一个选择框问你要摄氏还是华氏;你选完,它派一个分身去查迪拜实时气温;温度回来后,它调起画卡片的技能,往项目里写两个文件——orchestration-workflow/weather.svg(天气卡片)和 orchestration-workflow/output.md(本次执行的摘要)。

就这些。没有一步需要你盯着,也没有一步是“希望它记得”。下面拆开看每个零件。

全景:三层结构,一条数据流

第 3 篇给过这张系统的全家福,这次我们把数据怎么流画出来:

天气编排的数据流 六个阶段,右侧是每一跳手里的数据 ① 你输入 /weather-orchestrator ② Command 问单位 · haiku 负责编排 ③ 派分身 · 单位偏好写进提示词 ④ 分身调 fetcher · 抓 Open-Meteo ⑤ 温度回到 Command 的上下文 ⑥ svg-creator 落盘两个文件 数据形态 C / F 偏好 AskUserQuestion 问来的 带单位的任务指令 写进给分身的 prompt 温度数值 + 单位 JSON 里取 temperature_2m 回到主对话 分身只交结论,过程留它那 weather.svg + output.md 固定目录,跑一次留一份痕迹 每一跳都有固定接口,没有一条数据靠“大概还在上下文里”

值得注意的不是有哪三层,而是数据的路径:你的单位偏好从选择框出发,经 Command 写进给 Agent 的指令,Agent 通过技能换成温度数值,数值回到 Command 的上下文,最后被画卡技能写进文件系统。每一跳都经过固定的接口,没有一条数据是靠“上下文里大概还有吧”传下去的。

逐文件拆解:四个文件,各管一段

这套系统一共四个配置文件,住在三个地方。

入口:.claude/commands/weather-orchestrator.md(Command 层)

它是整个流程的指挥,frontmatter 就很有讲究:

---
description: Fetch Dubai weather and create an SVG weather card
model: haiku
allowed-tools:
  - AskUserQuestion
  - Agent
  - Skill
---

model: haiku——指挥官用最便宜的模型。编排工作(问一句、派个活、收个结果)不需要聪明,需要省钱。allowed-tools 只给了三件工具:问用户、派分身、调技能。它连 Read 和 Bash 都没有——想自己动手查天气?工具架上根本没有那件工具。

正文部分写的是一份“执行契约”,关键句直接写死:

你必须通过派 weather-agent 来完成本命令。禁止用 Bash、WebFetch 或任何其他工具自己抓天气;禁止跳过第一步(用户的单位偏好是必须的输入);禁止在分身返回温度之前调用画卡技能。

分身:.claude/agents/weather-agent.md(Agent 层)

真正出门查天气的角色,配置里有三处值得抄作业:

allowedTools:
  - "Read"
  - "Skill"
model: sonnet
memory: project
skills:
  - weather-fetcher

allowedTools 里故意没有任何网络工具。配置注释里有一句话堪称点睛:“如果你发现自己需要一个网络工具,那是你在绕过技能的信号——停下来,改用 Skill(weather-fetcher)。”这比任何“请务必使用技能”的叮嘱都硬:绕路的门被物理拆掉了。

memory: project 让它每次的读数都进项目记忆——下次执行时,它能在汇报里附一句“比上次高了 2 度”。skills 预载取数手册,出厂即上岗(第 4 篇讲过的机制,这里是实战)。它甚至挂了自己的专属 Hooks——分身干活时你听得到它的动静,第 6 篇的声音系统在这里复用。

取数手册:.claude/skills/weather-fetcher/SKILL.md(Skill 层)

---
user-invocable: false
allowed-tools:
  - "WebFetch(*)"
---

两个细节:user-invocable: false 说明它是纯后台知识,用户永远不需要手动调它;allowed-tools 里 WebFetch 的许可写在技能这一层——网络权限跟着手册走,谁执行这本手册谁才临时获得联网能力,分身本身依然是“断网”的。

手册内容朴实到感人:两条 Open-Meteo 的 URL(免费、不要 API key)、告诉 AI 从返回 JSON 的哪个字段取温度、以及输出格式。好技能就是这种手感——没有任何炫技,每句话都在消除歧义。

画卡手册:.claude/skills/weather-svg-creator/SKILL.md(Skill 层)

收到温度后负责出活。它展示了第 5 篇说的渐进式披露怎么落地:SKILL.md 本体只有任务说明和三条规则(用调用方给的温度、不许重新抓、两个文件写到固定目录),SVG 模板放进 reference.md,输入输出示例放进 examples.md——执行时用到哪份读哪份。

跑起来时,依次发生什么

  1. 你输入 /weather-orchestrator,Command 展开,主 Claude 以 haiku 开始执行编排;
  2. 它调 AskUserQuestion 问你:摄氏还是华氏?(跳过这步被契约明令禁止——单位是下游的必需输入)
  3. 它用 Agent 工具派出 weather-agent,提示词里带上一句“以用户选的单位查询”;
  4. 分身在自己的独立上下文里启动,预载的 weather-fetcher 技能就位,它调 Skill 工具执行手册,WebFetch 打向 Open-Meteo;
  5. 温度数值和单位回到 Command 的上下文;
  6. Command 调起 weather-svg-creator,技能读模板、套数值,把 weather.svg 和 output.md 写进 orchestration-workflow/。

全程你的主对话只经历了“回答一次选择”和“收到一份总结”,中间的网络请求、JSON 解析全发生在分身的上下文里——第 4 篇的上下文经济学,一次完整的实战。

值得抄的四个设计决策

一、每层一份“不可协商”的契约。 四个文件里有三个写着 Execution Contract,明令禁止本层越权的行为:Command 不许自己抓数据,Agent 不许直连 API,画卡技能不许重新抓取。这不是不信任 AI 的装饰性废话——它是和 allowed-tools 白名单配套的第二道锁:白名单管“拿什么工具”,契约管“拿工具干什么”。

二、fail-closed,不即兴。 两处契约都写了同款兜底:上游没有返回数值,就停下报告失败,不要试图自己补救。AI 的即兴发挥恰恰是流水线失控的起点——“它没查到,我拿旧数据凑一个吧”这种善意,正是你要在配置里掐死的。

三、模型分层计费。 编排的 Command 用 haiku,干活的分身用 sonnet。谁贵谁便宜不看地位看任务,这套系统是第 4 篇“让不同价位的模型各司其职”的实物示范。

四、产物落盘位置写死。 输出文件不落在“AI 觉得合适的地方”,而是技能配置里写死的固定目录。下次执行、别的脚本、你的 CI,都知道去哪找这张卡片。

改造成你自己的流水线

照着改五步,就能把“查天气”换成你的场景:

  1. 拆任务:哪一步需要问用户(Command + AskUserQuestion)?哪一步是独立的重活(Agent)?哪一步有固定操作知识(Skill)?
  2. 建四个文件:入口 Command、执行 Agent、N 个技能,目录照搬:.claude/commands/、.claude/agents/、.claude/skills/<name>/SKILL.md;
  3. 写契约:每层列出“禁止事项”——尤其禁止绕过下一层的捷径;
  4. 锁白名单:从零开始给工具,跑一遍缺什么加什么,别一上来全开;
  5. 定产物:输出文件写死目录,让流水线的每跑一次都留下可检查的痕迹。

举第 3 篇提过的例子:把“查天气”换成“跑测试收集报错”,把“画卡片”换成“按报错生成修复补丁”,同一条骨架就是一条质量修复流水线。

四个文件,各管一段 改造模板:目录照搬,职责照抄 .claude/commands/ weather-orchestrator.md .claude/agents/ weather-agent.md .claude/skills/weather-fetcher/ SKILL.md .claude/skills/weather-svg-creator/ SKILL.md + reference.md orchestration-workflow/ weather.svg + output.md 入口指挥 问一句、派活、收结果(haiku) 出门查数的分身 断网设计,只认技能(sonnet) 取数手册 Open-Meteo 两条 URL,只取数不落盘 落盘手册 模板在 reference.md,不重新抓数 产物目录 跑一次留一份痕迹,位置写死 改场景时:目录照搬,四个文件各改各的

两个容易踩的坑

坑一:契约写了一层就停。 只给 Command 写“必须派分身”,分身却可以直连 API——绕过技能的路径还通着。契约要每层各写各的,白名单每层各锁各的,两道锁都要落到位。

坑二:中间产物没落盘。 温度只在上下文里传,一旦某层失败重跑,上一步的结果就悬空了。数值类中间产物学这套系统:要么进 memory(分身的历史读数),要么写进固定文件——上下文是易失的,而磁盘不是。

收工清单

  1. 三层分工一句话:入口用按钮,重活用分身,手册用本能
  2. 编排层用 haiku,干活层用 sonnet:模型按任务计费,不看头衔
  3. 每层两道锁:allowed-tools 白名单 + 白纸黑字的执行契约
  4. 关键角色的能力要做减法:分身没有网络工具,绕过技能的路才真正断了
  5. 失败就停(fail-closed),禁止善意的即兴补救
  6. 产物落盘写死目录,流水线的每次运行都留下可检查的痕迹
  7. 改造五步:拆任务 → 建四个文件 → 写契约 → 锁白名单 → 定产物

零件、组装、实战,到这篇全部就位。下一篇看一眼地平线:Agent Teams、定时任务、并行开发这些正在快速成型的 Hot 特性,哪些值得现在就上手。

系列导航