现场是这样的。Agent 的外层工具 search_orders 带一个 filter 对象,模型把内层 filter.status 的值写到了外层 status 上,schema 校验通过但查询条件为空,返回零条。

中间走过弯路,把「服务端用宽松模式忽略了多余字段」当成主因,改完现象没变。

排查方向其实有限,先把可能性排一排。嵌套对象在 schema 里只写了 type 没写 properties;模型对同名层级的字段容易混淆;提示词里没有给出嵌套结构的示例。

上来先把嵌套结构写全并带上示例

python fix_schema.py --nested filter.status

服务端开启严格校验拒绝多余字段

python server.py --extra forbid

接着打印收到的参数逐层比对

python tool_dump.py --indent

剩下的就是用同名字段的请求验证拦截生效

python call_tool.py --payload nested.json

改之前先确认了最近有没有人动过配置,避免白查一遍。

恢复的判定其实很直接。层级写错时请求被明确拒绝并提示多余字段,层级正确时查询返回预期条数。

嵌套 schema 只写 type 等于没约束,模型会把字段拍平,严格模式加示例比反复改提示词有效。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189