@ computesdk/ givememode (英语)
给定 计算SDK的提供者。 这么快 微VM沙盒.
安装和设置
npm install @computesdk/givemeanode
把它装入一个 .env 文档。 任何管家都可以用薄荷薄荷
团队 或 CLI; 显示一次.
gman token create --name computesdk --workspace my-workspace
# prints GMN_TOKEN=gmnt_... once
GMN_TOKEN=gmnt_your_token
# Optional. Defaults to us-west-2. givemeanode runs an endpoint per region
# and they are not interchangeable for latency, so set this to the one
# nearest your workload.
GMN_API_HOST=https://api.use1.givemeanode.com
使用量
import { givemeanode } from '@computesdk/givemeanode'
const compute = givemeanode({ apiKey: process.env.GMN_TOKEN })
const sandbox = await compute.instances.create()
const result = await sandbox.runCommand('node -v')
console.log(result.stdout) // v24.19.0
await sandbox.destroy()
配置
| 选项 | 类型 | 默认 | 它会做什么 |
|---|---|---|---|
apiKey | string | GMN_TOKEN | 这个 gmnt_ org 服务标志. |
baseUrl | string | GMN_API_HOST,则 https://api.givemeanode.com | 使用哪个区域终点. |
fastToken | 'absorb' | 'prime' | 'off' | 'absorb' | 见下文. |
transport | 'auto' | 'http2' | 'fetch' | 'auto' | 每次请求都有一个HTTP/2会话,或 fetch。参见"一个连接一个破裂". |
warm | 'connect' | 'prime' | 'off' | 'connect' | 建筑与连接有什么关系. 见"一脉相通一脉相通". |
connectTimeout | number | 10000 | HTTP/2会话的开幕时间,以毫秒计. |
ramGib | number | 2个 | 宾客记忆. memoryMiB 编号 : memMiB 打开 create 也读取并四舍五入到整个GiB; memory 按共享选项是十进制 MB. |
egress | 'open' | 'none' | 账户默认 | 来宾能否到网. 宾客图像准备后固定, 不是每个命令 . |
execRetries | number | 1个 | 见"两种值得了解的行为". |
timeout | number | 120 000 个 | 请求超时,以毫秒计. |
要求多个核心
沙盒默认是一个vCPU. create 在其中任何一项下取一个 vCPU 计数
计算 SDK 的拼写( S)vcpus, (中文(简体) ), cpus, (中文(简体) ), resources.vcpus)它被绘制
打开 最小数 符合两个维度的已命名实例类型:
// 8 vCPU / 32 GiB (sandbox-lg)
const sandbox = await compute.instances.create({ vcpus: 8, memory: 16384 })
// ...or name the size outright, which wins over the hints
const xl = await compute.instances.create({ size: 'sandbox-xl' })
| 大小 | 五氯联苯 | 内存 | 记为 |
|---|---|---|---|
sandbox-sm (默认) | 1个 | 2个GiB | 2个GiB |
sandbox-md | 页:1 | 8个GIB | 16 吉贝 |
sandbox-lg | 第8条 | 32个GIB | 32个GIB |
sandbox-xl | 16个 | 64 吉贝 | 64 吉贝 |
要求8个VCPU
8-vCPU外形,从来没有16-vCPU. 一个通过范围夹顶的询问
改为 sandbox-xl 让门拒绝它 并留言命名你自己
天花板,而不是扔 不太有用的地方.
默认值以上的大小是每个工作空间的选入. 一个新的工作空间
sandbox_vcpus 上限为4个,上限为4个 sandbox_ram_gib 上限是8,所以
sandbox-lg 财务报告和审定财务报表 sandbox-xl 被拒绝,直到一个兽人管理者 提高两者。 这个
拒绝指定限制和如何提高限制, 并且此提供者显示
信息逐字记录.
一个命名大小和 ramGib 彼此排斥,因为大小已经
修正两个维度。 仅存请求保留 ramGib,所以希望6个GiB上
一个核心得到的正是 而不是被围成一个形状 你会
{\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}多收点钱.
容器图像
通过消化传递任何容器图像,并给定模式运行:
const sandbox = await compute.instances.create({
image: 'ghcr.io/acme/task@sha256:abc...',
})
或准备一次,然后从它开始许多沙盒,这要快得多 每个沙盒 :
const template = await compute.template.create({
image: 'ghcr.io/acme/task@sha256:abc...',
})
const a = await compute.instances.create({ templateId: template.id })
const b = await compute.instances.create({ templateId: template.id })
三事须知:
- 参考内容必须基于文摘.
ghcr.io/acme/task:latest实值 拒绝;ghcr.io/acme/task@sha256:<64 hex>已接受。 标签可以是 移动到不同字节的指向,准备的图像被缓存到下面 图像的身份,所以一个标记 最终将启动一个沙盒从 内容不再回答该名称。 阅读摘要docker buildx imagetools inspect <ref>或者说crane digest <ref>。 。 。 . - 将注册主机全文写入 .
alpine@sha256:...被拒绝 因为它没有说要认证给哪个登记处. - 新图像的第一个沙盒很慢,因为图像必须
在一切开始之前,要做好准备;每一次都快。 使用
template.create当你知道图像在前面。 提供者准备 给定的图像每个进程只共享一次结果, 因此开始 N 一个图像的沙盒不准备它N时间.
gimentmeanode自己的被整理的相片也可用名取出(sbx-base, (中文(简体) ),
默认,有蟒蛇3、节点24、克特、卷曲和一个编译器; sbx-min 财务报告和审定财务报表
sbx-task 比较小). 任何包含 @sha256: 被视为
容器图像; 其它任何东西均作为拼接名称处理.
签名的证书, 为什么你免费得到它
认证请求需要一次显示签名的来回旅行
证书没有。 给一个手 回到任何回应
请求与您的 gmnt_ 符号 :
gmn-fast-token: gmns_<compact JWT>
gmn-fast-token-expires: 2026-08-30T19:48:19Z
这个包吸收了报价并自动呈现出来. 有一个
无配置,无新库,无外出往返数字 :
价钱是按你已经得到的答复 和你的 gmnt_
信物是你们唯一的秘密 每一次失败都会回到
普通的证书,所以不能使用的证书 永远不会更糟
而不是没有.
三种模式,因为正确的模式取决于您的形状:
absorb(默认)从不增加回程. 你的第一个要求已经满足了 普通成本,它的反应 带有证书,和一切 更便宜的 包括紧接着命令 首先创建.prime先付一个请求 单飞过每一个 呼唤者分享信使,所以即使第一个创造出一个破裂的礼物 证书。 是一个GET /preview/sandboxes第一次选举之前 创建,列表中的十字符将输入数据库: 东门.off从不给一个.
const compute = givemeanode({
apiKey: process.env.GMN_TOKEN,
fastToken: 'prime', // pay the warm-up before the first burst
})
默认是 absorb 通过1.0.x, prime 在1.1.x中,并且为 absorb
再次从1.2.0. prime 是在2026-09-09上对着一个门测量的
读取其数据库以验证一个 gmnt_ 符号,所以100个寒冷创建队列
其中100个读取(约600毫秒为767毫秒所创造). 那天晚些时候
门开始回答 a gmnt_ 它的纪念品的复制品
表格和读数停止计算任何费用,而质数继续计算
其清单:2026-09-18年从我们东-东-1测得的100分
创建一个 HTTP/2 会话,中位点对交互时间改为 56 到
106米,没有质地对166米等待一个.
所花费的,明白无误地说:签名的证书对自己有效
不管后面的标志发生了什么 gman token revoke 停止任何东西 新设 立刻,但证书已经
客户端的手一直工作到到期. 禁令的行为也一样.
一个连接一个破裂
在节点上,这个提供商向门讲HTTP/2:每个提供商一个会话, 每一个请求其中的流, 当提供者构建时打开 握手是在你准备的时候付的 测量数据 我们东一站对着我们东一门, 100个同时创建的,当时命令 配对 :
| 有线 | TTI 中位数 | 第95页 | 第99页 |
|---|---|---|---|
fetch,每个飞行请求连接一次 | 211分钟 | 315分钟 | 338 分钟 |
| 1个 HTTP/2 会话 | 40分钟 | 44分钟 | 45分钟 |
门是用大约1ms来回答的 区别在于客户端:
fetch 每个飞行中请求打开一个 TLS 连接, 单行
跑步时间 接接接接接接地握手 中位数
创作等待着170毫秒左右的转弯 才有字节到达大门.
fetch 保持为后退 node:http2 无法获取
(浏览器,边缘运行时间)或会话无法打开,它是什么
已注射 fetch 选择。 设定 transport: 'fetch' 永远不要开会,
或者说 transport: 'http2' 用它来对抗一个纯文本回回回 dev 服务器
(h2c) (中文(简体) ).
建筑不会在会话上发出任何信号: 您的符号首先离开
进程。 设定 warm: 'prime' 支付签名
证书的热身在建筑, 所以即使是第一个创造的爆破
送给你,或者 warm: 'off' 在第一次请求之前不打开任何东西。 闲会话不保留节点
进程为活,所以一个脚本可以发出请求,并随即返回
结束了 fetch。其连接从未完成的请求在
拥有 timeout,并且连接需要比 connectTimeout
放弃了 放弃了 fetch 从那时起回答.
那扇窗是一个证书的一生,不再存在.
抓图
一个沙盒可以被快照,一个快照从开始. 这是 获取备妥环境的 N 副本的最快方式 :
const snapshot = await compute.snapshot.create(sandbox.instanceId)
const copy = await compute.instances.create({ snapshotId: snapshot.id })
源出相续. 叉子恢复确切的捕获状态:
整个根文件系统(包括 /tmp、内存和运行过程
(单位:千美元)provider.snapshot.capabilities 实值 { scope: 'rootfs', memory: true, destroysSource: false }) (中文(简体) ). 没有明显的停顿:一个闲置的沙盒
自己去公园,然后在下一个命令上醒来,所以 instance.pause() 没有
提供.
支助
| 特性 | 支助 |
|---|---|
sandbox.create 编号 : getById 编号 : list 编号 : destroy | 对 |
runCommand (cwd, env, 背景, 超时) | 对 |
filesystem (读取、写取、mkdir、读取、存在、删除) | 是的,结束了 runCommand |
template.create 编号 : list 编号 : destroy | 是, 从容器图像 |
snapshot.create 编号 : list 编号 : delete | 对 |
getUrl (用于端口的公开 HTTPS URL) | 是 - 见下文 |
| 流出/断层 | 非本土; SDK 桥适用 |
三个值得了解的行为
读取范围为执行输出封顶下方. 文件以 512 KiB 读取 字节块超过基数64,然后解码为UTF-8一次. 这个可以保留 多字节字符, 一个领先的 BOM, 和后面的新行甚至横跨 块边界 。 截断响应、 已读失败、 短块和大小 更改拒绝而不是返回前缀。 联系被跟踪 嘉宾的文件权限仍然适用。 正在更改的文件不是 原子快照:如果需要的话,在阅读前先停止写作.
写作经过了基础64,不是异端. 异教徒的身体是每一行
因此它只能生成一个文件 结束于 a
新线: 写入 hello 并读回赠 hello\nBase64 没有
这种圆形,不需要逃跑(字母表是空壳形),并携带
包含异端文件不能 - 没有后继的新行, 与标记等同的行,
任意字节。 执行频道在 ~100 KB 上多降一个命令
(结果以 exec_channel_lost),所以满足于谁
基数64 超过 32 KB 后附a <path>.gmn-part 文件为切片
以最后一种方式重命名为目标
半写文件,一个大写 花费每个切片一个执行。 每个
图像飞船,所以 base64 已存在。 编码和
命令生成一次发生一个切片,而不是完整的列表
base64 命令在内存中保存 .
命令被重试一次, 只针对一个错误 . 与a的联系
沙盒是按要求重建的,所以是静静后的第一个命令
伸展可以发现它关闭,需要重拨。 没有别的事是重审的
命令运行和失败时有退出代码,因此返回,
也不是一个例外。 在罕见的情况下 沙盒确实收到
在连接被放弃前请求, 重试意味着命令可以运行
两次,通过 execRetries: 0 工作需要的话.
预览 URL
getUrl({ port }) 返回到达服务器的公开 HTTPS URL
运行在沙盒里 - 一个编码代理刚写的页面,看
从外出 :
const sandbox = await compute.instances.create({ templateId: template.id })
await sandbox.runCommand('sh', ['-c', 'cd app && (npm run dev > /tmp/dev.log 2>&1 &)'])
const url = await sandbox.getUrl({ port: 3000 })
三件事决定它是否有效:
- 服务器在沙盒回放上听.
127.0.0.1:3000实值 dev 服务器默认绑定且完全正确; 主机连接 在vsock和客人拨自己的回路, 所以没有包到达 在嘉宾的网络界面。 这也意味着一个暴露的端口工程 在沙盒上准备egress: 'none'。 。 。 . - 服务器在启动它的命令中幸存了下来.
runCommand等待时间 使其命令输出结束, 因此npm run dev &一个人挂电话 然后随之而去. 重定向 :(npm run dev > /tmp/dev.log 2>&1 &)。 。 。 . - URL是秘诀. 主机名带有令人厌恶的
能力,所以把它当作一个密码;它过期(默认时为24小时)和
死在沙盒里 死在沙盒里 死在沙盒里.
unexposePort(sandbox, port)更早关闭它.
调用为每端口的同位素 - 相同的端口返回相同的 URL 刷新了过期 - 所以没有理由缓存一个.
限制
- 已曝光端口仅为 HTTP( S), 它是一个预览 URL 而不是一个
疾控网.
getUrl({port})薄荷到达端口的公用 HTTPS URL 在沙盒内; 请求骑取一个代理 hop, 这适合 dev 服务器或 API 您正在测试,而不是服务生产流量. 流式、SSE和WebSocket(protocol: 'wss',同一URL)通过. 原始 TCP 端口不能被曝光 . - 集装箱图像必须贴有消化装置并符合登记条件,以及 新来的沙盒很慢 见"集装箱影像".
- 区域终点不能互换. 设定
baseUrl对一方 最近的你的工作量.