ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Plano 配置版本治理:深入解析 config.yaml 的 version 字段与 schema 校验机制

Plano 配置版本治理:深入解析 config.yaml 的 version 字段与 schema 校验机制 Plano 配置版本治理深入解析 config.yaml 的 version 字段与 schema 校验机制【免费下载链接】planoPlano is an AI-native proxy server and data plane for agentic apps. Smart LLM routing, observability, agent orchestration, and guardrails so you stay focused on your agents core logic.项目地址: https://gitcode.com/GitHub_Trending/ar/planoversion字段是 Plano 每份config.yaml必须声明的顶层字段它直接决定配置文件能否通过版本化 JSON Schema 校验并成功启动。本文以 skills/rules/config-version.md 规则为骨架结合 config/plano_config_schema.yaml 与 cli/planoai/config_generator.py 的源码实现讲清 version 字段的作用机制、当前支持的版本列表、配置迁移行为以及如何在启动前用官方脚本完成校验排错。version 字段为什么是 CRITICAL 级配置项在 Plano 中version不是装饰性的元数据而是所有其他配置校验的开关。Plano 使用一份版本化的 JSON Schema 校验配置缺失或不识别的 version 会在容器启动之前由 CLI 的 schema 校验阶段直接报错终止。其关键性体现在两个层面Schema 层面在 config/plano_config_schema.yaml 中required列表明确包含version与listeners两项且additionalProperties: false。这意味着version缺失时校验直接失败配置中出现 schema 未定义的字段同样失败。校验顺序层面cli/planoai/config_generator.py 的validate_prompt_config会在渲染 Envoy 配置、转换 legacy 字段等一切处理之前先执行jsonschema.validate(config_yaml, config_schema_yaml)。校验失败时抛出带绝对路径定位的ValidationError随后 validate_and_render_schema 捕获异常并exit(1)——这正是planoai up在容器启动前立即失败的原因。因此version的缺失或不合法会让任何后续的 listeners、model_providers 配置都变得无意义。在排查planoai up启动报错时永远应该第一个检查 version 字段。正确与错误的 version 写法错误示例缺失或非法 version以下配置无法通过校验因为顶层缺少version字段# No version field — fails schema validation listeners: - type: model name: model_listener port: 12000 model_providers: - model: openai/gpt-4o access_key: $OPENAI_API_KEY运行planoai up时jsonschema 会报告version is a required property启动流程在容器创建之前即终止。正确示例显式声明受支持的版本version: v0.3.0 listeners: - type: model name: model_listener port: 12000 model_providers: - model: openai/gpt-4o access_key: $OPENAI_API_KEY default: true参数要点要点说明位置必须是顶层字段top level与listeners、model_providers平级类型字符串schema 中type: string并落入枚举值集合取值必须属于 schemaenum中声明的版本之一见下文“受支持版本列表”缺失后果planoai up立即以 schema 校验错误失败容器不会启动当前受支持的版本列表与选择建议config/plano_config_schema.yaml 中version属性的enum声明了当前全部受支持的版本version: type: string enum: - v0.1 - v0.1.0 - 0.1-beta - 0.2.0 - v0.3.0 - v0.4.0对比规则文档中列出的v0.1、v0.1.0、0.1-beta、v0.2.0、v0.3.0仓库内 schema 已额外收录v0.4.0。使用建议新项目一律使用v0.3.0规则文档的明确推荐它代表当前稳定、文档齐全的配置形态若需要使用顶层routing_preferences带models: [...]列表的偏好路由则必须声明v0.4.0及以上——见下文运行时门禁仅当你针对某个已部署的特定 Plano 镜像版本做兼容性对齐时才选用v0.1、0.1-beta等旧版本否则不要主动回退。版本不仅是“校验开关”v0.4.0 的运行时门禁从源码看version 字段不只是启动前的 schema 校验还会影响运行时的功能开关。在 crates/brightstaff/src/main.rs 中brightstaff 用parse_semver把版本字符串解析成(major, minor, patch)三元组容忍v前缀、缺失段按 0 处理随后在 init_app_state 中执行功能门禁// Validate that top-level routing_preferences requires v0.4.0. let config_version parse_semver(config.version); let is_v040_plus config_version (0, 4, 0); if !is_v040_plus config.routing_preferences.is_some() { return Err( top-level routing_preferences requires version v0.4.0 or above. \ Update the version field or remove routing_preferences. .into(), ); }这解释了为什么 schema 的routing_preferences定义中注明“v0.3.0 风格的 inline routing_preferences 由 config generator 自动迁移到顶层”也解释了 docs/routing-api.md 中为什么强调新配置要把routing_preferences声明在顶层并带显式models: [...]列表。换言之版本号与功能集是绑定的升级配置形态时必须同步升级 version。旧版配置的自动迁移config_generator 如何处理版本version字段还驱动着配置的自动迁移逻辑。cli/planoai/config_generator.py 的migrate_inline_routing_preferences展示了典型的版本迁移流程通过_version_tuple把当前 version 解析成数值元组剥离v前缀、按.切分、缺失位补 0见 config_generator.py若版本低于(0, 4, 0)自动将 version 提升为v0.4.0并把每个model_providers下内联的routing_preferences提升为顶层列表同名 preference 合并models保留用户已定义的顶层条目对v0.4.0及以上版本则直接透传视为规范形态。类似的自动修复还包括llm_providers自动转换为model_providers二者同时出现时报错见 config_generator.py以及 legacy 格式 listeners 的转换。这些迁移全部发生在 schema 校验通过之后、渲染 Envoy 配置之前保证渲染出的plano_config_rendered.yaml与运行时brightstaff的版本预期一致。启动前校验validate_plano_config.sh 与 CLI 调用链仓库提供了现成的配置校验入口 config/validate_plano_config.sh它会递归查找所有config.yaml与plano_config_full_reference.yaml通过uv run --directory cli python -m planoai.config_generator无 uv 时回退到裸python执行与planoai up完全相同的校验渲染流程若校验失败收集文件并最终以非零退出码结束。bash config/validate_plano_config.sh该脚本通过环境变量PLANO_CONFIG_FILE、PLANO_CONFIG_SCHEMA_FILE、TEMPLATE_ROOT等注入文件路径见 validate_plano_config.sh与 CLI 在planoai up时通过 cli/planoai/native_runner.py 调用的validate_and_render_schema使用同一套逻辑因此本地校验结果可以直接代表启动时行为。此外CLI 还有独立的版本管理模块 cli/planoai/versioning.pyget_version()读取已安装的planoai包版本PyPI 元数据优先回退本地开发版本check_version_status()与 PyPI 最新版本比较并给出更新提示。注意这里比较的是CLI 工具自身的发布版本而config.yaml里的version字段描述的是配置 schema 版本两者是不同维度的概念排查问题时应区分开。排查清单version 相关启动失败速查结合 skills/plano-config-fundamentals/SKILL.md 的执行清单当遇到 “Why doesplanoai upfail schema validation?” 时按顺序检查version 是否存在顶层必须有version缺失即失败version 是否在枚举内对照 config/plano_config_schema.yamlv0.3.0是当前推荐值version 与功能集是否匹配使用顶层routing_preferences必须声明v0.4.0否则 brightstaff 启动时报错是否混用新旧字段llm_providers与model_providers不得同时出现inline routing_preferences 应迁移为顶层列表本地预检运行bash config/validate_plano_config.sh或在修改配置后重新执行planoai up让错误信息jsonschema 会输出Location与Value直接定位到出错的字段路径。在真实 Demo 配置中验证版本声明仓库中的示例配置全部遵循“顶层显式 version”的规范可作为写配置时的对照模板。例如 demos/getting_started/llm_gateway/config.yaml、demos/getting_started/weather_forecast/config.yaml、demos/filter_chains/mcp_filter/config.yaml、demos/agent_orchestration/travel_agents/config.yaml 等均以version: v0.3.0开头demos/advanced/model_choice_test_harness/plano_config_with_aliases.yaml 则演示了带model_aliases的完整配置。写新配置时直接复制这些文件的结构把 version 放在文件首行即可规避绝大多数启动期错误。小结version字段是 Plano 配置体系的“第一道门”它既是 schema 的必填项缺失即拒又是运行时功能门禁的依据v0.4.0 才允许顶层 routing_preferences还驱动 CLI 的自动迁移旧版 inline 配置自动升级。实践中的黄金法则是新项目固定version: v0.3.0使用顶层 routing_preferences 时升级到v0.4.0任何配置改动后先用config/validate_plano_config.sh预检再启动这样可以确保配置始终落在受支持、可预期的版本边界内。【免费下载链接】planoPlano is an AI-native proxy server and data plane for agentic apps. Smart LLM routing, observability, agent orchestration, and guardrails so you stay focused on your agents core logic.项目地址: https://gitcode.com/GitHub_Trending/ar/plano创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进