schema 生成 协议

别名: schema 从 spec 生成

从一份声明式 spec 生成 JSON Schema,而不是手抄,从根上消除「schema 与实现互相漂移」。TS 的运行时没有类型(编译后被擦除),所以用一份运行时可见的参数声明(`name` / `type` / `description` / `required`)作为唯一契约来源,注册时由一个小生成器算出 schema。

它是什么

schema 生成是指从一份声明式 spec 算出 JSON Schema,而不是手抄,从根上消除「schema 与实现互相漂移」:第 06 章手写 tools 数组时,参数的真实定义写在实现里、schema 描述手抄在数组里——同一份契约有两份拷贝,改一处忘一处,模型按旧契约调用、线上偶发炸。这种 bug 不在测试里出现(测试只覆盖你记得更新的路径),是工具系统里最阴险的一类故障。

为什么 TS 要绕路

Python 生态能直接读函数类型注解和 docstring 生成 schema(如 smolagents@tool),因为 Python 的类型是运行时对象;TS 的类型在编译后被擦除,运行时拿不到。引入类型编译器或运行时类型库(zod/typebox)代价又高,所以本章用一份运行时可见的参数声明(name / type / description / required)作为唯一契约来源,注册时由十行小生成器算出 schema:

function generateSchemaFromSpec(spec) {
  const properties = {};
  const required = [];
  for (const p of spec.parameters) {
    properties[p.name] = { type: p.type, description: p.description };
    if (p.required !== false) required.push(p.name);
  }
  return { type: 'object', properties, required };
}

小结

spec 写一次,schema 是算出来的,不存在「忘改」这个操作——漂移问题从根上消失。等工具系统复杂到需要嵌套对象、联合类型、跨工具复用类型时,再评估 zod/typebox 也不迟(第 08 章)。

相关词条

出现在这些章节