现场是这样的。在 OpenAI 的 tools 里注册了一个名为 web_search 的函数,调用时接口返回 400,原文是 tools[0].function.name is reserved,改名之后立刻正常。

中间走过弯路,把「名字超过长度上限被截断」当成主因,改完现象没变。

真正麻烦的地方在于,几个原因的现象几乎一样。这个名字与内置工具重名;名字里带连字符或点号不符合命名规则;与另一个工具的别名冲突。

先按命名规则先自查一遍

python -c "import re;print(bool(re.fullmatch(r'[a-zA-Z0-9_-]{1,64}','web_search')))"

随后改成带业务前缀的名字

python rename_tool.py --name search_orders_v2

全量检查已注册工具名重复

python -c "import json;print([t['function']['name'] for t in json.load(open('tools.json'))])"

末了重新请求确认 400 消失

python call_tool.py --tool search_orders_v2

这类改动我都写进变更记录,过两周再出问题时能对上号。

我习惯把每一步的执行时间和结果记在一边,后面复盘省事。

别只看报错消失,验证要多做一步。请求返回 200 并正确产生 tool_calls,工具名与本地注册表一致,不再出现 reserved 提示。

提醒一点。各家都有保留工具名,起名时统一加业务前缀,比事后逐个排查冲突省事。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189