−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 hex-символи), 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 МіБ на потік
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 МБ.

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 МБ
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. Пісочниця видаляється на виході з блоку, зокрема після винятку.

Коментарі

Поки немає коментарів. Будьте першим.

Залишити коментар

Коментарі проходять модерацію перед публікацією.