−25%

op Windows bij jaarbetaling, tot 31/10. Naar de pakketten

EQVPS
Aan de slag

Sandbox-API-referentie: SDK voor Python en TypeScript

Alle methodes van de EQVPS-sandbox-SDK op één pagina: parameters, standaardwaarden, retourwaarden en alle 11 foutklassen, met hetzelfde voorbeeld in Python en TypeScript.

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

De SDK is een dun laagje over de sandbox-REST-API. Hij bespaart je drie dingen: verzoeken met de hand opbouwen, ze opnieuw proberen als het platform druk is, en vergeten een sandbox te verwijderen als je code een exception gooit. Alles hier hoort bij versie 0.2.0 van beide pakketten.

Heb je nog nooit een sandbox aangemaakt, dan geeft de verbindingshandleiding van 5 minuten je eerst een token. Wat een sandbox is en wat erin zit, staat bij Sandboxes.

Installeren en instellen

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

Hetzelfde programma in beide talen: sandbox aanmaken, code draaien, verwijderen.

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

Sandboxes aanmaken en vinden

Sandbox.create(...) start een sandbox, meestal in ongeveer een seconde. Python neemt keyword-argumenten, TypeScript één object met opties.

PythonTypeScriptStandaardBetekenis
modemode"ephemeral""ephemeral" (per seconde) of "persistent" (per begonnen uur, houdt zijn schijf)
tarifftariff"small"micro, small, standard, plus, pro, max
idle_timeoutidleTimeout300seconden zonder activiteit voordat een ephemeral sandbox wordt verwijderd, tot 3600
ttlttl—maximale levensduur in seconden: tot 86400 ephemeral, 2592000 persistent
envenv—omgevingsvariabelen voor elk commando, versleuteld opgeslagen
api_key, base_urlapiKey, baseUrlomgevingsvariabelenvervangen EQVPS_API_KEY / EQVPS_API_URL
timeouttimeoutMs70 sHTTP-timeout per verzoek
max_retriesmaxRetries3nieuwe pogingen bij 429/503

Sandbox.connect(id) koppelt aan een bestaande sandbox, meestal een persistente die je gisteren hebt gemaakt. Sandbox.list() geeft alle sandboxes van het account terug, draaiend en gepauzeerd.

Eigenschappen: id (sb_ + 24 hex-tekens), mode, tariff, state (running, starting, paused, pausing, resuming, deleting, deleted), env_keys / envKeys (alleen namen, waarden komen nooit terug) en info (het ruwe object). refresh() laadt ze opnieuw.

kill() verwijdert de sandbox en stopt de facturering. Het aanroepen voor een sandbox die al weg is, is geen fout.

Code draaien

run(code, language="python", timeout=30) stuurt code via stdin naar Python 3.12, Node.js 22 of bash ("python", "node", "bash"). exec(command, cwd=None, stdin=None, timeout=30) voert een shell-commando uit: een string gaat via bash -lc, een lijst wordt als argv zonder shell uitgevoerd.

Beide geven een ExecResult terug:

VeldBetekenis
exit_codeexitcode van het proces
stdout, stderruitvoer, tot 1 MiB per stream
timed_outhet commando liep tegen zijn timeout aan
truncatedde uitvoer is afgekapt
duration_mshoe lang het duurde
okexit_code == 0 en geen timeout

Een synchrone aanroep duurt hooguit 55 seconden. Beide methodes nemen ook env voor alleen die aanroep; dat vervangt de waarden die bij het aanmaken zijn gezet.

Lange klussen: achtergrondtaken

Geef background=True mee (TypeScript: { background: true }) en je krijgt meteen een Task. Die heeft geen limiet van 55 seconden en kan draaien tot het einde van de levensduur van de sandbox. Tot 8 taken 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) });
MethodeWat ze doet
task.logs()nieuwe stdout en stderr sinds de vorige aanroep
task.status()status zonder uitvoer te verbruiken: running, done, failed, killed, timeout
task.wait(timeout, poll_interval=2, on_output)vraagt op tot de taak klaar is, geeft TaskResult terug
task.kill()stopt de taak en haar processen
sb.task(id) / sb.tasks()opnieuw koppelen aan een taak / taken opvragen

Loopt de eigen timeout van wait af, dan gooit hij SandboxTimeoutError, maar de taak draait door. Een lopende taak voorkomt ook dat een ephemeral sandbox wegens inactiviteit wordt verwijderd.

