最终版标准轨道
| 字段 | 值 |
|---|---|
| SEP | 1303 |
| 标题 | 输入验证错误作为工具执行错误 |
| 状态 | 最终版 |
| 类型 | 标准轨道 |
| 创建日期 | 2025-08-05 |
| 作者 | @fredericbarthelet |
| 赞助人 | 无 |
| PR | #1303 |
摘要
本 SEP 提议将工具输入验证错误视为工具执行错误,而不是协议错误。这一变更将使语言模型能够在其上下文窗口中接收验证错误反馈,允许它们自我纠正并成功完成任务而无需人工干预,显著提高任务完成率。动机
语言模型可以从工具输入验证错误消息中学习,并相应地重试带有修正参数的 tools/call,但前提是它们在其上下文窗口中接收到错误反馈。协议错误由 MCP 客户端在应用层捕获。只有工具执行错误才会作为 JSON-RPC 响应转发回模型。根据当前规范,模型无法看到这些错误消息,因此无法自我纠正,导致重复失败和糟糕的用户体验。问题陈述
考虑一个使用以下zod 验证架构验证出发日期的航班预订工具:
- 模型没有收到解释日期为何被拒绝的错误消息
- 模型多次重复同样的错误(例如,当用户只指定日和月或相对日期时,Cursor 通常一致地发送 2024 年的日期,并重复相同的 tools/call 请求 3 次,而没有获得任何关于工具调用为何失败的信息)
- 尽管模型在获得适当反馈的情况下能够自我纠正,但任务仍然失败
- 用户感到沮丧并且必须手动干预
本提案的好处
- 更高的任务完成率:模型无需人工干预即可自我纠正验证错误
- 更好的用户体验:减少失败并加快任务完成
- 利用模型能力:现代大语言模型擅长理解和响应错误消息
- 减少 API 调用:随着模型在第一个错误上自我纠正,重试尝试减少
规范
当前行为
工具错误规范 目前提供了模糊的指导:- “无效参数”应被视为协议错误
- “无效输入数据”应被视为工具执行错误
提议的变更
通过以下变更澄清规范:- 从 协议错误 中移除“无效参数”类别。
- 工具执行错误 应用于所有工具参数验证失败(将
无效参数和无效输入数据合并到新的输入验证错误类别下)
规范文本变更
更新错误处理部分以包括:实现
之前(协议错误)
之后(工具执行错误)
向后兼容性
此变更是向后兼容的,因为它:- 不改变协议结构
- 仅澄清现有的模糊行为
- 维持所有现有的错误类型和格式
- 在不破坏现有实现的情况下改进行为