−25%

Windows 年払い、10月31日まで。 プランを見る

EQVPS
始める

サンドボックス API リファレンス:Python と TypeScript の SDK

EQVPS サンドボックス SDK の全メソッドを 1 ページに:パラメータ、デフォルト値、戻り値、そして 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(...) はサンドボックスを起動します。通常は約 1 秒です。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_retriesmaxRetries3429/503 での再試行回数

Sandbox.connect(id) は既存のサンドボックスに接続します。多くは昨日作ったパーシステントなものです。Sandbox.list() はアカウントのすべてのサンドボックス(稼働中と一時停止中)を返します。

プロパティ:id(sb_ + 16 進 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 秒の制限はなく、サンドボックスの寿命が尽きるまで動かせます。1 サンドボックスあたり最大 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) は文字列を返します。1 回の転送は 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_foundid が違う、またはファイルがない
SandboxPausedError409sandbox_paused残高切れで一時停止中。チャージ後に再開
SandboxDeletedError410sandbox_deleted完全に削除済み
FileTooLargeError413file_too_large転送は 5 MB 未満に
ValidationError422invalid_requestパラメータを修正
RateLimitError429too_many_concurrent、too_many_tasks、rate_limited待ってから再試行
BudgetExceededError429budget_exceededサンドボックスの 1 日または 1 か月の支出上限に到達
CapacityError503capacity少し待って再試行するか、小さいプランを選ぶ
SandboxTimeoutError—request_timeout、wait_timeoutタイムアウトしたのは HTTP リクエスト(または wait)で、コマンドではない

429 の大半は二つの制限から来ます。1 アカウントで 同時に実行できるコマンドは 2 つ、保持できるサンドボックスは 20 個まで です。待ち時間をサーバーが示したとき SDK は再試行し、3 回失敗すると例外になります。

SDK が不要な場合

HTTP クライアントがあればどの言語からでも API を直接呼べます。エンドポイントは https://eqvps.com/openapi.json の OpenAPI ファイルにあります。Claude や Cursor、その他の MCP クライアントで動くエージェントにはコードすら不要です。MCP サーバー に同じサンドボックスのツールがあります。動くところを見てみたいだけなら、サンドボックスのページ にプランと新規アカウント向けの $1 トライアルが載っています。

よくある質問

SDK はどのバージョンの Python と Node.js に対応していますか?

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 は失敗したリクエストを再試行しますか?

サーバーが Retry-After を返した場合、429 と 503 を最大 3 回再試行し、1 回あたり最大 30 秒待ちます。これらのステータスは何も実行される前にリクエストが拒否されたことを意味するので、run と exec を再試行しても安全です。ネットワークエラーは GET のみ再試行し、run、exec、upload が 2 回送信されることはありません。

ゼロ以外の終了コードは例外になりますか?

なりません。run と exec は exit_code、stdout、stderr を含む結果を返します。result.ok か result.exit_code を確認してください。例外になるのは、残高不足や無効なトークンなど API のエラーだけです。

コードがクラッシュしてもサンドボックスを確実に削除するには?

スコープ付きの書き方を使います。Python なら with Sandbox.create() as sb、TypeScript なら Sandbox.with(options, fn) か await using です。ブロックを抜けるとき、例外の後でもサンドボックスは削除されます。

コメント

まだコメントはありません。最初になりましょう。

コメントを残す

コメントは表示される前にモデレートされます。