作用:确保工具执行失败时不会导致整个 agent 运行中断
ToolErrorHandlingMiddleware 拦截所有工具调用(wrap_tool_call / awrap_tool_call),用 try-except 包裹:
def wrap_tool_call(
self,
request: ToolCallRequest,
handler: Callable[[ToolCallRequest], ToolMessage | Command],
) -> ToolMessage | Command:
try:
return handler(request)
except GraphBubbleUp:
# Preserve LangGraph control-flow signals (interrupt/pause/resume).
raise
except Exception as exc:
logger.exception("Tool execution failed (sync): name=%s id=%s", request.tool_call.get("name"), request.tool_call.get("id"))
return self._build_error_message(request, exc)
正常执行 → 返回工具结果
GraphBubbleUp → 放行,这是 LangGraph 的内部控制信号
其他异常 → 构造一个带 status=”error” 的 ToolMessage 返回给 LLM
_build_error_message 构造一个错误 ToolMessage,将工具异常转换为结构化响应