−25%

στα Windows με ετήσια χρέωση, έως 31/10. Δείτε τα πακέτα

EQVPS
Ξεκινήστε

Αναφορά API για sandboxes: SDK Python και TypeScript

Όλες οι μέθοδοι του SDK για sandboxes της EQVPS σε μία σελίδα: παράμετροι, προεπιλογές, τιμές επιστροφής και οι 11 κλάσεις σφαλμάτων, με το ίδιο παράδειγμα σε Python και TypeScript.

Τελευταίος έλεγχος: 2026-10-10 · SDK 0.2.0 (PyPI eqvps, npm @eqvps/sdk)

Το SDK είναι ένα λεπτό στρώμα πάνω από το REST API των sandboxes. Σας γλιτώνει από τρία πράγματα: να φτιάχνετε αιτήματα με το χέρι, να τα ξαναστέλνετε όταν η πλατφόρμα είναι απασχολημένη και να ξεχνάτε να διαγράψετε ένα sandbox όταν ο κώδικας πετάξει εξαίρεση. Όλα εδώ αντιστοιχούν στην έκδοση 0.2.0 και των δύο πακέτων.

Αν δεν έχετε φτιάξει ποτέ sandbox, ο οδηγός σύνδεσης σε 5 λεπτά σας δίνει πρώτα ένα token. Τι είναι ένα sandbox και τι περιέχει εξηγείται στη σελίδα Sandboxes.

Εγκατάσταση και ρύθμιση

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

Το ίδιο πρόγραμμα και στις δύο γλώσσες: δημιουργία sandbox, εκτέλεση κώδικα, διαγραφή.

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
});

Δημιουργία και εύρεση sandboxes

Το Sandbox.create(...) ξεκινά ένα sandbox, συνήθως σε περίπου ένα δευτερόλεπτο. Η Python δέχεται ονομαστικά ορίσματα, η TypeScript ένα αντικείμενο επιλογών.

PythonTypeScriptΠροεπιλογήΣημασία
modemode"ephemeral""ephemeral" (ανά δευτερόλεπτο) ή "persistent" (ανά ώρα που ξεκίνησε, κρατά τον δίσκο του)
tarifftariff"small"micro, small, standard, plus, pro, max
idle_timeoutidleTimeout300δευτερόλεπτα αδράνειας πριν διαγραφεί ένα εφήμερο sandbox, έως 3600
ttlttl—μέγιστη διάρκεια ζωής σε δευτερόλεπτα: έως 86400 για εφήμερο, 2592000 για μόνιμο
envenv—μεταβλητές περιβάλλοντος για κάθε εντολή, αποθηκευμένες κρυπτογραφημένες
api_key, base_urlapiKey, baseUrlμεταβλητές περιβάλλοντοςαντικαθιστούν τα EQVPS_API_KEY / EQVPS_API_URL
timeouttimeoutMs70 δλχρονικό όριο HTTP ανά αίτημα
max_retriesmaxRetries3επαναλήψεις σε 429/503

Το Sandbox.connect(id) συνδέεται σε υπάρχον sandbox, συνήθως ένα μόνιμο που φτιάξατε χθες. Το Sandbox.list() επιστρέφει όλα τα sandboxes του λογαριασμού, ενεργά και σε παύση.

Ιδιότητες: id (sb_ + 24 δεκαεξαδικοί χαρακτήρες), mode, tariff, state (running, starting, paused, pausing, resuming, deleting, deleted), env_keys / envKeys (μόνο ονόματα, οι τιμές δεν επιστρέφονται ποτέ) και info (το ακατέργαστο αντικείμενο). Το refresh() τις ξαναφορτώνει.

Το kill() διαγράφει το sandbox και σταματά τη χρέωση. Η κλήση του για sandbox που έχει ήδη χαθεί δεν θεωρείται σφάλμα.

Εκτέλεση κώδικα

