−25%

за Windows при годишно плащане, до 31.10. Към плановете

EQVPS
Започни

Справочник за API на пясъчниците: SDK за Python и TypeScript

Всички методи на SDK за пясъчници на EQVPS на една страница: параметри, стойности по подразбиране, връщани стойности и всичките 11 класа грешки, с един и същ пример на Python и TypeScript.

Последна проверка: 2026-10-10 · SDK 0.2.0 (PyPI eqvps, npm @eqvps/sdk)

SDK е тънък слой над REST API на пясъчниците. Спестява ви три неща: да сглобявате заявки на ръка, да ги повтаряте, когато платформата е заета, и да забравяте да изтриете пясъчника, когато кодът хвърли изключение. Всичко тук отговаря на версия 0.2.0 на двата пакета.

Ако никога не сте създавали пясъчник, ръководството за свързване за 5 минути първо ще ви даде токен. Какво е пясъчник и какво има в него, е обяснено в Пясъчници.

Инсталиране и настройка

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

Една и съща програма на двата езика: създай пясъчник, изпълни код, изтрий го.

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

Създаване и намиране на пясъчници

Sandbox.create(...) стартира пясъчник, обикновено за около секунда. Python приема именувани аргументи, TypeScript — един обект с опции.

PythonTypeScriptПо подразбиранеЗначение
modemode"ephemeral""ephemeral" (на секунда) или "persistent" (на започнат час, пази диска си)
tarifftariff"small"micro, small, standard, plus, pro, max
idle_timeoutidleTimeout300секунди без активност, преди ефимерен пясъчник да бъде изтрит, до 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.list() връща всички пясъчници на акаунта, работещи и на пауза.

Свойства: id (sb_ + 24 шестнайсетични знака), mode, tariff, state (running, starting, paused, pausing, resuming, deleting, deleted), env_keys / envKeys (само имена, стойностите никога не се връщат) и info (суровият обект). refresh() ги презарежда.

kill() изтрива пясъчника и спира таксуването. Извикването за вече изтрит пясъчник не е грешка.

Изпълнение на код

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) изпълнява команда на обвивката: низ минава през 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 секунди и може да работи до края на живота на пясъчника. До 8 задачи на пясъчник.

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, но задачата продължава да работи. Работеща задача също пречи ефимерният пясъчник да бъде изтрит заради неактивност.

Файлове и разход

upload(path, content, mode=None) записва файл по абсолютен път и връща размера му. download(path) връща байтове, download_text(path) / downloadText(path) — низ. Едно прехвърляне е ограничено до 5 MB.

usage() връща секундите работа, използваните CPU секунди, изходящите байтове, цената на час, billed_usd и estimated_total_usd. tariffs() е обикновена функция без ключ, връща текущите цени и лимити. Правилата за таксуване са на страницата Лимити и таксуване на пясъчниците.

Грешки

Всяка грешка на API е подклас на EqvpsError с status (HTTP), code (стабилен низ) и body. retry_after / retryAfter е попълнено, когато сървърът го изпрати.

КласHTTPТипичен codeКакво да направите
AuthenticationError401unauthenticatedпроверете токена
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достигнат е дневният или месечният лимит за пясъчници
CapacityError503capacityопитайте след малко или изберете по-малка тарифа
SandboxTimeoutError—request_timeout, wait_timeoutизтекъл е таймаутът на HTTP заявката (или на wait), а не на командата

Повечето 429 идват от два лимита: акаунтът изпълнява 2 команди едновременно и държи до 20 пясъчника. SDK повтаря такива заявки, когато сървърът каже колко да се чака; след три опита получавате изключението.

Кога SDK не ви трябва

Всеки език с HTTP клиент може да вика API директно; крайните точки са описани във файла OpenAPI на https://eqvps.com/openapi.json. Агентите в Claude, Cursor и други MCP клиенти изобщо нямат нужда от код: MCP сървърът има същите инструменти за пясъчници. А ако просто искате да видите как работи, на страницата за пясъчници са тарифите и пробният $1 за нови акаунти.

Често задавани въпроси

Кои версии на Python и Node.js поддържа SDK?

Пакетът за Python изисква Python 3.8 или по-нов и няма зависимости. Пакетът за TypeScript също няма зависимости и работи на Node.js 18+, Deno, Bun и в браузъри с fetch.

Откъде SDK взима моя API ключ?

От аргумента api_key / apiKey или от променливата на средата EQVPS_API_KEY. Ключът е обикновен токен на акаунт в EQVPS. EQVPS_API_URL сменя адреса на API; трябва само за тестове.

Повтаря ли SDK неуспешните заявки?

Повтаря 429 и 503 до 3 пъти, когато сървърът изпрати Retry-After, като чака най-много 30 секунди всеки път. Тези статуси означават, че заявката е отхвърлена, преди нещо да се изпълни, така че повтарянето на run и exec е безопасно. Мрежовите грешки се повтарят само за GET; run, exec и upload никога не се изпращат два пъти.

Ненулевият код на изход изключение ли е?

Не. run и exec връщат резултат с exit_code, stdout и stderr. Проверявайте result.ok или result.exit_code. Изключения има само при грешки на API, например празен баланс или невалиден токен.

Как да съм сигурен, че пясъчникът ще бъде изтрит, ако кодът ми се срине?

Използвайте формата с обхват: with Sandbox.create() as sb в Python, Sandbox.with(options, fn) или await using в TypeScript. Пясъчникът се изтрива, когато блокът приключи, включително след изключение.

Коментари

Още няма коментари. Бъди първият.

Остави коментар

Коментарите се модерират преди да се появят.