把内部服务的方法名原样注册成工具,名字带上模块路径一共 78 个字符,请求返回 400,原文是 tools.0.function.name: string too long,缩短到 40 字符以内就正常。

一开始怀疑是「多个工具共用长前缀,整体都被判超长」,查了一圈,方向不对。

这类报错背后常见的原因有几处,逐个排除就行。函数名有长度上限,路径式命名容易超。也可能是名字里带了点号或斜杠,不符合字符集要求。

还有一种情况,SDK 不做本地校验,问题拖到请求时才暴露。

第一件事是把所有工具名长度打出来排一遍

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

接着用短名加映射表替换长名

python rename_tools.py --map tools_map.json --out tools_short.json

校验字符集只允许字母数字下划线和短横线

python -c "import re,json;print([t['function']['name'] for t in json.load(open('tools_short.json')) if not re.fullmatch(r'[a-zA-Z0-9_-]{1,64}',t['function']['name'])])"

发一次最小请求确认注册通过

python describe_tools.py --file tools_short.json

别只看报错消失,验证要多做一步。所有工具名都在 64 字符以内且只含合法字符,注册请求返回 200,模型能正确选中目标工具。

这里还有个坑。工具名对模型来说就是标识符,短而语义清楚的名字反而更容易被选对,映射关系放在客户端维护即可。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189