概览
智能体使用记忆和执行环境中的信息来完成任务。 在生产环境中,有几个基本概念决定了信息如何被共享和访问:- 线程(Thread):单次对话。消息历史和临时文件默认限定在线程范围内,不会跨线程延续。
- 用户(User):与智能体交互的人。记忆和文件可以是用户私有的,也可以跨用户共享。身份和授权来自你的认证层。
- 助手(Assistant):已配置的智能体实例。记忆和文件可以绑定到一个助手,也可以跨所有助手共享。
- LangSmith Deployments:带有认证、webhook 和定时任务的托管基础设施
- 生产注意事项:多租户、认证、凭证、异步和持久性
- 记忆:跨对话持久化信息
- 执行环境:文件存储和代码执行
- 护栏:速率限制、错误处理和数据隐私
- 前端:将 UI 连接到已部署的智能体
LangSmith Deployments

deepagents deploy,它打包你的智能体配置并通过一条命令将其部署为 LangSmith Deployment。或者,你也可以直接配置 LangSmith Deployment。任何一种方式都会为你的智能体预置所需的基础设施:助手、线程、运行、存储和检查点器,因此你无需自己设置。它还开箱即用地提供认证、webhook、定时任务和可观测性,并可通过 MCP 或 A2A 暴露你的智能体。
有关基于 CLI 的方法,请参阅使用 CLI 部署。有关手动设置,请参阅 LangSmith Deployments 快速入门。
除非另有说明,本页面上的所有代码片段都使用以下 langgraph.json:
langgraph.json
langgraph.json 是告诉 LangGraph 平台如何构建和运行你的应用程序的配置文件。它位于项目根目录,本地开发(使用 langgraph dev)和生产部署都需要它。关键字段包括:
有关完整的配置选项(自定义 Docker 步骤、存储索引、认证处理器等),请参阅应用结构。
生产注意事项
多租户
当你的智能体服务多个用户时,你需要处理三个关注点:验证每个用户的身份、控制他们能访问什么,以及管理智能体代表用户使用的凭证。
用户身份和访问控制
LangSmith Deployments 支持自定义认证来建立用户身份,以及授权处理器来控制对线程、助手和存储命名空间等资源的访问。授权处理器在认证成功后运行,可以:- 用所有权元数据标记资源(例如
owner: user_id) - 返回过滤器,使用户只能看到自己的资源
- 对未授权操作返回 HTTP 403 拒绝访问
团队访问控制 (RBAC)
LangSmith 的基于角色的访问控制管理你团队中谁可以部署、配置和监控智能体。这与上述的终端用户授权是分开的。
企业版提供具有细粒度权限的自定义角色。有关完整的权限模型,请参阅 RBAC 参考。
终端用户凭证
当你的智能体需要代表用户调用外部 API(例如读取他们的 GitHub 仓库、发送 Slack 消息、查询他们的数据仓库)时,你需要一种将用户凭证传递给智能体的方式,而不是硬编码它们。 通过 Agent Auth 的 OAuth。 Agent Auth 提供托管的 OAuth 2.0 流程。配置 OAuth 提供商,智能体即可请求限定到每个用户的 Token。首次使用时,智能体会中断执行并呈现 OAuth 同意 URL。用户认证后,智能体以有效 Token 恢复执行。Token 会自动存储和刷新。异步
基于大语言模型(LLM)的应用是高度 I/O 密集型的:调用语言模型、数据库和外部服务。异步编程让这些操作可以并发运行而非阻塞,提高吞吐量和响应能力。LangChain 遵循在异步方法名前加
a 前缀的约定(例如 ainvoke、abefore_agent、astream)。同步和异步变体位于同一个类或命名空间中。- 创建异步工具。 LangChain 在单独的线程中运行同步工具以避免阻塞,但原生异步完全避免了线程开销。
- 使用异步中间件方法。 自定义中间件应实现异步钩子(例如
abefore_agent而非before_agent)。 - 对外部资源生命周期使用异步。 创建沙箱或连接 MCP 服务器涉及网络调用,应使用 await。这就是为什么预置这些资源的图工厂是异步的。
持久性
深度智能体运行在 LangGraph 上,它开箱即用地提供持久执行。持久化层在每一步都会创建检查点,因此被故障、超时或人机协作暂停中断的运行会从上次记录的状态恢复,无需重新处理之前的步骤。对于产生大量子智能体的长时间运行深度智能体,这意味着中途故障不会丢失已完成的工作。
- 无限期中断。 人机协作工作流可以暂停几分钟或几天,然后从中断的位置精确恢复。
- 时间旅行。 每个检查点步骤都是一个快照,你可以回退到该状态,如果出现问题可以从早期状态重放。
- 安全处理敏感操作。 对于涉及支付或其他不可逆操作的工作流,检查点提供了审计追踪和恢复点,可以检查导致操作的确切状态。
记忆
没有记忆,每次对话都从头开始。记忆让你的智能体能在对话之间保留信息(用户偏好、学到的指令、过往经验),从而随时间个性化其行为。有关记忆类型的概述,请参阅记忆概念指南。
范围划定
记忆始终跨对话持久化。主要问题是它如何在用户和助手边界之间划定范围。正确的范围取决于谁应该查看和修改数据:配置
在深度智能体中,记忆作为文件存储在虚拟文件系统中。默认情况下,文件限定在单个线程(对话)范围内,不跨线程共享。要跨线程共享记忆,请将/memories/ 等路径路由到写入 LangGraph Store 的 StoreBackend。使用 CompositeBackend 为智能体提供线程范围的临时空间和跨线程的长期记忆。
下面显示的
rt.server_info 和 rt.execution_info 命名空间模式需要 deepagents>=0.5.0。- 用户(推荐)
- 助手
- 用户
- 组织
按
user_id 划分命名空间。每个用户获得自己的私有记忆。这是推荐的默认方式,因为大多数应用程序部署单个助手。agent.py
执行环境
在本地,智能体可以在磁盘上读写文件并直接运行 shell 命令。在生产环境中,你需要考虑隔离和持久化。正确的设置取决于你的智能体是否需要执行代码:- 文件系统后端——如果你的智能体只需要读写文件就够了。选择一个匹配你持久化需求的后端:线程范围的临时空间、跨线程存储,或两者的混合。
- 沙箱——添加一个带有
execute工具的隔离容器来运行 shell 命令。如果你的智能体需要运行代码、安装包或执行文件 I/O 以外的操作,请使用沙箱。
文件系统
根据需要持久化的内容选择后端:- StateBackend(默认):线程范围的临时空间。文件通过检查点器在线程内的各轮之间持久化,但不跨线程共享。每一步都会创建检查点,因此避免写入大文件。
- StoreBackend:跨对话存活的跨线程存储。使用命名空间工厂划定范围。
- CompositeBackend:混合两者。默认为线程范围的临时空间,为
/memories/等特定路径提供跨线程路由。
沙箱
如果你的智能体需要运行代码(不仅仅是读写文件),请使用沙箱。沙箱提供文件系统和用于在隔离容器中运行 shell 命令的execute 工具。这种隔离也保护你的主机:如果智能体的代码耗尽内存或崩溃,只有沙箱受到影响。你的服务器继续运行。
生命周期
关键决策是沙箱的存活时间。每次对话获得一个全新的沙箱,还是对话共享一个持久环境?以下示例使用异步图工厂而非静态图,因为沙箱需要
thread_id 或 assistant_id 来查找或创建正确的沙箱。图工厂不接收完整的 Runtime(没有 server_info 或 execution_info);而是接受 RunnableConfig 并从 config["configurable"] 读取 thread_id 和 assistant_id。工厂是异步的,因为沙箱创建是一个 I/O 密集型操作,需要仅在调用时可用的每次运行信息。- 线程范围(最常见)
- 助手范围
agent 变量是异步函数(不是已编译的图),服务器将其视为图工厂并在每次运行时调用它,注入配置。工厂通过提供商基于标签的搜索查找或创建沙箱,并返回连接到该沙箱的新智能体图。
使用 langgraph deploy 部署后,使用 SDK 从应用程序代码调用智能体。客户端代码无论范围如何都是相同的。范围完全在上面的智能体工厂中处理,但行为不同:
- 线程范围
- 助手范围
每个线程获得自己的沙箱。同一线程内的后续消息复用同一个沙箱,但新线程总是以没有之前对话遗留文件或已安装包的干净环境开始。
client.py
文件传输
沙箱是隔离容器,因此你的应用程序代码无法直接访问其中的文件。使用upload_files() 和 download_files() 在沙箱边界之间移动数据:
- 在智能体运行前为沙箱准备数据:上传用户文件、技能脚本、配置或持久化记忆,使智能体从一开始就拥有所需的内容
- 在智能体完成后检索结果:下载生成的产物(报告、图表、导出文件)并将更新的记忆同步回去以供未来对话使用
示例:使用自定义中间件同步技能和记忆
示例:使用自定义中间件同步技能和记忆
管理秘密
沙箱是隔离容器,因此你主机上的环境变量在其中不可用。有两种方式为沙箱代码提供 API 密钥和其他秘密: 认证代理(推荐)。 沙箱认证代理拦截来自沙箱的出站请求并自动注入认证头。沙箱代码正常调用外部 API,代理根据目标主机添加正确的凭证。这意味着 API 密钥永远不会出现在沙箱代码、环境变量或日志中。
${SECRET_KEY} 引用在 LangSmith 工作区设置中存储的秘密进行解析。在创建引用它们的模板之前,请先在那里配置秘密。
工作区秘密。 对于不需要基于代理注入的 API 密钥(例如智能体服务器本身使用的密钥,而非沙箱代码),将它们存储为 LangSmith 中的工作区秘密。这些作为环境变量在工作区中所有智能体的运行时可用。
护栏
生产中的智能体自主运行,这意味着它们可能无限循环、触及速率限制,或处理包含敏感信息的用户数据。深度智能体提供两层保护:- 权限:声明式的允许/拒绝规则,控制智能体可以读取或写入哪些文件和目录。使用权限将智能体限制在工作目录内、保护敏感文件或强制只读记忆。
- 中间件:包装模型和工具调用的钩子,用于速率限制、错误处理和数据隐私。

