−25%

untuk Windows tahunan, hingga 31 Okt. Lihat paket

EQVPS
Mulai

Referensi API sandbox: SDK Python dan TypeScript

Semua metode SDK sandbox EQVPS dalam satu halaman: parameter, nilai bawaan, nilai kembalian, dan ke-11 kelas error, dengan contoh yang sama dalam Python dan TypeScript.

Terakhir diperiksa: 2026-10-10 · SDK 0.2.0 (PyPI eqvps, npm @eqvps/sdk)

SDK adalah lapisan tipis di atas REST API sandbox. Ia menghemat tiga hal: menyusun permintaan secara manual, mengulanginya saat platform sibuk, dan lupa menghapus sandbox ketika kode melempar exception. Semua di sini sesuai dengan versi 0.2.0 kedua paket.

Kalau belum pernah membuat sandbox, panduan koneksi 5 menit memberi Anda token lebih dulu. Apa itu sandbox dan isinya dijelaskan di Sandbox.

Instal dan konfigurasi

pip install eqvps          # Python 3.8+
npm i @eqvps/sdk           # Node.js 18+, Deno, Bun
export EQVPS_API_KEY=...   # your EQVPS account token

Program yang sama dalam dua bahasa: buat sandbox, jalankan kode, hapus.

from eqvps import Sandbox

with Sandbox.create(tariff="small") as sb:
    r = sb.run("print(2 + 2)")
    print(r.exit_code, r.stdout)   # 0 4
import { Sandbox } from "@eqvps/sdk";

await Sandbox.with({ tariff: "small" }, async (sb) => {
  const r = await sb.run("print(2 + 2)");
  console.log(r.exit_code, r.stdout); // 0 4
});

Membuat dan menemukan sandbox

Sandbox.create(...) menyalakan sandbox, biasanya dalam sekitar satu detik. Python menerima argumen bernama, TypeScript satu objek opsi.

PythonTypeScriptBawaanArti
modemode"ephemeral""ephemeral" (per detik) atau "persistent" (per jam yang dimulai, disk dipertahankan)
tarifftariff"small"micro, small, standard, plus, pro, max
idle_timeoutidleTimeout300detik tanpa aktivitas sebelum sandbox ephemeral dihapus, hingga 3600
ttlttl—masa hidup maksimum dalam detik: hingga 86400 untuk ephemeral, 2592000 untuk persistent
envenv—variabel lingkungan untuk setiap perintah, disimpan terenkripsi
api_key, base_urlapiKey, baseUrlvariabel lingkunganmenggantikan EQVPS_API_KEY / EQVPS_API_URL
timeouttimeoutMs70 dtkbatas waktu HTTP per permintaan
max_retriesmaxRetries3percobaan ulang pada 429/503

Sandbox.connect(id) menyambung ke sandbox yang sudah ada, biasanya sandbox persistent yang Anda buat kemarin. Sandbox.list() mengembalikan semua sandbox di akun, yang berjalan maupun dijeda.

Properti: id (sb_ + 24 karakter hex), mode, tariff, state (running, starting, paused, pausing, resuming, deleting, deleted), env_keys / envKeys (hanya nama, nilainya tidak pernah dikembalikan), dan info (objek mentah). refresh() memuat ulang semuanya.

kill() menghapus sandbox dan menghentikan penagihan. Memanggilnya untuk sandbox yang sudah tidak ada bukan error.

Menjalankan kode

run(code, language="python", timeout=30) mengirim kode lewat stdin ke Python 3.12, Node.js 22, atau bash ("python", "node", "bash"). exec(command, cwd=None, stdin=None, timeout=30) menjalankan perintah shell: string lewat bash -lc, list dijalankan sebagai argv tanpa shell.

Keduanya mengembalikan ExecResult:

FieldArti
exit_codeexit code proses
stdout, stderroutput, hingga 1 MiB per aliran
timed_outperintah mencapai batas waktunya
truncatedoutput terpotong
duration_mslama berjalan
okexit_code == 0 dan tidak timeout

Panggilan sinkron berjalan paling lama 55 detik. Kedua metode juga menerima env untuk panggilan itu saja; nilainya menggantikan yang diatur saat pembuatan.

Pekerjaan panjang: tugas latar belakang

Berikan background=True (TypeScript: { background: true }) dan Anda langsung mendapat Task. Tidak ada batas 55 detik, dan tugas bisa berjalan sampai masa hidup sandbox habis. Hingga 8 tugas per sandbox.

