Sandkasser
Isolerede Linux-mikroVM’er til kode, som dine scripts og AI-agenter kører. En sandkasse starter på omkring et sekund, kører Python, Node.js eller bash og afregnes pr. sekund fra den samme saldo som dine servere.
Hvad en sandkasse er
En lille Linux-maskine, som du opretter via API’et eller MCP, bruger i nogle sekunder eller nogle dage og sletter igen. Udgående internet virker (pip install, npm install, git clone). Der er ingen indgående porte og ingen SSH: kommandoer og filer går via API’et. Indeni: Python 3.12 med pip, Node.js 22 med npm, bash, git og curl.
To tilstande
Takster
| Takst | vCPU | RAM | Disk | Netværk | Pr. time | Vedvarende, maks. pr. måned |
|---|---|---|---|---|---|---|
| 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 |
Du betaler for vCPU og RAM i den valgte takst: $0.040 pr. vCPU-time og $0.013 pr. GiB-time. Aktuelle priser uden token: GET /sandboxes/tariffs.
Grænser, der er værd at kende
En kommando kører i op til 55 sekunder; længere job kører som baggrundsopgaver, som du spørger efter resultatet af. Filer op til 5 MB pr. kald, større (op til 2 GB) via engangslinks til download og upload. En konto kan køre op til 20 sandkasser og 2 kommandoer på samme tid.
Miljøvariabler
Send hemmeligheder og indstillinger som env. Angivet ved oprettelse gælder de for alle kommandoer i sandkassen; angivet ved exec eller run gælder de kun for det kald og overskriver sandkassens værdier. Op til 64 variabler, 32 KB pr. værdi og 64 KB i alt. Værdier gemmes krypteret, returneres aldrig af API'et og skrives ikke i logs: svar viser kun navnene (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"}}'Udgiftsgrænse
Som standard har sandkasser ingen udgiftsgrænse. Du kan sætte et dagligt og et månedligt loft i kontrolpanelet eller med PUT /sandboxes/budget. Når et loft nås, får nye sandkasser 429 budget_exceeded, kørende midlertidige slettes, og vedvarende sættes på pause med disken bevaret. De fortsætter, når du hæver loftet, eller en ny dag eller måned begynder (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"Kom hurtigt i gang: MCP (Claude Code, Cursor og andre klienter)
Forbind MCP-serveren én gang, og bed så agenten om det, du vil, med dine egne ord. Sandkasseværktøjer: 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"Opret en lille sandkasse, kør print(2 + 2) i Python, vis mig outputtet, og slet sandkassen.Kom hurtigt i gang: REST fra Python og Node.js
Der skal ikke bruges ekstra pakker. Læg dit token i miljøvariablen EQVPS_API_KEY (hvordan du får et: »Tilslut din konto«).
# 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 til Python og TypeScript
Hellere et bibliotek? Pakkerne til Python og TypeScript laver de samme REST-kald, prøver selv 429 og 503 igen og sletter altid sandkassen, når blokken slutter. Installation og eksempel:
# 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 errorsTilslut din konto: token, konfiguration, første sandkasse, saldo →
Kommentarer
Ingen kommentarer endnu. Vær den første.