useStream配置,请参考 Going to production 。
架构
此方案包含三个部分: :::python- 深度智能体与沙盒后端:智能体自动从沙盒获取文件系统工具(
read_file,write_file,edit_file,delete,execute)
:::
- 深度智能体与沙盒后端:智能体自动从沙盒获取文件系统工具(
read_file,write_file,edit_file,execute)自动
:::
2. 自定义API服务器——通过
langgraph.json的http.app字段暴露的FastAPI应用,提供前端可调用的文件浏览端点::: :::js
2. 自定义API服务器:通过
langgraph.json的http.app字段暴露的Hono应用,提供前端可调用的文件浏览端点:::
- 三面板前端:同步显示智能体修改的实时文件系统的文件树、代码/差异查看器和聊天面板
沙盒生命周期
设置沙盒存活时长和共享权限后再连接前端。关于线程作用域沙盒与助手作用域沙盒、异步图工厂配置、TTL行为及SDK调用示例,请参考Sandbox lifecycle。 本指南默认使用线程作用域沙盒。前端和自定义API服务器均通过LangGraph的threadID解析沙盒。这保持了会话隔离性,并在持久化线程ID后支持页面刷新重连到相同环境。 对于multi-tenant应用,应在后端工厂中按用户或助手范围作用域沙盒。对于无LangGraph线程的演示,通过API URL传递客户端生成的会话ID。该会话ID不跨浏览器会话持久化。连接智能体与API服务器
按执行环境描述配置深度智能体的sandbox backend。智能体自动获取文件系统工具和[Token]execute工具,无需额外工具配置。
构建此界面在生产力环境基础上增加要求:需要自定义API服务器,该服务器独立于智能体图运行,确保智能体后端和文件浏览路由为每个线程解析相同的沙盒。将沙盒ID存储在线程元数据中,并在两者间共享一个查找函数。
从线程元数据解析沙盒
:::js在共享模块定义
getOrCreateSandboxForThread。智能体图工厂和自定义API路由均导入此模块:
thread_id配置并传递解析后的后端到createDeepAgent:
类似 Going to production 的示例,智能体作为每个运行的异步图工厂。将沙盒ID存储在线程元数据中,使自定义
http.app 路由可调用相同的 getOrCreateSandboxForThread 辅助函数。Going to production在仅通过LangGraph SDK接入时使用提供者标签查找。初始化项目文件
运行前通过uploadFiles/upload_files上传启动文件。关于文件传输模式、提供者示例及同步记忆或技能到沙盒的说明,请参考File transfers。对于LangSmith沙盒,创建容器时传递sandbox snapshot的templateName。
添加文件浏览API
:::js智能体可读写文件,但前端需要直接访问沙盒文件系统。添加自定义Hono API服务器并通过
http.app字段在langgraph.json中暴露::: :::python
智能体可读写文件,但前端需要直接访问沙盒文件系统。添加自定义FastAPI API服务器并通过
http.app字段在langgraph.json中暴露:::
创建API服务器
沙盒API端点使用线程ID作为URL路径参数,确保前端始终访问当前会话对应的正确沙盒。使用与智能体后端相同的get_or_create_sandbox_for_thread(Python)或getOrCreateSandboxForThread(JavaScript)函数解析:
:::js
智能体后端和API服务器均调用相同的
get_or_create_sandbox_for_thread(Python)或 getOrCreateSandboxForThread(JavaScript)函数。这确保两者为同一线程解析相同的沙盒。沙盒ID在元数据中是唯一可信源,无需内存缓存。配置langgraph.json
注册智能体图和API服务器。http.app字段告知LangGraph平台同时服务默认路由和自定义路由。参考application structure和LangSmith Deployments获取完整的langgraph.json选项说明。
:::js
langgraph dev时,地址为http://localhost:2024。
在
http.app中定义的自定义路由具有优先级,高于默认的LangGraph路由。这意味着您可以通过覆盖内置端点实现特定需求,但需注意不要意外覆盖/threads或/runs等关键路由。构建前端界面
前端包含三个面板:文件树侧边栏、代码/差异查看器,以及聊天面板。它使用@
useStream处理智能体会话,并通过自定义API端点实现文件浏览功能。
对于生产环境部署,将apiUrl指向您的LangSmith 部署,并在每次运行时传递稳定的thread_id。相关配置请参考Going to production中的Frontend部分,其中也包含通过thread_id和运行时context调用智能体的示例。
线程创建
页面加载时创建LangGraph线程,并将线程ID持久化存储于sessionStorage,以便页面刷新后能重新连接到相同的沙盒环境:
文件状态管理
跟踪沙盒文件系统的两个快照:初始状态(智能体运行前)和实时更新状态。通过在API URL中包含线程ID,确保所有请求始终指向正确的沙盒环境:实时文件同步
IDE的核心体验在于智能体运行时即更新文件,而非在运行结束后。监听文件修改工具的ToolMessage消息实例。当write_file或edit_file工具调用完成时,刷新对应文件;当execute调用完成时,刷新所有文件(因 shell 命令可能修改任意文件):
检测修改文件
每次智能体运行前快照当前文件内容。文件更新后,通过对比快照识别修改的文件:显示差异
使用框架适配的差异库渲染统一格式差异:
示例(React使用
@pierre/diffs):
修改文件摘要
展示所有修改文件的行级增删计数,类似git status的概览视图:
用例
沙盒适用于以下场景:- 编程智能体需要可视化界面(超越纯聊天)
- 代码审查流程中智能体提出修改建议,用户需预览差异后再确认
- 教学/学习应用中AI助手分步指导项目构建,并实时展示修改上下文
- 原型工具中用户通过自然语言描述需求,实时观察智能体实现过程
最佳实践
前端特定建议:- 在
sessionStorage中持久化threadId,确保页面刷新后能重新连接到相同线程和沙盒环境。
-
在每次相关工具调用时同步文件,而非仅当运行结束时。监听
write_file、edit_file、delete、execute工具消息并立即刷新。
:::js -
在每次相关工具调用时同步文件,而非仅当运行结束时。监听
write_file、edit_file、execute工具消息并立即刷新。
::: - 修改文件默认展示差异视图。用户点击被智能体修改的文件时,优先展示差异视图——这才是他们关心的内容。
-
对只读操作显示紧凑结果。例如,替代在聊天中堆砌
read_file的完整输出,改用单行提示Read router.js L1-42。将完整输出保留给修改型工具。 -
过滤
node_modules在文件树中。用户不需要浏览数千个依赖文件,在获取文件树时过滤这些文件。
- 生产环境使用线程级沙盒。参考Sandbox lifecycle。
- 通过线程元数据共享沙盒解析结果,确保智能体后端与API服务器解析相同环境,避免内存缓存差异。
- 为沙盒预置真实项目。参考File transfers。
- 隔离敏感信息。使用sandbox auth proxy而非环境变量或文件上传处理API密钥。
- 添加运行前 guardrails。配置RAG、error handling、data privacy中间件约束自主编程智能体行为。
相关文档
Going to production
部署带持久化沙盒、认证、安全约束和生产
useStream设置的智能体Sandboxes
沙盒服务提供商、安全模型与文件传输API
Frontend overview
其他深度智能体UI模式:子智能体流式输出、待办清单、自定义状态
Application structure
完整
langgraph.json参考,包括自定义http.app路由相关LangChain指南
沙盒IDE基于LangChain前端核心模式。以下指南涵盖本页使用的相同useStream基础组件:
Tool calling
将文件操作和执行工具调用渲染为专用UI卡片,并安全展示结果。
Headless tools
在客户端运行浏览器/设备API,例如在IDE面板嵌入实时预览或终端输出。
Open-ended generative UI
渲染沙盒内应用预览和MCP生成的界面,扩展生成式UI的边界。
Join & rejoin streams
页面刷新后自动重新连接运行中的编程会话,不丢失沙盒状态。
官方原文:src/oss/deepagents/frontend/sandbox.mdx · 非官方翻译,译文由 AI 生成,以英文原文为准。