news 2026/11/5 11:04:37

Pollinations 沙箱(Sandboxes)实战指南:用 polli CLI 按秒计费租用 E2B Linux 虚拟机

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Pollinations 沙箱(Sandboxes)实战指南:用 polli CLI 按秒计费租用 E2B Linux 虚拟机
  • AI 应用
  • 媒体生成
  • 后端
  • 前端

【免费下载链接】pollinations

Your Friendly Open-Source Gen-AI Platform

项目地址:https://gitcode.com/gh_mirrors/po/pollinations
点击查看免费下载

Pollinations 的 Sandboxes 功能为开发者提供由 E2B 托管的 Linux 虚拟机(VM),费用直接从你的 Pollinations 钱包(以 Pollen 计)中按秒结算。通过polli命令行工具,你可以创建、SSH 登录、暂停、续期和销毁沙箱,并将编码智能体(Claude Code、OpenCode、Pi、Hermes Agent、OpenClaw 等)接入其中运行持久化任务。读完本文,你将掌握沙箱的完整命令用法、生命周期与续期机制、计费规则,以及如何直接使用 E2B 官方 SDK/CLI 对接同一套按 Pollinations 计费的环境。

当前功能处于 alpha 阶段,所有参数、价格与限制均以本仓库(gh_mirrors/po/pollinations)中的实现为准。

一、Sandboxes 是什么

Sandboxes 是"由 E2B 提供的 Linux VM,费用从你的 Pollinations 钱包支付"(参见 文档原文)。它的核心价值在于:你不需要在本地维护一台常驻机器,也不需要为闲置资源买单——沙箱在 SSH 会话结束后约 10 分钟自动暂停,文件保留,下一次ssh即可恢复;需要长期运行时,则可以设置 timeout 让它持续运行,由 gen 服务端负责每小时续费。

在架构上,Pollinations 并没有自建虚拟机,而是在 Cloudflare Worker(gen 网关)中代理了 E2B 的控制面 API:所有对 E2B 的调用都发生在 gen.pollinations.ai/src/routes/e2b.ts 中定义的实验性路径/alpha/e2b之下,用 Pollinations 的 API Key 鉴权,并以"一个 E2B team 运行所有用户的沙箱、通过 metadata 标记 owner"的方式隔离用户。

二、快速开始:创建你的第一个沙箱

前置条件

  • Node.js 22 或更新版本(ssh接入依赖 Node 22+ 的原生 WebSocket,参见 ssh.ts 中的显式检查"This needs Node.js 22 or newer")。
  • 全局安装 CLI 并登录:
npm install -g @pollinations/cli polli auth login

polli auth login会创建一个具备profile、usage、keys、machines等账户权限的密钥,其中machines权限正是"创建和运行托管沙箱"所需的权限(见 shared/auth/authorize-config.ts 对machines的注释)。

创建并连接

polli sandbox create # 打印 sandbox id 并自动配置 ssh polli sandbox create --timeout 0 # 一直运行,直到你 pause 或 kill polli sandbox create pollinations-large # 4 vCPU, 8 GB ssh <id>.polli # scp、sftp、rsync 同样可用

第一次polli sandbox create会自动完成 SSH 配置(setupSsh),之后你就能用ssh <id>.polli进入沙箱。在命令行实现中(packages/polli-cli/src/commands/sandbox/index.ts),create命令的完整签名是:

  • polli sandbox create [template]:模板参数可选,默认pollinations,可用--timeout <seconds>指定无 SSH 会话时的最长存活时间;--timeout 0表示永不过期(见下文"永不过期"的机制)。
  • 创建成功后 CLI 会同时输出id与ssh: ssh <id>.polli,并提示"若无 SSH 会话,将在 10 分钟后暂停;--timeout 0可保持运行"。

创建请求的底层行为在 e2b.ts 中定义:createSandbox向/alpha/e2b/sandboxes发送{ templateID, timeout, autoPause: true },默认 lease 为LEASE_SECONDS = 600(即 10 分钟)。这一点也被 index.test.ts 中的测试用例锁定:断言创建请求体为{"templateID":"pollinations","timeout":600,"autoPause":true}。

其他常用命令速查

