Sandboxes
Απομονωμένες Linux microVM για κώδικα που τρέχουν τα scripts και οι AI agents σας. Ένα sandbox ξεκινά σε περίπου ένα δευτερόλεπτο, τρέχει Python, Node.js ή bash και χρεώνεται ανά δευτερόλεπτο από το ίδιο υπόλοιπο με τους servers σας.
Τι είναι ένα sandbox
Ένα μικρό μηχάνημα Linux που δημιουργείτε μέσω API ή MCP, χρησιμοποιείτε για λίγα δευτερόλεπτα ή λίγες μέρες και διαγράφετε. Το εξερχόμενο internet λειτουργεί (pip install, npm install, git clone). Δεν υπάρχουν εισερχόμενες θύρες ούτε SSH: εντολές και αρχεία περνούν από το API. Μέσα: Python 3.12 με pip, Node.js 22 με npm, bash, git και curl.
Δύο λειτουργίες
Πακέτα
| Πακέτο | vCPU | RAM | Δίσκος | Δίκτυο | Ανά ώρα | Μόνιμο, μέγ. ανά μήνα |
|---|---|---|---|---|---|---|
| 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 |
Πληρώνετε για τα vCPU και τη RAM του πακέτου που επιλέγετε: $0.040 ανά vCPU-ώρα και $0.013 ανά GiB-ώρα. Τρέχουσες τιμές χωρίς token: GET /sandboxes/tariffs.
Όρια που αξίζει να ξέρετε
Μία εντολή τρέχει έως 55 δευτερόλεπτα· μεγαλύτερες εργασίες τρέχουν στο παρασκήνιο και ελέγχετε το αποτέλεσμα. Αρχεία έως 5 MB ανά αίτημα, μεγαλύτερα (έως 2 GB) μέσω συνδέσμων λήψης και αποστολής μίας χρήσης. Ένας λογαριασμός μπορεί να τρέχει έως 20 sandboxes και 2 εντολές ταυτόχρονα.
Μεταβλητές περιβάλλοντος
Περάστε μυστικά και ρυθμίσεις ως env. Όταν ορίζονται στη δημιουργία, ισχύουν για κάθε εντολή στο sandbox· όταν ορίζονται σε exec ή run, ισχύουν μόνο για αυτή την κλήση και αντικαθιστούν τις τιμές του sandbox. Έως 64 μεταβλητές, 32 KB ανά τιμή και 64 KB συνολικά. Οι τιμές αποθηκεύονται κρυπτογραφημένες, δεν επιστρέφονται ποτέ από το API και δεν γράφονται σε αρχεία καταγραφής: οι απαντήσεις δείχνουν μόνο τα ονόματα (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"}}'Όριο δαπανών
Από προεπιλογή τα sandbox δεν έχουν όριο δαπανών. Μπορείτε να ορίσετε ημερήσιο και μηνιαίο ανώτατο όριο στον πίνακα ελέγχου ή με PUT /sandboxes/budget. Όταν συμπληρωθεί, τα νέα sandbox λαμβάνουν 429 budget_exceeded, τα ενεργά προσωρινά διαγράφονται και τα μόνιμα τίθενται σε παύση με τον δίσκο τους διατηρημένο. Συνεχίζουν όταν αυξήσετε το όριο ή ξεκινήσει νέα ημέρα ή νέος μήνας (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"Γρήγορη εκκίνηση: MCP (Claude Code, Cursor και άλλοι clients)
Συνδέστε τον MCP server μία φορά και μετά απλώς ζητήστε από τον agent αυτό που θέλετε με δικά σας λόγια. Εργαλεία sandbox: 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"Δημιούργησε ένα μικρό sandbox, τρέξε print(2 + 2) σε Python, δείξε μου την έξοδο και διάγραψε το sandbox.Γρήγορη εκκίνηση: REST από Python και Node.js
Δεν χρειάζονται επιπλέον πακέτα. Βάλτε το token σας στη μεταβλητή περιβάλλοντος EQVPS_API_KEY (πώς παίρνετε ένα: «Σύνδεση του λογαριασμού σας»).
# 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 για Python και TypeScript
Προτιμάτε βιβλιοθήκη; Τα πακέτα για Python και TypeScript κάνουν τις ίδιες κλήσεις REST, ξαναδοκιμάζουν μόνα τους σε 429 και 503 και διαγράφουν πάντα το sandbox στο τέλος του μπλοκ. Εγκατάσταση και παράδειγμα:
# 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 errorsΣύνδεση του λογαριασμού σας: token, ρύθμιση, πρώτο sandbox, υπόλοιπο →
Σχόλια
Δεν υπάρχουν ακόμη σχόλια. Γίνετε ο πρώτος.