−25%

på Windows vid årsbetalning, till 31/10. Till paketen

EQVPS
Kom igång

Sandlådor

Isolerade Linux-mikroVM:ar för kod som dina skript och AI-agenter kör. En sandlåda startar på ungefär en sekund, kör Python, Node.js eller bash och debiteras per sekund från samma saldo som dina servrar.

Vad en sandlåda är

En liten Linux-maskin som du skapar via API:t eller MCP, använder i några sekunder eller några dagar och tar bort. Utgående internet fungerar (pip install, npm install, git clone). Det finns inga inkommande portar och ingen SSH: kommandon och filer går via API:t. Inuti: Python 3.12 med pip, Node.js 22 med npm, bash, git och curl.

Två lägen

Tillfällig (standard) — för en uppgift. Tas bort när du anropar delete, efter tidsgränsen för inaktivitet (5 minuter som standard, upp till 1 timme) eller när TTL löper ut (upp till 24 timmar). Debiteras per sekund, minst 60 sekunder.
Beständig — behåller disk och tillstånd i upp till 30 dagar. Debiteras per påbörjad timme, och en kalendermånad kostar aldrig mer än 730 timmar minus 25 %. Tar saldot slut pausas den i en ögonblicksbild (debiteras inte) och fortsätter efter påfyllning; pausade ögonblicksbilder sparas i 14 dagar.

Tariffer

TariffvCPURAMDiskNätverkPer timmeBeständig, max per månad
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 betalar för vCPU och RAM i den tariff du väljer: $0.040 per vCPU-timme och $0.013 per GiB-timme. Aktuella priser utan token: GET /sandboxes/tariffs.

Gränser som är bra att känna till

Ett kommando kör i upp till 55 sekunder; längre jobb körs som bakgrundsuppgifter som du frågar efter resultatet av. Filer upp till 5 MB per anrop, större (upp till 2 GB) via engångslänkar för nedladdning och uppladdning. Ett konto kan köra upp till 20 sandlådor och 2 kommandon samtidigt.

Miljövariabler

Skicka hemligheter och inställningar som env. Anges de vid skapandet gäller de för alla kommandon i sandlådan; anges de vid exec eller run gäller de bara för det anropet och ersätter sandlådans värden. Upp till 64 variabler, 32 KB per värde och 64 KB totalt. Värden lagras krypterade, returneras aldrig av API:et och skrivs inte till loggar: svaren visar bara namnen (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"}}'

Utgiftsgräns

Som standard har sandlådor ingen utgiftsgräns. Du kan ange ett dags- och ett månadstak i kontrollpanelen eller med PUT /sandboxes/budget. När ett tak nås får nya sandlådor 429 budget_exceeded, körande tillfälliga tas bort och beständiga pausas med disken kvar. De fortsätter när du höjer taket eller en ny dag eller månad börjar (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"

Snabbstart: MCP (Claude Code, Cursor och andra klienter)

Anslut MCP-servern en gång och be sedan agenten med egna ord om det du vill. Sandlådeverktyg: 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"
Skapa en liten sandlåda, kör print(2 + 2) i Python, visa mig utdata och ta bort sandlådan.

Snabbstart: REST från Python och Node.js

Inga extra paket behövs. Lägg din token i miljövariabeln EQVPS_API_KEY (hur du får en: ”Ansluta ditt 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 för Python och TypeScript

Hellre ett bibliotek? Paketen för Python och TypeScript gör samma REST-anrop, försöker själva igen vid 429 och 503 och tar alltid bort sandlådan när blocket är slut. Installation och exempel:

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

Ansluta ditt konto: token, konfiguration, första sandlådan, saldo →

Kommentarer

Inga kommentarer än. Bli först.

Lämna en kommentar

Kommentarer modereras innan de visas.