E2B SDK 接入
E2B 是一个 agent 沙箱 SDK。Rayrun 实现了它的控制面与数据面契约 ——
用 E2B 官方 SDK 接入:控制面(创建、列举、销毁)配 E2B_API_URL
与 E2B_API_KEY,数据面(命令、文件)再加 E2B_DOMAIN。
SDK 代码不用改;PTY 暂不支持(请求会明确返回 400,不会静默降级)。
⚠️ 托管环境的 E2B 数据面尚未开通(见下方「当前可用范围」)。
pip install "e2b>=2.53"
export E2B_API_KEY=<你的 Rayrun API Token> # 控制台「设置 → 我的 API Token」export E2B_API_URL=https://api.rayrunos.com # 控制面:创建 / 列举 / 销毁# 自托管时把 E2B_API_URL 换成自己的 API 地址;不要用裸 IP(SDK 强制 https)。
# 数据面(commands.run / 文件)再补一个(自托管 / 托管环境开通后):export E2B_DOMAIN=<数据面域名> # 通配 DNS + 证书只做控制面时前两个变量就够;数据面的命令与文件还需要
E2B_DOMAIN(域名与证书的要求见下方「当前可用范围」)。
from e2b import Sandbox
sbx = Sandbox.create(template="ubuntu@1") # template 对应 Rayrun 的镜像名try: r = sbx.commands.run("echo hello from $(hostname)") print(r.stdout) # hello from <沙箱主机名> print(r.exit_code) # 0
sbx.files.write("/tmp/a.txt", "hi") print(sbx.files.read("/tmp/a.txt")) # hifinally: sbx.kill()行为与 SDK 一致:commands.run("exit 3") 抛
CommandExitException(exit_code=3);后台命令(background=True)返回句柄、
可 handle.kill();stdout 与 stderr 分流。Sandbox 的
create / list / getInfo / kill / connect 均可用。
运行期网络策略
Section titled “运行期网络策略”Sandbox.updateNetwork() 可用(PUT /sandboxes/{id}/network,204):
sbx.update_network( allow_out=["api.example.com", "8.8.8.8"], deny_out=["10.0.0.0/8"], allow_internet_access=True,)语义对齐 E2B:allow_internet_access 缺省 true(空 body = 默认放行全部);
allowOut 是例外列表,denyOut 是黑名单,allow 优先。denyOut 只接受
CIDR / 裸 IP(域名会 400)。allow_internet_access=False + allowOut 是
「默认拒绝 + 白名单」的写法。
与 E2B 的刻意差异
Section titled “与 E2B 的刻意差异”- 文件面不越出工作目录:E2B 的语义允许
files.read("/etc/passwd"), Rayrun 拒绝 —— 沙箱的文件面以工作区为边界。这是安全设计,不是兼容性缺口。 - 被拒字段明确报错:如
autoPause,SDK 会收到带字段名的 400, 而不是静默降级成别的行为。 - PTY 暂不支持:请求带
pty会返回 400invalid_argument(pty is not supported),不会静默忽略。