Skip to content

E2B 兼容接口如何映射到内部模型

CubeAPI 对外兼容 E2B 的 REST API,但内部使用自己的数据模型。这篇文章拆解字段映射的每一步。


1. 请求生命周期概览


2. 核心字段映射

2.1 CreateSandboxRequest → CreateSandboxRequestLocal

SandboxService::create_sandbox()CubeAPI/src/services/sandboxes.rs 中执行映射:

2.2 完整字段对照表

E2B 字段内部字段说明
templateIDannotations["cube.创建人"]暂存在创建人字段,CubeMaster 用它查询模板
metadatacreate_time时间戳,用于沙箱命名
envVarsenvs环境变量列表,直接复制
timeouttags["cube-sandbox.id"]超时值编码到 tag 中
envdVersionannotation["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_idsandboxIDCubeMaster 生成的 UUID
client_idclientIDCubeMaster 返回
template_idtemplateIDCubeMaster 解析模板后返回
envd_versionenvdVersionCubeMaster 计算
nodenodeCubeMaster 调度结果
cpu / memorycpu / memory模板定义的资源量
metadatametadata来自原始请求

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. 完整调用链路


延伸阅读