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 — один объект опций.
| Python | TypeScript | По умолчанию | Что значит |
|---|---|---|---|
mode | mode | "ephemeral" | "ephemeral" (посекундно) или "persistent" (за начатый час, диск сохраняется) |
tariff | tariff | "small" | micro, small, standard, plus, pro, max |
idle_timeout | idleTimeout | 300 | секунд без активности до удаления эфемерной песочницы, до 3600 |
ttl | ttl | — | максимальное время жизни в секундах: до 86400 у эфемерной, 2592000 у постоянной |
env | env | — | переменные окружения для всех команд, хранятся зашифрованными |
api_key, base_url | apiKey, baseUrl | переменные окружения | переопределяют EQVPS_API_KEY / EQVPS_API_URL |
timeout | timeoutMs | 70 с | HTTP-таймаут одного запроса |
max_retries | maxRetries | 3 | повторы при 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 | сколько длилось выполнение |
ok | exit_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 | Что делать |
|---|---|---|---|
AuthenticationError | 401 | unauthenticated | проверить токен |
InsufficientBalanceError | 402 | insufficient_balance | пополнить баланс |
NotFoundError | 404 | not_found | неверный id или файла нет |
SandboxPausedError | 409 | sandbox_paused | на паузе после исчерпания баланса; продолжит после пополнения |
SandboxDeletedError | 410 | sandbox_deleted | удалена окончательно |
FileTooLargeError | 413 | file_too_large | держать передачи меньше 5 МБ |
ValidationError | 422 | invalid_request | исправить параметры |
RateLimitError | 429 | too_many_concurrent, too_many_tasks, rate_limited | подождать и повторить |
BudgetExceededError | 429 | budget_exceeded | достигнут дневной или месячный лимит трат на песочницы |
CapacityError | 503 | capacity | повторить чуть позже или взять тариф меньше |
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 для новых аккаунтов.
Комментарии
Пока нет комментариев. Будьте первым.