polli sandbox list # 列出你的沙箱(含模板、规格、状态) polli sandbox timeout <id> 14400 # 让它再保持运行 4 小时(无需 ssh),并恢复已暂停的沙箱 polli sandbox pause <id> # 暂停:保留文件与内存 polli sandbox kill <id> # 删除沙箱及其全部文件(可一次传多个 id) polli sandbox logs <id> # 查看系统日志:启动、暂停与每次进程运行 polli sandbox ssh-config # 仅配置 ssh(create 已自动执行)
  • timeout命令的参数为"从现在起至少运行 ",0表示永不过期;实现上它调用connectSandbox(id, seconds)并打印到期时间( index.ts)。
  • list会展示id、模板别名、规格(如2 vCPU, 2048 MB)以及运行状态;运行中的沙箱还会显示"运行至某个时刻"。
  • logs输出格式为时间 级别 消息 key=value,并过滤掉 E2B 内部的 debug 追踪字段(edge_trace_id、trace_id、span_id、source_type)。
  • 命令均支持--json输出(全局选项),方便脚本与 AI Agent 解析。

三、SSH 接入机制:从 WebSocket 到 sshd

ssh <id>.polli之所以能工作,靠的是 polli 在本地写下的 SSH 配置。setupSsh()(ssh.ts)会:

  1. 在~/.pollinations/ssh/下生成 ed25519 密钥对id_ed25519(首次创建时通过ssh-keygen生成,注释为polli-sandbox)。
  2. 写入~/.pollinations/ssh/config:
Host *.polli User user IdentityFile "~/.pollinations/ssh/id_ed25519" IdentitiesOnly yes UserKnownHostsFile "~/.pollinations/ssh/known_hosts" StrictHostKeyChecking accept-new ProxyCommand <node> <polli> sandbox proxy %h
  1. 在你的~/.ssh/config顶部插入一行Include ~/.pollinations/ssh/config(已存在则跳过),并保证该文件权限为0600。

每次ssh都会触发隐藏命令polli sandbox proxy <id>:它先调用connectSandbox(id)延长租约,然后在沙箱内以 root 身份通过 envd(每个 E2B 沙箱内置的 agent)执行 bootstrap.sh,最后建立一个指向沙箱8022端口的 WebSocket 隧道,把本地 stdin/stdout 与沙箱内的 sshd 对接起来。连接期间每隔RENEW_MS = 300_000(5 分钟)自动续租一次,确保租约不会在会话中途耗尽。

bootstrap.sh 是幂等的初始化脚本,每次 ssh 都会执行,其中包含几个关键细节:

  • 若沙箱缺少sshd或rsync,通过apt-get安装openssh-server与rsync——因此只有基于 Debian 的模板才支持 ssh 接入(脚本会明确报错polli ssh needs a Debian-based template)。
  • 下载并校验websocat(固定版本 v1.14.1,带 SHA-256 校验),用它把 WebSocket 端口(8022)转发到本机127.0.0.1:22。
  • 加固 sshd:强制PermitEmptyPasswords no、PasswordAuthentication no、KbdInteractiveAuthentication no、PermitRootLogin no。之所以需要显式覆盖,是因为 E2B base 镜像默认PermitEmptyPasswords yes且user用户无密码,若不加固,sshd 会接受无密钥登录。
  • 把 polli 的公钥写入/home/user/.ssh/authorized_keys(只追加不重复)。
  • 若模板装有herdr(如pollinations系列模板),则以固定环境启动herdr server,使 agent 在 ssh 断开后仍持续运行。

也就是说,第一个允许进入沙箱的密钥只有 polli 的~/.pollinations/ssh/id_ed25519;在非默认模板上,首次 ssh 会先安装sshd、rsync与websocat。

四、模板与预装环境

模板规格内容
pollinations(默认)2 vCPU, 2 GBE2B 的base(Debian 12, Python 3.11)+ Node.js 24 + polli + 各编码 harness:Claude Code、OpenCode、Pi、Hermes Agent、OpenClaw
pollinations-large4 vCPU, 8 GB与上面相同,适合需要更多内存的构建与测试套件
claude/codex/opencode/amp各 2 vCPU, 2 GB通过polli sandbox create <template>显式指定
任意其他公共 E2B 模板由模板决定也支持,但更大的模板每秒成本更高

