ls、read_file、write_file、edit_file、glob 和 grep 等工具向 agent 暴露文件系统表面。这些工具通过可插拔的后端运行。read_file 工具原生支持所有后端上的图像文件(.png、.jpg、.jpeg、.gif、.webp),将其作为多模态内容块返回。
沙盒和 LocalShellBackend 还提供 execute 工具。
本页面介绍了如何 选择后端、将不同路径路由到不同后端、实现自己的虚拟文件系统(例如 S3 或 Postgres)、添加策略钩子 以及 遵守后端协议。
快速开始
以下是一些预构建的文件系统后端,您可以快速将其与 deep agent 一起使用:| 内置后端 | 描述 |
|---|---|
| 默认 | agent = create_deep_agent() 状态是临时的。agent 的默认文件系统后端存储在 langgraph 状态中。请注意,此文件系统仅 在单个线程中 持久化。 |
| 本地文件系统持久化 | agent = create_deep_agent(backend=FilesystemBackend(root_dir="/Users/nh/Desktop/")) 这使 deep agent 可以访问您本地机器的文件系统。您可以指定 agent 有权访问的根目录。请注意,提供的任何 root_dir 必须是绝对路径。 |
| 持久存储 (LangGraph store) | agent = create_deep_agent(backend=lambda rt: StoreBackend(rt)) 这使 agent 可以访问 跨线程持久化 的长期存储。这非常适合存储适用于 agent 多次执行的长期记忆或指令。 |
| 沙盒 | agent = create_deep_agent(backend=sandbox) 在隔离环境中执行代码。沙盒提供文件系统工具以及用于运行 shell 命令的 execute 工具。可选择 Modal、Daytona、Deno 或本地 VFS。 |
| 本地 Shell | agent = create_deep_agent(backend=LocalShellBackend(root_dir=".", env={"PATH": "/usr/bin:/bin"})) 直接在主机上进行文件系统和 shell 执行。无隔离——仅在受控开发环境中使用。请参阅下面的 安全注意事项。 |
| 复合后端 | 默认为临时,/memories/ 持久化。复合后端最为灵活。您可以指定文件系统中的不同路由指向不同的后端。请参阅下面的复合路由以获取可粘贴的示例。 |
内置后端
StateBackend (临时)
- 将当前线程的文件存储在 LangGraph agent 状态中。
- 通过检查点在同一线程上的多个 agent 轮次中持久化。
- 作为 agent 编写中间结果的暂存板。
- 自动驱逐大型工具输出,agent 随后可以逐块读取这些输出。
FilesystemBackend (本地磁盘)
- 读取/写入可配置
root_dir下的真实文件。 - 您可以选择设置
virtual_mode=True以沙盒化并规范化root_dir下的路径。 - 使用安全路径解析,在可能的情况下防止不安全的符号链接遍历,可以使用 ripgrep 进行快速
grep。
- 本地机器上的本地项目
- CI 沙盒
- 挂载的持久卷
LocalShellBackend (本地 Shell)
- 使用
execute工具扩展FilesystemBackend,以便在主机上运行 shell 命令。 - 使用
subprocess.run(shell=True)直接在您的机器上运行命令,没有沙盒。 - 支持
timeout(默认 120s)、max_output_bytes(默认 100,000)、env和用于环境变量的inherit_env。 - Shell 命令使用
root_dir作为工作目录,但可以访问系统上的任何路径。
- 本地编码助手和开发工具
- 开发期间的快速迭代(当您信任 agent 时)
StoreBackend (LangGraph store)
When deploying to LangSmith Deployment, omit the
store parameter. The platform automatically provisions a store for your agent.- 将文件存储在运行时提供的 LangGraph
BaseStore中,实现跨线程持久存储。
- 当您已经在配置了 LangGraph store 的情况下运行(例如 Redis、Postgres 或
BaseStore之后的云实现)。 - 当您通过 LangSmith Deployment 部署 agent 时(会自动为您的 agent 配置 store)。
CompositeBackend (路由器)
- 根据路径前缀将文件操作路由到不同的后端。
- 在列表和搜索结果中保留原始路径前缀。
- 当您想同时为 agent 提供临时和跨线程存储时,
CompositeBackend允许您同时提供StateBackend和StoreBackend - 当您有多个信息源想作为单个文件系统提供给 agent 时。
- 例如,您在一个 Store 中的
/memories/下存储了长期记忆,并且您还有一个自定义后端,可以通过 /docs/ 访问文档。
- 例如,您在一个 Store 中的
指定后端
- 将后端传递给
create_deep_agent(backend=...)。文件系统中间件将其用于所有工具。 - 您可以传递:
- 实现
BackendProtocol的实例(例如FilesystemBackend(root_dir=".")),或 - 一个工厂
BackendFactory = Callable[[ToolRuntime], BackendProtocol](用于需要运行时的后端,如StateBackend或StoreBackend)。
- 实现
- 如果省略,默认为
lambda rt: StateBackend(rt)。
路由到不同的后端
将命名空间的部分路由到不同的后端。通常用于持久化/memories/* 并保持其他所有内容为临时状态。
/workspace/plan.md→StateBackend(临时)/memories/agent.md→FilesystemBackend位于/deepagents/myagent下ls、glob、grep聚合结果并显示原始路径前缀。
- 较长的前缀优先(例如,路由
"/memories/projects/"可以覆盖"/memories/")。 - 对于 StoreBackend 路由,确保存储运行时提供 store (
runtime.store)。
使用虚拟文件系统
构建自定义后端以将远程或数据库文件系统(例如 S3 或 Postgres)投影到工具命名空间中。 设计指南:- 路径是绝对路径 (
/x/y.txt)。决定如何将其映射到您的存储键/行。 - 高效实现
ls_info和glob_info(在可用的情况下进行服务端列表,否则进行本地过滤)。 - 对丢失的文件或无效的正则表达式模式返回用户可读的错误字符串。
- 对于外部持久化,在结果中设置
files_update=None;只有状态内后端才应返回files_update字典。
- 表
files(path text primary key, content text, created_at timestamptz, modified_at timestamptz) - 将工具操作映射到 SQL:
ls_info使用WHERE path LIKE $1 || '%'glob_info在 SQL 中过滤或获取后在 Python 中应用 globgrep_raw可以通过扩展名或最后修改时间获取候选行,然后扫描行
添加策略钩子
通过子类化或包装后端来强制执行企业规则。 阻止所选前缀下的写入/编辑(子类化): 通用包装器(适用于任何后端):协议参考
后端必须实现BackendProtocol。
必需的端点:
ls_info(path: str) -> list[FileInfo]- 返回至少包含
path的条目。可用时包括is_dir、size、modified_at。按path排序以获得确定性输出。
- 返回至少包含
read(file_path: str, offset: int = 0, limit: int = 2000) -> str- 返回带编号的内容。文件丢失时,返回
"Error: File '/x' not found"。
- 返回带编号的内容。文件丢失时,返回
grep_raw(pattern: str, path: Optional[str] = None, glob: Optional[str] = None) -> list[GrepMatch] | str- 返回结构化匹配项。对于无效的正则表达式,返回类似
"Invalid regex pattern: ..."的字符串(不要引发异常)。
- 返回结构化匹配项。对于无效的正则表达式,返回类似
glob_info(pattern: str, path: str = "/") -> list[FileInfo]- 将匹配的文件作为
FileInfo条目返回(如果无则为空列表)。
- 将匹配的文件作为
write(file_path: str, content: str) -> WriteResult- 仅创建。发生冲突时,返回
WriteResult(error=...)。成功时,设置path,对于状态后端设置files_update={...};外部后端应使用files_update=None。
- 仅创建。发生冲突时,返回
edit(file_path: str, old_string: str, new_string: str, replace_all: bool = False) -> EditResult- 除非
replace_all=True,否则强制old_string的唯一性。如果未找到,返回错误。成功时包括occurrences。
- 除非
WriteResult(error, path, files_update)EditResult(error, path, files_update, occurrences)FileInfo包含字段:path(必需),可选is_dir、size、modified_at。GrepMatch包含字段:path、line、text。
将这些文档连接 到 Claude、VSCode 以及更多通过 MCP 获取实时答案的工具。

