−25%

sur Windows en paiement annuel, jusqu'au 31/10. Voir les offres

EQVPS
Commencer

Sandboxes

Des micro-VM Linux isolées pour le code que lancent vos scripts et vos agents IA. Une sandbox démarre en une seconde environ, exécute Python, Node.js ou bash, et elle est facturée à la seconde sur le même solde que vos serveurs.

Ce qu’est une sandbox

Une petite machine Linux que vous créez via l’API ou MCP, utilisez quelques secondes ou quelques jours, puis supprimez. L’accès Internet sortant fonctionne (pip install, npm install, git clone). Pas de port entrant ni de SSH : commandes et fichiers passent par l’API. À l’intérieur : Python 3.12 avec pip, Node.js 22 avec npm, bash, git et curl.

Deux modes

Éphémère (par défaut) — pour une tâche. Supprimée quand vous appelez delete, après le délai d’inactivité (5 minutes par défaut, jusqu’à 1 heure) ou à la fin de son TTL (jusqu’à 24 heures). Facturée à la seconde, minimum 60 secondes.
Persistante — conserve son disque et son état jusqu’à 30 jours. Facturée par heure entamée, et un mois civil ne coûte jamais plus de 730 heures moins 25 %. Si le solde est épuisé, elle est mise en pause dans un instantané (non facturé) et reprend après une recharge ; les instantanés en pause sont conservés 14 jours.

Tarifs

TarifvCPURAMDisqueRéseauPar heurePersistante, max. par mois
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

Vous payez les vCPU et la RAM du tarif choisi : $0.040 par vCPU-heure et $0.013 par Gio-heure. Prix à jour, sans jeton : GET /sandboxes/tariffs.

Limites à connaître

Une commande s’exécute jusqu’à 55 secondes ; les tâches plus longues tournent en arrière-plan et vous interrogez leur résultat. Fichiers jusqu’à 5 Mo par requête, au-delà (jusqu’à 2 Go) via des liens de téléchargement et d’envoi à usage unique. Un compte peut faire tourner jusqu’à 20 sandboxes et 2 commandes en même temps.

Variables d'environnement

Transmettez secrets et paramètres via env. Définies à la création, elles s'appliquent à toutes les commandes de la sandbox ; définies dans exec ou run, elles ne valent que pour cet appel et remplacent les valeurs de la sandbox. Jusqu'à 64 variables, 32 Ko par valeur et 64 Ko au total. Les valeurs sont stockées chiffrées, jamais renvoyées par l'API et jamais écrites dans les journaux : les réponses ne montrent que les noms (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"}}'

Limite de dépenses

Par défaut, les sandboxes n'ont pas de limite de dépenses. Vous pouvez fixer un plafond quotidien et mensuel dans le tableau de bord ou avec PUT /sandboxes/budget. Une fois le plafond atteint, les nouvelles sandboxes reçoivent 429 budget_exceeded, les éphémères en cours sont supprimées et les persistantes sont mises en pause, disque conservé. Elles reprennent lorsque vous relevez le plafond ou qu'un nouveau jour ou mois commence (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"

Démarrage rapide : MCP (Claude Code, Cursor et autres clients)

Connectez le serveur MCP une fois, puis demandez simplement à l’agent ce que vous voulez. Outils 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"
Crée une petite sandbox, exécute print(2 + 2) en Python, montre-moi la sortie et supprime la sandbox.

Démarrage rapide : REST depuis Python et Node.js

Aucun paquet supplémentaire n’est nécessaire. Placez votre jeton dans la variable d’environnement EQVPS_API_KEY (comment l’obtenir : « Connecter votre compte »).

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 pour Python et TypeScript

Vous préférez une bibliothèque ? Les paquets Python et TypeScript font les mêmes appels REST, relancent seuls les 429 et 503 et suppriment toujours la sandbox à la fin du bloc. Installation et exemple :

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

Connecter votre compte : jeton, configuration, première sandbox, solde →

Commentaires

Pas encore de commentaires. Soyez le premier.

Laisser un commentaire

Les commentaires sont modérés avant leur publication.