这个坑值得记一笔。langgraph 0.2 的 ToolNode 里工具函数抛 requests.Timeout,整张图直接抛异常退出,checkpointer 里状态停在 tools 节点,用户侧看到 500。

刚开始盯着「没有配置错误兜底边」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。ToolNode 默认不捕获工具异常;工具没有设置超时,等到连接层报错;图级没有重试策略。

第一件事是打开 handle_tool_errors 让异常回到模型

python -c "from langgraph.prebuilt import ToolNode;print(ToolNode([f],handle_tool_errors=True))"

给工具调用加超时并抛明确的业务异常

python -c "import requests;print(requests.get('https://example.com',timeout=5).status_code)"

随后在图里加一条指向模型的条件边

python -c "print({'edge':'tools -> agent','condition':'on_error'})"

末了用一次超时注入跑回归,确认图能继续

python graph_regression.py --inject timeout --case tool_error

当时还开着另一个排查窗口,两边日志对照着看才定位到。

别只看报错消失,验证要多做一步。注入超时后图回到 agent 节点并给出兜底回复,checkpointer 里的状态是完整的一轮。

容易忽略的是,工具是外部依赖,异常要当成正常分支处理,让模型看到错误文本往往比直接 500 更有用。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189