Agent 工具超时处理:截止、取消与用户可见降级
超时策略是产品体验,也是正确性。 工具调用卡住时,Agent 若只会「再试一次」,可能把支付、发信等副作用打成双份。
分层设置
| 层 | 建议 |
|---|---|
| 单次工具 HTTP | 明确 timeout + 可取消 |
| Agent 步级 | 单步墙钟上限 |
| 整任务 | 全局预算,到点总结已得结果 |
处理剧本
提示/策略片段
若工具在 {{N}}s 内未返回:
- 停止等待该调用
- 记录 tool_name、timeout、是否已知副作用
- 若只读:可按退避重试至多 {{K}} 次
- 若写操作:改为 status_check 工具,禁止重复 submit
- 向用户输出降级说明,不要假装成功
与结果截断
超时和「返回过长被截断」不同,后者见 工具结果截断。
可观测性
每次超时打点:工具名、耗时、是否重试、是否走了状态查询。仪表盘上看「超时后仍报告成功」的比例——这是严重事故信号。向用户的降级文案要预置,避免模型即兴道歉却暗示任务已完成。
取消语义:若底层支持 abort,就暴露给 Agent;不支持则至少不要叠加新的写调用。全局预算到点时,输出「已完成步骤摘要 + 未完成步骤」,便于人接盘。与截断、重试、幂等三篇文章一起,构成工具可靠性最小集。
用户可见文案原则
说明卡在哪一类工具(搜索 / 下单 / 发送),给出已确认的部分结果,提供「重试 / 转人工 / 稍后再说」。不要用幽默掩盖是否成功。内部则保留完整堆栈与工具链路 ID。
压测时注入故意超时,看 Agent 是否双写。超时预算应随工具类型配置,而不是全局一个魔法数。与重试、幂等、截断策略一起写进 Agent 运行手册。
配置表示意
只读搜索 8s、生成类 60s、支付类 15s 且禁用盲重试——具体数字按你们 SLA 压测得出,本文不给保证值。把配置放服务端,不放提示词里让模型改。超时演练纳入发布检查单。 超时不是边缘情况,而是默认会发生的情况。把它设计进主路径,Agent 才像可靠同事。重试、幂等、降级文案三件套齐备再上线。示意秒数必须经压测替换;支付与发送类工具禁止盲重试。把演练记录留下,便于事故复盘时对照当时配置。
对用户说「系统忙」不如说「正在等待××工具,已超过×秒,已为你保存草稿」。具体工具名可映射成产品语言。示意文案需产品审定。