苍山如海1202 2026-01-13 10:22 采纳率: 0%
浏览 3

langchain-chatchat_0.3.1.3自定义的agent工具无法显示

首先,我观察到项目自带的所有的工具都是放在libs\chatchat-server\chatchat\server\agent\tools_factory目录下。
其次,我先在该目录下创建了一个新的python文件:***.py。代码如下:

@regist_tool(title="柴油机参数获取")
def diesel_engine_status() -> BaseToolOutput:
    """
    Using a simulator to obtain real-time status parameters of diesel engines.
    获取船舶柴油发动机的实时运行参数和状态。
    """
    try:
        # 创建新的模拟器实例(避免状态问题)
        engine = MarineDieselEngine()
        current_data = engine.generate_data()
        current_alert = engine.get_current_alert()

        # 构建输出文本
        txt = "当前柴油机参数:\n"
        for k, v in current_data.items():
            txt += f"  {k}: {v}\n"

        if current_alert:
            txt += f"\n⚠️ 当前报警: {current_alert['parameter']} - {current_alert['message']}"
        else:
            txt += "\n✅ 状态正常"

        # 重要:返回BaseToolOutput对象,与calculate.py示例保持一致
        return BaseToolOutput(txt)

    except Exception as e:
        error_msg = f"模拟器错误,无法查到当前柴油机状态参数!错误信息:{str(e)}"
        return BaseToolOutput(error_msg)

之后,我在该目录下的__init__.py中对我自定义工具进行了导入,并且在这里将几个我不需要的工具注释掉。

# from .url_reader import url_reader
from .diesel_engine_status import diesel_engine_status  # 自定义的
# from .arxiv import arxiv
# from .calculate import calculate
# from .search_internet import search_internet
# from .search_local_knowledgebase import search_local_knowledgebase
# from .search_youtube import search_youtube
# from .shell import shell
# from .text2image import text2images
# from .text2sql import text2sql
# from .weather_check import weather_check
# from .wolfram import wolfram
# from .amap_poi_search import amap_poi_search
# from .amap_weather import amap_weather
# from .wikipedia_search import wikipedia_search
# from .text2promql import text2promql

最后,在settings.py和tool_settings.yaml文件中对相关配置进行了修改,所有修改都是按照网上的教程做的。
但是,当我重启项目后,我自定义的工具无法看到和调用;而我注释掉的工具依然能看到,且能正常调用。命令行也没有报错信息。
能麻烦帮我解答一下困惑吗?谢谢!

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2026-01-13 10:23
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    你遇到的问题是:自定义的 Agent 工具无法在 LangChain-Chatchat 0.3.1.3 中显示和调用,而被注释掉的工具仍然可见且可用。这说明你的自定义工具虽然进行了导入和配置,但可能未正确注册到系统中,或者某些关键逻辑没有被触发。


    问题分析

    1. 文件结构与导入机制

      • 自定义工具应该放在 libs/chatchat-server/chatchat/server/agent/tools_factory/ 目录下。
      • 每个工具应该是一个 Python 文件,如 my_tool.py,并在其中定义一个类(通常是继承自 BaseTool 或其子类)。
      • __init__.py 中需要将工具类进行导入,以确保其被识别。
    2. 工具注册机制

      • LangChain-Chatchat 的 Agent 工具通常通过 tools_factory 注册。
      • 如果你的自定义工具没有被正确注册到 tools_factory 中,即使导入了,也不会显示。
    3. 配置文件

      • settings.pytool_settings.yaml 需要包含你的工具配置信息。
      • 如果配置不完整或格式错误,可能导致工具未被加载。

    🔍 解决方案

    1. 确保自定义工具类正确实现

    请确保你的自定义工具类如下所示:

    # my_tool.py
    from langchain.agents import tool
    
    @tool
    def my_custom_tool(input: str) -> str:
        """这是一个自定义工具的描述"""
        return f"这是来自 {input} 的响应"
    

    注意:如果你使用的是旧版本的 LangChain-Chatchat,可能需要使用 BaseTool 类来实现工具,而不是 @tool 装饰器。


    2. 在 __init__.py 中正确导入工具

    确保你在 tools_factory/__init__.py 中导入了你的工具类,并将其加入 TOOL_REGISTRY 或类似的注册表中:

    # tools_factory/__init__.py
    from .my_tool import my_custom_tool
    
    # 假设有一个工具注册列表
    TOOL_REGISTRY = {
        "my_custom_tool": my_custom_tool,
        # 其他工具...
    }
    

    重点:如果没有将工具加入注册表,Agent 就不会加载它。


    3. 修改 tool_settings.yaml 配置

    确保你的 tool_settings.yaml 包含如下配置(根据你的工具名称修改):

    tools:
      - name: my_custom_tool
        description: "这是一个自定义工具的描述"
        class: "chatchat.server.agent.tools_factory.my_tool.my_custom_tool"
    

    重点:路径必须准确,否则工具无法被加载。


    4. 检查 settings.py 中的 Agent 配置

    确保 settings.py 中的 Agent 配置包含了你的工具名称,例如:

    AGENT_TOOLS = ["my_custom_tool", "other_tool"]
    

    重点:如果这个列表中没有你的工具,Agent 也不会加载它。


    5. 重启服务并检查日志

    • 完成以上步骤后,彻底重启项目(包括所有依赖服务)。
    • 查看后台日志(如 logs/app.log),确认是否加载了你的工具。

    重点:有时候缓存或旧进程未完全退出会导致配置未生效。


    🛠️ 示例代码修改

    修改后的 tools_factory/my_tool.py

    from langchain.agents import tool
    
    @tool
    def my_custom_tool(input: str) -> str:
        """这是一个自定义工具的描述"""
        return f"这是来自 {input} 的响应"
    

    修改后的 tools_factory/__init__.py

    from .my_tool import my_custom_tool
    
    TOOL_REGISTRY = {
        "my_custom_tool": my_custom_tool,
    }
    

    修改后的 tool_settings.yaml

    tools:
      - name: my_custom_tool
        description: "这是一个自定义工具的描述"
        class: "chatchat.server.agent.tools_factory.my_tool.my_custom_tool"
    

    修改后的 settings.py

    AGENT_TOOLS = ["my_custom_tool", "search_web", "read_file"]
    

    🧾 总结

    | 问题点 | 解决方案 | |--------|----------| | 工具未被注册 | 确保在 __init__.py 中加入 TOOL_REGISTRY | | 工具路径错误 | 检查 tool_settings.yaml 中的类路径是否正确 | | Agent 不加载工具 | 确保 AGENT_TOOLS 列表中包含你的工具名称 | | 未重启服务 | 重启项目并查看日志,排除缓存影响 |


    如果你已经按照上述步骤操作但仍无法显示,可以提供以下信息,我会进一步帮助你排查:

    • my_tool.py 的完整代码
    • __init__.py 的内容
    • tool_settings.yaml 的配置片段
    • 后台日志中的相关输出

    希望这些内容能帮你解决问题!如果还有疑问,请随时提问。

    评论

报告相同问题?

问题事件

  • 修改了问题 1月13日
  • 创建了问题 1月13日