构建

e2b仓库源码构建

背景

代码仓库:

https://github.com/e2b-dev/E2B

准备工作

clone仓库

mkdir -p ~/work/code/e2b
cd ~/work/code/e2b
git clone git@github.com:e2b-dev/E2B.git
cd E2B

安装 pnpm

npm install -g pnpm

安装后查看版本:

$ pnpm --version    
9.15.5

构建

参考代码仓库下的 Makefile 文件:

https://github.com/e2b-dev/E2B/blob/main/Makefile

codegen

先执行:

pnpm install

再执行:

make codegen

过程中会比较慢,因为要下载这个 2GB 的镜像文件 codegen-env:

$ docker images                 
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
codegen-env   latest    ea38a80a213c   16 minutes ago   2.07GB

执行完成之后,packages/js-sdk/node_modules/.bin/ 下就会存在 npm-run-all 文件:

$ ls packages/js-sdk/node_modules/.bin/

eslint   knip      ncu                openapi-typescript  run-s     tsup
glob     knip-bun  npm-check-updates  playwright          tsc       tsup-node
json2ts  msw       npm-run-all        run-p               tsserver  vitest

python sdk

Python SDK 的代码生成包含 API 客户端、Protobuf 通信层和数据模型定义:

  • API 客户端代码(OpenAPI Client 生成): (注意:日志显示它先生成在 api/api 目录,然后被 mv 移动到了 client 目录)
    • 主 API 客户端模块:packages/python-sdk/e2b/api/client/ (包含了与 E2B 后端交互的所有 Pydantic 模型和请求客户端)
    • 云盘 (Volume) API 客户端模块:packages/python-sdk/e2b/volume/client/
  • 容器内通信协议代码(Buf / Protobuf 生成):
    • 由 buf generate 执行生成的 Proto 文件处理模块,通常分布在 packages/python-sdk/e2b/ 下的相关协议文件夹中(如用于处理 filesystem 和 process 的相关 _pb2.py 和通信存根代码)。
  • MCP 数据模型(Datamodel Codegen 生成):
    • Pydantic 数据模型:packages/python-sdk/e2b/sandbox/mcp.py

python sdk 的 代码入口在 packages/python-sdk/e2b/sandbox_sync/main.py:

    @classmethod
    def create(
        cls,
        template: Optional[str] = None,
        timeout: Optional[int] = None,
        metadata: Optional[Dict[str, str]] = None,
        envs: Optional[Dict[str, str]] = None,
        secure: bool = True,
        allow_internet_access: bool = True,
        mcp: Optional[McpServer] = None,
        network: Optional[SandboxNetworkOpts] = None,
        lifecycle: Optional[SandboxLifecycle] = None,
        volume_mounts: Optional[SandboxVolumeMount] = None,
        **opts: Unpack[ApiParams],
    ) -> Self:

对应官方实例代码:

from e2b import Sandbox

with Sandbox.create() as sandbox:
    result = sandbox.commands.run('echo "Hello from E2B!"')
    print(result.stdout)  # Hello from E2B!

js sdk

JS 的代码生成主要基于 OpenAPI 规范、Protocol Buffers 以及 JSON Schema 生成 TypeScript 的类型定义文件和接口调用代码:

  • API 接口协议代码(OpenAPI 生成):
    • 主 API 接口定义:packages/js-sdk/src/api/schema.gen.ts
    • 环境 (Envd) API 接口定义:packages/js-sdk/src/envd/schema.gen.ts
    • 云盘 (Volume) API 接口定义:packages/js-sdk/src/volume/schema.gen.ts
  • 容器内通信协议代码(Buf / gRPC 生成):
    • 文件系统通信:packages/js-sdk/src/envd/filesystem/filesystem_connect.ts 和 filesystem_pb.ts
    • 进程通信:packages/js-sdk/src/envd/process/process_connect.ts 和 process_pb.ts
  • MCP (Model Context Protocol) 规范(JSON Schema 转换):
    • 类型声明文件:packages/js-sdk/src/sandbox/mcp.d.ts

js sdk 的 代码入口在 packages/js-sdk/src/sandbox/index.ts

export class Sandbox extends SandboxApi {

  static async create<S extends typeof Sandbox>(
    this: S,
    opts?: SandboxOpts
  ): Promise<InstanceType<S>>

}

对应官方实例代码:

import Sandbox from 'e2b'

const sandbox = await Sandbox.create()
const result = await sandbox.commands.run('echo "Hello from E2B!"')
console.log(result.stdout) // Hello from E2B!