编排设计规范(Orchestration / .orch.json)
本文档定义 WeGirlOffice 编排文件(
.orch.json)的设计规范与最佳实践。 适用于在插件中编写、评审、演进编排的所有场景。 全文示例均来自真实在用编排:
plugins/standard-orch/标准模式.orch.json—— 计划 → 人审 → 执行闭环(Plan-Review-Execute)plugins/standard-orch/PTC 模式.orch.json—— 标准模式的 PTC 变体(节点级 toolMode)plugins/static-site/SEO巡查.orch.json—— MCP 数据采集流水线(业务规则前置 + 结构化回传)
目录
- 文件结构契约
- 节点两大类:flow 与 config
- 三种骨架模式(真实示例拆解)
- 变量与模板规范
- 边(edges)设计规范
- 提示词与工具授权规范
- 收尾链与回传 UI
- 命名与可读性
- 演进策略:复制-定向改造
- 发布前自检清单
1. 文件结构契约
每个 .orch.json 必须满足以下顶层结构(formatVersion 2):
{
"__type": "agent-orchestration",
"__formatVersion": 2,
"__main__": {
"name": "编排名(中文,见名知义)",
"nodes": [ /* 见 §2 */ ],
"edges": [ /* 见 §5 */ ]
},
"visibility": "sparkle",
"sparkleFor": "ai-button 绑定键(可选)"
}
规则:
__type与__formatVersion为固定值,不得省略或自造;name用中文短语,与文件名保持一致(如标准模式.orch.json内name="标准模式");visibility: "sparkle"+sparkleFor: "<key>"表示该编排作为 AIButton(SparkleButton)的候选编排暴露给按钮配置器;sparkleFor是持久化在按钮配置里的绑定键,发布后不得更名(兼容存量配置,参见 AI_BUTTON_SPEC.md);- 编排文件随插件分发:改源码里的编排 JSON,必须同步 dist(本地开发项目 dist 直读,构建脚本负责拷贝)。
2. 节点两大类:flow 与 config
编排图里的节点分两类,职责必须分清:
| 类别 | 职责 | 典型 type | 数据流 |
|---|---|---|---|
| flow 节点 | 参与主数据流,处理/加工/传递内容 | start / input / context / llm / mcp / composite / human / memory / snapshot / tokenMeter / code / output / wegirl-output / end |
串联在 start→…→end 主链上 |
| config 节点 | 提供配置/资源,不加工内容 | config / mcp-config / kb-config / comfy-config / checkpointer / memory-storage-* |
用边「挂」到消费节点上,不接主链 |
关键约定:
- config 节点必须有一条指向其消费节点的边才会生效。例如标准模式里
config节点分别连向memory-storage-file、checkpointer、mcp-config、kb-config;SEO 巡查里config(id=mcpConfig)连向mcp-config(GSC); memory节点必须有memory-storage-*存储节点作为上游(标准模式:node-mt4el9te_g(memory-storage-file, scope=session) →memLoad);- 自定义节点类型一律走
main.cjs的apply(ctx)内ctx.harness.registerNode注册(三登记:NODE_TYPES+NODE_META/NODE_ORDER/CONFIG_ITEM_TYPES),详见 PLUGIN_CUSTOM_NODE_DEVELOPMENT.md。
每个节点的 config.logMode 约定:
hidden:无观测价值的节点——start/input/end/output;smart:业务节点默认值,聊天流按摘要展示。
3. 三种骨架模式(真实示例拆解)
3.1 骨架 A:计划 → 人审 → 执行闭环(标准模式)
适用:改动不可逆资源(写文件、发消息)前的任务型编排。
start → input → tokenMeter → memLoad → ctx
ctx ──(planModeEnabled == true)──→ planComposite ──→ review ──┐
ctx ──(planModeEnabled != true)──→ planExec │
review(approve) ──→ planExec → output → memSave → snapshot → end
review(revise, count<5) ──→ planComposite(回到规划)
设计要点(全部对应 标准模式.orch.json):
- 规划与执行职责分离:
planComposite(composite,cnRef=ReAct 循环)的 agent 只授权只读工具(Read/Grep/Glob/ListDir/Plan),system 明令「禁止 Write/Edit/Shell/SpawnSubagent」;planExec才持有写能力。最小权限是铁律:能只读规划的阶段绝不给写工具。 - 人审节点
human(mode=decision):varName: "review"收集决策;counterVar: "reviseCount"+counterMax: 5限制修订轮数——凡是允许「打回重做」的环,必须配计数上限,否则存在无限修订风险。 - 条件边互斥完备:
vars.planModeEnabled == true/!= true两条边覆盖全部取值,任何输入都有唯一去路。 - 收尾链固定:
output → memSave → snapshot → end(见 §7)。 - composite 覆盖:
cnRef引用复合编排,overrides按「节点 id → config 局部覆盖」合并(overrides.agent.system/prompt/outputVar/tools、overrides.loopDetect.maxLoops)。只覆盖差异项,不整段重写。 extraTools用于在基础工具之外追加(标准模式执行节点追加了ComfyUIImage)。
3.2 骨架 B:PTC 变体(PTC 模式)
PTC 模式.orch.json 是标准模式的最小定向变体,图结构完全相同(start/input/tokenMeter/memory/ctx/review/执行/output/memSave/snapshot/end),只改了两处:
- 节点级 toolMode:执行 composite 的
overrides.agent.toolMode: "ptc",让该节点注入run_code程序化工具调用能力(简单操作走原生工具,批量/循环/分支/并发组合走 run_code,await tools.<工具名>(args)); - system 重写工作方式:把「什么该写成 run_code」的判定标准直接写进提示词——「如果你打算跑的 shell 命令里带了管道/循环/多目标,那就该写成 run_code 程序」;并约定「关键中间结果务必 console 出来,结尾 return 汇总对象」「每次提交带 description」。
设计要点:
- 能复制就别重写:PTC 模式从标准模式复制而来,图、id、收尾链零漂移,diff 只有目标差异——评审时一眼看清;
- 配套调整规划侧提示词:规划 agent 的计划要求里追加「标注哪些步骤适合在执行阶段用 PTC 程序(run_code)一次性完成」,上下游提示词联动;
maxLoops: 30高于运行时默认(MAX_TOOL_LOOPS=14),放宽必须有业务理由(本例:PTC 单次提交可完成多步,整轮步数天然更少但单步更大),并在评审时说明。
3.3 骨架 C:MCP 数据流水线(SEO 巡查)
适用:对接外部系统采集数据 → 分析 → 结构化回传 UI 的周期性业务流水线。
start → input → director(context 业务规则) → gscAnalyze(mcp) → extractTodos(llm) → output(wegirl-output) → end
config ──→ gscConfig(mcp-config, servers=[gsc])
设计要点(全部对应 SEO巡查.orch.json):
- 业务规则前置到 context 节点(id=
director):多账号隔离、配额保护、输出格式全部集中写在 context 模板里,下游节点只做执行——规则一处维护,多个执行节点引用; - MCP 节点收敛调用面:
serverRefs: ["gsc"]限定服务器;maxCalls: 30硬上限保护外部 API 配额;prefixToolNames: false保持工具原名;system 里写明「优先/禁止/兜底」三级工具策略(如:禁止预先调list_sites,仅报错时兜底一次); - 结构化提取独立成 llm 节点(id=
extractTodos):分析节点输出人类可读报告,另一个 llm 节点专职把报告压成一行 JSON(summary/kpi/pages/todos),system 里给出精确 JSON Schema + 「找不到的数据省略、禁止编造」——分析归分析、结构化归结构化,互不污染; - 回传走
wegirl-output:source: "vars.report",附action(回调动作键)、mode/siteUrl/date/requestId业务字段、todos/reportData(结构化数据,驱动 UI 自动生成待办); - 幂等参数显式传递:每次工具调用必须携带的
projectPath/account等隔离参数,在 prompt 与 system 中反复钉死,防模型漏带。
3.4 选型速查
| 场景 | 骨架 | 参考文件 |
|---|---|---|
| 会写文件/发消息的任务执行 | A:计划-人审-执行 | standard-orch/标准模式 |
| 同上 + 批量工具组合提速 | B:A 的 PTC 变体 | standard-orch/PTC 模式 |
| 外部系统数据采集/巡查/回传 | C:MCP 流水线 | static-site/SEO巡查 |
4. 变量与模板规范
- 输入变量:
{{input.<name>}}(如{{input.query}},由input节点收集); - 运行时变量:
{{vars.<name>}}(节点outputVar写入、human 节点varName写入); - 记忆块:
{{block}}(memLoad 的 loadTemplate / snapshotLoadTemplate 内使用); - 记忆写入:
{{content}}为本轮回复兜底字段——saveTemplate 用{{content}},不用{{vars.result}}(结果节点失败时仍能记录用户原话与回复); - 模板里引用的变量必须有确定来源;可选变量(如
{{vars.review.feedback}}首轮为空)在 prompt 文案中注明「首轮为空」。
5. 边(edges)设计规范
- 每个非 start 节点必须可达;主链从
start出发,终点是end; - 条件边互斥且完备:同一源节点的所有 condition 合起来必须覆盖全部情况(
== true/!= true;decision == "approve"/== "revise" && counter < max)——用!=而非枚举反例,避免新增取值时漏边; - config 节点的边只用于「供应」,不出现在主链上(见 §2);
- 修订回边必须带计数条件(
vars.reviseCount < 5),并由 human 节点的counterVar/counterMax驱动; - 不要为「看起来直观」增加无语义的中间节点;图的可读性靠 id 命名与布局(position 不重叠、主链从左到右、config 区在上方)。
6. 提示词与工具授权规范
每个智能体节点(llm / composite.agent / mcp)的 system + prompt 按此分工:
- system = 角色 + 能力边界 + 禁止行为 + 输出格式(例:「你现在是【规划智能体】…严禁直接修改任何业务文件…」);
- prompt = 本次任务数据(
{{input.query}}、{{vars.planText}}等),不混入长期规则; - 工具最小授权:白名单逐个列出(
tools: [{name, arguments}]),需要时用extraTools追加;只读阶段绝不给写工具; - 禁止行为显式成文:「禁止编造数据」「数据不足时标注数据不足」「同一工具相同参数禁止重复调用」——模型可执行的否定约束要具体到工具名;
- MCP 类编排把配额保护写成「硬规则 + 最高优先级」单独成节(SEO 巡查 director 模板的做法)。
7. 收尾链与回传 UI
任务型编排的收尾链固定为:
执行节点 → output → memSave → snapshot → end
output(source 指向结果变量,如vars.result)负责把结论送达聊天流;memSave(mode=save)写记忆;snapshot(token_budget 策略,示例值 16000 / keepLastN 10,含 skip 防抖参数)压缩历史;- 运行结束以外层
graph.run.completed事件为准——收尾链缺环会导致会话状态不收敛,禁止省略 end; - 需要「结果回传 UI 面板」的编排,用
wegirl-output节点(见 §3.3 第 4 条):action是插件侧注册的回调键;回传对象携带text(markdown)字段时,聊天流「最终结果」面板会直接渲染,图片按项目相对路径解析。
8. 命名与可读性
- 节点 id 语义化:核心 flow 节点用手写 id(
memLoad/memSave/review/planExec/director/gscAnalyze/extractTodos),便于 overrides 寻址与评审;自动生成 id(node-mtXXXX)仅用于无需引用的 config/存储节点; label用中文动词短语描述职责(「记忆调度(读)」「提存 JSON(优化待办)」);- composite 的
cnRef用中文引用复合编排名("ReAct 循环"),与编排库保持一致; - 长模板里的章节用
### 小标题分节(硬规则 / 输出规则 / 示例格式),便于后续维护者定位。
9. 演进策略:复制-定向改造
新增编排优先从最接近的存量编排复制,再做最小定向差异:
- 复制 → 改
name与文件名; - 删除用不到的 config 节点及其边(PTC 模式相比标准模式删掉了
comfy-config); - 只改目标差异点(toolMode / system / 工具白名单 / 骨架节点),图结构能不动就不动;
- 改完重跑/试运行一轮,确认聊天流节点顺序、人审计数、收尾链符合预期;
- 同步 dist(编排 JSON 改源必同步 dist 才会生效)。
反模式:从零手写一张「看起来类似」的图——id 命名漂移、收尾链缺环、条件边不完备,都是这么引入的。
10. 发布前自检清单
-
__type/__formatVersion/__main__.name齐全,文件名与 name 一致 - 所有节点从 start 可达,主链终点为
end(收尾链 output→memSave→snapshot→end 完整) - config/存储节点都有指向消费节点的边;memory 节点上游有 memory-storage-*
- 条件边互斥且完备;回边带计数上限
- 工具白名单最小授权;只读阶段无写工具;MCP 有 maxCalls
- system/prompt 分工清晰;禁令具体到工具名;结构化输出有 Schema 且禁编造
- 节点 id 语义化;logMode 按约定 hidden/smart
-
visibility/sparkleFor如有绑定,确认键名未更名 - 源文件改动已同步 dist