Bestanden en verbruik

upload(path, content, mode=None) schrijft een bestand naar een absoluut pad en geeft de grootte terug. download(path) geeft bytes terug, download_text(path) / downloadText(path) een string. Eén overdracht is beperkt tot 5 MB.

usage() geeft de looptijd in seconden, verbruikte CPU-seconden, uitgaande bytes, de uurprijs, billed_usd en estimated_total_usd. tariffs() is een gewone functie zonder sleutel die de huidige prijzen en limieten teruggeeft. De factureringsregels staan bij Sandbox-limieten en facturering.

Fouten

Elke API-fout is een subklasse van EqvpsError met status (HTTP), code (stabiele string) en body. retry_after / retryAfter is gevuld als de server die meestuurt.

KlasseHTTPTypische codeWat te doen
AuthenticationError401unauthenticatedtoken controleren
InsufficientBalanceError402insufficient_balancesaldo opwaarderen
NotFoundError404not_foundverkeerde id, of het bestand bestaat niet
SandboxPausedError409sandbox_pausedgepauzeerd omdat het saldo op was; gaat verder na opwaarderen
SandboxDeletedError410sandbox_deleteddefinitief weg
FileTooLargeError413file_too_largeoverdrachten onder 5 MB houden
ValidationError422invalid_requestparameters corrigeren
RateLimitError429too_many_concurrent, too_many_tasks, rate_limitedwachten en opnieuw proberen
BudgetExceededError429budget_exceededje dag- of maandlimiet voor sandboxes is bereikt
CapacityError503capacityzo meteen opnieuw proberen of een kleiner tarief kiezen
SandboxTimeoutError—request_timeout, wait_timeouthet HTTP-verzoek (of wait) liep af, niet het commando

Twee limieten veroorzaken de meeste 429's: een account voert 2 commando's tegelijk uit en houdt tot 20 sandboxes. De SDK probeert deze opnieuw als de server zegt hoe lang je moet wachten; na drie pogingen krijg je de exception.

Wanneer je de SDK niet nodig hebt

Elke taal met een HTTP-client kan de API direct aanroepen; de endpoints staan in het OpenAPI-bestand op https://eqvps.com/openapi.json. Agents in Claude, Cursor of andere MCP-clients hebben helemaal geen code nodig: de MCP-server heeft dezelfde sandboxtools. En wil je het gewoon zien werken, dan staan op de sandboxpagina de tarieven en de proef van $1 voor nieuwe accounts.

Veelgestelde vragen

Welke versies van Python en Node.js ondersteunt de SDK?

Het Python-pakket vraagt Python 3.8 of nieuwer en heeft geen afhankelijkheden. Het TypeScript-pakket heeft die ook niet en draait op Node.js 18+, Deno, Bun en in browsers met fetch.

Waar haalt de SDK mijn API-sleutel vandaan?

Uit het argument api_key / apiKey of uit de omgevingsvariabele EQVPS_API_KEY. De sleutel is een gewoon EQVPS-accounttoken. EQVPS_API_URL vervangt het API-adres; dat heb je alleen nodig om te testen.

Probeert de SDK mislukte verzoeken opnieuw?

Hij probeert 429 en 503 tot 3 keer opnieuw als de server Retry-After stuurt, en wacht elke keer hooguit 30 seconden. Die statussen betekenen dat het verzoek is geweigerd voordat er iets draaide, dus run en exec opnieuw proberen is veilig. Netwerkfouten worden alleen bij GET opnieuw geprobeerd; run, exec en upload gaan nooit twee keer.

Is een exitcode die niet nul is een exception?

Nee. run en exec geven een resultaat terug met exit_code, stdout en stderr. Controleer result.ok of result.exit_code. Exceptions komen alleen bij API-fouten, zoals een leeg saldo of een ongeldig token.

Hoe zorg ik dat een sandbox wordt verwijderd als mijn code crasht?

Gebruik de vorm met een scope: with Sandbox.create() as sb in Python, Sandbox.with(options, fn) of await using in TypeScript. De sandbox wordt verwijderd als het blok eindigt, ook na een exception.

Reacties

Nog geen reacties. Wees de eerste.

Laat een reactie achter

Reacties worden gemodereerd voordat ze verschijnen.