报错是这么冒出来的。用 gpt-4o 做企业内部工具调用,函数名按部门前缀拼到了 71 个字符,接口回 400,原文是 Invalid 'tools[0].function.name': string too long,把名字截短就能通,可截短后几个工具又重名了。
中间走过弯路,把「中文说明被塞进 name 而不是 description」当成主因,改完现象没变。
把日志和配置对完,能解释这个现象的基本就这几处。函数名上限是 64 字符。另一种情况是前缀拼了环境名和版本号 长度不可控。
不容易想到的是,代码生成时把命名空间整段带进了函数名。
量一遍所有工具名的长度
python -c "import json;ts=json.load(open('tools.json'));print([(len(t['function']['name']),t['function']['name']) for t in ts])"
然后用哈希后缀替代长前缀
python shorten_tools.py --max 64 --hash-len 4 --in tools.json
接着把环境信息挪到 description 里
python -c "import json;t=json.load(open('tools.json'))[0];print(t['function']['description'][:80])"
等前面都确认过,再重新发一次工具调用冒烟
curl https://api.openai.com/v1/chat/completions -H "Authorization: Bearer $OPENAI_API_KEY" -H "Content-Type: application/json" -d @smoke.json
怎么算真的好了,看的是同一批现象。工具定义通过校验,模型能正确选中截短后的函数名,返回的 name 与注册表一一对应。
同名截断会造成路由错乱,加短哈希比简单截断安全,映射表要跟着工具定义一起版本化。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
