−25%

på Windows ved årlig betaling, til 31/10. Se pakkerne

EQVPS
Kom i gang

API-reference for sandboxes: SDK til Python og TypeScript

Alle metoder i EQVPS' sandbox-SDK på én side: parametre, standardværdier, returværdier og alle 11 fejlklasser, med det samme eksempel i Python og TypeScript.

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

SDK'et er et tyndt lag oven på sandboxenes REST-API. Det sparer dig for tre ting: at bygge kald i hånden, at prøve dem igen, når platformen er travl, og at glemme at slette en sandbox, når koden kaster en exception. Alt her svarer til version 0.2.0 af begge pakker.

Har du aldrig oprettet en sandbox, giver forbindelsesguiden på 5 minutter dig først et token. Hvad en sandbox er, og hvad der er i den, står under Sandboxes.

Installér og konfigurér

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

Det samme program på begge sprog: opret en sandbox, kør kode, slet den.

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

Opret og find sandboxes

Sandbox.create(...) starter en sandbox, som regel på omkring et sekund. Python tager navngivne argumenter, TypeScript ét objekt med indstillinger.

PythonTypeScriptStandardBetydning
modemode"ephemeral""ephemeral" (pr. sekund) eller "persistent" (pr. påbegyndt time, beholder disken)
tarifftariff"small"micro, small, standard, plus, pro, max
idle_timeoutidleTimeout300sekunder uden aktivitet, før en midlertidig sandbox slettes, op til 3600
ttlttl—maksimal levetid i sekunder: op til 86400 for midlertidig, 2592000 for vedvarende
envenv—miljøvariabler til alle kommandoer, gemt krypteret
api_key, base_urlapiKey, baseUrlmiljøvariablererstatter EQVPS_API_KEY / EQVPS_API_URL
timeouttimeoutMs70 sHTTP-timeout pr. kald
max_retriesmaxRetries3genforsøg ved 429/503

Sandbox.connect(id) kobler sig på en eksisterende sandbox, typisk en vedvarende, du oprettede i går. Sandbox.list() returnerer alle kontoens sandboxes, kørende og satte på pause.

Egenskaber: id (sb_ + 24 hex-tegn), mode, tariff, state (running, starting, paused, pausing, resuming, deleting, deleted), env_keys / envKeys (kun navne, værdierne kommer aldrig tilbage) og info (det rå objekt). refresh() genindlæser dem.

kill() sletter sandboxen og stopper afregningen. At kalde den for en sandbox, der allerede er væk, er ikke en fejl.

Kør kode

run(code, language="python", timeout=30) sender kode via stdin til Python 3.12, Node.js 22 eller bash ("python", "node", "bash"). exec(command, cwd=None, stdin=None, timeout=30) kører en shell-kommando: en streng går gennem bash -lc, en liste køres som argv uden shell.

Begge returnerer et ExecResult:

FeltBetydning
exit_codeprocessens exitkode
stdout, stderroutput, op til 1 MiB pr. strøm
timed_outkommandoen ramte sin timeout
truncatedoutputtet blev afkortet
duration_mshvor længe det kørte
okexit_code == 0 og ingen timeout

Et synkront kald kører højst 55 sekunder. Begge metoder tager også env til netop det kald; det erstatter værdierne, der blev sat ved oprettelsen.

Lange job: baggrundsopgaver

Angiv background=True (TypeScript: { background: true }), og du får straks en Task. Den har ingen grænse på 55 sekunder og kan køre, til sandboxens levetid slutter. Op til 8 opgaver pr. 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) });
MetodeHvad den gør
task.logs()nyt stdout og stderr siden sidste kald
task.status()status uden at forbruge output: running, done, failed, killed, timeout
task.wait(timeout, poll_interval=2, on_output)spørger, til opgaven er færdig, returnerer TaskResult
task.kill()stopper opgaven og dens processer
sb.task(id) / sb.tasks()koble sig på en opgave igen / liste opgaver

Hvis wait rammer sin egen timeout, kaster den SandboxTimeoutError, men opgaven kører videre. En kørende opgave forhindrer også, at en midlertidig sandbox slettes på grund af inaktivitet.

