−25%

la planurile Windows anuale, până pe 31 oct. Vezi planurile

EQVPS
Începe

Referința API-ului de sandboxuri: SDK pentru Python și TypeScript

Fiecare metodă a SDK-ului de sandboxuri EQVPS pe o singură pagină: parametri, valori implicite, valori returnate și toate cele 11 clase de erori, cu același exemplu în Python și TypeScript.

Verificat ultima dată: 2026-10-10 · SDK 0.2.0 (PyPI eqvps, npm @eqvps/sdk)

SDK-ul e un strat subțire peste REST API-ul sandboxurilor. Te scutește de trei lucruri: construirea manuală a cererilor, reîncercarea când platforma e ocupată și uitarea ștergerii unui sandbox când codul tău aruncă o excepție. Tot ce e aici corespunde versiunii 0.2.0 a ambelor pachete.

Dacă n-ai creat niciodată un sandbox, ghidul de conectare în 5 minute îți dă întâi un token. Ce e un sandbox și ce conține e acoperit în Sandboxuri.

Instalare și configurare

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

Același program în ambele limbaje: creează un sandbox, rulează cod, șterge-l.

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

Crearea și găsirea sandboxurilor

Sandbox.create(...) pornește un sandbox, de obicei în aproximativ o secundă. Python primește argumente cu nume, TypeScript un singur obiect de opțiuni.

PythonTypeScriptImplicitÎnseamnă
modemode"ephemeral""ephemeral" (la secundă) sau "persistent" (pe oră începută, își păstrează discul)
tarifftariff"small"micro, small, standard, plus, pro, max
idle_timeoutidleTimeout300secunde fără activitate înainte ca un sandbox efemer să fie șters, până la 3600
ttlttl—durata maximă de viață în secunde: până la 86400 pentru efemere, 2592000 pentru persistente
envenv—variabile de mediu pentru fiecare comandă, stocate criptat
api_key, base_urlapiKey, baseUrlvariabilele de mediusuprascriu EQVPS_API_KEY / EQVPS_API_URL
timeouttimeoutMs70 stimeoutul HTTP pe cerere
max_retriesmaxRetries3reîncercări la 429/503

Sandbox.connect(id) se atașează la un sandbox existent, de obicei unul persistent creat ieri. Sandbox.list() returnează toate sandboxurile contului, care rulează și puse pe pauză.

Proprietăți: id (sb_ + 24 de caractere hex), mode, tariff, state (running, starting, paused, pausing, resuming, deleting, deleted), env_keys / envKeys (doar numele, valorile nu se întorc niciodată) și info (obiectul brut). refresh() le reîncarcă.

kill() șterge sandboxul și oprește facturarea. Apelarea lui pe un sandbox care nu mai există nu e o eroare.

Rularea codului

run(code, language="python", timeout=30) trimite codul pe stdin către Python 3.12, Node.js 22 sau bash ("python", "node", "bash"). exec(command, cwd=None, stdin=None, timeout=30) rulează o comandă de shell: un șir trece prin bash -lc, o listă e executată ca argv, fără shell.

Amândouă returnează un ExecResult:

CâmpÎnseamnă
exit_codecodul de ieșire al procesului
stdout, stderrieșirea, până la 1 MiB pe flux
timed_outcomanda a atins timeoutul
truncatedieșirea a fost tăiată
duration_mscât a rulat
okexit_code == 0 și fără timeout

Un apel sincron poate rula cel mult 55 de secunde. Ambele metode primesc și env pentru acel apel; suprascrie valorile setate la create.

Sarcinile lungi: sarcini de fundal

Trimite background=True (TypeScript: { background: true }) și primești imediat un Task. Nu are limita de 55 de secunde și poate rula până se încheie durata de viață a sandboxului. Până la 8 sarcini pe 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) });
MetodăCe face
task.logs()stdout și stderr noi de la apelul anterior
task.status()starea, fără a consuma ieșirea: running, done, failed, killed, timeout
task.wait(timeout, poll_interval=2, on_output)interoghează până se încheie sarcina, returnează TaskResult
task.kill()oprește sarcina și procesele ei
sb.task(id) / sb.tasks()reatașare la o sarcină / listarea sarcinilor

