−25%

روی پرداخت سالانه Windows، تا ۳۱ اکتبر. مشاهده پلن‌ها

EQVPS
شروع کنید

سندباکس‌ها

ماشین‌های مجازی کوچک و ایزولهٔ Linux برای کدی که اسکریپت‌ها و ایجنت‌های هوش مصنوعی شما اجرا می‌کنند. هر سندباکس حدود یک ثانیه‌ای بالا می‌آید، Python، Node.js یا bash اجرا می‌کند و ثانیه‌ای از همان موجودی سرورهایتان حساب می‌شود.

سندباکس چیست

یک ماشین کوچک Linux که از طریق API یا MCP می‌سازید، چند ثانیه یا چند روز استفاده می‌کنید و حذف می‌کنید. اینترنت خروجی کار می‌کند (pip install، npm install، git clone). پورت ورودی و SSH ندارد: فرمان‌ها و فایل‌ها از API می‌گذرند. داخلش: Python 3.12 با pip، Node.js 22 با npm، bash، git و curl.

دو حالت

موقت (پیش‌فرض) — برای یک کار. وقتی delete را صدا بزنید، پس از مهلت بیکاری (پیش‌فرض ۵ دقیقه، حداکثر ۱ ساعت) یا با پایان TTL (حداکثر ۲۴ ساعت) حذف می‌شود. محاسبهٔ ثانیه‌ای، حداقل ۶۰ ثانیه.
دائمی — دیسک و وضعیتش را تا ۳۰ روز نگه می‌دارد. هر ساعتِ شروع‌شده حساب می‌شود و یک ماه تقویمی هرگز بیشتر از ۷۳۰ ساعت منهای ۲۵٪ هزینه ندارد. اگر موجودی تمام شود، با یک اسنپ‌شات متوقف می‌شود (بدون هزینه) و پس از شارژ ادامه می‌دهد؛ اسنپ‌شات‌های متوقف ۱۴ روز نگه داشته می‌شوند.

تعرفه‌ها

تعرفهvCPURAMدیسکشبکهساعتیدائمی، سقف ماهانه
micro0.25512 MB3 GB50 Mbit/s$0.0165$9.03
small0.51 GB5 GB100 Mbit/s$0.033$18.07
standard12 GB10 GB200 Mbit/s$0.066$36.14
plus24 GB15 GB300 Mbit/s$0.132$72.27
pro48 GB20 GB400 Mbit/s$0.264$144.54
max816 GB40 GB500 Mbit/s$0.528$289.08

هزینهٔ vCPU و RAM تعرفهٔ انتخابی را می‌پردازید: ‎$0.040 برای هر vCPU-ساعت و ‎$0.013 برای هر GiB-ساعت. قیمت‌های به‌روز بدون توکن: GET /sandboxes/tariffs.

محدودیت‌هایی که بهتر است بدانید

هر فرمان حداکثر ۵۵ ثانیه اجرا می‌شود؛ کارهای طولانی‌تر در پس‌زمینه اجرا می‌شوند و نتیجه را می‌پرسید. فایل‌ها تا ۵ مگابایت در هر درخواست، بزرگ‌ترها (تا ۲ گیگابایت) با لینک‌های یک‌بارمصرف دانلود و آپلود. هر حساب هم‌زمان تا ۲۰ سندباکس و ۲ فرمان دارد.

متغیرهای محیطی

رازها و تنظیمات را با env بفرستید. اگر هنگام ساخت تعیین شوند برای همه دستورهای سندباکس اعمال می‌شوند؛ اگر در exec یا run تعیین شوند فقط برای همان فراخوانی اعمال می‌شوند و مقادیر سندباکس را بازنویسی می‌کنند. حداکثر ۶۴ متغیر، ۳۲ کیلوبایت برای هر مقدار و ۶۴ کیلوبایت در مجموع. مقادیر رمزنگاری‌شده ذخیره می‌شوند، API هرگز آن‌ها را برنمی‌گرداند و در لاگ‌ها نوشته نمی‌شوند: پاسخ‌ها فقط نام‌ها را نشان می‌دهند (env_keys).

API=https://api.eqvps.com/api/v1/eqvps
AUTH="Authorization: Bearer $EQVPS_API_KEY"

# env for the whole sandbox (only the names come back, as env_keys)
SB=$(curl -s -X POST $API/sandboxes -H "$AUTH" -H "Content-Type: application/json" \
  -d '{"tariff":"small","env":{"DB_URL":"postgres://user:pass@db/app","MODE":"test"}}' | jq -r .id)

# env for one call, merged over the sandbox env
curl -s -X POST $API/sandboxes/$SB/exec -H "$AUTH" -H "Content-Type: application/json" \
  -d '{"command":"echo $MODE $RUN_ID","env":{"RUN_ID":"42"}}'

سقف هزینه

به‌طور پیش‌فرض سندباکس‌ها سقف هزینه ندارند. می‌توانید سقف روزانه و ماهانه را در داشبورد یا با PUT /sandboxes/budget تعیین کنید. با رسیدن به سقف، سندباکس‌های جدید پاسخ 429 budget_exceeded می‌گیرند، سندباکس‌های موقت در حال اجرا حذف می‌شوند و دائمی‌ها با حفظ دیسک متوقف می‌شوند. با افزایش سقف یا شروع روز یا ماه جدید (UTC) کارشان ادامه می‌یابد.

