E2B 与 Stripe Projects 集成实战:从凭据获取到 CLI / SDK 全链路沙箱编排指南
人工智能AI AgentAgent 沙箱后端【免费下载链接】E2BOpen-source, secure environment with real-world tools for enterprise-grade agents.项目地址https://gitcode.com/gh_mirrors/e2/E2B点击查看免费下载本篇技术指南聚焦于一个真实场景当你的 E2B 沙箱/API 访问权限是通过Stripe Projects配置provision出来之后如何安全地拿到 E2B 团队 API Key并把它正确用于 E2B CLI、JavaScript SDK、Python SDK 以及 Code Interpreter SDK。你将掌握一套可直接落地的凭据拉取与导出流程含防泄密注意事项、e2b sandbox系列命令的实战姿势以及 SDK 中Sandbox.create()/Sandbox.connect()与 lifecycle 参数的正确用法——这些模式来自本仓库skills/stripe-projects/SKILL.md并结合仓库源码与测试加以印证。场景背景Stripe Projects 如何交付 E2B 访问权限Stripe Projects 是一套面向 Stripe 生态项目的应用交付机制。当 E2B 沙箱/API 访问权限通过 Stripe Projects 配置完成后Stripe Projects 会返回一个E2B 团队 API Keyteam API key。这个 key 是后续所有 E2B 操作的唯一凭据它用于沙箱创建sandbox creation它用于沙箱控制sandbox control如 pause / resume / kill它被SDK 客户端JS / Python / Code Interpreter隐式或显式读取。从本仓库源码看SDK 对凭据的解析高度依赖环境变量。在 packages/python-sdk/e2b/connection_config.py 中ConnectionConfig通过os.getenv(E2B_API_KEY)、os.getenv(E2B_API_URL)、os.getenv(E2B_DOMAIN)读取配置在 packages/js-sdk/src/connectionConfig.ts 中ConnectionOpts同样声明apiKey、domain、apiUrl默认取自E2B_API_KEY、E2B_DOMAIN、E2B_API_URL环境变量其中domain缺省为e2b.appapiUrl缺省为https://api.${domain}。因此把 Stripe Projects 交付的 key 注入E2B_API_KEY环境变量是整个链路的统一入口。CLI 侧同样遵循此约定在 packages/cli/src/api.ts 中apiKey直接取自process.env.E2B_API_KEY。这意味着无论你走 CLI 还是 SDK导出E2B_API_KEY都能让命令和 SDK 调用命中同一个 E2B 团队。凭据管理安全导出杜绝回显SKILL.md 给出了几条硬性安全原则值得逐条展开优先在运行时环境中显式设置E2B_API_KEY让命令和 SDK 调用始终使用预期的 E2B 团队避免隐式配置漂移。本地默认值可以来自.env.local或~/.e2b/config.json。仓库源码印证了后者~/.e2b/config.json正是 CLI 的用户配置文件packages/cli/src/user.ts其中以 v2 格式保存projectName/projectId/projectApiKey等字段ensureAPIKey()会在环境变量缺失时回退到该文件packages/cli/src/api.ts。不要打印密钥明文。stripe projects env --json可能返回被脱敏redacted的占位符不能作为可运行的E2B_API_KEY来源。不要source .env整个文件作为 shell 代码执行只按需读取需要的 E2B 变量。推荐的凭据拉取与导出流程如下stripe projects env --pull --yes env_value() { awk -F -v key$1 $1 key {sub(/^[^]*/, ); gsub(/^|$/, ); print; exit} .env } export E2B_API_KEY$(env_value E2B_API_KEY) export E2B_API_URL$(env_value E2B_API_URL) export E2B_DOMAIN$(env_value E2B_DOMAIN) e2b sandbox create base --detach这段脚本做了三件事拉取 Stripe Projects 托管的凭据文件--pull --yes用awk从.env中按 key 精确提取 E2B 变量同时去掉值两侧的引号导出为环境变量后直接用于 CLI。注意最后一步e2b sandbox create base --detach验证了整条链路——base是 CLI 的默认模板packages/cli/src/commands/sandbox/create.ts 中DEFAULT_TEMPLATE base。Stripe Projects CLI添加服务与检查凭据添加 E2B 服务到当前 Stripe 项目stripe projects add e2b/sandboxes该命令把 E2B 沙箱服务挂到当前 Stripe 项目上是后续凭据 provision 的前置步骤。检查 / 拉取凭据stripe projects env # 查看环境变量概览 stripe projects env --json # 以 JSON 结构检查 stripe projects env --pull --yes # 拉取托管凭据到本地 .env 文件关于三者的定位SKILL.md 给出了明确分工--json只用于结构检查。在当前的 Stripe Projects 输出中E2B 变量位于data.resource_access_configurations[].access_configuration之下包含E2B_API_KEY、E2B_API_URL、E2B_DOMAIN三项——但值可能被脱敏直接拿去调 CLI / SDK 是跑不通的。--pull --yes才是可执行凭据的正确来源。它会拉取托管的环境变量文件配合前面介绍的env_value()函数按需导出即可。stripe projects env --pull --yes env_value() { awk -F -v key$1 $1 key {sub(/^[^]*/, ); gsub(/^|$/, ); print; exit} .env } export E2B_API_KEY$(env_value E2B_API_KEY) export E2B_API_URL$(env_value E2B_API_URL) export E2B_DOMAIN$(env_value E2B_DOMAIN)env_value()的实现要点以key精确匹配行首避免误命中前缀相同的其他变量剥掉KEY前缀再用gsub(/^|$/, )去掉引号最后exit只输出第一个命中。不要对整个.env做source——这会把无关变量、注释和潜在敏感内容一起注入当前 shell。Stripe Projects 场景下的 CLI 登录问题一个值得注意的差异在 Stripe Projects 的结账/交付流程中E2B CLI 可能并未全局登录即没有执行过e2b auth login~/.e2b/config.json里没有凭据。此时如果直接敲e2b sandbox ...会走ensureAPIKey()的兜底逻辑——环境变量缺失、用户配置文件也不存在时CLI 会打印提示并退出packages/cli/src/api.ts。因此 SKILL.md 明确建议优先采用 Stripe Projects env pull 每条命令前导出环境变量 的方式而不是尝试e2b auth login。这也符合ensureAPIKey()的优先级设计环境变量 用户配置文件。E2B CLI沙箱生命周期操作实战安装 / 修复 CLI如果 E2B CLI 缺失或 shell shim 损坏直接用 Node 全局安装不必切换到 SDK 代码if ! e2b --version /dev/null 21; then npm install -g e2b/cli fi注意版本前提e2b/cli要求Node 20 或更新版本。仓库中 packages/cli/package.json 的engines字段进一步标明支持范围20.18.1 21 || 22.9.0。创建沙箱优先 detached 模式非交互式工作流应使用 detached 沙箱让命令直接返回沙箱 ID 而不附加交互终端e2b sandbox create --detach e2b sandbox create base --detach第一条省略模板名等价于使用默认模板base第二条显式指定base。从 packages/cli/src/commands/sandbox/create.ts 的实现看--detach分支会直接console.log(sandbox.sandboxId)并退出不带--detach时则会打印 Dashboard 检查 URL 并连接终端。这正是脚本化工作流需要的拿到 ID 就走的行为。在沙箱中执行命令--分隔符e2b sandbox exec会把沙箱 ID 之后的所有内容原样透传给远端命令因此在 shell 标志前加--防止 CLI 误解析e2b sandbox exec sandbox_id -- bash -lc pwd ls -la仓库实现印证了这一点exec命令在 packages/cli/src/commands/sandbox/exec.ts 中声明了.passThroughOptions()帮助文本也明确写道sandbox ID 之后的所有内容都会透传给远端命令所以 e2b 选项必须放在 sandbox ID 之前。SDK 侧的 connect 也即 exec 的底层CLI 先Sandbox.connect(sandboxID, { apiKey })再sandbox.commands.run(...)packages/cli/src/commands/sandbox/exec.ts。长时进程后台运行 PID 文件对需要长期运行的进程应在沙箱内后台启动并写入 PID 文件方便后续管理e2b sandbox exec sandbox_id -- bash -lc nohup python server.py server.log 21 echo $! server.pid这条命令把python server.py用nohup转入后台stdout/stderr 重定向到server.log并把进程 PID 写入server.pid。CLI 的exec本身也支持--background标志配合 stdin 管道见 packages/cli/src/commands/sandbox/exec.ts但从沙箱内部自管进程是更通用的模式。暂停后的恢复显式 resumeCLI 提供显式的 resume 命令但沙箱创建目前没有暴露 auto-resume 标志e2b sandbox resume sandbox_id从 packages/cli/src/commands/sandbox/resume.ts 的实现看resume的底层是e2b.Sandbox.connect(sandboxID, { apiKey })——对暂停中的沙箱执行 connect 即完成恢复若沙箱不存在会捕获NotFoundError并提示Sandbox ... wasnt found。常见运维命令e2b sandbox exec sandbox_id -- bash -lc python --version e2b sandbox exec sandbox_id -- bash -lc ls -la /tmp这些命令直接复用sandbox exec对既有沙箱做运维检查无需重新创建沙箱。JavaScript SDK创建与连接全新沙箱Sandbox.create()import Sandbox from e2b const sandbox await Sandbox.create(base) const result await sandbox.commands.run(echo hello from e2b) console.log(result.stdout)Sandbox.create()使用当前环境中的E2B_API_KEY即前面导出的变量创建一个全新沙箱。SDK 中base是默认模板packages/js-sdk/src/sandbox/index.ts 的defaultTemplate: string base。生命周期选项超时暂停 自动恢复当沙箱希望在超时后暂停、并在后续活动时自动恢复传入 lifecycle 选项const sandbox await Sandbox.create(base, { lifecycle: { onTimeout: pause, autoResume: true }, })从 packages/js-sdk/src/sandbox/sandboxApi.ts 的类型定义看SandboxLifecycle的语义如下onTimeout超时后的动作取值pause或kill不设置时该字段从创建请求中省略由 API 默认当前为kill决定。autoResume是否允许自动恢复。仅在onTimeout为pause时可为true与mode: filesystem仅持久化文件系统的快照不兼容——因为文件系统快照没有内存可恢复冷启动后必须通过connect()显式恢复。进阶用法onTimeout也可传对象形式{ action: pause, mode: full | filesystem }来控制暂停快照的类型见 packages/js-sdk/src/sandbox/sandboxApi.ts。CLI 侧有完全对称的参数--lifecycle.ontimeout pause|kill和--lifecycle.autoresumepackages/cli/src/commands/sandbox/create.ts并且--lifecycle.autoresume必须配合--lifecycle.ontimeout pause使用buildLifecycle会校验并抛错。该行为有测试覆盖见 packages/cli/tests/commands/sandbox/create_lifecycle.test.ts其中验证了autoresume缺少pause时会报--lifecycle.autoresume requires --lifecycle.ontimeout pause。复用既有沙箱Sandbox.connect()当沙箱已由 CLI 步骤如前面e2b sandbox create --detach创建SDK 侧用Sandbox.connect()连接import Sandbox from e2b const sandbox await Sandbox.connect(process.env.SANDBOX_ID!) const result await sandbox.commands.run(cat important_file.md) console.log(result.stdout)connect是跨步骤共享沙箱的关键CLI 创建 → 把sandbox_id传给后续步骤 → SDK 连接并继续操作。connect 的timeoutMs以毫秒计且只会延长运行中沙箱的超时见 packages/js-sdk/src/sandbox/sandboxApi.ts 的文档注释。Python SDK上下文管理器与生命周期短时任务上下文管理器from e2b import Sandbox with Sandbox.create(base) as sandbox: result sandbox.commands.run(echo hello from e2b) print(result.stdout)with块结束时沙箱自动清理适合一次性短任务。生命周期选项sandbox Sandbox.create( base, lifecycle{on_timeout: pause, auto_resume: True}, )Python SDK 的参数名是蛇形snake_case。从 packages/python-sdk/e2b/sandbox_async/main.py 的文档看lifecycle 还支持对象形式{on_timeout: {action: pause, mode: full|filesystem}}其中mode: filesystem表示超时自动暂停时仅持久化文件系统恢复时冷启动且不能与auto_resume组合。跨步骤共享沙箱from e2b import Sandbox sandbox Sandbox.connect(sandbox_id) result sandbox.commands.run(cat important_file.md) print(result.stdout)与 JS SDK 的connect()语义一致先拿到sandbox_id比如来自 CLI 创建步骤或环境变量再在后续工作流步骤中连接使用。实用默认值Practical DefaultsSKILL.md 收尾给出四条贯穿全文的默认策略这些也是与源码行为一一对应的约定除非任务明确需要特定模板一律使用base模板——它是 CLI 的DEFAULT_TEMPLATEpackages/cli/src/commands/sandbox/create.ts和 JS SDK 的defaultTemplatepackages/js-sdk/src/sandbox/index.ts无需额外配置即可创建。多命令 CLI 执行优先用bash -lc——-l加载登录环境、-c执行命令串配合exec的--透传是最贴近交互终端的行为。临时文件放在沙箱内/tmp或当前工作目录——除非任务有特定路径要求这能避免污染持久化文件系统、也便于沙箱销毁后自动清理。需要run_code/runCode代码执行能力的工作负载改用 Code Interpreter SDK——它封装了代码解释器语义如 Python 侧run_code见 packages/code-interpreter-python/e2b_code_interpreter/code_interpreter_sync.py 的方法签名与回调参数JS 侧runCode见 packages/code-interpreter-js/src/sandbox.ts而不是用通用commands.run拼 shell。全链路工作流速查把以上内容串成一个完整的 Stripe Projects E2B 工作流# 1. 把 E2B 挂到当前 Stripe 项目一次性的 provision 步骤 stripe projects add e2b/sandboxes # 2. 拉取凭据并只导出 E2B 变量不 source 整个 .env stripe projects env --pull --yes env_value() { awk -F -v key$1 $1 key {sub(/^[^]*/, ); gsub(/^|$/, ); print; exit} .env } export E2B_API_KEY$(env_value E2B_API_KEY) export E2B_API_URL$(env_value E2B_API_URL) export E2B_DOMAIN$(env_value E2B_DOMAIN) # 3. 用 CLI 创建 detached 沙箱并拿到 ID e2b sandbox create base --detach # 4. 对既有沙箱执行命令-- 之后透传给远端 shell e2b sandbox exec sandbox_id -- bash -lc pwd ls -la # 5. 在 SDK 中复用同一个沙箱JS / Python 均可 # const sandbox await Sandbox.connect(process.env.SANDBOX_ID!) # or: sandbox Sandbox.connect(sandbox_id)这套流程的关键在于CLI 与 SDK 共享E2B_API_KEY环境变量与sandbox_id作为衔接点——前者保证命中正确的 E2B 团队后者保证多步骤工作流复用同一个沙箱实例。记住两个最容易踩坑的点一是stripe projects env --json的脱敏值不能当凭据用二是 CLI 在 Stripe Projects 场景下可能未全局登录务必走env pull 导出而非e2b auth login。赞分享人工智能AI AgentAgent 沙箱后端【免费下载链接】E2BOpen-source, secure environment with real-world tools for enterprise-grade agents.项目地址https://gitcode.com/gh_mirrors/e2/E2B点击查看免费下载相关推荐OpenAI Agents SDK × CubeSandbox 集成实战基于 E2B 兼容协议的沙箱 Agent 落地指南OpenAI Agents SDK × CubeSandbox 集成实战基于 E2B 兼容协议的沙箱 Agent 落地指南 本篇指南基于仓库 examplesAgent 沙箱虚拟化云原生人工智能后端容器运行时E2B JavaScript SDK 实战指南在云端安全沙箱中运行 AI 生成的代码E2B JavaScript SDK 实战指南在云端安全沙箱中运行 AI 生成的代码 导读 E2B 是开源的沙箱即基础设施方案它把 AI 生成的代码放进人工智能AI AgentAgent 沙箱后端PostHog 数据仓库集成 E2B 数据源沙箱基础设施同步实战指南PostHog 数据仓库集成 E2B 数据源沙箱基础设施同步实战指南 E2B 是运行 AI Agent 生成代码的安全云沙箱服务。本文基于 PostHog 仓数据分析后端前端数据可视化大数据上一篇ComfyUI加载redshift-diffusion完整教程一步步出片Redshift渲染风格作品下一篇Hyperf Box 使用指南PHP 环境管理、应用二进制打包与 Swoole/Swow 服务反向代理部署创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考