- AI 应用
- 媒体生成
- 后端
- 前端
【免费下载链接】pollinations
Your Friendly Open-Source Gen-AI Platform
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 loginpolli 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)会:
- 在
~/.pollinations/ssh/下生成 ed25519 密钥对id_ed25519(首次创建时通过ssh-keygen生成,注释为polli-sandbox)。 - 写入
~/.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- 在你的
~/.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 GB | E2B 的base(Debian 12, Python 3.11)+ Node.js 24 + polli + 各编码 harness:Claude Code、OpenCode、Pi、Hermes Agent、OpenClaw |
pollinations-large | 4 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,语义即"创建并运行托管沙箱")。之后:
- 先执行一次
polli sandbox ssh-config,让本地 ssh 能进入这些 SDK/CLI 创建的沙箱。 - 在创建、连接(connect)或调用
setTimeout时,用这把密钥设置一个超过 24 小时的 timeout,沙箱就会被保持运行到该时刻——这等价于在拥有更长限制的 E2B team 上的行为:gen 每小时用这把密钥续费,并每天重启一次 run。 - E2B 没有"永不过期"的 timeout,因此请使用其最大值2147483647 秒。
- 之后若把 timeout 改为 24 小时或更短,或执行暂停,keep 即结束。
- 建议在创建/连接请求中设置
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.ts | create/list/timeout/pause/logs/kill/ssh-config 及隐藏的 proxy |
| 租约与超时常量 | packages/polli-cli/src/commands/sandbox/e2b.ts | LEASE_SECONDS=600、RUN_SECONDS=24h、KEEP_SECONDS=2**31-1 |
| SSH 隧道与配置 | packages/polli-cli/src/commands/sandbox/ssh.ts | WebSocket 隧道、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.toml | scheduled→keepSandboxes,cron 每 10 分钟 |
| keep 数据表 | shared/db/sandbox.ts | sandbox_keep(sandbox_id, api_key_id, until) |
| 测试覆盖 | packages/polli-cli/src/commands/sandbox/index.test.ts | 创建请求体、--timeout 0请求2**31-1、pause 路由 |
九、实操建议
- 按需付费的临时开发环境:默认模板即可,用完
kill,避免闲置扣费。 - 长时间运行的 agent 或任务:用一把无到期、无预算的密钥设置
polli sandbox timeout <id> <seconds>(或创建时--timeout),配合 herdr 让 agent 在 ssh 断开后继续运行;注意预算与密钥生命周期会终止 keep。 - 需要更多内存的构建:选用
pollinations-large(4 vCPU, 8 GB)。 - 自己熟悉的 E2B 模板:
polli sandbox create <template>支持任意公共模板,但要确认基于 Debian,否则 ssh 接入不可用;更大规格意味着更高每秒成本。 - 程序化接入:所有
polli sandbox命令支持--json,配合E2B_API_URL/E2B_API_KEY环境变量可把现有 E2B 脚本无缝迁移到 Pollinations 计费体系。
- AI 应用
- 媒体生成
- 后端
- 前端
【免费下载链接】pollinations
Your Friendly Open-Source Gen-AI Platform
相关推荐
Pollinations E2B 连接器指南:从月度用量采集到沙箱计费全解析
Pollinations E2B 连接器指南:从月度用量采集到沙箱计费全解析 本指南以开源仓库 pollinations 中的 E2B 连接器文档( .clau
AI 应用媒体生成后端前端qwerty-learner:免费打字练习工具,边背单词边练英语肌肉记忆
qwerty learner:免费打字练习工具,边背单词边练英语肌肉记忆 中文输入飞快,一敲英文单词就开始拼错,这是很多键盘工作者的通病。qwerty lear
前端教育Pollinations × OpenClaw 接入实战:用 Polli CLI 一键把 OpenClaw 变成 Pollinations AI 的 Agent 大脑
Pollinations × OpenClaw 接入实战:用 Polli CLI 一键把 OpenClaw 变成 Pollinations AI 的 Agent
AI 应用媒体生成后端前端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考