OpenMontage 的 `config.yaml` 全文逐键读:LLM、预算、检查点、输出、路径
看一个「流程写在文本里」的项目,最难受的是你不知道该信哪一段文字。README 讲愿景,skill 是写给模型看的提示词,manifest 是流水线自己的说法——这些都要靠 agent 去读、去执行,读没读、执行到什么程度,你在仓库里看不出来。
所以我翻 OpenMontage 的时候,习惯先把 config.yaml 读完。这是仓库根目录下唯一一份全局配置,只有五段、三十来行,里面每一个默认值都是可以直接引用的硬事实——不需要谁去「理解」它,它就摆在那里。
先把全文摆出来
这是我们实读的 config.yaml 全文:
# OpenMontage - Global Configuration
llm:
provider: anthropic # anthropic | openai | gemini | openrouter | ollama | mistral | minimax
model: null # null = use provider default
temperature: 0.7
max_tokens: 4096
budget:
mode: warn # observe | warn | cap
total_usd: 10.00
reserve_pct: 0.10 # holdback for retries / cleanup
single_action_approval_usd: 0.50
require_approval_for_new_paid_tool: true
checkpoint:
policy: guided # guided | manual_all | auto_noncreative
storage_dir: pipeline # relative to project root
output:
default_format: mp4
default_codec: libx264
default_audio_codec: aac
default_resolution: "1920x1080"
default_fps: 30
default_crf: 23
paths:
pipeline_dir: pipeline
library_dir: library
styles_dir: styles
skills_dir: skills
output_dir: output
五段:llm、budget、checkpoint、output、paths。下面逐段说。
需要先声明一句边界:这份文件被 lib/ 下的哪些模块读、以什么优先级生效、命令行或环境变量能不能覆盖它——这些实现我们没有读过(lib/ 里确实有 config_model.py、env_loader.py、paths.py 这几个文件名,但仅此而已)。本文只讲这份 YAML 里写了什么。
llm:默认 provider 是 anthropic,注释里列了七个
provider: anthropic 是默认值,同一行的注释把全部可选值都列了出来:anthropic | openai | gemini | openrouter | ollama | mistral | minimax,一共七个。model: null 后面的注释解释得很清楚,null 表示用该 provider 的默认模型,也就是说你不填模型名不会报缺参数,只是把选择权交出去了。另外两个键是 temperature: 0.7 和 max_tokens: 4096。
这里有一处前后不一致,值得记下来:注释里的七个可选值中已经包含 ollama,而 README 里写的是「通过 Ollama 和 LM Studio 支持本地 LLM」属于 “Coming soon”。两处口径不一样,以仓库当前状态为准。我不打算推断哪一处是准的、也不建议你据此认为本地 LLM 现在就能用——README 把它写成计划,那它在文档层面就是计划,不是已交付的能力。
顺带提醒一句,这一段管的是这套系统里 LLM 侧的默认配置,和后面视频生成、图像生成、TTS 那些 provider 不是同一回事。工具侧的 provider 是由一套七维评分引擎在运行时打分选出来的(lib/scoring.py 第 38-44 行的权重是 0.30 / 0.20 / 0.15 / 0.15 / 0.10 / 0.05 / 0.05,相加正好 1.00),那套逻辑不写在 config.yaml 里,我们另有一篇专门讲它。
budget:默认是 warn,不是 cap
这是全文最该看仔细的一段,五个键:
mode: warn—— 三个模式是observe | warn | captotal_usd: 10.00reserve_pct: 0.10—— 行内注释写的是 holdback for retries / cleanup,即为重试和收尾预留single_action_approval_usd: 0.50require_approval_for_new_paid_tool: true
第一个键最容易被误读。很多人扫一眼看到 total_usd: 10.00,就默认这是一道硬性的支出上限,然后放心去跑。但默认模式是 warn 不是 cap。README 的 Budget Controls 一节对三个模式给的说明是:observe 只跟踪、warn 记录超支、cap 是硬上限。三种模式各自具体怎么执行,请以仓库代码和官方文档为准;我要说的只是,默认那个不是硬上限那个。
把这段和 README 的 Production Governance 一节对照着读,还有两点值得写。
一是对得上的部分。README 说预算控制分 Estimate(执行前估算)、Reserve(调用前锁定资金)、Reconcile(事后对账)三步加可配置模式,单次动作审批默认 $0.50、总预算默认 $10、完全可配置。这几个数字和模式名与 config.yaml 实读值逐项吻合——README 怎么写的,配置里就是怎么写的,这一条对照可以直接用,不必再去猜。
二是README 没提、配置里有的两个键:reserve_pct: 0.10 和 require_approval_for_new_paid_tool: true。后面这个尤其影响实际体验——它的意思是,遇到一个此前没用过的付费工具,默认要走审批,而不是先调了再说。README 的 Budget Controls 一节没有列这两项,是配置文件自己带的。
还有一处纵向对照:单条流水线可以自带比全局更紧的预算默认值。documentary-montage.yaml 的 orchestration.budget_default_usd 是 1.00,比全局的 total_usd: 10.00 低一个数量级。也就是说你在 config.yaml 里配的是全局默认,具体跑哪条流水线时还可能被 manifest 里的值覆盖,看总额之前先看你要跑的那条 manifest。
最后必须说清楚:把这五个键配好,不等于不会超支。README 那句收尾原文是 “No surprise bills. The agent tells you what it will cost before it spends.”,那是 README 的措辞,不是我们验证过的结论。真正拦住花销的动作发生在每一个创意闸上——是你点不点那个批准。
checkpoint:默认 guided,以及路径段里那处重复
这一段只有两个键。policy: guided 是默认,另两个可选值是 manual_all 和 auto_noncreative;storage_dir: pipeline,注释注明是相对项目根目录。
三个策略名本身就说明了这套设计在哪里给你留了余地:manual_all 顾名思义是全部人工,auto_noncreative 从命名看是把非创意的环节自动化掉,默认的 guided 在两者之间。这三个策略各自具体在哪些阶段停、停多久,是 skills/meta/checkpoint-protocol.md 那一层的事,那份 skill 的正文我们没有读过,不展开。
关于 checkpoint 本身,README 的 Quality Gates 一节里有两句可以直接引用:checkpoint 写入器会拒绝一个没有记录批准的「已完成」闸控阶段;每一个被取代的 checkpoint 都会被归档,所以审计链路在修订之后仍然存活。换句话说,这个 storage_dir 指向的目录不只是断点续跑的缓存,它同时是审计留痕的落地位置。
顺手记一处配置里的重复:checkpoint.storage_dir 的默认值是 pipeline,而 paths 段里 pipeline_dir 的默认值也是 pipeline,两处默认值相同。这两个键分别怎么被读、改一处会不会带动另一处,源码我们没有读,这里只如实指出默认值撞在了同一个目录名上——你要把 checkpoint 挪到别处时,记得看看这两个键是不是都要改。
output:六个默认值,以及它管不到的事
default_format: mp4、default_codec: libx264、default_audio_codec: aac、default_resolution: "1920x1080"、default_fps: 30、default_crf: 23。六个键都带 default_ 前缀,语义很明确,是默认值不是强制值。这几个参数各自的具体含义以 FFmpeg 官方文档为准,配置文件里只给了值,没有解释。
要提醒的是这一段的作用范围。output 决定的是容器、编解码器、分辨率、帧率这类封装层面的默认参数,它决定不了一条片子能不能通过质量闸。真正卡在合成前的是另一套东西:lib/slideshow_risk.py 的模块 docstring 写明,它在 6 个维度上给视频计划打分,每维 0-5 分、分越低越好,判定门槛是小于 2.0 为 strong、小于 3.0 为 acceptable、小于 4.0 为 revise、大于等于 4.0 为 fail,且 fail 时不应进入 compose 阶段。这套评分和你在 output 里写 30 fps 还是别的值毫无关系。这两组数值经常被混着讲,分清楚它们各管一段,是读这份配置时最实用的一条认知。
paths:五个目录名,一并摆进配置
最后一段把五个目录名做成了可配置项:pipeline_dir: pipeline、library_dir: library、styles_dir: styles、skills_dir: skills、output_dir: output。
注意 skills_dir 也在里面。这个项目的知识主体是 Markdown——我们实读 skills/ 下有 156 个 .md、.agents/ 下有 567 个,相加 723 个——把 skill 目录做成配置项,意味着这堆文本的位置在配置层面是可以挪的。至于挪了之后 agent 侧的读取行为会怎么变,那取决于你用的 agent 和它当时的上下文,不是这份 YAML 能保证的事。AGENT_GUIDE.md 里有一节标题就叫 Project Directory Convention,说明目录约定这件事在 agent 契约里另有规定,那一节的正文我们没有读过。
读完这三十行,你能做出哪几个判断
- 想控成本:先确认
budget.mode是不是你要的那个,默认warn不是硬上限;再看你要跑的那条流水线 manifest 有没有自带更紧的budget_default_usd。 - 嫌打断太多或太少:调
checkpoint.policy,三个取值是guided | manual_all | auto_noncreative。但要记住 README 明写人类审批闸是强制的、不是建议的,这个键调的是节奏,不是「关掉审批」。 - 想换 LLM provider:七个可选值写在
llm.provider的注释里,其中ollama出现在注释中、而 README 把本地 LLM 支持标为 “Coming soon”,两处口径不一致,以仓库当前状态为准。另外AGENT_GUIDE.md的 What Not To Do 一节里明确写了:不要在没有事先告知用户的情况下更换 provider、模型或渲染路径。你自己改配置当然可以,但这条约束的存在说明这个项目把「换 provider」当成一件需要被告知的事。 - 想改输出规格:
output段六个键都带default_前缀,改它影响的是封装参数,不影响合成前的质量判定。
这份配置的信息密度很高,但它的边界也很清楚:它只放默认值,不放判断逻辑。判断逻辑在 lib/ 的评分与治理模块里,在 pipeline_defs/ 的 manifest 里,在 skills/ 的那堆 Markdown 里——而 Markdown 那部分,最终是不是被读、被读进去多少,取决于你手上那个 agent。
本文依据 OpenMontage 官方仓库(github.com/calesthio/OpenMontage)的 README、
AGENT_GUIDE.md、config.yaml、pipeline_defs/ 与 lib/ 下的治理模块整理,核对日 2026-08-09。
本文内容为仓库源码与文档口径,我们没有安装或运行过该系统,也没有调用过其中任何一个 provider API,
文中出现的成本数字均为项目方在 README 中自行标注的金额,非我们的实测结果。
该项目以 AGPL-3.0 发布,部分流水线在 manifest 中自标 stability: beta,请以仓库最新内容为准。
安全相关做法请结合自身环境评估,本文不构成安全方案建议。