Filer og forbrug

upload(path, content, mode=None) skriver en fil til en absolut sti og returnerer dens størrelse. download(path) returnerer bytes, download_text(path) / downloadText(path) en streng. Én overførsel er begrænset til 5 MB.

usage() returnerer kørte sekunder, brugte CPU-sekunder, udgående bytes, timeprisen, billed_usd og estimated_total_usd. tariffs() er en almindelig funktion uden nøgle, der returnerer aktuelle priser og grænser. Afregningsreglerne står under Grænser og afregning for sandboxes.

Fejl

Hver API-fejl er en underklasse af EqvpsError med status (HTTP), code (stabil streng) og body. retry_after / retryAfter er sat, når serveren sender det.

KlasseHTTPTypisk codeHvad du gør
AuthenticationError401unauthenticatedtjek tokenet
InsufficientBalanceError402insufficient_balancefyld saldoen op
NotFoundError404not_foundforkert id, eller filen findes ikke
SandboxPausedError409sandbox_pausedpå pause, fordi saldoen slap op; fortsætter efter opfyldning
SandboxDeletedError410sandbox_deletedvæk for altid
FileTooLargeError413file_too_largehold overførsler under 5 MB
ValidationError422invalid_requestret parametrene
RateLimitError429too_many_concurrent, too_many_tasks, rate_limitedvent og prøv igen
BudgetExceededError429budget_exceededdin daglige eller månedlige grænse for sandboxes er nået
CapacityError503capacityprøv igen om lidt, eller vælg en mindre tarif
SandboxTimeoutError—request_timeout, wait_timeoutHTTP-kaldet (eller wait) fik timeout, ikke kommandoen

To grænser giver de fleste 429: en konto kører 2 kommandoer ad gangen og har op til 20 sandboxes. SDK'et prøver igen, når serveren siger, hvor længe der skal ventes; efter tre forsøg får du exceptionen.

Når du ikke har brug for SDK'et

Ethvert sprog med en HTTP-klient kan kalde API'et direkte; endpoints står i OpenAPI-filen på https://eqvps.com/openapi.json. Agenter i Claude, Cursor eller andre MCP-klienter behøver slet ingen kode: MCP-serveren har de samme sandbox-værktøjer. Og vil du bare se det virke, viser sandbox-siden tarifferne og prøveperioden på $1 for nye konti.

Ofte stillede spørgsmål

Hvilke versioner af Python og Node.js understøtter SDK'et?

Python-pakken kræver Python 3.8 eller nyere og har ingen afhængigheder. TypeScript-pakken har heller ingen afhængigheder og kører på Node.js 18+, Deno, Bun og i browsere med fetch.

Hvor henter SDK'et min API-nøgle?

Fra argumentet api_key / apiKey eller fra miljøvariablen EQVPS_API_KEY. Nøglen er et almindeligt EQVPS-kontotoken. EQVPS_API_URL skifter API-adressen; den skal kun bruges til test.

Prøver SDK'et fejlede kald igen?

Det prøver 429 og 503 igen op til 3 gange, når serveren sender Retry-After, og venter højst 30 sekunder hver gang. Disse statusser betyder, at kaldet blev afvist, før noget kørte, så det er sikkert at prøve run og exec igen. Netværksfejl prøves kun igen ved GET; run, exec og upload sendes aldrig to gange.

Er en exitkode forskellig fra nul en exception?

Nej. run og exec returnerer et resultat med exit_code, stdout og stderr. Tjek result.ok eller result.exit_code. Exceptions kommer kun ved API-fejl, fx en tom saldo eller et ugyldigt token.

Hvordan sikrer jeg, at en sandbox bliver slettet, hvis min kode crasher?

Brug formen med et scope: with Sandbox.create() as sb i Python, Sandbox.with(options, fn) eller await using i TypeScript. Sandboxen slettes, når blokken slutter, også efter en exception.

Kommentarer

Ingen kommentarer endnu. Vær den første.

Skriv en kommentar

Kommentarer modereres, før de vises.