API 与错误码
工具的参数 schema 被拒(Invalid schema for function)
调用带工具或 MCP 的客户端时报 400 Invalid schema for function?原因是函数参数 schema 的顶层必须是纯 object,不能用 oneOf、anyOf 等组合关键字。本页给出定位方法和修改示例。
如果你用的客户端会自动挂上工具(尤其是接了 MCP 的那类),可能会看到这样一条 400:
Invalid schema for function 'mcp__example__do_something':
schema must have type 'object' and not have 'oneOf'/'anyOf'/'allOf'/'enum'/'const'/'not'
at the top level.
param: tools[14].function.parameters
这不是你的账号、也不是我们的限制
它来自模型厂商的 API 规范:OpenAI、Anthropic、Google 三家都要求
函数(工具)的 parameters 顶层是一个纯 object,不能是
oneOf / anyOf / allOf / enum / const / not 这些组合关键字。
实测过:同一个请求,只把那个工具的顶层换成纯 object,三家全部通过。
所以拒绝的是那个 schema 的形状,与你的密钥、余额、我们的链路都无关。
怎么修
改那个工具的 schema —— 把组合关键字挪进属性里,顶层留一个 object:
// 被拒
{ "anyOf": [ {"type": "object", "properties": {"a": {"type": "string"}}},
{"type": "object", "properties": {"b": {"type": "number"}}} ] }
// 可用
{ "type": "object",
"properties": { "payload": { "anyOf": [ {"type": "string"}, {"type": "number"} ] } },
"required": ["payload"] }
组合关键字在属性内部是允许的,被禁的只有顶层。
报文里的 param: tools[N].function.parameters 直接告诉你是第几个工具
(从 0 数)。客户端如果一次挂了几十个工具,先按这个下标定位,别逐个看。
换个模型能绕过吗
能,但那是绕过,不是解法:并非所有上游都这么严。 不过那个 schema 仍然是坏的 —— 它会在你换回三家原厂模型的那天再次失败, 而那时你多半已经忘了这件事。优先改 schema。
如果你确实只是想先跑起来,可以在模型广场上换一个别家的模型试; 哪些能通会随在售清单变化,这里不列具体型号。
相关
错误码与限流的完整清单见「错误码与限流」;
带工具调用的请求走的仍然是 POST /v1/chat/completions,见「端点与鉴权」。