Dacă wait își atinge propriul timeout, aruncă SandboxTimeoutError, dar sarcina rulează mai departe. O sarcină care rulează împiedică și ștergerea unui sandbox efemer pentru inactivitate.

Fișiere și consum

upload(path, content, mode=None) scrie un fișier la o cale absolută și îi returnează mărimea. download(path) returnează octeți, download_text(path) / downloadText(path) un șir. Un transfer e limitat la 5 MB.

usage() returnează secundele de rulare, secundele de CPU folosite, octeții trimiși spre exterior, prețul pe oră, billed_usd și estimated_total_usd. tariffs() e o funcție simplă care nu are nevoie de cheie și returnează prețurile și limitele curente. Regulile de facturare sunt în Limitele și facturarea sandboxurilor.

Erori

Fiecare eroare API e o subclasă a EqvpsError, cu status (HTTP), code (șir stabil) și body. retry_after / retryAfter e setat când serverul îl trimite.

ClasăHTTPcode tipicCe faci
AuthenticationError401unauthenticatedverifică tokenul
InsufficientBalanceError402insufficient_balancealimentează soldul
NotFoundError404not_foundid greșit sau un fișier care nu există
SandboxPausedError409sandbox_pausedpus pe pauză după ce s-a terminat soldul; își reia activitatea după alimentare
SandboxDeletedError410sandbox_deleteddispărut definitiv
FileTooLargeError413file_too_largeține transferurile sub 5 MB
ValidationError422invalid_requestcorectează parametrii
RateLimitError429too_many_concurrent, too_many_tasks, rate_limitedașteaptă și reîncearcă
BudgetExceededError429budget_exceededai atins limita zilnică sau lunară pentru sandboxuri
CapacityError503capacityîncearcă din nou în curând sau alege un tarif mai mic
SandboxTimeoutError—request_timeout, wait_timeouta expirat cererea HTTP (sau wait), nu comanda

Două limite cauzează cele mai multe 429: un cont rulează 2 comenzi în același timp și ține până la 20 de sandboxuri. SDK-ul le reîncearcă atunci când serverul spune cât să aștepte; după trei încercări primești excepția.

Când te poți lipsi de SDK

Orice limbaj cu un client HTTP poate apela direct API-ul; endpointurile sunt în fișierul OpenAPI de la https://eqvps.com/openapi.json. Agenții din Claude, Cursor sau alți clienți MCP nu au nevoie deloc de cod: serverul MCP are aceleași unelte pentru sandboxuri. Iar dacă vrei doar să-l vezi funcționând, pagina sandboxurilor listează tarifele și proba de $1 pentru conturile noi.

Întrebări frecvente

Ce versiuni de Python și Node.js suportă SDK-ul?

Pachetul Python are nevoie de Python 3.8 sau mai nou și nu are dependențe. Nici pachetul TypeScript nu are dependențe și rulează pe Node.js 18+, Deno, Bun și în browserele care au fetch.

De unde ia SDK-ul cheia mea API?

Din argumentul api_key / apiKey sau din variabila de mediu EQVPS_API_KEY. Cheia e un token obișnuit de cont EQVPS. EQVPS_API_URL suprascrie adresa API-ului; ai nevoie de ea doar pentru teste.

Reîncearcă SDK-ul cererile eșuate?

Reîncearcă 429 și 503 de până la 3 ori când serverul trimite Retry-After, așteptând de fiecare dată cel mult 30 de secunde. Aceste statusuri înseamnă că cererea a fost refuzată înainte să ruleze ceva, așa că reîncercarea pentru run și exec e sigură. Erorile de rețea sunt reîncercate doar pentru cererile GET; run, exec și upload nu sunt trimise niciodată de două ori.

E un cod de ieșire nenul o excepție?

Nu. run și exec returnează un rezultat cu exit_code, stdout și stderr. Verifică result.ok sau result.exit_code. Excepțiile sunt aruncate doar pentru erorile API, cum ar fi un sold gol sau un token invalid.

Cum mă asigur că un sandbox e șters dacă îmi cade codul?

Folosește forma cu domeniu delimitat: with Sandbox.create() as sb în Python, Sandbox.with(options, fn) sau await using în TypeScript. Sandboxul e șters când se încheie blocul, inclusiv după o excepție.

Comentarii

Încă nu există comentarii. Fii primul.

Lasă un comentariu

Comentariile sunt moderate înainte să apară.