深度对比:AI Agent 沙箱执行 — AgentScope Runtime vs OpenAI Agents SDK
当 LLM 调用一个执行 Python 或 Shell 命令的工具时,谁来保护宿主机的安全?这个问题定义了每一个生产级 AI Agent 的架构。两个开源框架给出了截然不同的答案:阿里巴巴的 AgentScope Runtime,一个全栈的"Agent-as-a-Service"平台;以及 OpenAI 的 Agents SDK,一个在 v0.14.0 中刚刚加入沙箱支持的轻量库。我们翻出了它们的源码,搞清楚各自是如何隔离代码执行环境的——以及你该如何选择。
为什么沙箱至关重要
现代 AI Agent 早已不止于对话。它们执行代码、读取文件、启动浏览器、修补代码仓库。如果没有隔离机制,一次幻觉导致的 rm -rf / 或一次对抗性 prompt 注入就会演变成真正的安全事件。沙箱提供了这种隔离——而它们的实现方式,直接决定了系统的规模、安全性和开发体验。
AgentScope Runtime:生产级平台
AgentScope Runtime 是阿里云对生产环境 Agent 部署的答卷。其 README 列出了四项核心能力,第一条就是"Tool Sandboxing——工具调用在加固沙箱中运行"。该项目自 2025 年 8 月首次发布以来快速迭代,到 2026 年 2 月的 v1.1.0 已完成了重大架构重构,引入了分布式中断服务。
全景图:它是如何工作的
AgentScope Runtime 的 Agent 应用直接继承自 FastAPI——AgentApp(FastAPI)——这意味着它能原生集成整个 FastAPI 生态。当 Agent 需要执行工具时,流程经过一个 SandboxManager(1,921 行的编排代码)来管理容器生命周期:
- 获取:首先尝试从每种类型的预热池中取出一个容器。如果没有可用容器,则创建新容器。
- 配置:生成
session_id,创建挂载目录,通过secrets.token_hex(16)生成 32 字符十六进制SECRET_TOKEN,将挂载目录映射到容器内的/workspace。 - 生命周期:心跳系统每秒扫描一次。闲置超过 300 秒的会话会被自动回收。容器状态遵循正式的状态机:
WARM → RUNNING → RECYCLED → RELEASED。 - 执行:容器内运行 Nginx 反向代理前置 FastAPI 应用。每次对
/tools/run_ipython_cell或/tools/run_shell_command的请求都必须通过 Bearer token 验证——即每个会话独立的SECRET_TOKEN。
心跳扫描器使用的分布式锁基于 Redis SET NX EX 命令搭配 Lua 脚本实现原子释放——这是生产级方案,能防止多个 Worker 共享同一沙箱池时出现竞态条件。
状态机有明确定义的转换路径——从空闲池补充到运行中再到回收。心跳扫描器(每秒一次)在闲置 300 秒时自动触发 RUNNING → RECYCLED 转换。恢复路径可以将回收的容器重新上线,而 ERROR 状态会捕获来自任何活跃状态的崩溃或超时。
八种后端,统一抽象
这才是 AgentScope Runtime 真正的差异化优势。CONTAINER_DEPLOYMENT 环境变量可以选择 八种后端,每种都实现了相同的 BaseClient 接口:
| 后端 | 隔离级别 | 最佳场景 |
|---|---|---|
| Docker | 内核命名空间 | 本地开发、测试 |
| gVisor (runsc) | 用户态内核 | 高安全本地或单机部署 |
| BoxLite | 硬件虚拟化 VM | 可嵌入的高隔离(Apple Silicon) |
| Kubernetes | Pod 命名空间 | 生产编排 |
| Knative | 无服务器 Pod | 缩零工作负载 |
| Kruise | Sandbox CRD | K8s 专用沙箱资源 |
| Function Compute | 平台托管 | 阿里云无服务器计算 |
| AgentRun | 平台托管 | 阿里云托管运行时 |
gVisor 和 BoxLite 的适配器非常简洁——分别只有 38 行和一个轻量的 SDK 封装——展示了干净的抽象设计。Kruise 客户端通过 agents.kruise.io/v1alpha1/Sandbox 自定义资源定义(CRD)创建 Kubernetes 资源,把沙箱当作一等集群资源而非普通 Pod。
上面的热力图从五个维度对每种后端打分。BoxLite 在隔离性上取胜(硬件 VM),Docker 在启动速度和成本上占优。对于生产环境,Kubernetes 提供了最佳的扩展能力,代价是运维复杂度。最佳路径取决于你的威胁模型:本地开发用 Docker,CI 环境用 BoxLite(Apple Silicon),生产环境上 K8s/Knative。
七种沙箱类型
AgentScope Runtime 不只是沙箱化 Python。每种沙箱类型都有自己专用的 Docker 镜像和内部组件:
- BaseSandbox:Python + IPython 内核 + Shell 命令。主力沙箱。
- GuiSandbox:XFCE4 桌面 + Chromium + VNC 访问。面向 computer-use 类 Agent。
- BrowserSandbox:通过 VNC 暴露 Playwright MCP,20+ 浏览器操作方法。面向 Web 自动化。
- FilesystemSandbox:完整的文件操作(读写、编辑、搜索、目录树)以 API 暴露。
- MobileSandbox:Redroid Android 模拟,通过 ws-scrcpy 的 ADB 控制。需要特权模式。
- TrainingSandbox:BFCL/APPWorld 评估环境,用于基准测试。
- AgentbaySandbox:通过 AgentBay 云服务提供的纯云端沙箱,无需本地容器。
所有沙箱类型都有同步和异步两种变体。在嵌入式模式下,SandboxManager 在进程内运行;在远程模式下,所有操作通过 HTTP 代理到独立的 runtime-sandbox-server,使用 Bearer 认证。这种双模式架构意味着同一套代码可以在本地开发环境和远程 K8s 生产集群上运行。
部署理念
AgentScope Runtime 从底层为多租户设计。它使用基于 Redis 的会话存储(RedisSession),支持 OSS(阿里云对象存储)实现跨实例文件系统持久化,并通过 Compute Nest 一键部署到阿里云 ACK。框架适配器允许你用 AgentScope、LangGraph 或 Microsoft Agent Framework 编写 Agent,并通过同一运行时暴露——不过各框架的工具支持程度有所不同。
OpenAI Agents SDK:轻量库路线
如果 AgentScope Runtime 是一个部署平台,那 OpenAI Agents SDK 就是一个你可以组合进自己技术栈的库。25,914 个 GitHub Star、3,964 个 Fork,社区采用量远超前者,发布也只早了两个月(2025 年 3 月)。
Sandbox Agent:架构哲学
Sandbox Agent 在 v0.14.0 中落地,贯彻了一个清晰的架构原则:将 Agent 定义与传输解耦。SandboxAgent 类继承自 Agent,增加了五个沙箱专属字段——default_manifest、base_instructions、capabilities、run_as 和一个内部并发锁——但完全不包含关于如何获取沙箱的信息。这些信息存在于 RunConfig(sandbox=SandboxRunConfig(...)) 中,在执行时传入。这意味着同一个 Agent 定义可以在本地文件系统、Docker 或 E2B 上运行,无需修改 Agent 代码。
Manifest:声明式工作空间布局
Manifest 模型是 OpenAI 沙箱设计的核心。它是一个声明式的工作空间契约,描述了会话启动时应该有哪些文件:
agent = SandboxAgent(
name="Workspace Assistant",
instructions="Inspect the sandbox workspace before answering.",
default_manifest=Manifest(
entries={
"repo": GitRepo(repo="openai/openai-agents-python", ref="main"),
}
),
)
Entry 系统具有深度的多态设计。File、Dir、LocalFile、LocalDir、GitRepo 和 Mount 子类都继承自 BaseEntry,Pydantic 的判别字段 type 自动处理反序列化。添加 GitRepo entry 时,SDK 会在沙箱内 clone 该仓库。每个 entry 携带 Permissions(owner/group/other 的 READ/WRITE/EXEC 标志位)、User 和 Group 元数据,在文件配置完成后在沙箱内应用。
这种多态设计使得整个技术栈都能进行 JSON 往返序列化:同样的 Pydantic type 判别字段模式被用于 entry、沙箱客户端选项和会话状态序列化。添加新的 entry 类型只需继承 BaseEntry 并赋予唯一的 type 值——注册过程自动完成。
会话生命周期:深入且精心设计
BaseSandboxSession 抽象类(1,167 行)是一个完整的工作空间操作系统。它提供:
- 进程执行:
exec(*command, timeout, shell, user)带 shell 包装(sh -lc)、超时强制和用户身份模拟 - 文件 I/O:
read(path)、write(path, data)带访问权限检查 - 目录操作:
mkdir、rm、ls - 持久化:
persist_workspace()和hydrate_workspace(data)实现基于 tar 的快照 - 交互式 PTY:
pty_exec_start()、pty_write_stdin()、pty_terminate_all()支持长时间运行的交互式进程 - 可观测性:所有操作通过
SandboxSession包装层加上事件发射和 tracing span
SandboxRuntimeSessionManager(959 行)以清晰的优先级链处理会话解析:session=(显式注入)→ RunState 沙箱数据 → session_state= → 全新创建。恢复密钥按 Agent 名称而非实例分配,因此 Agent 间的交接(handoff)能保留同一个沙箱会话。
能力组合模式
OpenAI 不使用固定的工具集,而是采用可组合的能力(Capability)模式。默认集合——Capabilities.default()——为每个沙箱 Agent 提供开箱即用的 Filesystem()、Shell() 和 Compaction()。能力可以添加工具、指令甚至 Manifest entry。它们每次运行时被克隆,因此一次执行的状态不会泄露到下一次。扩展方式是通过继承 Capability 子类并添加能绑定到活跃沙箱会话的自定义工具。
macOS Seatbelt:隐藏的安全宝石
最有趣的安全细节在 UnixLocalSandboxClient 中。在 macOS 上,本地沙箱会话中执行的每一条命令都经过 sandbox-exec -p <profile> 运行,使用 deny-by-default 的 Seatbelt 策略文件。该策略显式允许的路径仅限于:工作空间根目录、/usr/bin、/usr/lib、/bin、/System 以及配置的 extra_path_grants。它显式拒绝 /Users、/Applications、/Library、/etc、/var、/opt、/tmp 和 /private/*——这是一个远超简单进程隔离的实质性安全边界。
在 Docker 模式下,容器隔离承担了这一层的职责。
扩展生态
OpenAI 将沙箱客户端设计为抽象接口(BaseSandboxClient),社区已经积极响应。Vercel、Runloop、Modal、E2B、Daytona、Cloudflare 和 Blaxel 的扩展都已被贡献,每个都在自己的基础设施上实现了 create()、delete() 和 resume()。
正面对比
| 维度 | AgentScope Runtime | OpenAI Agents SDK |
|---|---|---|
| Star 数 | 766 | 25,914 |
| 许可证 | Apache-2.0 | MIT |
| 核心定位 | 部署平台 | 可组合库 |
| 沙箱后端 | 8 种(Docker, gVisor, BoxLite, K8s, Knative, Kruise, FC, AgentRun) | 2 种 + 7 个社区扩展 |
| 沙箱类型 | 7 种专用类型(Base, GUI, Browser, FS, Mobile, Training, Cloud) | 1 种统一会话(能力组合出不同功能) |
| 会话管理 | 内置 Redis、容器池、心跳、自动回收 | SDK 托管生命周期或开发者自管 |
| 多租户 | 原生支持,会话级隔离 | 由开发者集成 |
| 可观测性 | 内置日志和追踪 | 内置追踪(OpenAI 控制台) |
| 生产路径 | 一键部署阿里云 ACK | 自建基础设施或社区后端 |
| 框架适配 | AgentScope, LangGraph, MS Agent Framework, Agno | 单一 SDK(通过 any-llm/LiteLLM 跨提供商) |
| 入口 | AgentApp(FastAPI 子类) |
Runner.run() 或 Runner.run_sync() |
何时选择哪个
选择 AgentScope Runtime 的情况:
- 你需要一个全栈 Agent 部署平台,自带会话管理、连接池和多租户
- 你的基础设施在阿里云上,或你想要托管的 Kubernetes 体验
- 你需要 GUI、浏览器、文件系统或移动端沙箱——而不仅仅是代码执行
- 你在构建一个内部 Agent 平台,多个团队将在上面开发
- 你想要预热容器池和自动扩缩容,不想自己造轮子
选择 OpenAI Agents SDK 的情况:
- 你需要一个轻量库,组合进你现有的基础设施中
- 你已经有了部署方案,只需要沙箱化代码执行
- 你重视更大的社区(25k+ Star)和扩展生态
- 你需要跨提供商 LLM 访问(通过 any-llm/LiteLLM 支持 100+ 模型)
- 你需要在 macOS 上开发(Seatbelt 是本地测试时的独特优势)
最佳交汇点:如果你在 macOS 上本地原型开发 Agent,使用 OpenAI Agents SDK 配合 UnixLocalSandboxClient——Seatbelt 沙箱在开发阶段提供真实的隔离。当你需要生产部署(多租户 + 容器池)时,AgentScope Runtime 提供了开箱即用的方案。
我们还没看到的东西
两个框架目前都不支持 WebAssembly 沙箱化(如 Extism 或 wasmtime),后者能提供近乎即时的启动和跨语言执行。OpenAI 的方案可能较容易通过 BaseSandboxClient 接口添加 WASM 客户端。AgentScope Runtime 基于容器的架构使 WASM 集成不太自然,但通过现有的隔离层反而更安全。
两个框架都会受益于标准化的沙箱安全声明(sandbox security attestation)——某些东西能告诉部署者,某个后端到底提供了什么样的隔离保证。今天,你必须读源码才能知道 gVisor 使用用户态内核,而 BoxLite 使用硬件虚拟化。
结语
AI Agent 的沙箱正在从一个细分关注点演变为核心架构决策。AgentScope Runtime 和 OpenAI Agents SDK 代表了两种哲学:构建完整平台 vs 提供可组合原语。两者都是开源的,都运行在 Python 3.10+ 上,都在过去 24 小时内有活跃提交。正确的选择取决于你需要的是一个部署平台还是一个库——但无论选哪个,沙箱执行正在成为生产级 AI Agent 的入场券。
资料来源
所有分析基于 2026 年 5 月 6 日的源码直接阅读和官方文档。
AgentScope Runtime:
- 仓库:https://github.com/agentscope-ai/agentscope-runtime (Apache-2.0, ⭐766)
- 文档:https://runtime.agentscope.io/
- 重点阅读的源文件:
src/agentscope_runtime/sandbox/manager/sandbox_manager.py— SandboxManager (1,921 行),容器生命周期编排src/agentscope_runtime/sandbox/manager/heartbeat_mixin.py— 心跳扫描器,Redis SETNX 分布式锁,自动回收src/agentscope_runtime/sandbox/box/sandbox.py— SandboxBase,双模式架构(嵌入式/远程)src/agentscope_runtime/sandbox/box/base/— BaseSandbox,run_ipython_cell、run_shell_commandsrc/agentscope_runtime/sandbox/box/gui/、browser/、filesystem/、mobile/— 各类专用沙箱 Dockerfilesrc/agentscope_runtime/common/container_clients/docker_client.py— DockerClient(端口范围 49152-59152)src/agentscope_runtime/common/container_clients/gvisor_client.py— GVisorDockerClient(38 行,runtime=runsc)src/agentscope_runtime/common/container_clients/boxlite_client.py— BoxliteClient(硬件 VM 隔离)src/agentscope_runtime/common/container_clients/kubernetes_client.py、knative_client.py、kruise_client.py— K8s/Knative/Kruise 后端src/agentscope_runtime/sandbox/shared/app.py— 容器内 FastAPI 应用(Nginx + Uvicorn + Token 认证)src/agentscope_runtime/engine/__init__.py— AgentApp(继承自 FastAPI)
OpenAI Agents SDK:
- 仓库:https://github.com/openai/openai-agents-python (MIT, ⭐25,914)
- 文档:https://openai.github.io/openai-agents-python/
- 重点阅读的源文件:
src/agents/sandbox/sandbox_agent.py— SandboxAgent(继承 Agent),并发保护锁src/agents/sandbox/manifest.py— Manifest 模型,声明式工作空间契约src/agents/sandbox/entries/base.py、artifacts.py— BaseEntry 多态,File/Dir/LocalFile/LocalDir/GitReposrc/agents/sandbox/session/base_sandbox_session.py— BaseSandboxSession (1,167 行),exec/read/write/pty/snapshotsrc/agents/sandbox/session/sandbox_session.py— SandboxSession 可观测性包装层src/agents/sandbox/session/sandbox_client.py— BaseSandboxClient 抽象接口src/agents/sandbox/sandboxes/unix_local.py— UnixLocalSandboxClient,macOS Seatbelt(sandbox-exec deny-by-default)src/agents/sandbox/sandboxes/docker.py— DockerSandboxClient,volume 挂载、端口映射src/agents/sandbox/runtime.py— SandboxRuntime,连接 Runner 与沙箱会话src/agents/sandbox/runtime_session_manager.py— RuntimeSessionManager (959 行),会话解析优先级链src/agents/sandbox/capabilities/capabilities.py— Capabilities.default():Filesystem + Shell + Compactionextensions/sandbox/— 社区扩展:Vercel、Runloop、Modal、E2B、Daytona、Cloudflare、Blaxel