这两个pollinations系列模板在创建时会自动登录:gen 网关在 e2b.ts 中识别LOGGED_IN_TEMPLATES = ["pollinations", "pollinations-large"],并通过 enter 服务的密钥 API 为沙箱签发一把专用密钥polli-sandbox-<id>,写入沙箱内的/home/user/.pollinations/credentials.json(staging 环境则为credentials.staging.json)。

这把沙箱内密钥只有profile、usage、machines权限(POLLI_PERMISSIONS),刻意不含keys权限——因为沙箱里的任何进程都能读到登录凭据,若含keys权限,代码就能创建新密钥或修改预算。删除沙箱不会删除这把密钥(由 enter 侧管理)。你在沙箱内的首次交互式ssh会把每个编码 harness 都用这把密钥连接到 Pollinations。

另外,默认模板内置了 herdr 服务端(由ssh启动)。在 herdr 中启动的 agent 在 ssh 断开后仍会继续运行;沙箱被暂停后再次恢复,agent 会从原状态继续。相关操作:

ssh <id>.polli herdr agent list # 查看 herdr 中运行的 agent 及其状态 herdr machine add <id>.polli # 让你本机的 herdr 管理该沙箱中的 agent

五、生命周期:自动暂停、恢复与"永不停止"的续期机制

自动暂停与恢复

沙箱在最后一个 ssh 会话结束后约 10 分钟自动暂停(对应LEASE_SECONDS = 600秒的租约耗尽)。暂停后文件与内存都会保留,不产生费用;下一次ssh <id>.polli会立即恢复它。在 CLI 中这一语义被封装为:

  • polli sandbox pause <id>:手动暂停,保留文件和内存,同时结束任何超过 24 小时的 timeout;直到ssh或polli sandbox timeout恢复它。
  • polli sandbox kill <id>:彻底删除沙箱及其文件。

--timeout 0与"永不过期"

polli sandbox create --timeout 0表示沙箱一直运行到你主动 pause 或 kill。这里有个实现细节:E2B 本身没有"永不过期"的超时值,只有 32 位秒数上限,所以 polli 会替你要 E2B 能接受的最大 timeout:2 ** 31 - 1秒(约 68 年),这等价于 Daytona 的autoStopInterval: 0语义。相关常量定义在 e2b.ts:KEEP_SECONDS = 2 ** 31 - 1、RUN_SECONDS = 24 * 3600,并有测试用例专门验证--timeout 0会请求2 ** 31 - 1(见 index.test.ts)。

超过 24 小时的"续期保持(keep)"机制

E2B 自身限制单次运行(run)为 24 小时。当 timeout 超过 24 小时时,Pollinations 的 gen 服务会替你把沙箱一直保持运行到 timeout 到期:

  • 每小时续费一次:每次续费用的是"当初设置 timeout 的那把密钥"。因此,想让沙箱运行数周,就应该用一把无到期时间、无预算上限的密钥来设置 timeout。
  • 每天重启一次 run:由于 E2B 会在 24 小时后结束 run,gen 每天会暂停并恢复一次被 keep 的沙箱。文件、内存与进程都保留,但已建立的网络连接会断开。如果某次续费失败导致沙箱暂停,gen 会在下一次续费时(10 分钟内)自动恢复它。
  • keep 的结束条件:设置 timeout 的密钥被删除、停用或过期,或它的预算、钱包余额耗尽——此时 keep 结束,沙箱会在其已付费的最后一个小时结束后暂停。

这套逻辑的完整实现位于 gen.pollinations.ai/src/routes/e2b.ts:

  • MAX_RUN_MS = 24 * 60 * 60_000:E2B 的单次 run 上限。
  • MAX_TIMEOUT_SECONDS = 2 ** 31 - 1:E2B 的 timeout 上限。
  • KEEP_LEASE_SECONDS = 3600:被 keep 的沙箱每次续租 1 小时。
  • KEEP_RENEW_WITHIN_MS = 15 * 60_000:当租约剩余不足 15 分钟时触发续费。
  • keep 的登记表是 D1 中的sandbox_keep表(shared/db/sandbox.ts),字段为sandbox_id(主键)、api_key_id(设置 timeout 的密钥,级联删除)、until(保持到期时间)。
  • gen Worker 通过定时任务驱动续费:在 index.ts 中注册了scheduled处理器调用keepSandboxes(env, ctx),对应的 cron 表达式*/10 * * * *(每 10 分钟)配置在 wrangler.toml 的[env.production.triggers]/[env.staging.triggers]中。
  • 续费时会重新加载付款密钥的当前状态(loadPayer),因此删除密钥、密钥过期、移除其machines权限或封禁账户都会立即终止 keep;402/403响应会直接结束 keep,其他错误则留待下一轮重试。

