−25%

su Windows con pagamento annuale, fino al 31/10. Vai ai piani

EQVPS
Inizia

Riferimento dell'API sandbox: SDK Python e TypeScript

Tutti i metodi dell'SDK sandbox di EQVPS in una pagina: parametri, valori predefiniti, valori restituiti e tutte le 11 classi di errore, con lo stesso esempio in Python e in TypeScript.

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

L'SDK è un sottile strato sopra l'API REST delle sandbox. Ti risparmia tre cose: costruire le richieste a mano, ripeterle quando la piattaforma è occupata e dimenticarti di eliminare una sandbox quando il codice solleva un'eccezione. Tutto ciò che segue corrisponde alla versione 0.2.0 di entrambi i pacchetti.

Se non hai mai creato una sandbox, la guida alla connessione in 5 minuti ti dà prima un token. Che cos'è una sandbox e cosa contiene è spiegato in Sandbox.

Installare e configurare

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

Lo stesso programma nei due linguaggi: crea una sandbox, esegui codice, eliminala.

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
});

Creare e trovare sandbox

Sandbox.create(...) avvia una sandbox, di solito in circa un secondo. Python accetta argomenti con nome, TypeScript un oggetto di opzioni.

PythonTypeScriptPredefinitoSignificato
modemode"ephemeral""ephemeral" (al secondo) o "persistent" (per ora iniziata, conserva il disco)
tarifftariff"small"micro, small, standard, plus, pro, max
idle_timeoutidleTimeout300secondi di inattività prima che una sandbox effimera venga eliminata, fino a 3600
ttlttl—durata massima in secondi: fino a 86400 per le effimere, 2592000 per le persistenti
envenv—variabili d'ambiente per ogni comando, salvate cifrate
api_key, base_urlapiKey, baseUrlvariabili d'ambientesostituiscono EQVPS_API_KEY / EQVPS_API_URL
timeouttimeoutMs70 stimeout HTTP per richiesta
max_retriesmaxRetries3tentativi su 429/503

Sandbox.connect(id) si collega a una sandbox esistente, di solito una persistente creata ieri. Sandbox.list() restituisce tutte le sandbox dell'account, attive e in pausa.

Proprietà: id (sb_ + 24 caratteri esadecimali), mode, tariff, state (running, starting, paused, pausing, resuming, deleting, deleted), env_keys / envKeys (solo i nomi, i valori non tornano mai) e info (l'oggetto grezzo). refresh() li ricarica.

kill() elimina la sandbox e ferma la fatturazione. Chiamarlo su una sandbox già eliminata non è un errore.

Eseguire codice

run(code, language="python", timeout=30) invia il codice su stdin a Python 3.12, Node.js 22 o bash ("python", "node", "bash"). exec(command, cwd=None, stdin=None, timeout=30) esegue un comando di shell: una stringa passa per bash -lc, una lista viene eseguita come argv senza shell.

Entrambi restituiscono un ExecResult:

CampoSignificato
exit_codecodice di uscita del processo
stdout, stderroutput, fino a 1 MiB per flusso
timed_outil comando ha raggiunto il timeout
truncatedl'output è stato tagliato
duration_msdurata dell'esecuzione
okexit_code == 0 e nessun timeout

Una chiamata sincrona dura al massimo 55 secondi. Entrambi i metodi accettano anche env per quella sola chiamata; sostituisce i valori impostati alla creazione.

Lavori lunghi: task in background

Passa background=True (TypeScript: { background: true }) e ricevi subito un Task. Non ha il limite di 55 secondi e può durare fino alla fine della vita della sandbox. Fino a 8 task 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) });
MetodoCosa fa
task.logs()nuovo stdout e stderr dalla chiamata precedente
task.status()stato senza consumare l'output: running, done, failed, killed, timeout
task.wait(timeout, poll_interval=2, on_output)interroga finché il task termina, restituisce TaskResult
task.kill()ferma il task e i suoi processi
sb.task(id) / sb.tasks()ricollegarsi a un task / elencare i task

Se wait raggiunge il proprio timeout solleva SandboxTimeoutError, ma il task continua. Un task in corso impedisce anche che una sandbox effimera venga eliminata per inattività.

