先把当时的情况摆出来。langgraph 0.2.28,add_conditional_edges 的路由函数在 tool_calls 为空时没有返回值,执行到这里图直接结束,没有报错也没走到 END 节点。

原因不止一个,得分开看。路由函数某些分支漏了 return。另一种情况是返回的字符串与条件边映射表的键不一致。

还有一种情况,映射表里没有 default 分支。另外,递归上限到了,图被静默终止。

给路由函数加兜底返回

python -c "def route(s): return s.get('next') or 'end';print(route({}))"

映射表里补上 end

python -c "print({'tools':'tools','end':'__end__'})"

再往下打开递归上限跑一次

python -c "from app.graph import build;print(build().invoke({'q':'hi'},{'recursion_limit':25}))"

末了在路由函数里打日志确认走向

python -c "print('route ->', 'end')"

这类改动我都写进变更记录,过两周再出问题时能对上号。

我习惯把每一步的执行时间和结果记在一边,后面复盘省事。

别只看报错消失,验证要多做一步。空工具调用时走到 END,日志里能看到 route 为 end,图不再中途消失。

提醒一点。条件边返回 None 不会报错,只当成没有后续节点,排查时先打印每次路由的返回值。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189