先把当时的情况摆出来。用 asyncio.gather 并发执行三个工具,其中一个查物流的接口要 40 秒,整体设了 15 秒超时,结果另外两个已经成功的查询也被取消,Agent 收到异常后整轮失败。

这类报错背后常见的原因有几处,逐个排除就行。gather 默认一个任务抛错就向外传播。也可能是超时加在整批而不是单个工具上。

少数情况下是成功的返回值没先落盘 被取消后丢失。不容易想到的是,工具内部没有自己的超时。

上来先改成收集异常而不是直接抛出

python -c "import asyncio;print(asyncio.gather.__doc__.strip().splitlines()[0])"

给每个工具单独设超时

python run_tools.py --timeout 12 --per-tool

成功的先写结果文件 失败的单独标记

python merge_tools.py --out tools.jsonl

单独测慢接口的耗时

curl -m 12 -s -o /dev/null -w '%{time_total} seconds' https://api.example.com/logistics/1

别只看报错消失,验证要多做一步。两个快工具的结果正常返回,慢工具被标记为超时,整轮对话仍能给出部分答案。

这里还有个坑。并行调用里最慢的那个决定整批耗时,把慢工具拆出去单独异步补,比整体加超时划算。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189