如何在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
相关产品推荐
相关产品推荐

