报错是这么冒出来的。给工具参数加下拉限制时写成 {‘type’:’string’,’enum’:’a,b’},请求返回 400,提示 enum 必须是数组,改成数组后模型才肯调用这个工具。

中间走过弯路,把「parameters 顶层缺少 type 与 properties」当成主因,改完现象没变。

真正麻烦的地方在于,几个原因的现象几乎一样。enum 的值必须是字符串数组,不能传逗号拼接的字符串。还有一种是required 里列了未定义的字段。

不容易想到的是,嵌套数组的 items 没写 type,整体被判不合法。

动手时先把 enum 改成标准 JSON 数组写法

params = {'type':'object','properties':{'level':{'type':'string','enum':['低','中','高']}},'required':['level']}

发送前用 jsonschema 校验一遍

python -c "import jsonschema;jsonschema.validate({'level':'低'},params);print('ok')"

接着用 curl 确认服务端接受的完整 schema

curl https://api.openai.com/v1/chat/completions -H "Authorization: Bearer $KEY" -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"hi"}],"tools":[{"type":"function","function":{"name":"set_level","parameters":{"type":"object","properties":{"level":{"type":"string","enum":["low","high"]}}}}}]}'

末了记录模型实际给出的参数,观察是否越界

print(tc.function.arguments)

别只看报错消失,验证要多做一步。请求返回 200,模型调用工具时 level 参数只落在枚举值里,不再被服务端拒绝,工具调用成功率明显提升。

提醒一点。enum 只是约束模型输出,不是强校验,模型仍可能给出近似词,落库前要自己再做一次白名单过滤。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189