mirror of
https://github.com/deepseek-ai/deepseek-harness.git
synced 2026-08-29 04:26:38 +00:00
2.3 KiB
2.3 KiB
Agent Note: 模型边界处的运行时参数校验
Status: implemented
English | 中文
问题
defineTool(统一 schema DSL)为工具作者的 execute(args) 提供了经 InferArgs<S> 映射的类型化参数。但该类型只是对运行时值的编译期声明,而这个值实际上是模型生成的 JSON:没有任何机制强制模型遵守 schema,因此畸形调用(缺少必需键、声明为数字的位置传入字符串,或字面量超出声明的集合)会以「仅在名义上类型化」的状态到达 execute。工具函数体随后要么在错误形状上崩溃,要么静默地行为异常。
决策
validateArgs(spec, args): string[] 编译 ParameterSchemaSpec,并委托共享的 validateJsonSchemaValue() 遍历器,对格式正确的声明返回可读的违规列表。defineTool 在定义时对编译后的参数 schema 创建快照,并在调用类型化函数体之前执行校验;存在违规时会抛出 ToolArgsError(INVALID_ARGS),注册表将其作为模型可据以修正的错误结果返回。
校验器与编译器因此共享完全一致的语义:隐式参数根是开放对象;必需键仅来自 required: true;默认值仍是注解;显式嵌套对象遵循其声明的开放性;数组通过 items 递归;标量字面量约束保证类型正确;oneOf 仅在恰好一个分支匹配时才接受。直接注册的工具自行负责输入校验。
后果
- 模型在自身畸形调用上获得可操作的反馈,而非不透明的崩溃,弥合了
InferArgs的承诺与运行时现实之间的鸿沟。 - 校验器与
InferArgs必须保持一致;一项属性测试生成满足 spec 的参数并断言它们通过validateArgs(同时断言定向破坏的参数被拒绝),以机械方式封堵漂移风险。 ToolArgsError目前是带code字段的普通Error;如果日后引入 harness 级别的错误分类体系,它将变为子类,但不影响读取.message的调用方。- 校验开销相对于一次模型调用可忽略不计。