ai官小西

深度对比: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 行的编排代码)来管理容器生命周期:

  1. 获取:首先尝试从每种类型的预热池中取出一个容器。如果没有可用容器,则创建新容器。
  2. 配置:生成 session_id,创建挂载目录,通过 secrets.token_hex(16) 生成 32 字符十六进制 SECRET_TOKEN,将挂载目录映射到容器内的 /workspace
  3. 生命周期:心跳系统每秒扫描一次。闲置超过 300 秒的会话会被自动回收。容器状态遵循正式的状态机:WARM → RUNNING → RECYCLED → RELEASED
  4. 执行:容器内运行 Nginx 反向代理前置 FastAPI 应用。每次对 /tools/run_ipython_cell/tools/run_shell_command 的请求都必须通过 Bearer token 验证——即每个会话独立的 SECRET_TOKEN

心跳扫描器使用的分布式锁基于 Redis SET NX EX 命令搭配 Lua 脚本实现原子释放——这是生产级方案,能防止多个 Worker 共享同一沙箱池时出现竞态条件。

Container Lifecycle FSM

状态机有明确定义的转换路径——从空闲池补充到运行中再到回收。心跳扫描器(每秒一次)在闲置 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。

Backend Isolation Heatmap

上面的热力图从五个维度对每种后端打分。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_manifestbase_instructionscapabilitiesrun_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 系统具有深度的多态设计。FileDirLocalFileLocalDirGitRepoMount 子类都继承自 BaseEntry,Pydantic 的判别字段 type 自动处理反序列化。添加 GitRepo entry 时,SDK 会在沙箱内 clone 该仓库。每个 entry 携带 Permissions(owner/group/other 的 READ/WRITE/EXEC 标志位)、UserGroup 元数据,在文件配置完成后在沙箱内应用。

Manifest Entry Polymorphism

这种多态设计使得整个技术栈都能进行 JSON 往返序列化:同样的 Pydantic type 判别字段模式被用于 entry、沙箱客户端选项和会话状态序列化。添加新的 entry 类型只需继承 BaseEntry 并赋予唯一的 type 值——注册过程自动完成。

会话生命周期:深入且精心设计

BaseSandboxSession 抽象类(1,167 行)是一个完整的工作空间操作系统。它提供:

  • 进程执行exec(*command, timeout, shell, user) 带 shell 包装(sh -lc)、超时强制和用户身份模拟
  • 文件 I/Oread(path)write(path, data) 带访问权限检查
  • 目录操作mkdirrmls
  • 持久化persist_workspace()hydrate_workspace(data) 实现基于 tar 的快照
  • 交互式 PTYpty_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_command
    • src/agentscope_runtime/sandbox/box/gui/browser/filesystem/mobile/ — 各类专用沙箱 Dockerfile
    • src/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.pyknative_client.pykruise_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.pyartifacts.py — BaseEntry 多态,File/Dir/LocalFile/LocalDir/GitRepo
    • src/agents/sandbox/session/base_sandbox_session.py — BaseSandboxSession (1,167 行),exec/read/write/pty/snapshot
    • src/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 + Compaction
    • extensions/sandbox/ — 社区扩展:Vercel、Runloop、Modal、E2B、Daytona、Cloudflare、Blaxel

Architecture Comparison