统一错误协议(error-as-data) 安全与工程
别名:
error-as-data
把工具失败当成数据而不是崩溃:工具抛错 → 捕获 → 格式化成字符串 → 作为 `tool_result` 回填给模型 → 模型读到自己失败的原因,自己纠正重试。错误字符串必须带「工具名 + 非法值 + 期望」,模型才有纠正的抓手;循环本身从不因一个工具而中断。
它是什么
统一错误协议(error-as-data)把工具失败当成数据而不是崩溃:工具抛错 → 捕获 → 格式化成字符串 → 作为 tool_result 回填给模型 → 模型读到自己失败的原因,自己纠正重试。错误不跳出数据通道,而是顺着数据通道流回给发起点——循环本身从不因一个工具而中断,用户也永远看不到「Agent 挂了」。
错误字符串怎么写
错误消息的写法决定模型能不能纠正。Error: add() expects numeric a, got "abc" 之所以有效,是因为它包含三样东西:工具名(add)、非法值(got "abc")、期望(expects numeric a)。反过来 Error: failed 让模型无从下手;把整个堆栈丢进去则既烧 token 又对模型没用——错误字符串是给模型看的,不是给调试器看的,内部路径、环境变量这类信息更不该暴露(模型的话会原样进日志)。
走同一条路的失败
错误协议一旦建立,所有失败都走同一条路:工具抛错、工具不存在、甚至模型吐出的 arguments 是非法 JSON——统统捕获、格式化、回填,让模型重新生成参数。加上超时(Promise.race)与工具结果截断,就是工具层健壮性的完整闭环(第 08 章)。