Invalid JSON payload received. Unknown name "propertyNames" at 'tools[0].functio...
错误信息
AI 解决方案
好的,用户提供了一个API调用报错信息。这是典型的JSON格式验证错误,用户需要我按照既定流程进行分析。
首先看错误信息,多个位置都提到"Unknown name"和"Cannot find field",核心问题是JSON结构中包含了服务端不认识的字段名。
接下来开始分析。第一步是错误翻译,需要提取每个错误的核心部分。从信息看有两类主要问题:"propertyNames"和"const"字段不被识别,这些字段出现在function_declarations的不同位置。翻译时要把原文和译文放在同一个代码块里。
然后进行原因分析。根据经验,这种错误通常是因为客户端发送的JSON结构与服务端API定义不匹配。具体来看,"propertyNames"和"const"看起来像是JSON Schema的扩展属性,但API的schema定义可能不支持这些字段。
用户提供的错误信息显示问题分布在多个function_declaration中,说明这不是个别参数的问题,而是整体schema定义的兼容性问题。
现在考虑解决方案。最直接的方法是移除那些不支持的字段。对于"propertyNames",它通常用于JSON Schema的模式验证,但很多简单的API schema不支持。对于"const",它也是JSON Schema的验证关键字,可能同样不被支持。
需要检查每个function_declaration的parameters定义,把"propertyNames"和"const"字段都去掉。不过错误信息中的路径用*代替了部分内容,实际排查时需要根据完整的路径来定位。
最后是预防措施。应该建议用户在使用API前仔细查阅文档,特别是schema定义部分。可以推荐使用OpenAPI/Swagger规范来确保兼容性,也可以在发送请求前用JSON验证工具检查格式。
整个思考过程要自然流畅,从识别问题到分析原因,再到给出具体解决方案和预防建议,确保逻辑连贯。
🔍 错误分析
#### 1. 🌐 错误翻译
原文:Invalid JSON payload received. Unknown name "propertyNames" at 'tools[0].function_declarations[1].***.properties[0].value': Cannot find field. Invalid JSON payload received. Unknown name "const" at 'tools[0].function_declarations[11].***.properties[6].value.any_of[1]': Cannot find field.
译文:收到的JSON载荷无效。在‘tools[0].function_declarations[1].***.properties[0].value’处发现未知名称“propertyNames”:找不到该字段。收到的JSON载荷无效。在‘tools[0].function_declarations[11].***.properties[6].value.any_of[1]’处发现未知名称“const”:找不到该字段。
#### 2. 🎯 原因分析
根本原因是你发送给API(很可能是类似OpenAI或Google Gemini的函数调用功能)的JSON请求体结构不符合其服务端定义的Schema。具体来说:
"propertyNames" 不被识别:这个字段是JSON Schema规范的一部分,用于限制对象属性名称的模式。但目标API的参数Schema定义不支持或不需要这个字段,服务端无法在对应位置找到它。"const" 不被识别:"const" 也是JSON Schema的一个关键字,用于指定某个字段必须等于的特定值。同样,API的参数Schema未包含此字段定义。错误发生在你的 tools 数组中 function_declarations 的 parameters 定义里。你提交的参数描述结构比API实际支持的结构更“丰富”或更“严格”,导致服务端在解析时遇到未知字段。
#### 3. 💡 解决方案
你需要从每个出错的 function_declarations 的 parameters 定义中,移除API不支持的字段。请检查并修正你的代码:
// 修复前(示例,包含不支持的字段)
const tools = [
{
function_declarations: [
// ... 其他声明
{
name: "your_function",
description: "描述",
parameters: {
type: "object",
properties: {
some_param: {
type: "object",
properties: { /* ... */ },
propertyNames: { /* ... */ }, // ❌ 这个字段不被支持,需要移除
}
}
}
},
// ... 其他声明
{
name: "another_function",
description: "描述",
parameters: {
type: "object",
properties: {
config: {
type: "object",
properties: { /* ... */ },
any_of: [
{ /* ... */ },
{ const: "some_value" } // ❌ 这个字段不被支持,需要修改或移除
]
}
}
}
}
]
}
];
// 修复后(移除不支持的字段)
const tools = [
{
function_declarations: [
// ... 其他声明
{
name: "your_function",
description: "描述",
parameters: {
type: "object",
properties: {
some_param: {
type: "object",
properties: { /* ... */ }
// ✅ 已移除 `propertyNames` 字段
}
}
}
},
// ... 其他声明
{
name: "another_function",
description: "描述",
parameters: {
type: "object",
properties: {
config: {
type: "object",
properties: { /* ... */ }
// ✅ 方案1:移除整个 `any_of` 定义,改为简单的类型或枚举定义
// ✅ 方案2:如果 `any_of` 里的元素只是想说明是特定值,请使用 `enum` 字段代替:
// enum: ["some_value"]
}
}
}
}
]
}
];
具体操作步骤:
parameters 定义中,删除所有文档中未提及的字段,例如 propertyNames、const、if/then/else 等高级验证关键字。type, properties, required, enum, description 等最常见的字段。#### 4. 🛡️ 预防措施
openai 包、@google/generative-ai 包)来构建请求,它们通常会帮你处理或验证参数结构,减少手动构造错误。enum 列举可选值,而非复杂的条件约束。