这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

源码

E2B 源码

1 - e2b仓库

E2B e2b仓库源码学习

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

1.1 - 构建

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!

2 - code-interpreter仓库

E2B code-interpreter仓库源码学习

https://github.com/e2b-dev/code-interpreter

3 - infra仓库

E2B infra仓库源码学习

3.1 - 构建

E2B infra仓库源码的构建

背景

代码仓库:

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

准备工作

clone仓库

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

构建环境

根据 DEV.md 描述,需要基于 Linux(推荐 Ubuntu 22.04+)环境安装基础工具[1][5]。

前置安装:

  • Go:核心服务(Orchestrator, API, envd)由 Go 编写,需要 Go 1.22+ 版本。
  • Make:统一入口工具
  • Docker & Node.js:用于本地基础设施运行和部分前端/脚本编译
  • 内核要求:如果要在本地完整跑通虚拟机 Sandbox 构建,Linux 内核推荐 6.8+,并支持 KVM 和 HugePages。

构建

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

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

启动本地构建基础设施

先执行:

make local-infra

启动后要下载一批容器镜像:

make local-infra
cat: .last_used_env: No such file or directory
make -C packages/local-dev local-infra
make[1]: Entering directory '/home/sky/work/code/e2b/infra/packages/local-dev'
USERNAME=clickhouse PASSWORD=clickhouse PORT=9000 \
envsubst < ../clickhouse/local/config.tpl.xml > clickhouse-config-generated.xml
docker compose --file ./docker-compose.yaml up --abort-on-container-failure
[+] Running 107/107
 ✔ memcached Pulled                                                      239.5s 
 ✔ clickhouse Pulled                                                     994.1s 
 ✔ loki Pulled                                                            84.4s 
 ✔ grafana Pulled                                                        129.6s 
 ✔ mimir Pulled                                                           38.1s 
 ✔ redis Pulled                                                          239.1s 
 ✔ postgres Pulled                                                       273.7s 
 ✔ otel-collector Pulled                                                  99.4s 
 ✔ vector Pulled                                                          52.8s 
 ✔ tempo-init Pulled                                                     144.3s 
 ✔ tempo Pulled                                                           46.4s 

可以看到下载的镜像:

docker images
REPOSITORY                             TAG             IMAGE ID       CREATED         SIZE
otel/opentelemetry-collector-contrib   0.146.0         ea107e054905   2 months ago    357MB
grafana/mimir                          2.17.1          571ecdabe4af   7 months ago    101MB
grafana/tempo                          2.8.2           08c4147d7e1e   8 months ago    118MB
memcached                              1.6.38          eba955ff6453   9 months ago    87.1MB
clickhouse                             25.4.5.24       37d98d845098   11 months ago   682MB
grafana/grafana                        12.0.0          29c2d986a9d8   11 months ago   680MB
postgres                               17.4            45a04d02adcf   14 months ago   438MB
grafana/loki                           3.4.1           6e2b55358175   14 months ago   112MB
redis                                  7.4.2           65750d044ac8   15 months ago   117MB
timberio/vector                        0.34.X-alpine   2710728a77c2   2 years ago     134MB

然后本地运行下列的容器,提供本地构建的各种基础设施:

[+] Running 15/15
 ✔ Network local-dev_default             Cr...                             0.0s 
 ✔ Volume local-dev_postgres             Cr...                             0.0s 
 ✔ Volume local-dev_clickhouse           Created                           0.0s 
 ✔ Volume local-dev_tempo                Creat...                          0.0s 
 ✔ Container local-dev-tempo-init-1      Created                           0.3s 
 ✔ Container local-dev-clickhouse-1      Created                           0.3s 
 ✔ Container local-dev-mimir-1           Created                           0.3s 
 ✔ Container local-dev-loki-1            C...                              0.3s 
 ✔ Container local-dev-redis-1           Created                           0.3s 
 ✔ Container local-dev-otel-collector-1  Created                           0.3s 
 ✔ Container local-dev-postgres-1        Created                           0.3s 
 ✔ Container memcached                   Created                           0.3s 
 ✔ Container local-dev-grafana-1         Created                           0.3s 
 ✔ Container local-dev-tempo-1           Created                           0.0s 
 ✔ Container local-dev-vector-1          Created                           0.0s 

构建核心组件

打开另外一个终端,执行:

make build/api

输出为:

cat: .last_used_env: No such file or directory
make -C packages/api build
make[1]: Entering directory '/home/sky/work/code/e2b/infra/packages/api'
cat: ../../.last_used_env: No such file or directory
# Allow for passing commit sha directly for docker builds
CGO_ENABLED=0 go build -o bin/api -ldflags "-X=main.commitSHA=7e37444a5 -X=main.expectedMigrationTimestamp=20260416120000" .
make[1]: Leaving directory '/home/sky/work/code/e2b/infra/packages/api'
make build/api