速率限制
这里的速率限制指的是限制智能体在运行中自身的大语言模型(LLM)和工具使用量,而非入站请求的 API 网关速率限制。 没有限制,困惑的智能体可能在几分钟内通过循环相同的工具调用或进行数百次模型调用耗尽你的大语言模型(LLM)API 预算。对每次运行中的模型调用和工具执行都设置上限:run_limit 限制单次调用中的调用数(每轮重置)。使用 thread_limit 限制整个对话中的调用数(需要检查点器)。参阅 ModelCallLimitMiddleware 和 ToolCallLimitMiddleware 了解完整配置。
处理错误
不是所有错误都应该以相同方式处理。瞬时故障(网络超时、速率限制)应自动重试。大语言模型(LLM)可以恢复的错误(错误的工具输出、解析失败)应反馈给模型。需要人工输入的错误应暂停智能体。有关完整分类和代码示例,请参阅适当处理错误。 中间件处理瞬时情况。模型调用和工具调用各自有带有指数退避的重试中间件。如果你的主要模型提供商完全宕机,回退中间件会切换到替代方案:read_file 失败不会因重试而受益,但超时的网络搜索可能会。参阅 ModelRetryMiddleware 和 ModelFallbackMiddleware 了解完整配置。
数据隐私
如果你的智能体处理可能包含邮箱、信用卡号或其他 PII 的用户输入,你可以在它到达模型或存入日志之前检测和处理它:redact(替换为 [REDACTED_EMAIL])、mask(部分遮盖如 ****-****-****-1234)、hash(确定性哈希)和 block(抛出错误)。你也可以为领域特定的模式编写自定义检测器。
参阅 PIIMiddleware 了解完整配置。
有关可用中间件的完整列表,请参阅预置中间件。
前端
深度智能体使用useStream 将 UI 连接到智能体后端。useStream 是一个前端钩子(适用于 React、Vue、Svelte 和 Angular),可从智能体实时流式传输消息、子智能体进度和自定义状态。
在本地,useStream 指向 http://localhost:2024。在生产环境中,将其指向你的 LangSmith Deployment 并配置重连,使用户在连接断开时不会丢失进度。
reconnectOnMount 自动接续正在进行的运行。如果用户在智能体工作时刷新页面,他们会看到它继续执行而非空白屏幕。fetchStateHistory 加载线程的完整对话历史,使返回的用户能看到之前的消息。
对于产生大量子智能体的深度智能体工作流,在提交时设置较高的 recursionLimit 以避免截断长时间运行的执行:
连接这些文档 到 Claude、VSCode 等工具,通过 MCP 获取实时解答。

