跳转到内容
Rayrun
登录注册

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")) # hi
finally:
sbx.kill()

行为与 SDK 一致:commands.run("exit 3") 抛 CommandExitException(exit_code=3);后台命令(background=True)返回句柄、 可 handle.kill();stdout 与 stderr 分流。Sandbox 的 create / list / getInfo / kill / connect 均可用。

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 是 「默认拒绝 + 白名单」的写法。

  1. 文件面不越出工作目录:E2B 的语义允许 files.read("/etc/passwd"), Rayrun 拒绝 —— 沙箱的文件面以工作区为边界。这是安全设计,不是兼容性缺口。
  2. 被拒字段明确报错:如 autoPause,SDK 会收到带字段名的 400, 而不是静默降级成别的行为。
  3. PTY 暂不支持:请求带 pty 会返回 400 invalid_argument (pty is not supported),不会静默忽略。