概述
智能体利用来自内存和其执行环境的信息来完成任务。在生产环境中,有几个基本原语决定了信息如何被共享和访问:- 线程:一次单独的对话。消息历史和临时文件默认限定在线程范围内,不会跨线程延续。
- 用户:与您的智能体交互的人。内存和文件可以对某个用户私有,或跨用户共享。身份验证和授权来自您的 认证层。
- 助手:一个配置好的智能体实例。内存和文件可以绑定到某个助手,或在所有助手间共享。
- LangSmith 部署:提供认证、Webhook 和定时任务的托管基础设施
- 生产环境考量:调用、多租户、认证、凭据、异步和持久性
- 内存:跨对话持久化信息
- 执行环境:文件存储和代码执行
- 防护措施:权限和数据隐私
- 前端:将您的 UI 连接到已部署的智能体
LangSmith 部署
将深度智能体投入生产的推荐路径是 托管深度智能体,这是一个 CLI 优先的托管运行时,用于在 LangSmith 中创建、运行和操作深度智能体。托管深度智能体目前处于私密预览阶段(加入等待列表)。对于需要自定义应用代码、自定义路由、高级认证的团队,您可以直接配置 LangSmith 部署。这两种方式都会为您的智能体配置所需的基础设施:线程、运行、存储和检查点器,因此您无需自行设置这些。传统的 LangSmith 部署还开箱提供 认证、Webhook、定时任务 和 可观测性,并可以通过 MCP 或 A2A 暴露您的智能体。
除非另有说明,本页的所有代码片段都使用以下的 langgraph.json 文件:
langgraph.json
langgraph.json 是配置文件,它告诉 LangGraph 平台如何构建和运行您的应用程序。它位于项目根目录,对于本地开发(使用 langgraph dev)和生产部署都是必需的。关键字段包括:
有关完整的配置选项(自定义 Docker 步骤、存储索引、认证处理器等),请参阅 应用程序结构。
生产环境考量
调用智能体
在生产环境中,每次调用都应携带两个运行级别的参数:thread_id(通过config={"configurable": {"thread_id": ...}}传递):对话的稳定标识符。检查点器 使用它来持久化和恢复消息历史,因此后续轮次可以继续同一对话。生成新的thread_id以开始新的对话。context:您的工具和中间件在调用时读取的每次运行数据,例如user_id、API 密钥、功能标志或会话元数据。使用context_schema定义其形状,并通过runtime.context访问它。参见 运行时上下文。
thread_id 传递给每次运行:
多租户
当您的智能体为多个用户提供服务时,您需要处理三个问题:验证每个用户是谁,控制他们可以访问什么,以及管理智能体用于代表他们行事的凭据。
用户身份与访问控制
LangSmith 部署 支持 自定义认证 来建立用户身份,并支持 授权处理器 来控制对线程、助手和存储命名空间等资源的访问。授权处理器在认证成功后运行,可以:- 使用所有权元数据标记资源(例如,
owner: user_id) - 返回过滤器,使用户只能看到自己的资源
- 拒绝未经授权的操作并返回 HTTP 403
团队访问控制 (RBAC)
LangSmith 的基于角色的访问控制管理团队中谁可以部署、配置和监控智能体。这与上述的最终用户授权是分开的。
企业版计划提供具有细粒度权限的自定义角色。有关完整的权限模型,请参阅 RBAC 参考。
最终用户凭据
当您的智能体需要代表用户调用外部 API 时(例如,读取他们的 GitHub 仓库、发送 Slack 消息、查询他们的数据仓库),您需要一种方式将用户的凭据传递给智能体,而无需硬编码。 通过代理认证进行 OAuth。 代理认证提供托管的 OAuth 2.0 流程。配置一个 OAuth 提供商,智能体就可以请求限定于每个用户的令牌。首次使用时,智能体会中断执行并显示一个 OAuth 同意 URL。用户完成认证后,智能体将使用有效的令牌恢复执行。令牌会自动存储和刷新。异步
基于 LLM 的应用程序在 I/O 方面非常密集:调用语言模型、数据库和外部服务。异步编程允许这些操作并发运行而不是阻塞,从而提高吞吐量和响应能力。LangChain 遵循在异步方法名前加
a 的约定(例如 ainvoke、abefore_agent、astream)。同步和异步变体位于同一个类或命名空间中。- 创建异步工具。 LangChain 在单独的线程中运行同步工具以避免阻塞,但原生异步可以完全避免线程开销。
- 使用异步中间件方法。 自定义中间件应实现异步钩子(例如,使用
abefore_agent而不是before_agent)。 - 对资源生命周期使用异步。 创建沙箱或连接到 MCP 服务器涉及网络调用,应该被
await。这就是为什么提供这些资源的图工厂是异步的。
持久性
深度智能体运行在 LangGraph 上,LangGraph 开箱即用地提供了持久化执行。持久化层在每个步骤检查点状态,因此因故障、超时或人在回路暂停而中断的运行可以从其最后记录的状态恢复,而无需重新处理之前的步骤。对于运行时间较长、生成许多子智能体的深度智能体来说,这意味着运行中的故障不会丢失已完成的工作。
检查点功能还实现了:
- 无限期的中断。 人在回路的工作流可以暂停数分钟或数天,并精确地从离开的地方恢复。
- 时间旅行。 每个检查点步骤都是一个快照,您可以回退到该快照,如果出现问题,可以从更早的状态重放。
- 安全处理敏感操作。 对于涉及支付或其他不可逆操作的工作流,检查点提供了审计跟踪和恢复点,可以检查导致操作的确切状态。
内存
没有内存,每次对话都从零开始。内存使您的智能体能够跨对话保留信息(用户偏好、学到的指令、过往经验),从而可以随时间个性化其行为。有关内存类型的概述,请参阅内存概念指南。
范围界定
内存始终在对话之间是持久的。主要问题是它如何在用户和助手边界之间界定范围。正确的范围取决于谁应该看到和修改数据:配置
在深度智能体中,内存作为文件存储在虚拟文件系统中。默认情况下,文件限定于单个线程(对话)并且不会在线程间共享。 否则,要跨线程共享内存,请将像/memories/ 这样的路径路由到写入 LangGraph 存储的 StoreBackend。使用 CompositeBackend 可以为智能体同时提供线程作用域的临时空间和跨线程的长期内存。
下面显示的
rt.server_info 和 rt.execution_info 命名空间模式需要 deepagents>=0.5.0。- 用户(推荐)
- 助手
- 用户
- 组织
按
user_id 划分命名空间。每个用户都有自己私有的内存。这是推荐的默认设置,因为大多数应用程序部署单个助手。agent.py
执行环境
在本地,智能体可以直接在磁盘上读写文件并运行 shell 命令。在生产环境中,您需要考虑隔离和持久性。正确的设置取决于您的智能体是否需要执行代码:- 如果您的智能体只需要读写文件,文件系统后端就足够了。选择一个符合您持久性需求的后端:线程作用域的临时空间、跨线程存储,或两者兼有。
- 沙箱添加一个隔离的容器,带有用于运行 shell 命令的
execute工具。如果您的智能体需要运行代码、安装包或进行文件 I/O 之外的任何操作,请使用沙箱。
文件系统
根据需要持久化的内容选择后端:- StateBackend(默认):线程作用域的临时空间。文件通过检查点器在线程内的轮次之间持久化,但不在线程间共享。在每个步骤进行检查点,因此避免写入大文件。
- StoreBackend:跨线程存储,在对话间保留。使用命名空间工厂进行范围界定。
-
CompositeBackend:混合两者。默认为线程作用域的临时空间,并为特定路径(如
/memories/)设置跨线路由。 -
ContextHubBackend:LangSmith Hub 仓库(owner/name或name)中的持久化文件。当您想要 LangSmith 原生持久化而不需配置单独的 LangGraph 存储时使用。
沙箱
如果您的智能体需要运行代码(而不仅仅是读写文件),请使用沙箱。沙箱既提供文件系统,也提供用于运行 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 中。这些密钥作为环境变量在运行时可用于工作区中的所有智能体。
防护措施
生产环境中的智能体是自主运行的,这意味着它们可能无限循环、达到速率限制或处理包含敏感信息的用户数据。深度智能体提供两层保护:- 权限:声明式的允许/拒绝规则,控制智能体可以读取或写入哪些文件和目录。
- 容错性:速率限制、重试、回退和错误处理。
- 数据隐私:在数据到达模型或存储在日志中之前检测和处理个人身份信息 (PII) 的中间件。
权限
权限是声明式的允许/拒绝规则,控制智能体可以读取或写入哪些文件和目录。使用权限将智能体隔离到工作目录、保护敏感文件或强制执行只读内存。规则按声明顺序评估,第一个匹配的规则生效。容错性
有关速率限制、重试、回退和错误处理,请参阅容错性。数据隐私
如果您的智能体处理的用户输入可能包含电子邮件、信用卡号码或其他个人身份信息 (PII),您可以在数据到达模型或存储在日志中之前检测和处理它:redact(替换为 [REDACTED_EMAIL])、mask(部分屏蔽,如 ****-****-****-1234)、hash(确定性哈希)和 block(引发错误)。您也可以为特定领域的模式编写自定义检测器。
有关完整的配置,请参阅 PIIMiddleware。
有关默认的深度智能体中间件栈,请参阅自定义。有关额外的 LangChain 预构建中间件(重试、回退、PII 检测等),请参阅预构建中间件。
前端
深度智能体使用useStream 将您的 UI 连接到智能体后端。useStream 是一个前端钩子(适用于 React、Vue、Svelte 和 Angular),可以实时从您的智能体流式传输消息、子智能体进度和自定义状态。
在本地,useStream 指向 http://localhost:2024。在生产环境中,将其指向您的 LangSmith 部署 并配置重连,以便用户在连接中断时不会丢失进度。
recursionLimit 以避免截断长时间运行的执行:
Connect these docs to Claude, VSCode, and more via MCP for real-time answers.

