先把当时的情况摆出来。用 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
别只看报错消失,验证要多做一步。两个快工具的结果正常返回,慢工具被标记为超时,整轮对话仍能给出部分答案。
这里还有个坑。并行调用里最慢的那个决定整批耗时,把慢工具拆出去单独异步补,比整体加超时划算。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