# daily cap $5, monthly cap $50 (null = no cap)
curl -s -X PUT $API/sandboxes/budget -H "$AUTH" -H "Content-Type: application/json" \
  -d '{"daily_usd":5,"monthly_usd":50}'

# spent today / this month and when the caps reset (UTC)
curl -s $API/sandboxes/budget -H "$AUTH"

شروع سریع: MCP (Claude Code، Cursor و کلاینت‌های دیگر)

سرور MCP را یک بار وصل کنید و بعد با کلمات خودتان از ایجنت بخواهید. ابزارهای سندباکس: create_sandbox، run_code، exec_command، get_task، kill_task، get_upload_url، get_download_url، list_sandboxes، get_sandbox، kill_sandbox، sandbox_pricing.

claude mcp add --transport http eqvps https://mcp.eqvps.com/mcp \
  --header "Authorization: Bearer $EQVPS_API_KEY"
یک سندباکس کوچک بساز، در Python دستور print(2 + 2) را اجرا کن، خروجی را نشانم بده و سندباکس را حذف کن.

شروع سریع: REST از Python و Node.js

بستهٔ اضافه‌ای لازم نیست. توکن خود را در متغیر محیطی EQVPS_API_KEY بگذارید (روش گرفتنش در «اتصال حساب»).

Python
# first_sandbox.py — Python 3.8+, standard library only
import json, os, urllib.request

API = "https://api.eqvps.com/api/v1/eqvps"
KEY = os.environ["EQVPS_API_KEY"]

def call(method, path, body=None):
    req = urllib.request.Request(API + path, method=method,
        data=json.dumps(body).encode() if body is not None else None,
        headers={"Authorization": "Bearer " + KEY,
                 "Content-Type": "application/json", "Accept": "application/json"})
    with urllib.request.urlopen(req, timeout=90) as r:   # HTTPError on 401/402/…
        return json.loads(r.read() or b"{}")

sb = call("POST", "/sandboxes", {"tariff": "small"})
try:
    r = call("POST", f"/sandboxes/{sb['id']}/run",
             {"language": "python", "code": "print(2 + 2)"})
    print(r["exit_code"], r["stdout"])                    # 0 4
finally:
    call("DELETE", f"/sandboxes/{sb['id']}")
Node.js
// first_sandbox.mjs — Node.js 18+ (built-in fetch), run: node first_sandbox.mjs
const API = "https://api.eqvps.com/api/v1/eqvps";
const KEY = process.env.EQVPS_API_KEY;

async function call(method, path, body) {
  const r = await fetch(API + path, {
    method,
    headers: { Authorization: `Bearer ${KEY}`, "Content-Type": "application/json", Accept: "application/json" },
    body: body ? JSON.stringify(body) : undefined,
  });
  const data = await r.json();
  if (!r.ok) throw new Error(`${r.status} ${data.error ?? ""} ${data.message ?? ""}`);
  return data;
}

const sb = await call("POST", "/sandboxes", { tariff: "small" });
try {
  const r = await call("POST", `/sandboxes/${sb.id}/run`, { language: "node", code: "console.log(2 + 2)" });
  console.log(r.exit_code, r.stdout); // 0 4
} finally {
  await call("DELETE", `/sandboxes/${sb.id}`);
}

SDK برای Python و TypeScript

کتابخانه را ترجیح می‌دهید؟ بسته‌های Python و TypeScript همان فراخوانی‌های REST را انجام می‌دهند، در 429 و 503 خودشان دوباره تلاش می‌کنند و در پایان بلوک همیشه سندباکس را حذف می‌کنند. نصب و مثال:

Python · eqvps
# pip install -U eqvps       https://pypi.org/project/eqvps/  (0.2.0+ for env)
# "eqvps sandbox create" = Sandbox.create() here · create_sandbox in MCP · POST /sandboxes in REST (no CLI)
from eqvps import Sandbox

# EQVPS_API_KEY from the environment; env = secrets for your code, stored encrypted
with Sandbox.create(tariff="small", env={"DB_URL": "postgres://user:pass@db/app"}) as sb:
    r = sb.run("print(2 + 2)")
    print(r.stdout, r.exit_code)             # "4\n" 0
    sb.upload("/root/data.csv", "a,b\n1,2\n")
    print(sb.exec("wc -l /root/data.csv").stdout)
    print(sb.exec("echo $RUN_ID", env={"RUN_ID": "42"}).stdout)   # env for one call
# the sandbox is deleted when the block exits, also on errors
TypeScript · @eqvps/sdk
// npm i @eqvps/sdk@latest   https://www.npmjs.com/package/@eqvps/sdk  (0.2.0+ for env)
import { Sandbox } from "@eqvps/sdk";

// EQVPS_API_KEY from the environment; env = secrets for your code, stored encrypted
await Sandbox.with({ tariff: "small", env: { DB_URL: "postgres://user:pass@db/app" } }, async (sb) => {
  const r = await sb.run("print(2 + 2)");
  console.log(r.stdout, r.exit_code);                    // "4\n" 0
  console.log((await sb.exec("echo $RUN_ID", { env: { RUN_ID: "42" } })).stdout); // env for one call
});                                                       // deleted afterwards, also on errors

اتصال حساب: توکن، پیکربندی، اولین سندباکس، موجودی ←

نظرات

هنوز نظری نیست. اولین نفر باشید.

یک نظر بگذارید

نظرات پیش از نمایش بررسی می‌شوند.