File e consumi

upload(path, content, mode=None) scrive un file in un percorso assoluto e ne restituisce la dimensione. download(path) restituisce byte, download_text(path) / downloadText(path) una stringa. Un trasferimento è limitato a 5 MB.

usage() restituisce i secondi di esecuzione, i secondi di CPU usati, i byte in uscita, il prezzo orario, billed_usd ed estimated_total_usd. tariffs() è una semplice funzione senza chiave che restituisce prezzi e limiti attuali. Le regole di fatturazione sono in Limiti e fatturazione delle sandbox.

Errori

Ogni errore dell'API è una sottoclasse di EqvpsError con status (HTTP), code (stringa stabile) e body. retry_after / retryAfter è valorizzato quando il server lo invia.

ClasseHTTPcode tipicoCosa fare
AuthenticationError401unauthenticatedcontrollare il token
InsufficientBalanceError402insufficient_balancericaricare il saldo
NotFoundError404not_foundid sbagliato o file inesistente
SandboxPausedError409sandbox_pausedin pausa perché il saldo è finito; riprende dopo una ricarica
SandboxDeletedError410sandbox_deletedeliminata per sempre
FileTooLargeError413file_too_largetenere i trasferimenti sotto i 5 MB
ValidationError422invalid_requestcorreggere i parametri
RateLimitError429too_many_concurrent, too_many_tasks, rate_limitedattendere e riprovare
BudgetExceededError429budget_exceededraggiunto il limite giornaliero o mensile per le sandbox
CapacityError503capacityriprovare a breve o scegliere una tariffa più piccola
SandboxTimeoutError—request_timeout, wait_timeoutè scaduta la richiesta HTTP (o wait), non il comando

Due limiti causano la maggior parte dei 429: un account esegue 2 comandi alla volta e tiene fino a 20 sandbox. L'SDK ripete queste richieste quando il server dice quanto aspettare; dopo tre tentativi ricevi l'eccezione.

Quando fare a meno dell'SDK

Qualsiasi linguaggio con un client HTTP può chiamare l'API direttamente; gli endpoint sono nel file OpenAPI su https://eqvps.com/openapi.json. Gli agenti in Claude, Cursor o altri client MCP non hanno bisogno di codice: il server MCP ha gli stessi strumenti per le sandbox. E se vuoi solo vederlo in azione, la pagina delle sandbox mostra le tariffe e la prova da $1 per i nuovi account.

Domande frequenti

Quali versioni di Python e Node.js supporta l'SDK?

Il pacchetto Python richiede Python 3.8 o successivo e non ha dipendenze. Anche il pacchetto TypeScript non ha dipendenze e funziona su Node.js 18+, Deno, Bun e nei browser che hanno fetch.

Da dove prende l'SDK la mia chiave API?

Dall'argomento api_key / apiKey oppure dalla variabile d'ambiente EQVPS_API_KEY. La chiave è un normale token di un account EQVPS. EQVPS_API_URL sostituisce l'indirizzo dell'API; serve solo per i test.

L'SDK riprova le richieste fallite?

Riprova 429 e 503 fino a 3 volte quando il server invia Retry-After, aspettando al massimo 30 secondi ogni volta. Questi stati indicano che la richiesta è stata rifiutata prima di eseguire qualcosa, quindi ripetere run ed exec è sicuro. Gli errori di rete vengono ripetuti solo per le GET; run, exec e upload non partono mai due volte.

Un exit code diverso da zero è un'eccezione?

No. run ed exec restituiscono un risultato con exit_code, stdout e stderr. Controlla result.ok o result.exit_code. Le eccezioni arrivano solo per errori dell'API, come un saldo vuoto o un token non valido.

Come mi assicuro che la sandbox venga eliminata se il mio codice va in crash?

Usa la forma con ambito: with Sandbox.create() as sb in Python, Sandbox.with(options, fn) o await using in TypeScript. La sandbox viene eliminata alla fine del blocco, anche dopo un'eccezione.

Commenti

Ancora nessun commento. Sii il primo.

Lascia un commento

I commenti sono moderati prima di comparire.