Source code for langchain_community.agent_toolkits.file_management.toolkit

from __future__ import annotations

from typing import Dict, List, Optional, Type

from langchain_core.pydantic_v1 import root_validator
from langchain_core.tools import BaseToolkit

from langchain_community.tools import BaseTool
from langchain_community.tools.file_management.copy import CopyFileTool
from langchain_community.tools.file_management.delete import DeleteFileTool
from langchain_community.tools.file_management.file_search import FileSearchTool
from langchain_community.tools.file_management.list_dir import ListDirectoryTool
from langchain_community.tools.file_management.move import MoveFileTool
from langchain_community.tools.file_management.read import ReadFileTool
from langchain_community.tools.file_management.write import WriteFileTool

_FILE_TOOLS: List[Type[BaseTool]] = [
    CopyFileTool,
    DeleteFileTool,
    FileSearchTool,
    MoveFileTool,
    ReadFileTool,
    WriteFileTool,
    ListDirectoryTool,
]
_FILE_TOOLS_MAP: Dict[str, Type[BaseTool]] = {
    tool_cls.__fields__["name"].default: tool_cls for tool_cls in _FILE_TOOLS
}


[docs]class FileManagementToolkit(BaseToolkit): """用于与本地文件交互的工具包。 *安全提示*:此工具包提供了与本地文件交互的方法。 如果将此工具包提供给LLM上的代理,请确保将代理的权限范围限制在仅包括执行所需操作所必需的权限。 默认情况下,代理将可以访问根目录中的所有文件,并能够复制、删除、移动、读取、写入和列出该目录中的文件。 考虑以下事项: - 使用`root_dir`限制对特定目录的访问。 - 使用文件系统权限限制对代理所需的文件和目录的访问和权限。 - 仅限制代理可用的工具,以执行代理预期使用所需的文件操作。 - 通过在容器中运行代理来对其进行沙盒隔离。 请访问https://python.langchain.com/docs/security了解更多信息。""" root_dir: Optional[str] = None """如果指定了,则所有文件操作都相对于 root_dir 进行。""" selected_tools: Optional[List[str]] = None """如果提供了,只提供所选工具。默认为全部。""" @root_validator def validate_tools(cls, values: dict) -> dict: selected_tools = values.get("selected_tools") or [] for tool_name in selected_tools: if tool_name not in _FILE_TOOLS_MAP: raise ValueError( f"File Tool of name {tool_name} not supported." f" Permitted tools: {list(_FILE_TOOLS_MAP)}" ) return values
[docs] def get_tools(self) -> List[BaseTool]: """获取工具包中的工具。""" allowed_tools = self.selected_tools or _FILE_TOOLS_MAP tools: List[BaseTool] = [] for tool in allowed_tools: tool_cls = _FILE_TOOLS_MAP[tool] tools.append(tool_cls(root_dir=self.root_dir)) # type: ignore[call-arg] return tools
__all__ = ["FileManagementToolkit"]