task = sb.exec("cd /root/app && python3 -m pytest -q", background=True)
result = task.wait(on_output=lambda out, err: print(out, end=""))
print(result.state, result.exit_code)   # done 0
const task = await sb.exec("cd /root/app && npm test", { background: true });
const result = await task.wait({ onOutput: (out) => process.stdout.write(out) });
MetodeFungsinya
task.logs()stdout dan stderr baru sejak panggilan sebelumnya
task.status()status tanpa mengonsumsi output: running, done, failed, killed, timeout
task.wait(timeout, poll_interval=2, on_output)memeriksa sampai tugas selesai, mengembalikan TaskResult
task.kill()menghentikan tugas dan prosesnya
sb.task(id) / sb.tasks()menyambung kembali ke tugas / daftar tugas

Jika wait mencapai batas waktunya sendiri, ia melempar SandboxTimeoutError, tetapi tugas tetap berjalan. Tugas yang sedang berjalan juga mencegah sandbox ephemeral dihapus karena tidak aktif.

File dan pemakaian

upload(path, content, mode=None) menulis file ke path absolut dan mengembalikan ukurannya. download(path) mengembalikan byte, download_text(path) / downloadText(path) mengembalikan string. Satu transfer dibatasi 5 MB.

usage() mengembalikan detik berjalan, detik CPU terpakai, byte keluar, harga per jam, billed_usd, dan estimated_total_usd. tariffs() adalah fungsi biasa tanpa kunci yang mengembalikan harga dan batas terkini. Aturan penagihan ada di Batas dan penagihan sandbox.

Error

Setiap error API adalah subkelas EqvpsError dengan status (HTTP), code (string tetap), dan body. retry_after / retryAfter terisi bila server mengirimkannya.

KelasHTTPcode umumYang harus dilakukan
AuthenticationError401unauthenticatedperiksa token
InsufficientBalanceError402insufficient_balanceisi ulang saldo
NotFoundError404not_foundid salah, atau file tidak ada
SandboxPausedError409sandbox_pauseddijeda karena saldo habis; lanjut setelah isi ulang
SandboxDeletedError410sandbox_deletedhilang permanen
FileTooLargeError413file_too_largejaga transfer di bawah 5 MB
ValidationError422invalid_requestperbaiki parameter
RateLimitError429too_many_concurrent, too_many_tasks, rate_limitedtunggu lalu coba lagi
BudgetExceededError429budget_exceededbatas harian atau bulanan sandbox Anda tercapai
CapacityError503capacitycoba lagi sebentar lagi atau pilih tarif lebih kecil
SandboxTimeoutError—request_timeout, wait_timeoutyang habis waktunya permintaan HTTP (atau wait), bukan perintahnya

Dua batas penyebab sebagian besar 429: satu akun menjalankan 2 perintah sekaligus dan menyimpan hingga 20 sandbox. SDK mengulangnya bila server memberi tahu berapa lama harus menunggu; setelah tiga kali, Anda menerima exception.

Kapan tidak perlu SDK

Bahasa apa pun dengan klien HTTP bisa memanggil API langsung; endpoint ada di file OpenAPI di https://eqvps.com/openapi.json. Agen di Claude, Cursor, atau klien MCP lain sama sekali tidak butuh kode: server MCP punya alat sandbox yang sama. Dan kalau Anda hanya ingin melihatnya bekerja, halaman sandbox menampilkan tarif dan uji coba $1 untuk akun baru.

Pertanyaan umum

Versi Python dan Node.js mana yang didukung SDK?

Paket Python butuh Python 3.8 atau lebih baru dan tidak punya dependensi. Paket TypeScript juga tanpa dependensi dan berjalan di Node.js 18+, Deno, Bun, serta browser yang punya fetch.

Dari mana SDK mengambil kunci API saya?

Dari argumen api_key / apiKey atau dari variabel lingkungan EQVPS_API_KEY. Kuncinya adalah token akun EQVPS biasa. EQVPS_API_URL mengganti alamat API; hanya perlu untuk pengujian.

Apakah SDK mencoba ulang permintaan yang gagal?

Ya, untuk 429 dan 503 hingga 3 kali bila server mengirim Retry-After, dengan jeda paling lama 30 detik tiap kali. Status itu berarti permintaan ditolak sebelum apa pun dijalankan, jadi mengulang run dan exec aman. Error jaringan hanya diulang untuk GET; run, exec, dan upload tidak pernah dikirim dua kali.

Apakah exit code bukan nol dianggap exception?

Tidak. run dan exec mengembalikan hasil berisi exit_code, stdout, dan stderr. Periksa result.ok atau result.exit_code. Exception hanya muncul untuk error API, misalnya saldo kosong atau token tidak valid.

Bagaimana memastikan sandbox terhapus jika kode saya crash?

Gunakan bentuk dengan cakupan: with Sandbox.create() as sb di Python, Sandbox.with(options, fn) atau await using di TypeScript. Sandbox dihapus saat blok selesai, termasuk setelah exception.

Komentar

Belum ada komentar. Jadilah yang pertama.

Tinggalkan komentar

Komentar dimoderasi sebelum muncul.