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"]