E2B 兼容接口如何映射到内部模型
CubeAPI 对外兼容 E2B 的 REST API,但内部使用自己的数据模型。这篇文章拆解字段映射的每一步。
1. 请求生命周期概览
2. 核心字段映射
2.1 CreateSandboxRequest → CreateSandboxRequestLocal
SandboxService::create_sandbox() 在 CubeAPI/src/services/sandboxes.rs 中执行映射:
2.2 完整字段对照表
| E2B 字段 | 内部字段 | 说明 |
|---|---|---|
templateID | annotations["cube.创建人"] | 暂存在创建人字段,CubeMaster 用它查询模板 |
metadata | create_time | 时间戳,用于沙箱命名 |
envVars | envs | 环境变量列表,直接复制 |
timeout | tags["cube-sandbox.id"] | 超时值编码到 tag 中 |
envdVersion | annotation["e2b-version"] | envd 版本,用于路由到正确节点 |
2.3 自动生成的字段
rust
// CubeAPI/src/services/sandboxes.rs
annotations.insert("cube.创建人".to_string(), sandbox_id.clone());cube.创建人 是 CubeSandbox 的内部扩展字段,用于标识沙箱归属。
3. 响应映射:内部模型 → E2B 格式
3.1 CreateSandboxResponseLocal → Sandbox
CubeMaster 返回内部格式,CubeAPI 转换为 E2B 格式:
3.2 build_sandbox_object() 的字段映射
| 内部字段 | E2B 响应字段 | 来源 |
|---|---|---|
sandbox_id | sandboxID | CubeMaster 生成的 UUID |
client_id | clientID | CubeMaster 返回 |
template_id | templateID | CubeMaster 解析模板后返回 |
envd_version | envdVersion | CubeMaster 计算 |
node | node | CubeMaster 调度结果 |
cpu / memory | cpu / memory | 模板定义的资源量 |
metadata | metadata | 来自原始请求 |
4. run_code 的数据通道
run_code 不走 CubeMaster,而是通过 CubeProxy 直接进入沙箱:
请求格式
json
{
"process": {
"envVars": {},
"cmd": "python3",
"args": ["-c", "print('hello')"],
"cwd": "/home/user"
}
}响应格式
json
{
"stdout": "hello\n",
"stderr": "",
"exitCode": 0
}5. CubeMasterClient 的实现
CubeAPI/src/cubemaster/mod.rs 封装了对 CubeMaster 的 HTTP 调用:
错误处理
rust
// CubeAPI/src/cubemaster/mod.rs
pub enum CubeMasterClientError {
RequestFailed(reqwest::Error), // HTTP 层错误
DeserializationFailed(...), // JSON 解析错误
#[error("cubemaster failed: {0}")]
CubeMasterFailed(String), // CubeMaster 业务错误
}6. 完整调用链路
延伸阅读
- CubeAPI 是怎么接住第一个请求的 — 请求进入 CubeAPI 的完整路径
- 创建沙箱时 CubeMaster 做了哪些事 — 下游控制面的处理细节