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.
| Python | TypeScript | Standaard | Betekenis |
|---|---|---|---|
mode | mode | "ephemeral" | "ephemeral" (per seconde) of "persistent" (per begonnen uur, houdt zijn schijf) |
tariff | tariff | "small" | micro, small, standard, plus, pro, max |
idle_timeout | idleTimeout | 300 | seconden zonder activiteit voordat een ephemeral sandbox wordt verwijderd, tot 3600 |
ttl | ttl | — | maximale levensduur in seconden: tot 86400 ephemeral, 2592000 persistent |
env | env | — | omgevingsvariabelen voor elk commando, versleuteld opgeslagen |
api_key, base_url | apiKey, baseUrl | omgevingsvariabelen | vervangen EQVPS_API_KEY / EQVPS_API_URL |
timeout | timeoutMs | 70 s | HTTP-timeout per verzoek |
max_retries | maxRetries | 3 | nieuwe 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:
| Veld | Betekenis |
|---|---|
exit_code | exitcode van het proces |
stdout, stderr | uitvoer, tot 1 MiB per stream |
timed_out | het commando liep tegen zijn timeout aan |
truncated | de uitvoer is afgekapt |
duration_ms | hoe lang het duurde |
ok | exit_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) });
| Methode | Wat 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.
| Klasse | HTTP | Typische code | Wat te doen |
|---|---|---|---|
AuthenticationError | 401 | unauthenticated | token controleren |
InsufficientBalanceError | 402 | insufficient_balance | saldo opwaarderen |
NotFoundError | 404 | not_found | verkeerde id, of het bestand bestaat niet |
SandboxPausedError | 409 | sandbox_paused | gepauzeerd omdat het saldo op was; gaat verder na opwaarderen |
SandboxDeletedError | 410 | sandbox_deleted | definitief weg |
FileTooLargeError | 413 | file_too_large | overdrachten onder 5 MB houden |
ValidationError | 422 | invalid_request | parameters corrigeren |
RateLimitError | 429 | too_many_concurrent, too_many_tasks, rate_limited | wachten en opnieuw proberen |
BudgetExceededError | 429 | budget_exceeded | je dag- of maandlimiet voor sandboxes is bereikt |
CapacityError | 503 | capacity | zo meteen opnieuw proberen of een kleiner tarief kiezen |
SandboxTimeoutError | — | request_timeout, wait_timeout | het 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.
Reacties
Nog geen reacties. Wees de eerste.