−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. Песочница удаляется по выходу из блока, в том числе после исключения.

Комментарии

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

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

Комментарии проходят модерацию перед публикацией.