−25%

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

EQVPS
Aan de slag

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

Tijdelijk (standaard) — voor één taak. Wordt verwijderd als je delete aanroept, na de inactiviteitstimeout (standaard 5 minuten, maximaal 1 uur) of als de TTL afloopt (tot 24 uur). Per seconde afgerekend, minimaal 60 seconden.
Persistent — houdt schijf en status tot 30 dagen vast. Afgerekend per begonnen uur, en een kalendermaand kost nooit meer dan 730 uur min 25%. Is het saldo op, dan wordt hij gepauzeerd als snapshot (niet afgerekend) en draait hij verder na opwaarderen; gepauzeerde snapshots blijven 14 dagen bewaard.

Tarieven

TariefvCPURAMSchijfNetwerkPer uurPersistent, max. per maand
micro0.25512 MB3 GB50 Mbit/s$0.0165$9.03
small0.51 GB5 GB100 Mbit/s$0.033$18.07
standard12 GB10 GB200 Mbit/s$0.066$36.14
plus24 GB15 GB300 Mbit/s$0.132$72.27
pro48 GB20 GB400 Mbit/s$0.264$144.54
max816 GB40 GB500 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’).

Python
# 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']}")
Node.js
// 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:

Python · eqvps
# 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
TypeScript · @eqvps/sdk
// 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 errors

Je account koppelen: token, configuratie, eerste sandbox, saldo →

Reacties

Nog geen reacties. Wees de eerste.

Laat een reactie achter

Reacties worden gemodereerd voordat ze verschijnen.