六、计费与限额

计费方式

  • 按秒计费,按沙箱的 CPU 与内存规格计算。E2B 的列表价在源码中体现为VCPU_SECOND = 0.000014Pollen/秒、GIB_SECOND = 0.0000045Pollen/秒(e2b.ts),发布期间按E2B 官方费率的四分之一收取(PRICE_MULTIPLIER = 0.25)。
  • 由此可得文档给出的参考价:pollinations(2 vCPU, 2 GB)约0.033 Pollen/小时,pollinations-large(4 vCPU, 8 GB)约0.083 Pollen/小时。
  • 预付制,分为四类扣费时点:
    • 创建时预付 10 分钟;
    • ssh 会话期间每 10 分钟预付一次;
    • 被 keep 的沙箱每小时预付一小时;
    • polli sandbox timeout <id> <seconds>追加的时间即时预付。

对应地,CLI 侧的LEASE_SECONDS = 600就是"每次 create/connect 预付 10 分钟"的体现,而keepLease()计算续租时"向下取整",避免对已经付过的零头秒重复计费。

不退费与 402

  • 未使用的时间不退款:提前暂停沙箱或缩短 timeout,等于放弃剩余已付时间;恢复运行则需再次付费。想停止付费,就等已付时间耗尽,或直接 kill。
  • 新建沙箱需要足够的钱包余额与密钥预算来支付第一个计费块,否则沙箱会被立即停止并返回402。在网关实现中,创建与续租前都会调用requireAccountFunds检查余额;创建后若首付失败,网关会主动 DELETE 该沙箱,避免留下"未付费的运行中沙箱"。

并发上限

每个账户同时最多运行 3 个沙箱。网关通过MAX_RUNNING_PER_USER = 3与按pollinations_user元数据查询运行中沙箱数量来强制(超出返回 429,提示"Kill or pause one first");暂停中的沙箱不计入上限,但恢复暂停沙箱前同样会检查容量。

七、直接使用 E2B 官方 SDK 与 CLI

Pollinations 的 gen 网关在/alpha/e2b下代理了 E2B 的控制面 API,因此E2B 的 SDK 与其 CLI 无需修改即可直接使用——只要把 API 地址与密钥换成 Pollinations 的即可:

export E2B_API_URL=https://gen.pollinations.ai/alpha/e2b export E2B_API_KEY=sk_...

使用前提:这把密钥必须具有machines权限(账户权限中的machines,语义即"创建并运行托管沙箱")。之后:

  1. 先执行一次polli sandbox ssh-config,让本地 ssh 能进入这些 SDK/CLI 创建的沙箱。
  2. 在创建、连接(connect)或调用setTimeout时,用这把密钥设置一个超过 24 小时的 timeout,沙箱就会被保持运行到该时刻——这等价于在拥有更长限制的 E2B team 上的行为:gen 每小时用这把密钥续费,并每天重启一次 run。
  3. E2B 没有"永不过期"的 timeout,因此请使用其最大值2147483647 秒。
  4. 之后若把 timeout 改为 24 小时或更短,或执行暂停,keep 即结束。
  5. 建议在创建/连接请求中设置lifecycle: { onTimeout: "pause" },这样租约到期未续费时沙箱会被暂停而非销毁。

暂不支持的 E2B 能力

从网关实现来看,以下能力当前不可用(创建请求携带这些字段会被拒绝,其余未开放的端点一律返回 403):

  • autoResume(自动恢复)
  • 快照(snapshots)、fork
  • IAM
  • 卷挂载(volume mounts)

网关的兜底路由对所有"未列入白名单的路径"(templates、snapshots、forks、volumes、secrets、webhooks 等)统一返回 403,注释说明这些端点"在有人评审完其计费方式之前保持关闭"(gen.pollinations.ai/src/routes/e2b.ts)。