Το run(code, language="python", timeout=30) στέλνει κώδικα μέσω stdin σε Python 3.12, Node.js 22 ή bash ("python", "node", "bash"). Το exec(command, cwd=None, stdin=None, timeout=30) εκτελεί εντολή κελύφους: ένα string περνά από bash -lc, μια λίστα εκτελείται ως argv χωρίς κέλυφος.

Και τα δύο επιστρέφουν ExecResult:

ΠεδίοΣημασία
exit_codeκωδικός εξόδου της διεργασίας
stdout, stderrέξοδος, έως 1 MiB ανά ροή
timed_outη εντολή έφτασε το χρονικό όριό της
truncatedη έξοδος κόπηκε
duration_msπόσο κράτησε
okexit_code == 0 και χωρίς υπέρβαση χρόνου

Μια σύγχρονη κλήση διαρκεί το πολύ 55 δευτερόλεπτα. Και οι δύο μέθοδοι δέχονται επίσης env μόνο για εκείνη την κλήση· αντικαθιστά τις τιμές που ορίστηκαν κατά τη δημιουργία.

Μεγάλες δουλειές: εργασίες παρασκηνίου

Δώστε background=True (TypeScript: { background: true }) και παίρνετε αμέσως ένα Task. Δεν έχει όριο 55 δευτερολέπτων και μπορεί να τρέχει μέχρι να τελειώσει η ζωή του sandbox. Έως 8 εργασίες ανά 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) });
ΜέθοδοςΤι κάνει
task.logs()νέο stdout και stderr από την προηγούμενη κλήση
task.status()κατάσταση χωρίς κατανάλωση εξόδου: running, done, failed, killed, timeout
task.wait(timeout, poll_interval=2, on_output)ελέγχει μέχρι να τελειώσει η εργασία, επιστρέφει TaskResult
task.kill()σταματά την εργασία και τις διεργασίες της
sb.task(id) / sb.tasks()επανασύνδεση σε εργασία / λίστα εργασιών

Αν το wait φτάσει το δικό του χρονικό όριο, πετά SandboxTimeoutError, αλλά η εργασία συνεχίζει. Μια εργασία σε εξέλιξη εμποδίζει επίσης τη διαγραφή ενός εφήμερου sandbox λόγω αδράνειας.

Αρχεία και κατανάλωση

Το upload(path, content, mode=None) γράφει αρχείο σε απόλυτη διαδρομή και επιστρέφει το μέγεθός του. Το download(path) επιστρέφει bytes, το download_text(path) / downloadText(path) string. Μία μεταφορά περιορίζεται στα 5 MB.

Το usage() επιστρέφει δευτερόλεπτα λειτουργίας, δευτερόλεπτα CPU που χρησιμοποιήθηκαν, εξερχόμενα bytes, την τιμή ανά ώρα, billed_usd και estimated_total_usd. Το tariffs() είναι απλή συνάρτηση χωρίς κλειδί που επιστρέφει τις τρέχουσες τιμές και όρια. Οι κανόνες χρέωσης βρίσκονται στη σελίδα Όρια και χρέωση sandboxes.

Σφάλματα

Κάθε σφάλμα API είναι υποκλάση του EqvpsError με status (HTTP), code (σταθερό string) και body. Το retry_after / retryAfter συμπληρώνεται όταν το στέλνει ο server.

ΚλάσηHTTPΣυνήθης codeΤι να κάνετε
AuthenticationError401unauthenticatedελέγξτε το token
InsufficientBalanceError402insufficient_balanceφορτίστε το υπόλοιπο
NotFoundError404not_foundλάθος id ή ανύπαρκτο αρχείο
SandboxPausedError409sandbox_pausedσε παύση επειδή τελείωσε το υπόλοιπο· συνεχίζει μετά τη φόρτιση
SandboxDeletedError410sandbox_deletedδιαγράφηκε οριστικά
FileTooLargeError413file_too_largeκρατήστε τις μεταφορές κάτω από 5 MB
ValidationError422invalid_requestδιορθώστε τις παραμέτρους
RateLimitError429too_many_concurrent, too_many_tasks, rate_limitedπεριμένετε και ξαναδοκιμάστε
BudgetExceededError429budget_exceededέφτασε το ημερήσιο ή μηνιαίο όριο δαπανών για sandboxes
CapacityError503capacityξαναδοκιμάστε σε λίγο ή διαλέξτε μικρότερο πακέτο
SandboxTimeoutError—request_timeout, wait_timeoutέληξε το αίτημα HTTP (ή το wait), όχι η εντολή

