−25%

untuk Windows tahunan, hingga 31 Okt. Lihat paket

EQVPS
Mulai

Sandbox

MicroVM Linux terisolasi untuk kode yang dijalankan skrip dan agen AI Anda. Sandbox menyala dalam sekitar satu detik, menjalankan Python, Node.js, atau bash, dan ditagih per detik dari saldo yang sama dengan server Anda.

Apa itu sandbox

Mesin Linux kecil yang Anda buat lewat API atau MCP, dipakai beberapa detik atau beberapa hari, lalu dihapus. Internet keluar berfungsi (pip install, npm install, git clone). Tidak ada port masuk dan tidak ada SSH: perintah dan file lewat API. Di dalamnya: Python 3.12 dengan pip, Node.js 22 dengan npm, bash, git, dan curl.

Dua mode

Sementara (bawaan) — untuk satu tugas. Dihapus saat Anda memanggil delete, setelah batas waktu menganggur (5 menit secara bawaan, hingga 1 jam), atau saat TTL habis (hingga 24 jam). Ditagih per detik, minimal 60 detik.
Persisten — menyimpan disk dan statusnya hingga 30 hari. Ditagih per jam yang dimulai, dan satu bulan kalender tidak pernah lebih mahal dari 730 jam dikurangi 25%. Jika saldo habis, sandbox dijeda ke snapshot (tidak ditagih) dan berlanjut setelah isi ulang; snapshot yang dijeda disimpan 14 hari.

Tarif

TarifvCPURAMDiskJaringanPer jamPersisten, maks. per bulan
micro0.25512 MB3 GB50 Mbit/s$0.0165$9.03
small0.51 GB5 GB100 Mbit/s$0.033$18.07
standard12 GB10 GB200 Mbit/s$0.066$36.14
plus24 GB15 GB300 Mbit/s$0.132$72.27
pro48 GB20 GB400 Mbit/s$0.264$144.54
max816 GB40 GB500 Mbit/s$0.528$289.08

Anda membayar vCPU dan RAM dari tarif yang dipilih: $0.040 per vCPU-jam dan $0.013 per GiB-jam. Harga terkini tanpa token: GET /sandboxes/tariffs.

Batas yang perlu diketahui

Satu perintah berjalan hingga 55 detik; pekerjaan yang lebih lama berjalan sebagai tugas latar yang hasilnya Anda tanyakan. File hingga 5 MB per permintaan, yang lebih besar (hingga 2 GB) lewat tautan unduh dan unggah sekali pakai. Satu akun bisa menjalankan hingga 20 sandbox dan 2 perintah sekaligus.

Variabel lingkungan

Kirim rahasia dan pengaturan sebagai env. Jika diatur saat membuat, berlaku untuk setiap perintah di sandbox; jika diatur di exec atau run, hanya berlaku untuk panggilan itu dan menimpa nilai sandbox. Hingga 64 variabel, 32 KB per nilai, dan total 64 KB. Nilai disimpan terenkripsi, tidak pernah dikembalikan oleh API, dan tidak ditulis ke log: respons hanya menampilkan nama (env_keys).

API=https://api.eqvps.com/api/v1/eqvps
AUTH="Authorization: Bearer $EQVPS_API_KEY"

# env for the whole sandbox (only the names come back, as env_keys)
SB=$(curl -s -X POST $API/sandboxes -H "$AUTH" -H "Content-Type: application/json" \
  -d '{"tariff":"small","env":{"DB_URL":"postgres://user:pass@db/app","MODE":"test"}}' | jq -r .id)

# env for one call, merged over the sandbox env
curl -s -X POST $API/sandboxes/$SB/exec -H "$AUTH" -H "Content-Type: application/json" \
  -d '{"command":"echo $MODE $RUN_ID","env":{"RUN_ID":"42"}}'

Batas pengeluaran

Secara bawaan sandbox tidak memiliki batas pengeluaran. Anda bisa menetapkan batas harian dan bulanan di dasbor atau dengan PUT /sandboxes/budget. Saat batas tercapai, sandbox baru mendapat 429 budget_exceeded, sandbox sementara yang berjalan dihapus, dan sandbox permanen dijeda dengan disk tetap tersimpan. Semuanya berlanjut saat Anda menaikkan batas atau hari atau bulan baru dimulai (UTC).

# daily cap $5, monthly cap $50 (null = no cap)
curl -s -X PUT $API/sandboxes/budget -H "$AUTH" -H "Content-Type: application/json" \
  -d '{"daily_usd":5,"monthly_usd":50}'

# spent today / this month and when the caps reset (UTC)
curl -s $API/sandboxes/budget -H "$AUTH"

Mulai cepat: MCP (Claude Code, Cursor, dan klien lain)

