−25%

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

EQVPS
დაწყება

Sandbox API-ის ცნობარი: Python და TypeScript SDK

EQVPS-ის sandbox SDK-ის ყველა მეთოდი ერთ გვერდზე: პარამეტრები, ნაგულისხმევი მნიშვნელობები, დაბრუნებული მნიშვნელობები და შეცდომების 11-ვე კლასი, ერთი და იგივე მაგალითით Python-სა და TypeScript-ზე.

ბოლოს შემოწმდა: 2026-10-10 · SDK 0.2.0 (PyPI eqvps, npm @eqvps/sdk)

SDK არის sandbox-ის REST API-ის თხელი გარსი. ის სამ რამეს გაგირიდებთ: მოთხოვნების ხელით აწყობას, გამეორებას, როცა პლატფორმა დატვირთულია, და sandbox-ის წაშლის დავიწყებას, როცა კოდი გამონაკლისს აგდებს. აქ ყველაფერი ორივე პაკეტის 0.2.0 ვერსიას შეესაბამება.

თუ sandbox ჯერ არასოდეს შეგიქმნიათ, 5-წუთიანი დაკავშირების გზამკვლევი ჯერ ტოკენს მოგცემთ. რა არის sandbox და რა არის მის შიგნით, აღწერილია სენდბოქსებში.

ინსტალაცია და კონფიგურაცია

pip install eqvps          # Python 3.8+
npm i @eqvps/sdk           # Node.js 18+, Deno, Bun
export EQVPS_API_KEY=...   # your EQVPS account token

ერთი და იგივე პროგრამა ორივე ენაზე: შექმენით sandbox, გაუშვით კოდი, წაშალეთ.

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-ების შექმნა და მოძებნა

Sandbox.create(...) უშვებს sandbox-ს, ჩვეულებრივ დაახლოებით ერთ წამში. Python სახელდებულ არგუმენტებს იღებს, TypeScript — პარამეტრების ერთ ობიექტს.

PythonTypeScriptნაგულისხმევიმნიშვნელობა
modemode"ephemeral""ephemeral" (წამობრივად) ან "persistent" (ყოველ დაწყებულ საათზე, ინახავს დისკს)
tarifftariff"small"micro, small, standard, plus, pro, max
idle_timeoutidleTimeout300უმოქმედობის წამები, სანამ დროებითი sandbox წაიშლება, 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-ს, როგორც წესი მუდმივს, რომელიც გუშინ შექმენით. Sandbox.list() აბრუნებს ანგარიშის ყველა sandbox-ს, გაშვებულსაც და დაპაუზებულსაც.

თვისებები: id (sb_ + 24 თექვსმეტობითი სიმბოლო), mode, tariff, state (running, starting, paused, pausing, resuming, deleting, deleted), env_keys / envKeys (მხოლოდ სახელები, მნიშვნელობები არასოდეს ბრუნდება) და info (ნედლი ობიექტი). refresh() მათ ხელახლა ტვირთავს.

kill() შლის sandbox-ს და აჩერებს ბილინგს. უკვე წაშლილ sandbox-ზე მისი გამოძახება შეცდომა არ არის.

კოდის გაშვება

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) უშვებს shell-ის ბრძანებას: სტრიქონი გადის bash -lc-ში, სია სრულდება როგორც argv, shell-ის გარეშე.

ორივე აბრუნებს ExecResult-ს:

ველიმნიშვნელობა
exit_codeპროცესის გასვლის კოდი
stdout, stderrგამოსავალი, 1 MiB-მდე თითო ნაკადზე
timed_outბრძანებამ თავის ტაიმაუტს მიაღწია
truncatedგამოსავალი შეიკვეცა
duration_msრამდენ ხანს მუშაობდა
okexit_code == 0 და ტაიმაუტი არ ყოფილა

სინქრონული გამოძახება მაქსიმუმ 55 წამს მუშაობს. ორივე მეთოდი იღებს env-საც მხოლოდ ამ ერთი გამოძახებისთვის; ის ცვლის შექმნისას მითითებულ მნიშვნელობებს.

გრძელი სამუშაოები: ფონური ამოცანები

გადაეცით background=True (TypeScript-ში { background: true }) და მაშინვე მიიღებთ Task-ს. მას 55-წამიანი ლიმიტი არ აქვს და შეუძლია იმუშაოს sandbox-ის სიცოცხლის დასრულებამდე. თითო sandbox-ზე 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-ს, მაგრამ ამოცანა აგრძელებს მუშაობას. გაშვებული ამოცანა დროებით sandbox-საც იცავს უმოქმედობის გამო წაშლისგან.

ფაილები და ხარჯი

upload(path, content, mode=None) წერს ფაილს აბსოლუტურ გზაზე და აბრუნებს მის ზომას. download(path) აბრუნებს ბაიტებს, download_text(path) / downloadText(path) — სტრიქონს. ერთი გადაცემა 5 MB-ით შემოიფარგლება.

usage() აბრუნებს მუშაობის წამებს, გამოყენებულ CPU წამებს, გამავალ ბაიტებს, საათობრივ ფასს, billed_usd-ს და estimated_total_usd-ს. tariffs() ჩვეულებრივი ფუნქციაა, რომელსაც გასაღები არ სჭირდება და აბრუნებს მიმდინარე ფასებსა და ლიმიტებს. ბილინგის წესები აღწერილია sandbox-ის ლიმიტებსა და ბილინგში.

შეცდომები

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 MB-ზე ნაკლები უნდა იყოს
ValidationError422invalid_requestგაასწორეთ პარამეტრები
RateLimitError429too_many_concurrent, too_many_tasks, rate_limitedდაიცადეთ და სცადეთ ხელახლა
BudgetExceededError429budget_exceededsandbox-ის დღიურ ან თვიურ ლიმიტს მიაღწიეთ
CapacityError503capacityცოტა ხანში სცადეთ ან აირჩიეთ უფრო პატარა ტარიფი
SandboxTimeoutError—request_timeout, wait_timeoutHTTP მოთხოვნის (ან wait-ის) ტაიმაუტი, არა ბრძანების

429-ების უმეტესობას ორი ლიმიტი იწვევს: ანგარიში ერთდროულად 2 ბრძანებას უშვებს და 20 sandbox-მდე ინახავს. SDK მათ იმეორებს, როცა სერვერი ამბობს, რამდენ ხანს უნდა დაიცადოს; სამი ცდის შემდეგ გამონაკლისს მიიღებთ.

როდის არ გჭირდებათ SDK

ნებისმიერ ენას, რომელსაც HTTP კლიენტი აქვს, შეუძლია API პირდაპირ გამოიძახოს; endpoint-ები OpenAPI ფაილშია მისამართზე https://eqvps.com/openapi.json. Claude-ში, Cursor-ში ან სხვა MCP კლიენტებში აგენტებს კოდი საერთოდ არ სჭირდებათ: MCP სერვერს იგივე sandbox ხელსაწყოები აქვს. თუ უბრალოდ გინდათ ნახოთ, როგორ მუშაობს, sandbox-ის გვერდზე არის ტარიფები და $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-ის შეცდომებზე ჩნდება, მაგალითად ცარიელი ბალანსის ან არასწორი ტოკენის დროს.

როგორ დავრწმუნდე, რომ sandbox წაიშლება, თუ ჩემი კოდი ავარიულად დასრულდა?

გამოიყენეთ შემოფარგლული ფორმა: Python-ში with Sandbox.create() as sb, TypeScript-ში Sandbox.with(options, fn) ან await using. sandbox იშლება ბლოკის დასრულებისას, გამონაკლისის შემდეგაც.

კომენტარები

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

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

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