八、源码级要点速览

关注点位置关键常量/行为
CLI 沙箱命令packages/polli-cli/src/commands/sandbox/index.tscreate/list/timeout/pause/logs/kill/ssh-config 及隐藏的 proxy
租约与超时常量packages/polli-cli/src/commands/sandbox/e2b.tsLEASE_SECONDS=600、RUN_SECONDS=24h、KEEP_SECONDS=2**31-1
SSH 隧道与配置packages/polli-cli/src/commands/sandbox/ssh.tsWebSocket 隧道、5 分钟续租、Node 22+ 要求
沙箱内引导脚本packages/polli-cli/src/commands/sandbox/bootstrap.sh安装 sshd/rsync/websocat、sshd 加固、herdr server
E2B API 网关gen.pollinations.ai/src/routes/e2b.ts/alpha/e2b路径、定价、keep 续费、容量上限
续费定时任务gen.pollinations.ai/src/index.ts + wrangler.tomlscheduled→keepSandboxes,cron 每 10 分钟
keep 数据表shared/db/sandbox.tssandbox_keep(sandbox_id, api_key_id, until)
测试覆盖packages/polli-cli/src/commands/sandbox/index.test.ts创建请求体、--timeout 0请求2**31-1、pause 路由

九、实操建议

  1. 按需付费的临时开发环境:默认模板即可,用完kill,避免闲置扣费。
  2. 长时间运行的 agent 或任务:用一把无到期、无预算的密钥设置polli sandbox timeout <id> <seconds>(或创建时--timeout),配合 herdr 让 agent 在 ssh 断开后继续运行;注意预算与密钥生命周期会终止 keep。
  3. 需要更多内存的构建:选用pollinations-large(4 vCPU, 8 GB)。
  4. 自己熟悉的 E2B 模板:polli sandbox create <template>支持任意公共模板,但要确认基于 Debian,否则 ssh 接入不可用;更大规格意味着更高每秒成本。
  5. 程序化接入:所有polli sandbox命令支持--json,配合E2B_API_URL/E2B_API_KEY环境变量可把现有 E2B 脚本无缝迁移到 Pollinations 计费体系。
  • AI 应用
  • 媒体生成
  • 后端
  • 前端

【免费下载链接】pollinations

Your Friendly Open-Source Gen-AI Platform

项目地址:https://gitcode.com/gh_mirrors/po/pollinations
点击查看免费下载

相关推荐

上一篇:RIOT 开发指南:ESP32-S3-USB-OTG 板卡支持、外设配置与 USB 设备开发实践
下一篇:使用 Fleet 安装 osquery 并将 macOS 设备接入 Fleet 的完整指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/5 14:13:15

Kubernetes 1.26.4 集群部署实战:从环境初始化到节点加入的完整指南

1. 环境准备与方案选择先把话说在前头&#xff1a;Kubernetes 1.26.4 这个版本&#xff0c;不是最新版&#xff0c;但它是一个经过了大量生产环境验证的稳定版本。如果你正在规划内部系统的容器化改造&#xff0c;或者想搭建一套用于学习和测试的集群&#xff0c;1.26.4 是一个…

作者头像 李华
网站建设 2026/11/4 13:22:10

27.LeetCode 2265. 统计值等于子树平均值的节点数 —— 后序遍历实战

一、题目分析题目要求统计二叉树中满足 “节点值等于其所在子树平均值” 的节点数量。子树平均值的计算规则为&#xff1a;子树所有节点值之和 子树节点总数。示例解析以输入 root [4,8,5,0,1,null,6] 为例&#xff1a;节点 4 的子树包含 6 个节点&#xff0c;总和为 24&…

作者头像 李华
网站建设 2026/10/23 13:48:00

QCustomPlot多坐标系实战:轴的绑定、布局与联动避坑指南

简介&#xff1a;面向需要掌握 QCustomPlot 高级绘图能力的 Qt 开发者&#xff0c;这份代码工程围绕多坐标系核心机制展开&#xff0c;完整演示了如何通过 QCPAxisRect 创建多个坐标系、动态添加坐标轴区域、实现共享 X 轴联动&#xff0c;以及利用双击事件切换坐标系颜色。压缩…

作者头像 李华