先把当时的情况摆出来。定义工具 get_weather,模型返回的 function.name 是 get-weather,本地注册表按原名查找抛 KeyError,十次里有两次是这种改写。

排查方向其实有限,先把可能性排一排。模型对下划线做了短横线归一。少数情况下是工具名大小写混杂 模型自行改写。

另外,注册表用精确匹配 没有归一化。少数情况下是同名工具在多次部署里版本不同。

上来先把模型返回的原始 name 统计出来

grep -o '"name":"[^"]*"' resp.json | sort | uniq -c

然后查找前统一小写并替换短横线

python -c "print('get-weather'.lower().replace('-','_'))"

工具名改成简短全小写单词

python rename_tools.py --map tools.json --style snake

等前面都确认过,再找不到时返回可用工具列表让模型重选

python tool_router.py --on-miss list

命令输出我都留了记录,免得改完记不清原来的值。

恢复的判定其实很直接。连续两百次调用 name 全部命中注册表,KeyError 归零,改名的样本也能被归一命中。

这里还有个坑。工具名越简单越稳,长名字加下划线加版本后缀最容易在模型侧被改写。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189