You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成支持YAML锚点与别名的配置文件Schema?

支持YAML锚点/别名的Schema定义与文档生成方案

YAML锚点与别名是解析器层面的特性,Schema(如JSON Schema)本身不直接校验语法,但可以通过类型模型库实现结构化校验,并通过扩展Schema元信息自动生成包含锚点用法说明的文档。以下是Python、TypeScript的具体实现方案:

Python 实现(基于Pydantic + pydantic-yaml)

1. 定义模型并支持校验

通过Pydantic定义数据结构,pydantic-yaml负责YAML的解析与序列化,自动处理锚点和合并键(<<)的解析逻辑:

from pydantic import BaseModel, Field
from pydantic_yaml import YamlModel

# 基础配置模型
class FooConfig(BaseModel):
    val: str = Field(description="配置值,可通过YAML锚点复用后覆盖")

# 全局配置模型,标注锚点用途
class GlobalConfig(BaseModel):
    foo: FooConfig = Field(
        description="全局默认Foo配置,可通过`&default_foo`定义锚点,用`*default_foo`别名复用"
    )

# 列表项模型
class ConfigItem(BaseModel):
    name: str
    config: FooConfig

# 根配置模型
class MyConfig(YamlModel):
    globals: GlobalConfig
    my_config: dict[str, list[ConfigItem]] = Field(
        ..., description="包含可复用/覆盖配置的项列表"
    )

    # 添加YAML锚点用法示例到Schema元信息
    class Config:
        schema_extra = {
            "examples": [
                {
                    "yaml_example": """
globals:
  foo: &default_foo
    val: bar

my_config:
   items:
     - name: item1
       config: *default_foo
     - name: item2
       config:
         <<: *default_foo
         val: override_bar
                    """.strip()
                }
            ]
        }

2. 生成带锚点说明的Schema文档

  • 生成JSON Schema:通过MyConfig.model_json_schema()获取包含示例和描述的Schema
  • 转换为Markdown文档:使用jsonschema2md工具将JSON Schema转换为可读性强的Markdown文档,其中会自动包含你定义的锚点用法示例

TypeScript 实现(基于Zod + zod-to-json-schema)

1. 定义模型并支持校验

用Zod定义类型约束,结合zod-yaml处理YAML解析,自动兼容锚点和合并键:

import { z } from "zod";
import { zodToJsonSchema } from "zod-to-json-schema";

// 基础配置模型
const FooConfig = z.object({
  val: z.string().describe("配置值,可通过YAML锚点复用后覆盖"),
});

// 全局配置模型,标注锚点用途
const GlobalConfig = z.object({
  foo: FooConfig.describe(
    "全局默认Foo配置,可通过`&default_foo`定义锚点,用`*default_foo`别名复用"
  ),
});

// 列表项模型
const ConfigItem = z.object({
  name: z.string(),
  config: FooConfig,
});

// 根配置模型
const MyConfig = z.object({
  globals: GlobalConfig,
  my_config: z.object({
    items: z.array(ConfigItem),
  }).describe("包含可复用/覆盖配置的项列表"),
}).describe("支持YAML锚点与别名的配置Schema,可复用全局配置并覆盖特定值");

// 生成带示例的JSON Schema
const jsonSchema = zodToJsonSchema(MyConfig, {
  name: "MyConfig",
  examples: [
    {
      yaml_example: `globals:
  foo: &default_foo
    val: bar

my_config:
   items:
     - name: item1
       config: *default_foo
     - name: item2
       config:
         <<: *default_foo
         val: override_bar`
    }
  ]
});

2. 生成带锚点说明的Schema文档

  • 使用jsonschema2md将生成的JSON Schema转换为Markdown文档,自动展示类型约束和锚点用法示例
  • 若需集成到API文档,可使用@anatine/zod-openapi将Zod模型转换为OpenAPI Schema,通过Swagger UI等工具展示

关键说明

  • YAML锚点/合并键的语法正确性由解析器保证(如Python的PyYAML、TypeScript的js-yaml),类型模型库仅校验解析后的最终数据结构是否符合约束
  • 文档生成的核心是在模型定义时添加锚点用法的描述和示例,让自动生成的Schema文档能清晰告知用户如何复用和覆盖配置

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 09:49:56