Hubungkan server MCP sekali, lalu minta agen dengan kata-kata Anda sendiri. Alat sandbox: create_sandbox, run_code, exec_command, get_task, kill_task, get_upload_url, get_download_url, list_sandboxes, get_sandbox, kill_sandbox, sandbox_pricing.

claude mcp add --transport http eqvps https://mcp.eqvps.com/mcp \
  --header "Authorization: Bearer $EQVPS_API_KEY"
Buat sandbox kecil, jalankan print(2 + 2) di Python, tunjukkan hasilnya, lalu hapus sandbox-nya.

Mulai cepat: REST dari Python dan Node.js

Tidak perlu paket tambahan. Taruh token Anda di variabel lingkungan EQVPS_API_KEY (cara mendapatkannya ada di “Menghubungkan akun”).

Python
# first_sandbox.py — Python 3.8+, standard library only
import json, os, urllib.request

API = "https://api.eqvps.com/api/v1/eqvps"
KEY = os.environ["EQVPS_API_KEY"]

def call(method, path, body=None):
    req = urllib.request.Request(API + path, method=method,
        data=json.dumps(body).encode() if body is not None else None,
        headers={"Authorization": "Bearer " + KEY,
                 "Content-Type": "application/json", "Accept": "application/json"})
    with urllib.request.urlopen(req, timeout=90) as r:   # HTTPError on 401/402/…
        return json.loads(r.read() or b"{}")

sb = call("POST", "/sandboxes", {"tariff": "small"})
try:
    r = call("POST", f"/sandboxes/{sb['id']}/run",
             {"language": "python", "code": "print(2 + 2)"})
    print(r["exit_code"], r["stdout"])                    # 0 4
finally:
    call("DELETE", f"/sandboxes/{sb['id']}")
Node.js
// first_sandbox.mjs — Node.js 18+ (built-in fetch), run: node first_sandbox.mjs
const API = "https://api.eqvps.com/api/v1/eqvps";
const KEY = process.env.EQVPS_API_KEY;

async function call(method, path, body) {
  const r = await fetch(API + path, {
    method,
    headers: { Authorization: `Bearer ${KEY}`, "Content-Type": "application/json", Accept: "application/json" },
    body: body ? JSON.stringify(body) : undefined,
  });
  const data = await r.json();
  if (!r.ok) throw new Error(`${r.status} ${data.error ?? ""} ${data.message ?? ""}`);
  return data;
}

const sb = await call("POST", "/sandboxes", { tariff: "small" });
try {
  const r = await call("POST", `/sandboxes/${sb.id}/run`, { language: "node", code: "console.log(2 + 2)" });
  console.log(r.exit_code, r.stdout); // 0 4
} finally {
  await call("DELETE", `/sandboxes/${sb.id}`);
}

SDK untuk Python dan TypeScript

Lebih suka library? Paket Python dan TypeScript melakukan panggilan REST yang sama, mengulang 429 dan 503 sendiri, dan selalu menghapus sandbox saat blok selesai. Instalasi dan contoh:

Python · eqvps
# pip install -U eqvps       https://pypi.org/project/eqvps/  (0.2.0+ for env)
# "eqvps sandbox create" = Sandbox.create() here · create_sandbox in MCP · POST /sandboxes in REST (no CLI)
from eqvps import Sandbox

# EQVPS_API_KEY from the environment; env = secrets for your code, stored encrypted
with Sandbox.create(tariff="small", env={"DB_URL": "postgres://user:pass@db/app"}) as sb:
    r = sb.run("print(2 + 2)")
    print(r.stdout, r.exit_code)             # "4\n" 0
    sb.upload("/root/data.csv", "a,b\n1,2\n")
    print(sb.exec("wc -l /root/data.csv").stdout)
    print(sb.exec("echo $RUN_ID", env={"RUN_ID": "42"}).stdout)   # env for one call
# the sandbox is deleted when the block exits, also on errors
TypeScript · @eqvps/sdk
// npm i @eqvps/sdk@latest   https://www.npmjs.com/package/@eqvps/sdk  (0.2.0+ for env)
import { Sandbox } from "@eqvps/sdk";

// EQVPS_API_KEY from the environment; env = secrets for your code, stored encrypted
await Sandbox.with({ tariff: "small", env: { DB_URL: "postgres://user:pass@db/app" } }, async (sb) => {
  const r = await sb.run("print(2 + 2)");
  console.log(r.stdout, r.exit_code);                    // "4\n" 0
  console.log((await sb.exec("echo $RUN_ID", { env: { RUN_ID: "42" } })).stdout); // env for one call
});                                                       // deleted afterwards, also on errors

Menghubungkan akun: token, konfigurasi, sandbox pertama, saldo →

Komentar

Belum ada komentar. Jadilah yang pertama.

Tinggalkan komentar

Komentar dimoderasi sebelum muncul.