Sandboxes
Geïsoleerde Linux-microVM’s voor code die je scripts en AI-agents draaien. Een sandbox start in ongeveer een seconde, draait Python, Node.js of bash en wordt per seconde afgerekend van hetzelfde saldo als je servers.
Wat een sandbox is
Een kleine Linux-machine die je via de API of MCP aanmaakt, een paar seconden of een paar dagen gebruikt en weer verwijdert. Uitgaand internet werkt (pip install, npm install, git clone). Er zijn geen inkomende poorten en geen SSH: opdrachten en bestanden gaan via de API. Erin: Python 3.12 met pip, Node.js 22 met npm, bash, git en curl.
Twee modi
Tarieven
| Tarief | vCPU | RAM | Schijf | Netwerk | Per uur | Persistent, max. per maand |
|---|---|---|---|---|---|---|
| micro | 0.25 | 512 MB | 3 GB | 50 Mbit/s | $0.0165 | $9.03 |
| small | 0.5 | 1 GB | 5 GB | 100 Mbit/s | $0.033 | $18.07 |
| standard | 1 | 2 GB | 10 GB | 200 Mbit/s | $0.066 | $36.14 |
| plus | 2 | 4 GB | 15 GB | 300 Mbit/s | $0.132 | $72.27 |
| pro | 4 | 8 GB | 20 GB | 400 Mbit/s | $0.264 | $144.54 |
| max | 8 | 16 GB | 40 GB | 500 Mbit/s | $0.528 | $289.08 |
Je betaalt voor de vCPU en het RAM van het gekozen tarief: $0.040 per vCPU-uur en $0.013 per GiB-uur. Actuele prijzen zonder token: GET /sandboxes/tariffs.
Grenzen om te kennen
Eén opdracht draait tot 55 seconden; langere jobs draaien als achtergrondtaken waarvan je het resultaat opvraagt. Bestanden tot 5 MB per verzoek, grotere (tot 2 GB) via eenmalige download- en uploadlinks. Een account kan tot 20 sandboxes en 2 opdrachten tegelijk draaien.
Omgevingsvariabelen
Geef secrets en instellingen mee als env. Ingesteld bij het aanmaken gelden ze voor elke opdracht in de sandbox; ingesteld bij exec of run gelden ze alleen voor die aanroep en overschrijven ze de sandboxwaarden. Tot 64 variabelen, 32 KB per waarde en 64 KB in totaal. Waarden worden versleuteld opgeslagen, nooit door de API teruggegeven en niet gelogd: antwoorden tonen alleen de namen (env_keys).
API=https://api.eqvps.com/api/v1/eqvps
AUTH="Authorization: Bearer $EQVPS_API_KEY"
# env for the whole sandbox (only the names come back, as env_keys)
SB=$(curl -s -X POST $API/sandboxes -H "$AUTH" -H "Content-Type: application/json" \
-d '{"tariff":"small","env":{"DB_URL":"postgres://user:pass@db/app","MODE":"test"}}' | jq -r .id)
# env for one call, merged over the sandbox env
curl -s -X POST $API/sandboxes/$SB/exec -H "$AUTH" -H "Content-Type: application/json" \
-d '{"command":"echo $MODE $RUN_ID","env":{"RUN_ID":"42"}}'Bestedingslimiet
Standaard hebben sandboxes geen bestedingslimiet. Je kunt een dag- en maandlimiet instellen in het dashboard of met PUT /sandboxes/budget. Is een limiet bereikt, dan krijgen nieuwe sandboxes 429 budget_exceeded, worden actieve tijdelijke verwijderd en blijvende gepauzeerd met behoud van de schijf. Ze gaan verder zodra je de limiet verhoogt of een nieuwe dag of maand begint (UTC).
# daily cap $5, monthly cap $50 (null = no cap)
curl -s -X PUT $API/sandboxes/budget -H "$AUTH" -H "Content-Type: application/json" \
-d '{"daily_usd":5,"monthly_usd":50}'
# spent today / this month and when the caps reset (UTC)
curl -s $API/sandboxes/budget -H "$AUTH"Snelstart: MCP (Claude Code, Cursor en andere clients)
Koppel de MCP-server één keer en vraag de agent daarna gewoon in je eigen woorden wat je wilt. Sandbox-tools: create_sandbox, run_code, exec_command, get_task, kill_task, get_upload_url, get_download_url, list_sandboxes, get_sandbox, kill_sandbox, sandbox_pricing.
claude mcp add --transport http eqvps https://mcp.eqvps.com/mcp \
--header "Authorization: Bearer $EQVPS_API_KEY"Maak een kleine sandbox, voer print(2 + 2) uit in Python, laat me de uitvoer zien en verwijder de sandbox.Snelstart: REST vanuit Python en Node.js
Extra pakketten zijn niet nodig. Zet je token in de omgevingsvariabele EQVPS_API_KEY (hoe je er een krijgt: ‘Je account koppelen’).
# first_sandbox.py — Python 3.8+, standard library only
import json, os, urllib.request
API = "https://api.eqvps.com/api/v1/eqvps"
KEY = os.environ["EQVPS_API_KEY"]
def call(method, path, body=None):
req = urllib.request.Request(API + path, method=method,
data=json.dumps(body).encode() if body is not None else None,
headers={"Authorization": "Bearer " + KEY,
"Content-Type": "application/json", "Accept": "application/json"})
with urllib.request.urlopen(req, timeout=90) as r: # HTTPError on 401/402/…
return json.loads(r.read() or b"{}")
sb = call("POST", "/sandboxes", {"tariff": "small"})
try:
r = call("POST", f"/sandboxes/{sb['id']}/run",
{"language": "python", "code": "print(2 + 2)"})
print(r["exit_code"], r["stdout"]) # 0 4
finally:
call("DELETE", f"/sandboxes/{sb['id']}")// first_sandbox.mjs — Node.js 18+ (built-in fetch), run: node first_sandbox.mjs
const API = "https://api.eqvps.com/api/v1/eqvps";
const KEY = process.env.EQVPS_API_KEY;
async function call(method, path, body) {
const r = await fetch(API + path, {
method,
headers: { Authorization: `Bearer ${KEY}`, "Content-Type": "application/json", Accept: "application/json" },
body: body ? JSON.stringify(body) : undefined,
});
const data = await r.json();
if (!r.ok) throw new Error(`${r.status} ${data.error ?? ""} ${data.message ?? ""}`);
return data;
}
const sb = await call("POST", "/sandboxes", { tariff: "small" });
try {
const r = await call("POST", `/sandboxes/${sb.id}/run`, { language: "node", code: "console.log(2 + 2)" });
console.log(r.exit_code, r.stdout); // 0 4
} finally {
await call("DELETE", `/sandboxes/${sb.id}`);
}SDK voor Python en TypeScript
Liever een library? De pakketten voor Python en TypeScript doen dezelfde REST-aanroepen, proberen 429 en 503 zelf opnieuw en verwijderen de sandbox altijd aan het eind van het blok. Installatie en voorbeeld:
# pip install -U eqvps https://pypi.org/project/eqvps/ (0.2.0+ for env)
# "eqvps sandbox create" = Sandbox.create() here · create_sandbox in MCP · POST /sandboxes in REST (no CLI)
from eqvps import Sandbox
# EQVPS_API_KEY from the environment; env = secrets for your code, stored encrypted
with Sandbox.create(tariff="small", env={"DB_URL": "postgres://user:pass@db/app"}) as sb:
r = sb.run("print(2 + 2)")
print(r.stdout, r.exit_code) # "4\n" 0
sb.upload("/root/data.csv", "a,b\n1,2\n")
print(sb.exec("wc -l /root/data.csv").stdout)
print(sb.exec("echo $RUN_ID", env={"RUN_ID": "42"}).stdout) # env for one call
# the sandbox is deleted when the block exits, also on errors// npm i @eqvps/sdk@latest https://www.npmjs.com/package/@eqvps/sdk (0.2.0+ for env)
import { Sandbox } from "@eqvps/sdk";
// EQVPS_API_KEY from the environment; env = secrets for your code, stored encrypted
await Sandbox.with({ tariff: "small", env: { DB_URL: "postgres://user:pass@db/app" } }, async (sb) => {
const r = await sb.run("print(2 + 2)");
console.log(r.stdout, r.exit_code); // "4\n" 0
console.log((await sb.exec("echo $RUN_ID", { env: { RUN_ID: "42" } })).stdout); // env for one call
}); // deleted afterwards, also on errorsJe account koppelen: token, configuratie, eerste sandbox, saldo →
Reacties
Nog geen reacties. Wees de eerste.