−25%

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

EQVPS
Commencer

Référence de l'API sandbox : SDK Python et TypeScript

Toutes les méthodes du SDK sandbox d'EQVPS sur une page : paramètres, valeurs par défaut, valeurs de retour et les 11 classes d'erreurs, avec le même exemple en Python et en TypeScript.

Dernière vérification: 2026-10-10 · SDK 0.2.0 (PyPI eqvps, npm @eqvps/sdk)

Le SDK est une fine couche au-dessus de l'API REST des sandboxes. Il vous épargne trois choses : construire les requêtes à la main, les relancer quand la plateforme est occupée et oublier de supprimer une sandbox quand votre code lève une exception. Tout ce qui suit correspond à la version 0.2.0 des deux paquets.

Si vous n'avez jamais créé de sandbox, le guide de connexion en 5 minutes vous donne d'abord un jeton. Ce qu'est une sandbox et ce qu'elle contient est expliqué dans Sandboxes.

Installer et configurer

pip install eqvps          # Python 3.8+
npm i @eqvps/sdk           # Node.js 18+, Deno, Bun
export EQVPS_API_KEY=...   # your EQVPS account token

Le même programme dans les deux langages : créer une sandbox, exécuter du code, la supprimer.

from eqvps import Sandbox

with Sandbox.create(tariff="small") as sb:
    r = sb.run("print(2 + 2)")
    print(r.exit_code, r.stdout)   # 0 4
import { Sandbox } from "@eqvps/sdk";

await Sandbox.with({ tariff: "small" }, async (sb) => {
  const r = await sb.run("print(2 + 2)");
  console.log(r.exit_code, r.stdout); // 0 4
});

Créer et retrouver des sandboxes

Sandbox.create(...) démarre une sandbox, en général en une seconde environ. Python prend des arguments nommés, TypeScript un objet d'options.