Τα περισσότερα 429 τα προκαλούν δύο όρια: ένας λογαριασμός εκτελεί 2 εντολές ταυτόχρονα και κρατά έως 20 sandboxes. Το SDK τα ξαναδοκιμάζει όταν ο server λέει πόσο να περιμένει· μετά από τρεις προσπάθειες παίρνετε την εξαίρεση.

Πότε δεν χρειάζεστε το SDK

Κάθε γλώσσα με HTTP client μπορεί να καλέσει το API απευθείας· τα endpoints βρίσκονται στο αρχείο OpenAPI στο https://eqvps.com/openapi.json. Οι πράκτορες σε Claude, Cursor ή άλλους MCP clients δεν χρειάζονται καθόλου κώδικα: ο MCP server έχει τα ίδια εργαλεία sandbox. Κι αν θέλετε απλώς να το δείτε να δουλεύει, η σελίδα των sandboxes δείχνει τα πακέτα και τη δοκιμή των $1 για νέους λογαριασμούς.

Συχνές ερωτήσεις

Ποιες εκδόσεις Python και Node.js υποστηρίζει το SDK;

Το πακέτο Python χρειάζεται Python 3.8 ή νεότερη και δεν έχει εξαρτήσεις. Ούτε το πακέτο TypeScript έχει εξαρτήσεις· τρέχει σε Node.js 18+, Deno, Bun και σε browsers με fetch.

Από πού παίρνει το SDK το κλειδί API μου;

Από το όρισμα api_key / apiKey ή από τη μεταβλητή περιβάλλοντος EQVPS_API_KEY. Το κλειδί είναι ένα κανονικό token λογαριασμού EQVPS. Το EQVPS_API_URL αλλάζει τη διεύθυνση του API· χρειάζεται μόνο για δοκιμές.

Ξαναδοκιμάζει το SDK τα αιτήματα που αποτυγχάνουν;

Ξαναδοκιμάζει τα 429 και 503 έως 3 φορές όταν ο server στέλνει Retry-After, περιμένοντας το πολύ 30 δευτερόλεπτα κάθε φορά. Αυτές οι καταστάσεις σημαίνουν ότι το αίτημα απορρίφθηκε πριν εκτελεστεί οτιδήποτε, άρα η επανάληψη των run και exec είναι ασφαλής. Τα σφάλματα δικτύου επαναλαμβάνονται μόνο για GET· τα run, exec και upload δεν στέλνονται ποτέ δύο φορές.

Είναι εξαίρεση ένας μη μηδενικός κωδικός εξόδου;

Όχι. Τα run και exec επιστρέφουν αποτέλεσμα με exit_code, stdout και stderr. Ελέγξτε το result.ok ή το result.exit_code. Εξαιρέσεις προκύπτουν μόνο για σφάλματα του API, όπως άδειο υπόλοιπο ή άκυρο token.

Πώς εξασφαλίζω ότι το sandbox θα διαγραφεί αν ο κώδικάς μου κρασάρει;

Χρησιμοποιήστε τη μορφή με εμβέλεια: with Sandbox.create() as sb στην Python, Sandbox.with(options, fn) ή await using στην TypeScript. Το sandbox διαγράφεται όταν τελειώνει το μπλοκ, ακόμη και μετά από εξαίρεση.

Σχόλια

Δεν υπάρχουν ακόμη σχόλια. Γίνετε ο πρώτος.

Αφήστε ένα σχόλιο

Τα σχόλια ελέγχονται πριν εμφανιστούν.