42md 知识编排(4):让编排更灵活、更可靠
自己写编排写顺手后,会先后撞上三件事,每件都有一招:同一条流程想换个花样(比如换套排版),用参数留个旋钮;一步产出好几个文件,指定主产物,中间产物也能都留下;还有尤其该养成的一招——跑前先校验、预检,把工具名写错、引用写错这类问题提前抓出来,别跑到一半才炸、白花了钱。三招都配可直接抄的 YAML。
上一篇你从零搭了一条编排,能跑了。再用一阵,你会先后撞上三件事。一件比一件实用,第三件尤其该养成习惯。每件都只要一招,下面挨个讲清,YAML 都能直接抄。
一、同一条流程,想换个花样
先说个常见的。你写了一条「笔记 → 精排 PDF」的流程,平时用学术排版自己看;哪天要发给同事,想换成杂志风。
图省事,你可能会复制一份、把样式名一改,存成第二条。可两条几乎一样的编排,以后改哪条都得想半天。
更省事的做法:把那个「会变的地方」留成一个旋钮。在编排里它叫参数——声明一次,运行时随手拨。
name: notes2pdf-my
params:
- name: style # 声明一个旋钮,名叫 style
description: 排版样式
default: academic # 不拨就用这个:学术排版
steps:
- id: build
run: tools.md2pdf
with: ["{{ input }}", "--style", "{{ params.style }}"] # 把旋钮的值填进来
output: "{{ steps.build.output }}"
{{ params.style }} 就是「把 style 这个旋钮当前的值填到这里」。运行时用 --set 拨一下,不拨就走默认:
42md recipe run notes2pdf-my 笔记.md # 默认学术排版
42md recipe run notes2pdf-my 笔记.md --set style=magazine # 这次要杂志风
一条编排,两种用法,不用再维护两份。参数能放的不止样式——翻译的目标语言、摘要的风格,凡是「这条流程偶尔要换个值」的地方,都能留成旋钮。想让某个旋钮必须拨(不拨就报错、不许用默认),给它标 required: true。
小提示:
--style后面填什么,去42md tools md2pdf --style list里挑——序号、中文名、英文短标识都认。这套「按名取用配置」另开一篇细讲。
二、一步产出好几个文件,该往下传哪个
大多数步骤只产出一个文件,引擎自己就认得,不用你操心。但偶尔一步会同时吐出好几个——这时你得告诉它:把哪个往下传。用 produces 指定主产物的类型(按扩展名):
- id: extract
run: acquire
with: ["{{ input }}"]
produces: md # 这步主产物是 .md,往下就传它
还有个相关的小开关。默认情况下,编排只把最后一步的产物交到你手上,中间的就丢了。可有些流程,中间产物你也想留——比如「提取英文原文 → 翻译成中文 → 提炼要点摘要」,原文、译文、摘要三份你都想存着对照。加一句就行:
deliver: all # 整条流程的产物都留给你,整目录交付
内置的 pdf2digest 就是这么做的:跑完一篇论文,英文原文、中文译文、中文摘要三份都在交付目录里,方便你逐句比对。
三、跑之前先自检,别白花钱
这一招,尤其该记住。
编排是一步接一步往下跑的。假设你手滑,把 tools.translate 写成了 tools.translater(多打一个字母)。会怎样?提取照跑、翻译照跑——钱也照花了——一直跑到那个根本不存在的工具名,才整个炸掉。前面的时间和额度,白搭。
42md 让你在开跑前就把这类错抓出来。两个命令:
42md recipe validate ~/.42md/recipes/notes2pdf-my.yaml # 只检查这份编排写得对不对
42md recipe run notes2pdf-my 笔记.md --dry-run # 预演一遍:只打印计划,不真跑、不扣费
它们会在你花一分钱之前,替你抓出这几类常见错:
| 它能帮你抓出的错 | 例子 |
|---|---|
| 工具名写错 | tools.translater 不存在,当场报错,提示你用 recipe verbs 看有哪些合法动作 |
| 参数没声明 | 用了 {{ params.style }},却忘了在 params 里声明 style |
| 步骤引用错 | 引用了一个不存在的步骤,或引用了排在自己后面、还没跑的步骤 |
--dry-run 还会把整条计划摆给你看——分几步、每步调什么、哪步花钱、预估多少。看准了,去掉 --dry-run 再真跑。
先 validate / dry-run,再 run——这个顺序养成习惯,自定义编排基本不会在半路翻车,更不会写错一个字母就白烧一笔额度。
顺带一提:编排不一定非得先存进 ~/.42md/recipes/。手头有一份现成的 YAML 想直接试,42md recipe run -f 文件.yaml 笔记.md 就能跑,从管道喂进去也行(--recipe -)。这给下一篇「让 AI 生成编排、直接拿来跑」埋个引子。
知识编排系列
- 第(1)篇:多步流程,一条命令跑完
- 第(2)篇:七个内置编排,开箱即用
- 第(3)篇:写一条自己的编排
- 第(4)篇:让编排更灵活、更可靠(本篇)
- 第(5)篇:一句话,让 AI 生成编排
- 第(6)篇:把编排交给 AI 助手
活水 AI 实验室(42ailab) — 探索智能边界的 AI 创新实验室,以认知科学为基石,推动 AI 与人类智能的深度融合,真正理解并增强智能 —— 碳基的,也是硅基的。
活水MD(42md) — 活水 AI 实验室出品的高性能 Markdown 处理工具。AI 时代的 Markdown,一站式处理:42+ 种格式一行转 Markdown,还支持翻译、摘要、导出等十余种知识工具,并支持知识编译、流程编排、本地引擎与 Agent 调用。