内置支持
9+
首发版本
v0.14.0
GitHub Stars
25.3k
从「Agent 误删宿主机文件」的工程痛点切入,系统讲解 OpenAI Agents SDK v0.14.0 引入的 Sandbox Agents 体系:Harness/Compute 分离设计思路、SandboxAgent 相比普通 Agent 的四个额外属性(default_manifest / sandbox instructions / capabilities / run_as)、Manifest 工作区合约的全部字段及可覆盖/可快照特性、SandboxRunConfig 的精细运行控制。覆盖 9+ 种执行环境选择逻辑(本地 UnixLocal/Docker 到 E2B/Modal 等 7 家云端供应商),附完整带注释代码示例及 Capabilities 白名单机制说明。结合三个真实应用场景(代码执行隔离、合规敏感任务、长周期工程任务)给出 4 条可落地实践建议,结尾预告 #7 Tracing 篇。
리서치 브리프
/etc/hosts。SandboxAgent 是 Agent 的派生类,核心差异是四个额外属性:| 属性 | 作用 |
|---|---|
default_manifest | 定义沙箱的工作区环境(文件、目录、Git repos、环境变量) |
sandbox instructions | 沙箱专用指令,补充说明 Agent 在沙箱内的行为规范 |
capabilities | 开放给 Agent 的能力集(shell、文件系统、memory、skills 等) |
run_as | 沙箱内执行身份,指定 user/group |
Agent 只是「配了工具的 LLM」——你告诉它能做什么,它通过函数调用去触发。SandboxAgent 则额外持有一个「执行环境的完整描述」,每次运行时 SDK 会根据这份描述初始化一个干净的工作区。2| 字段 | 含义 |
|---|---|
files | 在沙箱内创建的合成文件(内容直接在 Manifest 中定义) |
dirs | 在沙箱内创建的合成目录 |
local_files | 从宿主机挂载的本地文件(只读或读写) |
local_dirs | 从宿主机挂载的本地目录 |
git_repos | 在沙箱启动时 clone 的 Git 仓库(支持 branch/commit 固定) |
environment | 注入沙箱的环境变量 |
users / groups | 沙箱内的用户和组定义 |
mounts | 远程存储挂载(S3、R2、GCS、Azure Blob 等) |
SandboxAgent.default_manifest 是默认值,但每次 Runner.run() 时,可以通过 SandboxRunConfig.manifest 字段覆盖——同一个 Agent,用不同 Manifest 跑出完全隔离的工作区。SandboxSessionState,下次运行时直接恢复到上次的状态,无需重新初始化。长周期任务和断点续跑靠的就是这个。1Manifest 管的是「空间」(工作区长什么样),SandboxRunConfig 管的是「时间」(这次跑怎么配置)。from agents.sandbox import SandboxRunConfig, DockerSandboxClient
run_config = SandboxRunConfig(
client=DockerSandboxClient(image="python:3.11-slim"), # 指定运行时
session=None, # 注入已有 session(可选)
session_state=my_snapshot, # 恢复快照(可选)
snapshot=True, # 运行完后生成快照
materialize_concurrency=4, # 并发挂载 mount 的限制
)client:创建沙箱的客户端。不传则使用 Agent 级默认值session:注入一个已有的 sandbox session(适合多轮对话共享同一工作区)session_state:从快照恢复(RunState、SandboxSessionState 或已保存快照均可)snapshot:是否在运行结束后序列化当前工作区状态materialize_concurrency:并发初始化 mount 的上限(避免大量 Git clone 同时触发)client 参数就能换执行环境。1| 客户端 | 特点 | 适用场景 |
|---|---|---|
UnixLocalSandboxClient | 直接用本机文件系统,无额外依赖 | 本地快速验证、调试 |
DockerSandboxClient | 启动 Docker 容器,完整隔离 | 本地生产级测试 |
UnixLocalSandboxClient,测试阶段 DockerSandboxClient,生产阶段根据延迟、成本、语言运行时需求选托管方案。Modal 适合 GPU 任务,E2B 适合快速冷启动,Cloudflare/Vercel 适合 Web 场景。from agents.sandbox import (
SandboxAgent,
Manifest,
LocalDir,
SandboxRunConfig,
UnixLocalSandboxClient,
)
from agents import Runner
# 1. 定义 SandboxAgent
agent = SandboxAgent(
name="code-assistant",
instructions="你是一个代码助手,可以读写文件并运行 shell 命令。",
# 工作区合约:从宿主机挂载当前项目目录
default_manifest=Manifest(
local_dirs=[
LocalDir(
host_path="./my-project", # 宿主机路径
sandbox_path="/workspace", # 沙箱内路径
read_only=False, # 允许写入
)
],
environment={"PYTHONPATH": "/workspace"},
),
# 能力声明:允许 shell 执行和文件系统操作
capabilities=["shell", "filesystem"],
)
# 2. 配置本次运行:使用本地 Unix 沙箱,运行后生成快照
run_config = SandboxRunConfig(
client=UnixLocalSandboxClient(),
snapshot=True, # 运行结束后序列化 session 状态
)
# 3. 执行
result = await Runner.run(
agent,
"帮我检查 /workspace 下的所有 Python 文件并运行测试",
run_config=run_config,
)
# 4. 保存快照,供下次运行恢复
session_state = result.session_stateLocalDir(read_only=False) 表示 Agent 可以向宿主机写回文件。生产环境建议先用 read_only=True 验证逻辑,再开放写权限capabilities=["shell", "filesystem"] 是白名单机制——没有列出的能力默认不开放。内置 capabilities 还包括 skills、memory、compaction2snapshot=True 后,result.session_state 可以序列化存储,下次通过 SandboxRunConfig(session_state=...) 恢复,这是长周期任务断点续跑的核心机制capabilities 字段控制 SandboxAgent 在沙箱内能做什么。目前支持:2| Capability | 含义 |
|---|---|
shell | 执行 shell 命令(bash、python 等) |
filesystem | 文件读写、目录操作、图片检查 |
skills | 加载 .agents/skills/ 中预定义的技能集 |
memory | 从历史运行中学习(支持 read-only 和 generate-only 模式) |
compaction | 上下文压缩,管理长对话的 token 消耗 |
memory capability 尤其值得单独说一下:它不是「对话历史」,而是「跨 run 的工作区记忆」。Agent 可以从先前运行中积累的状态里学习——支持 conversation_id、Session、group_id 多种颗粒度的记忆分组,甚至可以绑定 S3 做持久化存储。1import shutil; shutil.rmtree('/') 也只是在容器里自毁,宿主机毫发无损。tax-prep 和 healthcare workflow 示例。1capabilities 是白名单,默认什么都不开。不需要 shell 就不要加 shell,不需要跨 run 记忆就不要加 memory。开放越少,爆炸半径越小。read_only=True 做第一道防线snapshot=True,把 session_state 存到数据库。任务失败时从最近快照恢复,而不是从头开始。这也是生产级 Agent 和 Demo Agent 的核心区别之一。UnixLocalSandboxClientUnixLocalSandboxClient 零依赖、秒启动,能快速验证 Manifest 结构、capabilities 配置和 Agent 逻辑。逻辑通了再换 DockerSandboxClient 做隔离测试,最后上云。
이 콘텐츠를 둘러싼 관점이나 맥락을 계속 보강해 보세요.