LangChain Agent中为Tool函数添加ZapierNLA的action_id参数问题
解决Tool类传递action_id参数的ValidationError问题
问题原因
虽然Tool类定义里写了**kwargs: Any,但它底层的Pydantic模型实际设置了extra='forbid',不允许传入未定义的额外字段,所以直接传action_id会触发验证错误。
解决方法
核心思路是把action_id预先绑定到ZapierNLAWrapper.run方法上,让Tool的func调用时自动带上这个参数,不需要给Tool实例传额外字段。
方法1:使用functools.partial包装方法
from functools import partial from langchain.tools import Tool from langchain.utilities.zapier import ZapierNLAWrapper # 实例化一次ZapierNLAWrapper,避免重复创建 zapier_wrapper = ZapierNLAWrapper() # 创建Tool时用partial固定action_id tool = Tool( name=item['name'], func=partial(zapier_wrapper.run, id=item['action_id']), description=item['description'] )
方法2:用闭包定义包装函数
from langchain.tools import Tool from langchain.utilities.zapier import ZapierNLAWrapper def build_zapier_tool(item): wrapper = ZapierNLAWrapper() # 闭包自动捕获item['action_id'] def execute_tool(query): return wrapper.run(query=query, id=item['action_id']) return Tool( name=item['name'], func=execute_tool, description=item['description'] ) # 使用示例 tool = build_zapier_tool(item)
原理说明
两种方法都是把action_id提前注入到要执行的函数中,当Agent调用工具的func时,只需要传入query参数,函数内部会自动带上预设的action_id,完美避开Tool类的字段验证限制。
内容的提问来源于stack exchange,提问作者Talha
相关产品推荐
相关产品推荐

