−25%

på Windows ved årlig betaling, til 31/10. Se pakkerne

EQVPS
Kom i gang

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

Midlertidig (standard) — til én opgave. Slettes, når du kalder delete, efter inaktivitetsgrænsen (5 minutter som standard, op til 1 time) eller når TTL udløber (op til 24 timer). Afregnes pr. sekund, mindst 60 sekunder.
Vedvarende — beholder disk og tilstand i op til 30 dage. Afregnes pr. påbegyndt time, og en kalendermåned koster aldrig mere end 730 timer minus 25 %. Løber saldoen tør, sættes den på pause i et snapshot (gratis) og kører videre efter optankning; snapshots på pause gemmes i 14 dage.

Takster

TakstvCPURAMDiskNetværkPr. timeVedvarende, maks. pr. måned
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

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«).

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 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:

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

Tilslut din konto: token, konfiguration, første sandkasse, saldo →

Kommentarer

Ingen kommentarer endnu. Vær den første.

Skriv en kommentar

Kommentarer modereres, før de vises.