You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 14:15:26