无需全局变量:将Flask路由的userinfo传入外部GetIncidentsByUserTool
解决Flask路由中传递userinfo到LangChain工具的方案
方案一:正确实现带userinfo参数的自定义工具类
LangChain的BaseTool子类需要正确初始化父类并声明必要属性,之前报错大概率是因为__init__方法未调用父类初始化逻辑。以下是完整实现:
from langchain.tools import BaseTool from langchain_core.tools import ToolException class GetIncidentsByUserTool(BaseTool): name = "get_incidents_by_user" description = "根据当前用户信息查询其关联的事件记录" userinfo: dict # 声明存储用户信息的属性 def __init__(self, userinfo: dict, **kwargs): super().__init__(**kwargs) # 必须调用父类初始化,确保工具核心属性生效 self.userinfo = userinfo def _run(self, query: str) -> str: # 在这里直接使用self.userinfo处理业务逻辑 user_id = self.userinfo.get("user_id") # 替换为实际的事件查询逻辑 return f"用户ID {user_id}的事件列表:服务器告警、工单申请" async def _arun(self, query: str) -> str: # 若无需异步支持,直接抛出异常即可 raise ToolException("该工具暂不支持异步调用")
在Flask的/chat路由中,直接实例化工具并传入userinfo:
from flask import Flask, request app = Flask(__name__) @app.route("/chat", methods=["POST"]) def chat(): # 从请求中获取userinfo(根据实际场景调整,比如从token解析、请求体获取) userinfo = request.json.get("userinfo", {}) # 实例化工具时传入userinfo incident_tool = GetIncidentsByUserTool(userinfo=userinfo) # 后续将工具加入Agent或直接调用 # 示例:agent = initialize_agent([incident_tool], llm, agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION) # response = agent.run("帮我查我的事件记录") return {"status": "success", "data": "处理完成"}
方案二:使用functools.partial绑定userinfo参数
如果不想修改原有工具类,可通过partial函数将userinfo绑定到工具函数上,再创建LangChain的Tool实例:
from langchain.tools import Tool from functools import partial # 定义核心业务函数 def get_incidents_by_user(userinfo: dict, query: str) -> str: user_id = userinfo.get("user_id") return f"用户ID {user_id}的事件列表:服务器告警、工单申请" @app.route("/chat", methods=["POST"]) def chat(): userinfo = request.json.get("userinfo", {}) # 用partial绑定userinfo作为第一个参数 bound_func = partial(get_incidents_by_user, userinfo) # 创建Tool实例 incident_tool = Tool( name="get_incidents_by_user", description="根据当前用户信息查询其关联的事件记录", func=bound_func ) # 后续使用工具逻辑同上 return {"status": "success", "data": "处理完成"}
常见报错原因排查
- 未调用父类
__init__:自定义工具类时,必须通过super().__init__(**kwargs)初始化父类,否则name、description等核心属性无法被LangChain识别。 - 未实现
_run方法:BaseTool子类必须同步实现_run方法,异步场景需实现_arun。 - 直接传递工具类而非实例:如果在Agent初始化时传入的是
GetIncidentsByUserTool类而非实例,会导致无法传入userinfo参数。
内容的提问来源于stack exchange,提问作者MANASA
相关产品推荐
相关产品推荐