PythonTypeScriptDéfautSignification
modemode"ephemeral""ephemeral" (à la seconde) ou "persistent" (à l'heure entamée, garde son disque)
tarifftariff"small"micro, small, standard, plus, pro, max
idle_timeoutidleTimeout300secondes sans activité avant la suppression d'une sandbox éphémère, jusqu'à 3600
ttlttl—durée de vie maximale en secondes : jusqu'à 86400 en éphémère, 2592000 en persistante
envenv—variables d'environnement pour chaque commande, stockées chiffrées
api_key, base_urlapiKey, baseUrlvariables d'environnementremplacent EQVPS_API_KEY / EQVPS_API_URL
timeouttimeoutMs70 sdélai HTTP par requête
max_retriesmaxRetries3nouvelles tentatives sur 429/503

Sandbox.connect(id) se rattache à une sandbox existante, souvent une persistante créée la veille. Sandbox.list() renvoie toutes les sandboxes du compte, actives et en pause.

Propriétés : id (sb_ + 24 caractères hexadécimaux), mode, tariff, state (running, starting, paused, pausing, resuming, deleting, deleted), env_keys / envKeys (les noms seulement, les valeurs ne reviennent jamais) et info (l'objet brut). refresh() les recharge.

kill() supprime la sandbox et arrête la facturation. L'appeler sur une sandbox déjà supprimée n'est pas une erreur.

Exécuter du code

run(code, language="python", timeout=30) envoie le code sur stdin à Python 3.12, Node.js 22 ou bash ("python", "node", "bash"). exec(command, cwd=None, stdin=None, timeout=30) exécute une commande shell : une chaîne passe par bash -lc, une liste est exécutée comme argv sans shell.

Les deux renvoient un ExecResult :

ChampSignification
exit_codecode de sortie du processus
stdout, stderrsortie, jusqu'à 1 Mio par flux
timed_outla commande a atteint son délai
truncatedla sortie a été coupée
duration_msdurée d'exécution
okexit_code == 0 et pas de dépassement

Un appel synchrone dure 55 secondes au plus. Les deux méthodes acceptent aussi env pour cet appel seulement ; il remplace les valeurs définies à la création.

Tâches longues : l'arrière-plan

Passez background=True (TypeScript : { background: true }) et vous obtenez tout de suite une Task. Elle n'a pas de limite de 55 secondes et peut tourner jusqu'à la fin de vie de la sandbox. Jusqu'à 8 tâches par sandbox.

task = sb.exec("cd /root/app && python3 -m pytest -q", background=True)
result = task.wait(on_output=lambda out, err: print(out, end=""))
print(result.state, result.exit_code)   # done 0
const task = await sb.exec("cd /root/app && npm test", { background: true });
const result = await task.wait({ onOutput: (out) => process.stdout.write(out) });
MéthodeCe qu'elle fait
task.logs()nouveaux stdout et stderr depuis l'appel précédent
task.status()état sans consommer la sortie : running, done, failed, killed, timeout
task.wait(timeout, poll_interval=2, on_output)interroge jusqu'à la fin, renvoie TaskResult
task.kill()arrête la tâche et ses processus
sb.task(id) / sb.tasks()se rattacher à une tâche / lister les tâches

Si wait atteint son propre délai, il lève SandboxTimeoutError, mais la tâche continue. Une tâche en cours empêche aussi qu'une sandbox éphémère soit supprimée pour inactivité.

Fichiers et consommation

upload(path, content, mode=None) écrit un fichier à un chemin absolu et renvoie sa taille. download(path) renvoie des octets, download_text(path) / downloadText(path) une chaîne. Un transfert est limité à 5 Mo.

usage() renvoie les secondes de fonctionnement, les secondes CPU consommées, les octets sortants, le prix horaire, billed_usd et estimated_total_usd. tariffs() est une simple fonction sans clé qui renvoie les prix et limites actuels. Les règles de facturation sont dans Limites et facturation des sandboxes.

Erreurs

Chaque erreur d'API est une sous-classe de EqvpsError avec status (HTTP), code (chaîne stable) et body. retry_after / retryAfter est renseigné quand le serveur l'envoie.

ClasseHTTPcode typiqueQue faire
AuthenticationError401unauthenticatedvérifier le jeton
InsufficientBalanceError402insufficient_balancerecharger le solde
NotFoundError404not_foundmauvais id, ou fichier inexistant
SandboxPausedError409sandbox_pauseden pause après l'épuisement du solde ; reprend après une recharge
SandboxDeletedError410sandbox_deletedsupprimée définitivement
FileTooLargeError413file_too_largegarder les transferts sous 5 Mo
ValidationError422invalid_requestcorriger les paramètres
RateLimitError429too_many_concurrent, too_many_tasks, rate_limitedattendre et réessayer
BudgetExceededError429budget_exceededvotre limite quotidienne ou mensuelle pour les sandboxes est atteinte
CapacityError503capacityréessayer sous peu ou choisir un tarif plus petit
SandboxTimeoutError—request_timeout, wait_timeoutla requête HTTP (ou wait) a expiré, pas la commande

Deux limites provoquent la plupart des 429 : un compte exécute 2 commandes en même temps et garde jusqu'à 20 sandboxes. Le SDK relance ces requêtes quand le serveur indique combien attendre ; après trois essais, vous recevez l'exception.

Quand se passer du SDK

Tout langage doté d'un client HTTP peut appeler l'API directement ; les points d'accès sont décrits dans le fichier OpenAPI à https://eqvps.com/openapi.json. Les agents dans Claude, Cursor ou d'autres clients MCP n'ont besoin d'aucun code : le serveur MCP propose les mêmes outils de sandbox. Et pour simplement voir comment ça marche, la page des sandboxes liste les tarifs et l'essai à $1 pour les nouveaux comptes.

FAQ

Quelles versions de Python et de Node.js le SDK prend-il en charge ?

Le paquet Python demande Python 3.8 ou plus récent et n'a aucune dépendance. Le paquet TypeScript n'en a pas non plus et fonctionne sur Node.js 18+, Deno, Bun et dans les navigateurs qui ont fetch.

Où le SDK trouve-t-il ma clé d'API ?

Dans l'argument api_key / apiKey, ou dans la variable d'environnement EQVPS_API_KEY. La clé est un jeton de compte EQVPS ordinaire. EQVPS_API_URL remplace l'adresse de l'API ; vous n'en avez besoin que pour des tests.

Le SDK relance-t-il les requêtes qui échouent ?

Il relance les 429 et 503 jusqu'à 3 fois quand le serveur envoie Retry-After, en attendant au plus 30 secondes à chaque fois. Ces statuts signifient que la requête a été refusée avant toute exécution, donc relancer run et exec est sans risque. Les erreurs réseau ne sont relancées que pour les GET ; run, exec et upload ne partent jamais deux fois.

Un code de sortie non nul déclenche-t-il une exception ?

Non. run et exec renvoient un résultat avec exit_code, stdout et stderr. Vérifiez result.ok ou result.exit_code. Les exceptions ne concernent que les erreurs d'API, comme un solde vide ou un jeton invalide.

Comment être sûr qu'une sandbox est supprimée si mon code plante ?

Utilisez la forme à portée limitée : with Sandbox.create() as sb en Python, Sandbox.with(options, fn) ou await using en TypeScript. La sandbox est supprimée à la fin du bloc, y compris après une exception.

Commentaires

Pas encore de commentaires. Soyez le premier.

Laisser un commentaire

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