@ computesdk/ novita
计算SDK的 Novita Sandbox 提供者, 使用官方 novita-sandbox SDK(英语:SDK).
需要20号或更新的节点.
设置
npm install computesdk @computesdk/novita
export NOVITA_API_KEY=your_api_key
NOVITA_API_KEY 是该提供者配置的唯一环境变量.
Novita SDK提供默认的连接设置.
import { novita } from '@computesdk/novita';
const sdk = novita({}); // Reads NOVITA_API_KEY
const sandbox = await sdk.sandbox.create({ timeout: 300_000 });
try {
await sandbox.filesystem.writeFile('/tmp/hello.py', 'print("Hello from Novita")');
const result = await sandbox.runCommand('python /tmp/hello.py');
console.log(result.stdout);
} finally {
await sandbox.destroy();
}
提供商也与共享的ComputeSDK API合作:
import { compute } from 'computesdk';
import { novita } from '@computesdk/novita';
compute.setConfig({ provider: novita({}) });
const sandbox = await compute.instances.create();
await sandbox.destroy();
配置
| 选项 | 含义 |
|---|---|
apiKey | 可选的显密钥;另作 NOVITA_API_KEY。 。 。 . |
timeout | 以毫秒计的默认沙盒寿命;默认为 300000。 。 。 . |
sandbox.create({ timeout }) 超过提供者超时 。 使用 templateId
选择模板或 snapshotId 以还原快照; 省略两者
base这两种身份是相互排斥的。 创建也接受 envs, (中文(简体) ),
metadata,以及当地人 secure, (中文(简体) ), allowInternetAccess, (中文(简体) ), network,以及
lifecycle 选项。 框架选项,例如: signal 未转发给
诺维塔SDK.
命令和文件
runCommand 支持 cwd, (中文(简体) ), env, (中文(简体) ), timeout,以及本地流回调:
const result = await sandbox.runCommand('python -u /tmp/hello.py', {
cwd: '/tmp',
env: { MODE: 'test' },
timeout: 60_000,
onStdout: chunk => process.stdout.write(chunk),
onStderr: chunk => process.stderr.write(chunk),
});
命令超时与沙盒寿命分开. 非零命令退出 返回其输出和退出代码。 认证、网络和超时出错 拒绝电话.
background: true 启动本地背景进程并返回确认
带有退出代码 0 和空输出。 这不报告过程的最终结果
退出状态。 对于进程控件,PID跟踪,或等待背景输出,
使用情况 sandbox.getInstance().commands.run(command, { background: true })。 。 。 .
背景模式不能通过ComputeSDK与流回调合并.
文件系统支持 readFile, (中文(简体) ), writeFile, (中文(简体) ), mkdir, (中文(简体) ), readdir, (中文(简体) ), exists, (中文(简体) ),
财务报告和审定财务报表 remove。普通读取/写入接口处理文本;二进制操作
可通过 sandbox.getInstance().files。 。 。 .
寿命周期和URL
sdk.sandbox.getById(id)连接到沙盒; 只有未找到的响应 变成null。连接到暂停的沙盒可以恢复它.sdk.sandbox.list()获取所有运行中的沙盒并连接到 每一个这样返回的对象都可以执行命令。 连接可能扩展沙盒 根据诺维塔的连结行为,终生 暂停的沙盒不包括在内.sandbox.getInfo()读取当前 SDK 信息 。 暂停映射到stopped· ; 在元数据中保留原生状态.timeout之间的间隔 aPI的广告startedAt财务报告和审定财务报表endAt时间戳.sandbox.destroy()如果沙盒已经不见了,用ID杀死它并成功.sandbox.getUrl({ port: 3000 })返回 HTTPS 服务 URL。 绑定您的服务器 改为0.0.0.0. Novita 服务访问可能需要交通信号; URL本身 不公开服务。 原始符号信息可通过sandbox.getInstance()。 。 。 .
暂停并恢复
await sandbox.pause();
await sandbox.resume();
暂停保存内存, 因此文件系统的任何位置和运行
工艺存活(sdk.sandbox.pause 实值 { memory: true }) (中文(简体) ). 续会
与砂盒创建的一生重接.
超时扩展、 PTY 和其他 SDK 特性仍可通过
sandbox.getInstance() 或单独的 Novita 客户端.
抓图
const snapshot = await sdk.snapshot!.create(sandbox.instanceId);
const restored = await sdk.sandbox.create({ snapshotId: snapshot.id });
try {
console.log(await restored.runCommand('ls /tmp'));
} finally {
await restored.destroy();
}
await sdk.snapshot!.delete(snapshot.id);
抓图捕捉整个根文件系统(包括 /tmp,这不是
tmpfs)和内存,因此源代码中运行的流程在源代码中运行
还原了沙盒。 源头在拍摄快照时短暂地暂停
继续运行; sdk.snapshot.capabilities 实值
{ scope: 'rootfs', memory: true, destroysSource: false }。 。 。 . snapshot.list({ instanceId, limit })
支持通过源码过滤和总结果限制,获取额外页面
视需要而定。 抓图返回 id, (中文(简体) ), snapshotId,以及 provider; SDK 没有
提供创建时间戳。 不支持快照名称和元数据 .
模板
template.create, (中文(简体) ), template.list,以及 template.delete 覆盖 Novita 模板
构建 API. 创建等待构建完成并返回 id, (中文(简体) ), templateId, (中文(简体) ),
buildId, (中文(简体) ), provider,而土生土长的名称/tags。 使用返回的内容 id 作为
页:1 templateId 当创建沙盒时.
const template = await sdk.template.create({
name: 'my-python-template',
image: 'python:3.12',
build: {
cpuCount: 2,
memoryMB: 1024,
tags: ['dev'],
onBuildLogs: entry => console.log(entry),
},
});
const sandbox = await sdk.sandbox.create({ templateId: template.id });
try {
console.log(await sandbox.runCommand('python --version'));
} finally {
await sandbox.destroy();
}
const templates = await sdk.template.list({ limit: 50 });
console.log(templates.map(item => item.id));
await sdk.template.delete(template.id);
仅限 { name },创建使用诺维塔的基础图像. 对于软件包, 文件
副本、私人登记证书、启动命令或准备状态检查,
通过本地建筑师为 template 改为 image数字 :
import { Novita } from 'novita-sandbox';
const definition = new Novita().template.new()
.fromPythonImage('3.12')
.pipInstall('numpy');
const template = await sdk.template.create({
name: 'python-with-numpy',
template: definition,
build: { skipCache: true },
});
image 财务报告和审定财务报表 template 两者相互排斥. build 支持 cpuCount, (中文(简体) ),
memoryMB, (中文(简体) ), tags, (中文(简体) ), skipCache,以及 onBuildLogs。本地建筑 API 不
接受常见 description 或者说 metadata 字段,所以适配器拒绝
他们。 必要时在土建商上设置起动/准备状态.
列出返回构建模板(不是快照),默认获取所有页面,
治疗 limit 以总结果为限。 它保存了本地模板
字段,包括时间戳和资源大小。 限额 0 返回空白
阵列。 如果模板已经缺失, 删除成功; 其他 API 错误
宣传。 模板删除是永久的 .
工作室和测试
与 NOVITA_API_KEY 设置, 选择 novita 在Workbench。 工作区.
pnpm --filter @computesdk/novita test
pnpm --filter @computesdk/novita typecheck
测试内容包括E2B使用的同一共享供应商合同套件,即共享的 CRUD套件和22个适配器专用单元测试:
| 套间 | 默认( 即使有 API 密钥) | 与 NOVITA_RUN_INTEGRATION=1 财务报告和审定财务报表 NOVITA_API_KEY |
|---|---|---|
| 共享供应商合同(16项测试) | 运行常见的模拟沙盒 | 运行与真正的诺维塔沙盒 |
| 共享 CRUD (5个测试) | 跳过 | 删除后创建、连接、列表、销毁并检查沙盒 |
| 适应器单元测试(22个测试) | 嘲笑诺维塔 SDK | 还是嘲笑诺维塔SDK |
共享合同涵盖 shell 和背景命令,无效命令, 沙盒信息,端口3000/8080上的URL(包括自定义协议),全部6个 文件系统操作加上缺少文件错误,以及 shell 参数引用. 适配器专用套件还包括本土流线、参数和 错误映射、页码、快照和模板建立/列出/删除.
共享测试加载寄存器根 .env。真正的云调需要两者
NOVITA_RUN_INTEGRATION=1 财务报告和审定财务报表 NOVITA_API_KEY。单是钥匙就可以保存 test (包括
词根 pnpm test)在模拟模式并跳过直播CRUD. 选入的旗帜只是
测试开关,不是提供者配置选项。 设置在下面的命令上
进行现场测试时 共享套房在测试后清理出他们的沙盒.
模拟倒计时不能验证
诺维塔连接. 现场测试覆盖沙盒;模板和快照操作
目前只有模拟报道.
仅运行22个适配器单元测试而不使用云资源:
pnpm --filter @computesdk/novita test:unit
运行共享提供者和 CRUD 套房对 Novita, 设置 NOVITA_API_KEY
在环境或根 .env,然后运行 :
pnpm --filter @computesdk/test-utils build
NOVITA_RUN_INTEGRATION=1 pnpm --filter @computesdk/novita test:integration
重建 @computesdk/test-utils 更新此检出后, 诺维塔 CRUD
登记备有。 没有键或选入的旗帜,整合
套房以模拟模式运行共享合同并跳过直播 CRUD.