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

无需全局变量:将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 09:00:21