沙盒与上限
沙盒是云端运行所在的那台虚拟机。本页说明它的规格档和架构、装了什么、能访问什么、受哪些上限约束,以及运行结束后留下什么。
连 GitHub 仓库和自带镜像的项目,每次运行、每次预跑、每次「检查一次」都开一台全新的虚拟机。虚拟机开在伦敦(见运行位置)。它不会重复使用,也不和别人共用,运行结束就删除。隔离措施见安全说明。
选规格档
规格档决定虚拟机的大小。默认是「标准」。
| 规格档 | vCPU | 内存 | 磁盘 | x86 机型 | ARM 机型 | 适合 |
|---|---|---|---|---|---|---|
| 小 | 2 个共享(x86)/ 1 个(ARM) | 4 GB | 30 GB | e2-medium | n4a-standard-1 | 只调外部模型 API 的轻量 Agent |
| 标准 | 2 | 8 GB | 30 GB | e2-standard-2 | n4a-standard-2 | 多数 Agent |
| 大 | 4 | 16 GB | 50 GB | e2-standard-4 | n4a-standard-4 | 带数据库和多个工具后端的 Agent |
| 特大 | 8 | 32 GB | 100 GB | e2-standard-8 | n4a-standard-8 | 本地跑小模型或依赖很重 |
| 超大 | 16 | 64 GB | 200 GB | e2-standard-16 | n4a-standard-16 | 大型构建、几个很重的服务,或要更多内存的本地模型 |
| GPU(即将开放) | 8 个,加一块 24 GB 显存的 GPU | 32 GB | 100 GB | g2-standard-8 | 没有 | 要用 GPU 的本地模型 |
ARM 的一个 vCPU 是一个完整的核;x86 的一个 vCPU 是一个超线程。同一档不论 x86 还是 ARM 都是一个价,见价格。每一档在所有套餐上都能用,免费版也一样。「GPU」档只在伦敦的 x86 上跑。平台的 GPU 镜像做好并通过安全检查之前,这一档是灰的(「即将开放」),之后由平台开放。
要换档,打开项目的「设置 → 沙盒」,选「规格档」,点「保存」;也可以在接入向导的「规格档」一步里选。
平台会按测试接入(Agent 旁边要起几个容器)、仓库的依赖文件(要装 torch、TensorFlow、CUDA 这类很大的包)和最近 3 次沙盒(内存不够、盘满了、准备环境到了时间上限、准备环境用了 10 分钟以上)推荐一档。要装很大的包、或者上次准备环境很慢时,不管推荐不推荐都会提前写一句,比如「这个仓库要装 torch 这类很大的包:准备环境可能要 20 分钟以上」。这两处都会在现在用的那档旁边写出推荐的那一档和原因,下拉框一直显示现在的那档,点「换成…」才会改。测试接入写明了装什么之后(review.yaml 的 setup,没写就是按仓库根目录文件的默认装法),只按它装的算。平台从不推荐更小的档。
组织所有者在「组织」→「策略」→「AI 自己做的事」里关掉了「助手改东西要我确认」(默认开着)时,AI 会在它的费用上限内替项目换上推荐的档,项目上会写明,可以在「设置 → 沙盒」里改回。开着时,平台从不自己换档。
项目的每次运行都用选定的这一档,运行会记下用的是哪一档。平台停用的规格档,新的运行不能再选;已经在跑的不受影响。
自定义规格
「规格档」里最后一项「自定义…」让你自己定大小,所有套餐都能用,免费版也一样。它主要是给哪一档都没有的大小用的,比如 200 GB 内存。
| 字段 | 取值 |
|---|---|
| 核数 | 2 到 80 的偶数 |
| 内存 GB | 2 到 640 |
| 磁盘 GB | 30 到 2000 |
| GPU | 不要、1 块、2 块或 4 块(每块 24 GB 显存) |
平台给你至少这么大、最便宜的机器:
- 不要 GPU 时, 核数取你要的核数和「内存 ÷ 8」里大的那个,向上取到偶数(每个核最多配 8 GB);内存取你要的内存和「每核 2 GB」里大的那个。ARM 规则一样,最多 64 核、512 GB;更大的请选 x86。
- 要 GPU 时(只有 x86),给你 GPU 块数相同、核数和内存都够的最小一种机器:1 块 GPU 的有 4 核 16 GB、8 核 32 GB、12 核 48 GB、16 核 64 GB、32 核 128 GB;2 块的是 24 核 96 GB;4 块的是 48 核 192 GB。再大的会被拒。
给的比你要的多时,输入框下面写明实际给的,比如「实际分配:26 核 · 200 GB 内存 · 30 GB 磁盘」,旁边是每小时的价格(「价格:约 $3.64/小时」)。自定义规格在伦敦跑,不用你选在哪。自定义规格里的 GPU 和「GPU」档一起开放;在那之前,带 GPU 的自定义规格会被拒,提示同样是「即将开放」。
自定义规格和规格档一样按秒计费,用它自己的价格,开始测试前的预估也按这个价格算。价格和例子见价格。
选架构
沙盒跑在 x86(amd64)或 ARM(arm64)上。在「设置 → 沙盒 → 架构」里设:
| 设置 | 连仓库的项目 | 自带镜像的项目 |
|---|---|---|
| 自动(默认) | x86 | 镜像有 x86 就用 x86,否则用 ARM |
| x86 | x86 | x86,镜像得有 |
| ARM | ARM | ARM,镜像得有 |
自带镜像的项目只能选镜像有的架构。设置里选了镜像没有的,运行会被拒绝,并说明镜像有哪些。仓库默认 x86,因为一些 Python 包、下载型二进制和只出 x86 的工具在 ARM 上装不上。
出现 exec format error,或者找不到 aarch64 的包,说明架构不对。平台会从预跑(或「检查一次」)的日志里认出这些,自动换到另一种架构再预跑一次,项目的设置先不动。通过了,平台就把项目的架构改过去,在「设置 → 沙盒」里写明为什么,并给出「改回」。两种都没通过时,两次的结果都写在预跑结果里。在等这次预跑的测试也跟着换过去。
镜像没有设置里那种架构时,「检查一次」直接在镜像有的那种上跑。
选运行位置
在「设置 → 沙盒 → 运行位置」里设:
| 设置 | 沙盒开在哪 |
|---|---|
| 自动(默认) | 伦敦 |
| 伦敦 | 伦敦 |
现在两个都开在伦敦。只有平台以后再开一个位置时才有区别:「自动」在伦敦满了时可以开到那里,「伦敦」满了就排队。数据放在哪,见数据处理。
2026 年 10 月 24 日起,沙盒只在伦敦。「瑞典(欧盟)」不再提供,设置里也不显示;选过它的项目已经改成「自动」。还选着它的项目发起时会被拒,提示把运行位置改成「自动」,不会不问一声就换到伦敦。
机器镜像里有什么
沙盒从平台的机器镜像开机,每种架构一个:
- Ubuntu 24.04 LTS,带当周的更新。
- Docker Engine 和 Compose 插件,以及 devcontainer 命令行。
- Node.js 20 和 22(
node是 22;node20、node22也在 PATH 上),pnpm 和 yarn 经 corepack 提供。 - Python 3.12 和 3.11,各带 venv,以及 uv。
- Go 1.23 和 Java 21(OpenJDK)。
- 预先拉好的镜像:
postgres:16-alpine、mysql:8、redis:7-alpine、node:22-alpine、python:3.12-slim。 - 两个用户:
runner跑测试机,agent(uid 1500)跑你们的 Agent,没有 sudo,也用不了 Docker。
带 GPU 的虚拟机(「GPU」档,或带 GPU 的自定义规格)用同一个 x86 镜像开机,另外装好 GPU 驱动和容器工具包。在虚拟机上直接跑的 Agent 直接就能用 GPU;在容器里跑的 Agent 也能用(它的容器用 --gpus all 启动)。
镜像每周重建一次。每次运行都记下用的镜像版本,作为版本的一部分。
沙盒能访问什么
- 入站: 什么都进不来。沙盒没有外网 IP。
- 出站: 只有 TCP 443 和 80 端口,经伦敦的一个固定出口 IP。80 端口只给构建镜像用;你们的 Agent 本身只能走 443。
- 你们的 Agent 能经发布出来的端口访问
127.0.0.1上的 services,能访问外网 443 端口;访问不了云元数据服务、平台的控制面,也不能直接访问容器网络。
把沙盒地址加进白名单
你们的测试后端或模型网关只放行已知地址时,发邮件到 admin@nice2.io 问沙盒的出站地址,加进白名单。2026 年 10 月 24 日起不再用瑞典(欧盟)的那个地址。网页直连的对话 AI 则是从控制面自己的固定地址调用的。
上限
云端运行受组织策略约束。所有者在「组织 → 策略」里设,不能超过套餐允许的范围(见组织策略)。
| 上限 | 默认 | 到了会怎样 |
|---|---|---|
| 同时在跑的沙盒数 | 2 | 之后的运行排队,前面的跑完按顺序开始。 |
| 单次运行最长时间 | 120 分钟 | 到上限前 5 分钟,测试机在当时那次执行结束后停下,已有的部分结果照常出报告。到上限还在跑的被停下,虚拟机删除。虚拟机本身还带一个硬上限:到上限后晚 10 分钟直接删除。 |
| 每月沙盒小时 | 不限 | 所有者可以设上限。用完后新发起的运行会被拒并说明原因,还在跑的沙盒在当时那次执行结束后停下。每月 1 日(UTC)恢复。 |
套餐决定组织策略最多能设多少:
| 套餐 | 同时在跑的沙盒 | 单次运行最长 | 每月沙盒小时 |
|---|---|---|---|
| 免费版 | 1 | 60 分钟 | 不限 |
| Pro | 3 | 240 分钟 | 不限 |
| Ultra | 10 | 480 分钟 | 不限 |
| 先充值 | 3 | 240 分钟 | 不限 |
| 企业版 | 不限 | 不限 | 不限 |
预跑和「检查一次」也和运行一样占沙盒、用沙盒小时。沙盒时间按规格档或自定义规格的价格收费(单价)。免费版、Pro 和 Ultra 先从这一期的额度里扣,再从余额扣。
虚拟机一直没接上平台
新开的虚拟机要在建好后 12 分钟内接上平台。没接上的话,平台删掉它,自动重开一台。还是同一次测试、同一个人发起的,按组织的名额排队;页面上写明原因,并给出第一台的串口输出(和任务日志一样,里面的密钥和令牌已遮住)。这段时间不收费,也不算进本月的沙盒小时。
重开的那台也没接上,平台才结束这次运行,并把任务编号、两台各在哪家云哪个区、开机日志(密钥已遮住)发给我们的工程师(admin@nice2.io)。页面上会写「已经通知了平台的工程师」,你们不用做什么。
云上没能建起虚拟机时也一样:不收费,过一分钟自动再建一次,还不行就通知我们。只重开一次,取消了就不再重开。
虚拟机在运行中途没了,或失联
这次运行记为「没跑完」,不会自动重跑:你们的 Agent 可能已经改过测试后端里的数据。先重置测试后端,再重新发起。发起时要勾选,确认已经核对过。在有人确认之前,自动触发和用项目 API 令牌发起的运行都会被拒。已执行的部分照常出报告,可以补跑没执行的那几次。
虚拟机中途没了时,它最后一次交回部分结果之后的那段时间不收费,也不算进本月的沙盒小时;之后平台的自动补跑也不收费。测试中途和沙盒失联(租约过期)的照常计费。见平台的问题不收费。
测试中途和沙盒失联(租约过期)时,平台先看这次用的 review.yaml:测试开始后覆盖层里的没改过,就用覆盖层里的;否则读仓库里那个提交的。
下面这些全部满足时,Agent 能改的东西都在这台虚拟机里,已经随它删掉了,所以平台自己核对。任务页会写「平台已核对」,审计日志记成平台做的(job.auto_acknowledge,带上找到的后端):
- Agent 在虚拟机里跑(
driver: command或harness);用driver: http的,接口和它的重置地址在127.0.0.1或localhost上; - 工具经工具代理到
127.0.0.1上的上游(attach: http_proxy),或者是平台的模拟后端(fixture); - 数据重置是
127.0.0.1上的 HTTP 地址,或者是数据库地址在127.0.0.1上、写在runner_env里的 SQL;数据读取是虚拟机里的 SQLite 文件,或者地址在127.0.0.1上、写在runner_env里; - 交给 Agent 的项目密钥只有模型的密钥(
OPENAI_API_KEY这类),agent.env和runner_env里交给它的地址都在127.0.0.1上。
有一条不满足,就仍然要人核对。下面这些都算不满足:
- 外面的地址;
- 地址来自项目密钥(平台读不到它的值);
- 数据重置是一条命令;
- 用 MCP 工具服务(
mcp_wrap,它们连到哪儿不写在review.yaml里),或只看得到回复的接入; review.yaml读不到,或在测试开始后改过。
运行结束后留下什么
| 什么 | 保留多久 |
|---|---|
| 你们的源码或镜像,以及项目密钥 | 随虚拟机删除 |
| 运行包里的证据文件和沙盒日志 | 组织的保留期,默认 90 天 |
| 报告和结论 | 项目在就一直在 |
| 依赖缓存(连仓库的项目) | 30 天 |
按 Dockerfile 或 devcontainer.json 构建的容器镜像,按提交保存 | 30 天 |
一个运行包解压后最多 512 MB、10,000 个文件、单个文件 64 MB。
下一步
- review.yaml 参考:
environment和services。 - 组织与成员:改组织策略。
- 账单与用量:沙盒时间怎么收费、在哪里看。