如何在LangChain中捕获并处理StructuredTool的Pydantic ValidationError?
处理LangChain StructuredTool的Pydantic ValidationError
核心解决方案:自定义StructuredTool子类,拦截参数验证错误
LangChain的StructuredTool在执行前会通过_parse_input方法做参数验证,这里抛出的ValidationError不会触发handle_tool_error(因为它是工具执行前抛出的)。你可以通过继承StructuredTool并重写_parse_input方法,直接捕获验证错误,执行自定义处理逻辑后返回友好提示,避免Agent终止。
代码实现
from langchain.tools import StructuredTool from pydantic import ValidationError, BaseModel, Field import logging # 配置自定义日志(根据你的需求调整) logger = logging.getLogger("tool_validation") logger.setLevel(logging.ERROR) logger.addHandler(logging.FileHandler("tool_validation_errors.log")) class ValidationSafeStructuredTool(StructuredTool): def __init__(self, validation_error_handler=None, **kwargs): super().__init__(**kwargs) # 允许传入自定义错误处理函数,默认用内置逻辑 self.error_handler = validation_error_handler or self._default_handler def _default_handler(self, error: ValidationError) -> str: # 默认处理:记录日志+返回通用提示 logger.error(f"参数验证失败: {str(error)}") return "参数格式不符合要求,请检查后重试" def _parse_input(self, tool_input: dict) -> dict: try: # 调用父类的参数验证逻辑 return super()._parse_input(tool_input) except ValidationError as e: # 捕获错误,调用处理函数,返回带错误标记的字典 error_msg = self.error_handler(e) return {"__validation_error__": error_msg} def _run(self, **kwargs): # 检查是否有验证错误标记,有则直接返回错误信息 if "__validation_error__" in kwargs: return kwargs["__validation_error__"] # 无错误则执行原工具逻辑 return super()._run(**kwargs) # ------------------------------ # 示例:定义你的工具和Schema # ------------------------------ def example_tool(required_str: str, required_int: int) -> str: return f"处理结果:{required_str} - {required_int}" class ExampleToolArgs(BaseModel): required_str: str = Field(description="必填字符串参数") required_int: int = Field(description="必填整数参数") # 自定义错误处理函数(可选) def custom_error_handler(error: ValidationError) -> str: # 提取具体错误信息,生成更友好的提示 missing_fields = [err["loc"][0] for err in error.errors() if err["type"] == "value_error.missing"] if missing_fields: msg = f"缺少必填参数:{', '.join(missing_fields)},请补充后重试" else: msg = f"参数格式错误:{str(error)}" logger.error(f"工具验证错误详情: {str(error)}") return msg # 创建带错误处理的工具 safe_tool = ValidationSafeStructuredTool.from_function( func=example_tool, args_schema=ExampleToolArgs, validation_error_handler=custom_error_handler, name="ExampleTool", description="示例结构化工具" ) # 测试:传入不完整参数 result = safe_tool.run({"required_str": "test"}) print(result) # 输出:缺少必填参数:required_int,请补充后重试
方案优势
- 完全保留
args_schema的准确性,所有参数仍设为必填,不需要做妥协 - 自动捕获所有类型的
ValidationError(缺失字段、类型不匹配、格式错误等),不用提前预判所有失败场景 - 错误处理逻辑完全自定义,可灵活实现日志记录、错误提示优化、甚至自动补全参数等恢复逻辑
- Agent会收到错误提示字符串,不会因为未捕获的异常终止,能继续执行后续流程
替代思路
如果不想自定义工具类,也可以在Agent的运行循环中全局捕获ValidationError,但这种方式需要修改Agent的执行逻辑,不如自定义工具类灵活,而且容易遗漏其他场景的错误。
内容的提问来源于stack exchange,提问作者istrupin
相关产品推荐
相关产品推荐

