Deep Agents 通过文档索引
在以下地址获取完整的文档索引:https://docs.langchain.org.cn/llms.txt
在进一步探索之前,请使用此文件发现所有可用页面。
ls、read_file、write_file、edit_file、glob 和 grep 等工具向智能体暴露文件系统界面。这些工具通过可插拔的后端运行。read_file 工具在所有后端中原生支持图像文件(.png、.jpg、.jpeg、.gif、.webp),并将它们作为多模态内容块返回。 read_file 工具在所有后端中原生支持二进制文件(图像、PDF、音频、视频),返回带有类型化 content 和 mimeType 的 ReadResult。 沙箱和 LocalShellBackend 还提供了一个 execute 工具。本页解释了如何:- 选择后端,
- 将不同的路径路由到不同的后端,
- 实现您自己的虚拟文件系统(例如 S3 或 Postgres),
- 设置文件系统访问权限,
- 添加策略钩子,处理二进制和多模态文件,
- 遵守后端协议,
- 以及将现有后端更新到 v2。
快速入门
以下是几个可以快速与您的 Deep Agent 配合使用的预置文件系统后端| 内置后端 | 描述 |
|---|---|
| 默认 | agent = create_deep_agent(model="google_genai:gemini-3.1-pro-preview") 状态中的临时存储。智能体的默认文件系统后端存储在 langgraph 状态中。请注意,此文件系统仅在单个线程中持久存在。 |
| 本地文件系统持久化 | agent = create_deep_agent(model="google_genai:gemini-3.1-pro-preview", backend=FilesystemBackend(root_dir="/Users/nh/Desktop/")) 这使 Deep Agent 能够访问本地机器的文件系统。您可以指定智能体有权访问的根目录。请注意,提供的任何 root_dir 必须是绝对路径。 |
| 持久存储(LangGraph store) | agent = create_deep_agent(model="google_genai:gemini-3.1-pro-preview", backend=StoreBackend()) 这使智能体能够访问跨线程持久化的长期存储。这非常适合存储长期记忆或适用于智能体多次执行的指令。 |
| 沙箱 | agent = create_deep_agent(model="google_genai:gemini-3.1-pro-preview", backend=sandbox) 在隔离环境中执行代码。沙箱提供文件系统工具以及用于运行 shell 命令的 execute 工具。可以从 Modal、Daytona、Deno 或本地 VFS 中选择。 |
| 本地 Shell | agent = create_deep_agent(model="google_genai:gemini-3.1-pro-preview", backend=LocalShellBackend(root_dir=".", env={"PATH": "/usr/bin:/bin"})) 直接在宿主机上进行文件系统和 shell 执行。没有隔离——仅在受控的开发环境中使用。请参阅下文的安全注意事项。 |
| 组合型 (Composite) | 默认临时,/memories/ 持久化。Composite 后端具有最大的灵活性。您可以指定文件系统中的不同路由指向不同的后端。请参阅下文的 Composite 路由以获取可直接粘贴的代码示例。 |
内置后端
StateBackend (临时)
- 通过
StateBackend将文件存储在当前线程的 LangGraph 智能体状态中。 - 通过检查点在同一线程上的多个智能体轮次中持久存在。
- 用于智能体写入中间结果的暂存器。
- 自动逐出大型工具输出,智能体随后可以逐篇读回。
FilesystemBackend (本地磁盘)
FilesystemBackend 在可配置的根目录下读取和写入真实文件。
- 在可配置的
root_dir下读取/写入真实文件。 - 您可以选择性地设置
virtual_mode=True来在root_dir下对路径进行沙箱化和规范化。 - 使用安全路径解析,尽可能防止不安全的符号链接遍历,可以使用 ripgrep 进行快速
grep。
- 机器上的本地项目
- CI 沙箱
- 挂载的持久卷
LocalShellBackend (本地 Shell)
- 扩展了
FilesystemBackend,增加了用于在宿主机上运行 shell 命令的execute工具。 - 命令直接在您的机器上使用
subprocess.run(shell=True)运行,没有沙箱保护。 - 支持
timeout(默认 120s)、max_output_bytes(默认 100,000)、env和inherit_env环境变量。 - Shell 命令使用
root_dir作为工作目录,但可以访问系统上的任何路径。
- 本地编码助手和开发工具
- 在您信任智能体的开发阶段进行快速迭代
StoreBackend (LangGraph 存储)
部署到 LangSmith Deployment 时,请省略
store 参数。平台会自动为您的智能体配置存储。StoreBackend将文件存储在由运行时提供的 LangGraphBaseStore中,从而实现跨线程持久存储。
- 当您已经在运行配置了 LangGraph 存储(例如 Redis、Postgres 或
BaseStore后端的云实现)时。 - 当您通过 LangSmith Deployment 部署智能体时(系统会自动为您的智能体配置存储)。
命名空间工厂
命名空间工厂控制StoreBackend 读取和写入数据的位置。它接收一个 LangGraph Runtime 并返回一个用作存储命名空间的字符串元组。使用命名空间工厂隔离用户、租户或助手之间的数据。 在构造 StoreBackend 时将命名空间工厂传递给 namespace 参数:Runtime 提供:
-
rt.context— 通过 LangGraph 的上下文模式 (context schema)传递的用户提供上下文(例如user_id) -
rt.serverInfo— 在 LangGraph Server 上运行时服务器特定的元数据(助手 ID、图 ID、已通过身份验证的用户) -
rt.executionInfo— 执行身份信息(线程 ID、运行 ID、检查点 ID)
Runtime 参数在 deepagents>=1.9.1 中可用。早期的 1.9.x 版本传递的是 BackendContext — 见下文的从 BackendContext 迁移。rt.serverInfo 和 rt.executionInfo 要求 deepagents>=1.9.0。(user_id, thread_id) 用于按用户按对话隔离,或者附加像 "filesystem" 这样的后缀,以便在同一范围使用多个存储命名空间时消除歧义。 命名空间组件必须仅包含字母数字字符、连字符、下划线、点、@、+、冒号和波浪号。拒绝通配符(*、?)以防止 glob 注入。
CompositeBackend (路由器)
CompositeBackend根据路径前缀将文件操作路由到不同的后端。- 在列表和搜索结果中保留原始路径前缀。
- 当您想同时给智能体提供临时和跨线程存储时,
CompositeBackend允许您同时提供StateBackend和StoreBackend - 当您有多个信息源想作为单个文件系统的一部分提供给智能体时。
- 例如:您在其中一个 Store 的
/memories/下存储了长期记忆,同时您还有一个自定义后端,其文档可在/docs/访问。
- 例如:您在其中一个 Store 的
指定后端
- 将后端实例传递给
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/* 并保持其他所有内容为临时。
/workspace/plan.md→StateBackend(临时)/memories/agent.md→FilesystemBackend(位于/deepagents/myagent之下)ls,glob,grep聚合结果并显示原始路径前缀。
- 较长的前缀优先(例如,路由
"/memories/projects/"可以覆盖"/memories/")。 - 对于 StoreBackend 路由,请确保通过
create_deep_agent(model=..., store=...)提供了 store 或由平台配置了 store。
使用虚拟文件系统
构建自定义后端以将远程或数据库文件系统(例如 S3 或 Postgres)投影到工具命名空间中。 设计指南:-
路径是绝对路径(
/x/y.txt)。决定如何将它们映射到您的存储键/行。 -
高效地实现
ls和glob(如果可用,使用服务器端过滤,否则使用本地过滤)。 -
对于外部持久化(S3、Postgres 等),在写入/编辑结果中返回
files_update=None(Python) 或省略filesUpdate(JS) — 只有内存状态后端需要返回文件更新字典。 -
使用
ls和glob作为方法名。 -
所有查询方法(
ls,read,readRaw,grep,glob)必须返回结构化的 Result 对象(例如LsResult,ReadResult),并带有一个可选的error字段。 -
通过返回带有适当
mimeType的Uint8Array内容,在read()中支持二进制文件。
- 表
files(path text primary key, content text, mime_type text, created_at timestamptz, modified_at timestamptz) - 将工具操作映射到 SQL
ls使用WHERE path LIKE $1 || '%'→ 返回LsResult- 在 SQL 中进行
glob过滤或获取后再在本地应用 glob → 返回GlobResult grep可以通过扩展名或最后修改时间获取候选行,然后扫描行(跳过mime_type为二进制的行) → 返回GrepResult
权限
使用权限来声明式地控制智能体可以读取或写入哪些文件和目录。权限适用于内置的文件系统工具,并在调用后端之前进行评估。 有关包括规则排序、子智能体权限和组合后端交互在内的全套选项,请参阅权限指南。添加策略钩子
对于基于路径的允许/拒绝规则之外的自定义验证逻辑(速率限制、审计日志、内容检查),通过对后端进行子类化或包装来强制执行企业规则。 阻止选定前缀下的写入/编辑(子类化):多模态和二进制文件
多模态文件支持(PDF、音频、视频)需要
deepagents>=1.9.0。read() 遇到二进制文件(由文件扩展名的 MIME 类型决定)时,它返回带有 Uint8Array 内容和相应 mimeType 的 ReadResult。文本文件返回 string 内容。
支持的 MIME 类型
| 类别 | 扩展名 | MIME 类型 |
|---|---|---|
| 图像 | .png, .jpg/.jpeg, .gif, .webp, .svg, .heic, .heif | image/png, image/jpeg, image/gif, image/webp, image/svg+xml, image/heic, image/heif |
| 音频 | .mp3, .wav, .aiff, .aac, .ogg, .flac | audio/mpeg, audio/wav, audio/aiff, audio/aac, audio/ogg, audio/flac |
| 视频 | .mp4, .webm, .mpeg/.mpg, .mov, .avi, .flv, .wmv, .3gpp | video/mp4, video/webm, video/mpeg, video/quicktime, video/x-msvideo, video/x-flv, video/x-ms-wmv, video/3gpp |
| 文档 | .pdf, .ppt, .pptx | application/pdf, application/vnd.ms-powerpoint, application/vnd.openxmlformats-officedocument.presentationml.presentation |
| 文本 | .txt, .html, .json, .js, .ts, .py 等 | text/plain, text/html, application/json 等 |
读取二进制文件
FileData 格式
FileData 是用于在状态和存储后端中存储文件内容的类型。
fileFormat: "v1" 传递给后端构造函数(例如 new StoreBackend({ fileFormat: "v1" }))。
从后端工厂迁移
以前,像StateBackend 和 StoreBackend 这样的后端需要一个接收运行时对象的工厂函数,因为它们需要运行时上下文(状态、存储)才能运行。后端现在通过 LangGraph 的 get_config()、get_store() 和 get_runtime() 辅助工具在内部解析此上下文,因此您可以直接传递实例。
发生了什么变化
| 之前(已弃用) | 之后 |
|---|---|
backend=lambda rt: StateBackend(rt) | backend=StateBackend() |
backend=lambda rt: StoreBackend(rt) | backend=StoreBackend() |
backend=lambda rt: CompositeBackend(default=StateBackend(rt), ...) | backend=CompositeBackend(default=StateBackend(), ...) |
backend: (config) => new StateBackend(config) | backend: new StateBackend() |
backend: (config) => new StoreBackend(config) | backend: new StoreBackend() |
已弃用的 API
| 已弃用 | 替换方案 |
|---|---|
BackendFactory 类型 | 直接传递后端实例 |
BackendRuntime 接口 | 后端内部解析上下文 |
StateBackend(runtime, options?) 构造函数重载 | new StateBackend(options?) |
StoreBackend(stateAndStore, options?) 构造函数重载 | new StoreBackend(options?) |
WriteResult 和 EditResult 上的 filesUpdate 字段 | 状态写入现在由后端内部处理 |
工厂模式在运行时仍然有效,并会发出弃用警告。请在下一个大版本发布前更新代码以直接使用实例。
迁移示例
从 BackendContext 迁移
在 deepagents>=0.5.2 (Python) 和 deepagents>=1.9.1 (TypeScript) 中,命名空间工厂直接接收 LangGraph Runtime,而不是 BackendContext 包装器。旧的 BackendContext 形式仍然通过向后兼容的 .runtime 和 .state 访问器工作,但这些访问器会发出弃用警告,并将在 deepagents>=0.7 中删除。 变化内容:- 工厂参数现在是
Runtime,而不是BackendContext。 - 舍弃
.runtime访问器 — 例如,ctx.runtime.context.user_id变为rt.server_info.user.identity。 ctx.state没有直接替代品。命名空间信息在运行期间应该是只读且稳定的,而状态是可变的并随步骤变化——基于状态派生命名空间存在数据落入不一致键的风险。如果您有需要读取智能体状态的用例,请提交 issue。
协议参考
后端必须实现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: str = "/") -> 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- 除非
replace_all=True,否则强制old_string的唯一性。如果未找到,则返回错误。成功时包含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。所有查询方法都返回带有 { error?: string, ...data } 的结构化 Result 对象。
必需方法
-
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- 以
FileInfo条目形式返回匹配 glob 模式的文件。
- 以
-
write(filePath: string, content: string) → WriteResult- 仅限创建语义。冲突时返回
{ error: "..." }。成功时,设置path,对于状态后端设置filesUpdate={...};外部后端应使用filesUpdate=null。
- 仅限创建语义。冲突时返回
-
edit(filePath: string, oldString: string, newString: string, replaceAll?: boolean) → EditResult- 除非
replaceAll=true,否则强制oldString的唯一性。如果未找到,则返回错误。成功时包含occurrences。
- 除非
可选方法
uploadFiles(files: Array<[string, Uint8Array]>) → FileUploadResponse[]— 上传多个文件(适用于沙箱后端)。downloadFiles(paths: string[]) → FileDownloadResponse[]— 下载多个文件(适用于沙箱后端)。
结果类型
| 类型 | 成功字段 | 错误字段 |
|---|---|---|
ReadResult | content?: string | Uint8Array, mimeType?: string | 错误 |
ReadRawResult | data?: FileData | 错误 |
LsResult | files?: FileInfo[] | 错误 |
GlobResult | files?: FileInfo[] | 错误 |
GrepResult | matches?: GrepMatch[] | 错误 |
WriteResult | path?: string | 错误 |
EditResult | path?: string, occurrences?: number | 错误 |
辅助类型
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
迁移指南
迁移指南
方法重命名
| V1 方法 | V2 方法 | 返回类型更改 |
|---|---|---|
lsInfo(path) | ls(path) | FileInfo[] → LsResult |
read(filePath, offset, limit) | read(filePath, offset, limit) | string → ReadResult |
readRaw(filePath) | readRaw(filePath) | FileData → ReadRawResult |
grepRaw(pattern, path, glob) | grep(pattern, path, glob) | GrepMatch[] | string → GrepResult |
globInfo(pattern, path) | glob(pattern, path) | FileInfo[] → GlobResult |
write(...) | write(...) | 未更改 (WriteResult) |
edit(...) | edit(...) | 未更改 (EditResult) |
类型重命名
| V1 类型 | V2 类型 |
|---|---|
BackendProtocol | BackendProtocolV2 |
SandboxBackendProtocol | SandboxBackendProtocolV2 |
适配实用工具
如果您有现有的 V1 后端需要在仅限 V2 的代码中使用,请使用适配函数框架会自动适配传递给
createDeepAgent() 的 V1 后端。只有在直接调用协议方法时才需要手动适配。将这些文档连接到 Claude、VSCode 等,以获得实时答案。

