事情本身不复杂,线索都在日志里。自建 MCP 工具查询订单,查不到时按协议返回 isError 为 true 和一段错误文本,模型却把这段文本当成正常结果继续总结,最后给用户编了一个订单状态,链路日志里工具调用显示是成功的。
第一反应是「Agent 循环没检查工具结果状态,直接进入下一轮」,验证下来不成立。
真正麻烦的地方在于,几个原因的现象几乎一样。客户端把 isError 丢掉,只把 content 文本塞回模型。少数情况下是错误文本写得像结果,模型无法从措辞上区分。
少数情况下是工具内部捕获异常后返回 200 文本,协议层看不到错误。
第一件事是打印客户端收到的原始工具结果
python -c "import json;print(json.load(open('tool_result.json'))['isError'])"
再往下在提示里显式标注失败并给出停止指令
python prompt_patch.py --add-rule 'isError 为真时不要总结 直接告知失败'
Agent 侧加一次状态判断再继续
python agent_loop.py --stop-on-tool-error
等前面都确认过,再用查不到的订单号做一次端到端回归
python e2e.py --order-id NOT_EXIST --expect refusal
改完先别撤,确认这几项。工具失败的场景下回答是明确的失败提示,不再出现编造的订单状态,该轮在日志里标记为 error。
协议层有错误标记不代表模型能看到,中间任何一层丢字段都会让失败变成成功。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
