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

如何在LangChain自定义Tool中添加新属性并解决报错

解决Langchain自定义Tool添加额外属性的ValueError问题

问题原因

Langchain的BaseTool继承自Pydantic的BaseModel,会严格校验类的字段。直接在__init__中添加未声明的属性(比如number)会触发Pydantic的字段校验,导致抛出ValueError——因为模型不知道这个额外字段的存在。

解决方案

方案1:直接声明Pydantic字段(推荐)

在类级别声明number字段并设置默认值,无需自定义__init__方法,Pydantic会自动处理初始化:

from langchain.tools import BaseTool

class MyTool(BaseTool):
    name = "Whatever"
    description = "Whatever"
    # 声明number字段,指定类型和默认值
    number: int = 123
    
    def _run(self):
        pass
    
    def _arun(self):
        pass


tool = MyTool()
print(tool.number)  # 输出 123

方案2:自定义__init__方法(需调用父类构造)

如果必须自定义__init__,需要先在类级别声明number字段,再调用父类的__init__方法,避免校验失败:

from langchain.tools import BaseTool

class MyTool(BaseTool):
    name = "Whatever"
    description = "Whatever"
    number: int
    
    def __init__(self):
        # 先调用父类构造方法完成基础初始化
        super().__init__()
        self.number = 123
    
    def _run(self):
        pass
    
    def _arun(self):
        pass


tool = MyTool()

方案3:支持自定义属性值

如果需要在实例化时传入自定义的number值,可以结合Pydantic的字段声明和带参数的__init__:

from langchain.tools import BaseTool

class MyTool(BaseTool):
    name = "Whatever"
    description = "Whatever"
    number: int
    
    def __init__(self, number: int = 123, **kwargs):
        # 传递父类需要的参数
        super().__init__(**kwargs)
        self.number = number
    
    def _run(self):
        pass
    
    def _arun(self):
        pass


# 使用默认值
tool1 = MyTool()
# 自定义值
tool2 = MyTool(number=456)

内容的提问来源于stack exchange,提问作者gosia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 21:46:07