ls、read_file、write_file、edit_file、delete、glob和grep等工具向智能体暴露文件系统接口。这些工具通过可插拔的后端运行。read_file工具原生支持所有后端中的图像文件(.png、.jpg、.jpeg、.gif、.webp),并将其作为多模态内容块返回。
:::
:::js
深度智能体通过ls、read_file、write_file、edit_file、glob和grep等工具向智能体暴露文件系统接口。这些工具通过可插拔的后端运行。read_file工具原生支持所有后端中的二进制文件(图像、PDF、音频、视频),并返回一个ReadResult,其中包含类型的content和mimeType。
:::
沙盒和@[LocalShellBackend]也提供execute工具。
本页面解释如何:
- 选择后端
- 将不同路径路由到不同后端
- 实现自定义后端
- 设置文件系统访问权限 :::js
- 添加策略钩子
- 处理二进制和多模态文件 :::
- 遵守后端协议 :::js
- 将现有后端更新到v2 :::
快速入门
这里有一些你可以快速与深度智能体一起使用的预构建文件系统后端:内置后端
StateBackend
:::python- 通过@[
StateBackend]将文件存储在当前线程的LangGraph智能体状态中。 - 通过检查点器跨多个智能体回合持久化。文件不会跨线程共享。
- 作为智能体的草稿板来写入中间结果。
- 自动驱逐大型工具输出,智能体可以逐块读取。
FilesystemBackend(本地磁盘)
@[FilesystemBackend]在可配置的根目录下读取和写入真实文件。
:::python
- 在可配置的
root_dir下读写真实文件。 - 您可以选择将
virtual_mode=True设置为沙盒,并在root_dir下规范化路径。 - 使用安全的路径解析,在可能的情况下防止不安全的符号链接遍历,可以使用 ripgrep 进行快速的
grep。
- 您机器上的本地项目
- CI 沙盒
- 挂载的持久卷
openwiki/)读取的持久化仓库 wiki,请参阅 OpenWiki。
LocalShellBackend (本地 Shell)
:::python- 扩展
FilesystemBackend并使用execute工具在主机上运行 Shell 命令。 - 命令直接在您的机器上使用
subprocess.run(shell=True)运行,没有任何沙盒。 - 支持
timeout(默认 120 秒)、max_output_bytes(默认 100,000)、env和inherit_env用于环境变量。 - Shell 命令使用
root_dir作为工作目录,但可以访问系统上的任何路径。
- 本地编码助手和开发工具
- 开发过程中的快速迭代,当您信任智能体时
StoreBackend (LangGraph 存储)
:::python部署到 LangSmith 部署 时,省略
store 参数。平台会自动为您的智能体配置存储。- @[
StoreBackend] 将文件存储在由运行时提供的 LangGraph @[BaseStore] 中,实现跨线程持久化存储。
- 当您已经使用配置好的 LangGraph 存储运行时(例如 Redis、Postgres 或 @[
BaseStore] 背后的云实现)。 - 当您通过 LangSmith 部署 部署智能体时(会自动为您的智能体配置存储)。
命名空间工厂
命名空间工厂控制StoreBackend 读取和写入数据的位置。它接收一个 LangGraph @[Runtime] 并返回一个用作存储命名空间的字符串元组。使用命名空间工厂在用户、租户或助手之间隔离数据。
在构造 StoreBackend 时将命名空间工厂传递给 namespace 参数:
Runtime 提供:
rt.context—通过 LangGraph 的 上下文模式 传递的用户提供的上下文(例如user_id) :::pythonrt.server_info—在 LangGraph 服务器上运行时的服务器特定元数据(助手 ID、图 ID、认证用户)rt.execution_info—执行身份信息(线程 ID、运行 ID、检查点 ID) ::: :::jsrt.serverInfo—在 LangGraph 服务器上运行时的服务器特定元数据(助手 ID、图 ID、认证用户)rt.executionInfo—执行身份信息(线程 ID、运行 ID、检查点 ID) :::
Runtime 参数在 deepagents>=0.5.2 中可用。早期 0.5.x 版本传递了一个 BackendContext 而不是—请参阅 从 BackendContext 迁移 下的说明。rt.server_info 和 rt.execution_info 需要 deepagents>=0.5.0。Runtime 参数在 deepagents>=1.9.1 中可用。早期 1.9.x 版本传递了一个 BackendContext 而不是—请参阅 从 BackendContext 迁移 下的说明。rt.serverInfo 和 rt.executionInfo 需要 deepagents>=1.9.0。(user_id, thread_id) 用于按用户按对话隔离,或者追加后缀如 "filesystem" 以在相同范围使用多个存储命名空间时消除歧义。
命名空间组件必须仅包含字母数字字符、连字符、下划线、点、@、+、冒号和波浪号。通配符(*、?)被拒绝以防止glob注入。
:::python
:::
:::js
:::
ContextHubBackend
开始前:
ContextHubBackend需要在LangSmith中设置Context Hub仓库。如果您不熟悉智能体仓库和技能仓库,请先阅读Context Hub概念页面。ContextHubBackend将您的智能体的文件系统存储在LangSmith Context Hub仓库中。它可以使用独立仓库或链接到技能仓库的智能体仓库。
仓库结构: 在Context Hub中,一个_智能体仓库_包含智能体的顶层指令和配置(例如,AGENTS.md、tools.json)。它可以链接到一个或多个_技能仓库_,每个技能仓库作为一个可重用的能力打包(例如,一个SKILL.md,包含电子邮件格式化或代码审查的指令)。当您传递ContextHubBackend("my-agent")时,后端将智能体仓库挂载到文件系统根目录;链接的技能仓库作为/skills/下的子目录出现。
这意味着您的智能体的上下文有意分布在多个仓库中:每个智能体一个仓库,每个技能一个独立仓库。这种分离允许技能独立地进行版本控制、共享和重用。如果感觉碎片化,请参阅链接仓库了解原因。
:::python
owner/name或name格式的仓库标识符构建它。
在使用
ContextHubBackend之前设置LANGSMITH_API_KEY。- 在首次使用时惰性拉取Hub仓库树,然后从内存缓存中提供读取。
- 持久化写入和编辑为Hub提交,并在成功提交后更新缓存。
- 使用乐观父提交写入(
parent_commit):每次推送都针对最新的已知提交哈希。
- 如果仓库不存在,首次拉取被视为空;第一个成功的写入可以创建仓库。
- 如果其他写入者首先推进仓库,您的过时父提交写入可能会失败。重新拉取并在冲突时重试。
upload_files()接受UTF-8文本。非UTF-8文件按路径被invalid_path拒绝。
- 无需单独配置LangGraph
BaseStore的LangSmith原生持久文件系统。 - 从文件系统更改中受益于Hub提交历史的用例。
CompositeBackend(路由器)
:::python- @[
CompositeBackend]根据路径前缀将文件操作路由到不同的后端。 - 在列表和搜索结果中保留原始路径前缀。
- 当您希望为智能体提供线程范围和跨线程存储时,一个
CompositeBackend允许您提供StateBackend和StoreBackend - 当您有多个信息源,希望作为单个文件系统提供给智能体时。
- 例如。您在一个Store下
/memories/存储长期记忆,并且您还有一个自定义后端,其中文档可通过/docs访问。
- 例如。您在一个Store下
指定后端
:::python- 将后端实例传递给
create_deep_agent(model=..., backend=...)。文件系统中间件使用它进行所有工具操作。 - 后端必须实现
BackendProtocol(例如,StateBackend()、FilesystemBackend(root_dir=".")、StoreBackend()、ContextHubBackend("my-agent"))。 - 如果省略,默认为
StateBackend()。 :::
- 将后端实例传递给
createDeepAgent({ backend: ... })。文件系统中间件使用它进行所有工具操作。 - 后端必须实现
AnyBackendProtocol(BackendProtocolV1或BackendProtocolV2)—例如,new StateBackend()、new FilesystemBackend({ rootDir: "." })、new StoreBackend()。 - 如果省略,默认为
new StateBackend()。
在1.9.0版本之前,仅支持
BackendProtocol,现在为BackendProtocolV1。V1后端通过adaptBackendProtocol()在运行时自动适配为V2。无需代码更改即可继续使用现有的V1后端。要更新到v2,请参阅将现有后端更新到v2。路由到不同后端
将命名空间的一部分路由到不同的后端。通常用于跨线程持久化/memories/*,同时保持其他内容线程范围。
:::python
/workspace/plan.md→StateBackend(线程范围)/memories/agent.md→FilesystemBackend在/deepagents/myagent下ls、glob、grep聚合结果并显示原始路径前缀。
- 更长的前缀优先(例如,路由
"/memories/projects/"可以覆盖"/memories/")。 - 对于StoreBackend路由,请确保通过
create_deep_agent(model=..., store=...)提供存储或由平台配置。 - 深度智能体将内部数据(离线工具结果、对话历史)写入默认后端。使用
StateBackend作为默认值,以保持这些工件是暂时的,避免将它们写入磁盘或持久化存储。请参阅文件系统后端技巧以获取完整示例。
离线二进制内容
二进制内容离线存储将内联媒体存储在后端,而不是在消息历史中保留base64有效负载。这减少了读取二进制文件或接收用户消息中内联媒体的智能体的检查点大小。离线存储是可选的,默认禁用。 :::python二进制内容离线存储需要
deepagents>=0.7.21。FilesystemMiddleware上设置offload_binary_content=True,并将其作为middleware列表传递给create_deep_agent。使用相同的后端为智能体和中间件。
有效负载默认存储在/blobs/<sha256>下。如果您在中间件上设置artifacts_root,则blob存储在该根目录下。
:::
:::js
在createFilesystemMiddleware中设置offloadBinaryContent: true,并将中间件作为middleware数组传递给createDeepAgent。使用相同的后端为智能体和中间件。
有效负载默认存储在/blobs/<sha256>下。
:::
消息历史保留内容寻址引用。在每次模型调用之前,中间件从其缓存或后端恢复原始媒体。重新读取未更改的内容会重用相同的blob;更改的内容会创建新的blob。
使用一个将 blob 存储在图状态之外的后端,例如沙盒或 FilesystemBackend。当 blob 路径路由到 StateBackend 时(包括通过 CompositeBackend),卸载操作无效。如果你将 StateBackend 作为默认后端保留,请将 blob 目录路由到外部存储。
用户消息中的内联媒体在下次模型调用时会被替换。原始输入负载仍然出现在早期的检查点中。在恢复线程时保持 blob 存储可用,以便中间件可以恢复其媒体。
自定义后端
实现一个自定义后端,以连接深度智能体到数据库、对象存储和远程文件系统等存储系统。参见 社区构建的后端 获取示例。实现后端协议
:::python 继承 @[BackendProtocol] 并实现以下方法:
要同时支持
execute 工具(运行 shell 命令),请实现 @[SandboxBackendProtocol] 而不是 BackendProtocol,它通过一个 execute 方法扩展了 BackendProtocol。
始终在失败情况下返回结构化结果类型,并包含一个 error 字段。不要抛出异常。
:::
:::js
实现 @[BackendProtocol] (BackendProtocolV2) 并提供以下方法:
要同时支持
execute 工具(运行 shell 命令),请实现 @[SandboxBackendProtocol] 而不是 BackendProtocolV2,它通过一个 execute 方法扩展了 BackendProtocolV2。
所有方法必须返回结构化的 Result 对象,并包含可选的 error 字段——在缺少文件或无效模式时不抛出异常。
:::
Example: S3-style backend skeleton
Example: S3-style backend skeleton
这个骨架将文件系统路径映射到对象键。用你的存储客户端的列、读、搜索、上传和读改写操作填充每个方法。:::python::::::js:::
权限
使用 权限 声明式地控制智能体可以读取或写入哪些文件和目录。权限适用于内置的文件系统工具,并在调用后端之前进行评估。 :::python添加策略钩子
对于基于路径的允许/拒绝规则之外的定制验证逻辑(速率限制、审计日志、内容检查),通过继承或包装后端来执行企业规则。 在选定的前缀下阻止写入/编辑(继承): :::python多模态和二进制文件
多模态文件支持(PDF、音频、视频)需要
deepagents>=1.9.0。read() 遇到二进制文件(通过文件扩展名确定的 MIME 类型判定)时,它返回一个 ReadResult,包含 Uint8Array 内容和相应的 mimeType。文本文件返回 string 内容。
支持的 MIME 类型
读取二进制文件
FileData 格式
FileData 是用于在状态和存储后端中存储文件内容的数据类型。
fileFormat: "v1" 传递给后端构造函数(例如,new StoreBackend({ fileFormat: "v1" }))。
:::
从后端工厂迁移
以前,像StateBackend 和 StoreBackend 这样的后端需要一个接收运行时对象的工厂函数,因为它们需要运行时上下文(状态、存储)才能操作。现在后端通过 LangGraph 的 get_config()、get_store() 和 get_runtime() 辅助函数内部解析此上下文,因此你可以直接传递实例。
变更内容
弃用的 API
:::python
:::
:::js
:::
工厂模式在运行时仍然有效,并发出弃用警告。请在下一个主要版本之前更新您的代码以使用直接实例。
迁移示例
:::python从 BackendContext 迁移
在 deepagents>=0.5.2(Python)和 deepagents>=1.9.1(TypeScript)中,命名空间工厂直接接收 LangGraph @[Runtime],而不是 BackendContext 包装器。旧的 BackendContext 形式仍然通过向后兼容的 .runtime 和 .state 访问器工作,但这些访问器会发出弃用警告,并在 deepagents>=0.7 中被移除。
变更内容:
- 工厂参数现在是一个
Runtime,而不是BackendContext。 - 移除
.runtime访问器—for example,ctx.runtime.context.user_id变为rt.server_info.user.identity。 - 没有直接替换
ctx.state。命名空间信息应该是只读的并且在运行期间保持稳定,而状态是可变的并且按步骤变化—从状态派生命名空间有数据最终可能出现在不一致的键下。如果您有需要读取智能体状态的用例,请 打开问题。
协议参考
后端必须实现 @[BackendProtocol]。
必需方法:
ls(path: str) -> LsResult- 返回至少包含
path的条目。当可用时,包含is_dir、size、modified_at。按path排序以获得确定性输出。
- 返回至少包含
read(file_path: str, offset: int = 0, limit: int = 2000) -> ReadResult- 成功时返回文件数据。文件不存在时,返回
ReadResult(error="Error: File '/x' not found")。
- 成功时返回文件数据。文件不存在时,返回
grep(pattern: str, path: Optional[str] = None, glob: Optional[str] = None) -> GrepResult- 返回结构化匹配。出错时,返回
GrepResult(error="...")(不要抛出异常)。
- 返回结构化匹配。出错时,返回
glob(pattern: str, path: Optional[str] = None) -> GlobResult- 返回匹配的文件作为
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- 强制
old_string的唯一性,除非replace_all=True。如果未找到,返回错误。成功时包含occurrences。
- 强制
LsResult(error, entries)—entries成功时是list[FileInfo],失败时是None。ReadResult(error, file_data)—file_data成功时是FileData字典,失败时是None。GrepResult(error, matches)—matches成功时是list[GrepMatch],失败时是None。GlobResult(error, matches)—matches成功时是list[FileInfo],失败时是None。WriteResult(error, path, files_update)EditResult(error, path, files_update, occurrences)FileInfo,字段:path(必需),可选is_dir、size、modified_at。GrepMatch,字段:path、line、text。FileData,字段:content(str)、encoding("utf-8"或"base64")、created_at、modified_at。 :::
BackendProtocolV2。所有查询方法返回结构化的 Result 对象,包含 { error?: string, ...data }。
必需方法
-
ls(path: string) → LsResult- 列出指定目录中的文件和目录(非递归)。目录的路径以
/结尾,并具有is_dir=true。当可用时,包含is_dir、size、modified_at。
- 列出指定目录中的文件和目录(非递归)。目录的路径以
-
read(filePath: string, offset?: number, limit?: number) → ReadResult- 读取文件内容。对于文本文件,内容按行偏移/限制分页(默认偏移 0,限制 500)。对于二进制文件,返回完整的原始
Uint8Array内容,并设置mimeType字段。文件不存在时,返回{ error: "File '/x' not found" }。
- 读取文件内容。对于文本文件,内容按行偏移/限制分页(默认偏移 0,限制 500)。对于二进制文件,返回完整的原始
-
readRaw(filePath: string) → ReadRawResult- 读取文件内容作为原始
FileData。返回完整的文件数据,包括时间戳。
- 读取文件内容作为原始
-
grep(pattern: string, path?: string | null, glob?: string | null) → GrepResult- 搜索文件内容中的字面文本模式。根据 MIME 类型确定的二进制文件被跳过。失败时,返回
{ error: "..." }。
- 搜索文件内容中的字面文本模式。根据 MIME 类型确定的二进制文件被跳过。失败时,返回
-
glob(pattern: string, path?: string) → GlobResult- 返回匹配 glob 模式的文件作为
FileInfo条目。
- 返回匹配 glob 模式的文件作为
-
write(filePath: string, content: string) → WriteResult- 只读操作。冲突时,返回
{ error: "..." }。成功时,设置path;对于状态后端,设置filesUpdate={...};外部后端应使用filesUpdate=null。
- 只读操作。冲突时,返回
-
edit(filePath: string, oldString: string, newString: string, replaceAll?: boolean) → EditResult- 强制
oldString的唯一性,除非replaceAll=true。如果未找到,返回错误。成功时包含occurrences。
- 强制
可选方法
uploadFiles(files: Array<[string, Uint8Array]>) → FileUploadResponse[]—上传多个文件(用于沙盒后端)。downloadFiles(paths: string[]) → FileDownloadResponse[]—下载多个文件(用于沙盒后端)。
结果类型
支持类型
FileInfo—path(必需),可选is_dir、size、modified_at。GrepMatch—path,line(1索引),text。FileData—带时间戳的文件内容。参见 FileData 格式。
沙盒扩展
SandboxBackendProtocolV2 扩展 BackendProtocolV2,包含:
execute(command: string) → ExecuteResponse—在沙盒中运行 shell 命令。readonly id: string—沙盒实例的唯一标识符。 :::
将现有后端更新到 V2
Migration guide
Migration guide
参考文档
官方原文:src/oss/deepagents/backends.mdx · 非官方翻译,译文由 AI 生成,以英文原文为准。