−25%

Windows-ის წლიურ გადახდაზე, 31 ოქტომბრამდე. ტარიფებზე

EQVPS
დაწყება

სენდბოქსები

იზოლირებული Linux მიკრო-VM-ები იმ კოდისთვის, რომელსაც თქვენი სკრიპტები და AI აგენტები უშვებენ. სენდბოქსი დაახლოებით ერთ წამში ირთვება, უშვებს 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-ის გამოძახებისას, უმოქმედობის ლიმიტის შემდეგ (ნაგულისხმევად 5 წუთი, მაქსიმუმ 1 საათი) ან TTL-ის ამოწურვისას (მაქსიმუმ 24 საათი). ჩამოჭრა წამობრივად, მინიმუმ 60 წამი.
მუდმივი — დისკსა და მდგომარეობას ინახავს 30 დღემდე. ჩამოიჭრება ყოველ დაწყებულ საათზე, და კალენდარული თვე არასოდეს ღირს 730 საათს მინუს 25%-ზე მეტი. თუ ბალანსი ამოიწურა, სენდბოქსი პაუზდება სნეპშოტად (უფასოდ) და შევსების შემდეგ განაგრძობს მუშაობას; დაპაუზებული სნეპშოტები 14 დღე ინახება.

ტარიფები

ტარიფი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.

შეზღუდვები, რომლებიც უნდა იცოდეთ

ერთი ბრძანება მაქსიმუმ 55 წამი სრულდება; უფრო გრძელი სამუშაოები ფონურ ამოცანებად მიდის და შედეგს თქვენ ამოწმებთ. ფაილები — 5 MB-მდე ერთ მოთხოვნაზე, უფრო დიდი (2 GB-მდე) — ერთჯერადი ჩამოტვირთვისა და ატვირთვის ბმულებით. ერთ ანგარიშს ერთდროულად შეუძლია 20 სენდბოქსი და 2 ბრძანება.

გარემოს ცვლადები

გადაეცით საიდუმლოებები და პარამეტრები env-ით. შექმნისას მითითებული მოქმედებს სენდბოქსის ყველა ბრძანებაზე; exec-ში ან run-ში მითითებული მოქმედებს მხოლოდ ამ გამოძახებაზე და ცვლის სენდბოქსის მნიშვნელობებს. მაქსიმუმ 64 ცვლადი, 32 KB თითო მნიშვნელობაზე და ჯამში 64 KB. მნიშვნელობები ინახება დაშიფრული, 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

ანგარიშის დაკავშირება: ტოკენი, კონფიგურაცია, პირველი სენდბოქსი, ბალანსი →

კომენტარები

ჯერ არ არის კომენტარები. იყავით პირველი.

დატოვეთ კომენტარი

კომენტარები მოდერირდება გამოჩენამდე.