−25%

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

EQVPS
დაწყება

Sandbox-ის TypeScript SDK 5 წუთში: npm i @eqvps/sdk-იდან პირველ გაშვებამდე

დააყენეთ @eqvps/sdk, გაუშვით Firecracker sandbox Node.js-იდან, Deno-დან ან Bun-იდან, შეასრულეთ მასში Python, Node და shell კოდი, გადაიტანეთ ფაილები და გრძელ სამუშაოს პირდაპირ ეთერში ადევნეთ თვალი. ექვსი ნაბიჯი კოდის თითოეული ხაზით.

ეს გზამკვლევი sandbox-ს JavaScript-იდან ან TypeScript-იდან უშვებს. ჩართავთ იზოლირებულ Firecracker microVM-ს, შეასრულებთ კოდს სამ ენაზე, გადაიტანთ ფაილებს და გრძელი სამუშაოს გამოსავალს თვალს ადევნებთ. თითოეული ნაბიჯი კოდის მოკლე ფრაგმენტია.

გჭირდებათ Node.js 18+ (ან Deno, ან Bun) და EQVPS-ის ანგარიში.

1. აიღეთ ტოკენი

SDK ანგარიშის ჩვეულებრივი ტოკენით ავთენტიფიცირდება. როგორ მიიღოთ ის პანელიდან, API-იდან ან MCP სერვერიდან, ნაჩვენებია ანგარიშის დაკავშირების გვერდზე.

export EQVPS_API_KEY="your-token"

ბალანსის გარეშე ახალი ანგარიში $1 sandbox-ის კრედიტს იღებს, როცა პირველ sandbox-ს ქმნის. ეს ამ გზამკვლევისთვის ბევრჯერ საკმარისია.

2. დააყენეთ SDK

npm i @eqvps/sdk

მაგალითები იყენებენ ES მოდულებს და ზედა დონის await-ს. შეინახეთ ისინი .mjs ფაილებად, ან .ts-ად და გაუშვით npx tsx-ით.

3. გაუშვით sandbox და შეასრულეთ კოდი

import { Sandbox } from "@eqvps/sdk";

await Sandbox.with({ tariff: "small" }, async (sb) => {
  console.log(sb.id);
  const r = await sb.run("import platform; print(platform.python_version())");
  console.log(r.exit_code, r.stdout);
});

გამოსავალია sandbox-ის id (sb_ და კიდევ 24 სიმბოლო), შემდეგ 0 3.12.x. Sandbox.with შლის sandbox-ს, როცა callback სრულდება, მაშინაც კი, თუ ის შეცდომას აგდებს.

ნაგულისხმევი ენა Python-ია. დანარჩენი ორი ერთი პარამეტრითაა დაშორებული:

await Sandbox.with({}, async (sb) => {
  const js = await sb.run("console.log(process.version)", { language: "node" });
  const sh = await sb.run("uname -r && nproc", { language: "bash" });
  console.log(js.stdout, sh.stdout);
});

წარუმატებელი სკრიპტი არაფერს აგდებს. შეამოწმეთ r.ok, რომელიც true-ა, როცა exit_code 0-ია და ბრძანებამ ტაიმაუტს არ მიაღწია.

4. Shell ბრძანებები და პაკეტები

exec იღებს shell სტრიქონს ან argv მასივს. sandbox-ს ინტერნეტზე წვდომა აქვს, ამიტომ npm-ითა და pip-ით ინსტალაცია მუშაობს:

await Sandbox.with({ tariff: "small" }, async (sb) => {
  await sb.exec("mkdir -p /root/app && cd /root/app && npm init -y && npm i lodash", { timeout: 55 });
  const r = await sb.exec(["node", "-e", "console.log(require('/root/app/node_modules/lodash').VERSION)"]);
  console.log(r.stdout);
});

სინქრონული გამოძახება მაქსიმუმ 55 წამს გრძელდება. ყველაფერი უფრო გრძელი ფონურ ამოცანაში მიდის (ნაბიჯი 6).

5. ფაილები

await Sandbox.with({}, async (sb) => {
  await sb.upload("/root/input.json", JSON.stringify({ values: [3, 5, 8] }));
  await sb.run("import json; d = json.load(open('/root/input.json')); open('/root/out.txt', 'w').write(str(sum(d['values'])))");
  console.log(await sb.downloadText("/root/out.txt"));   // 16
});

upload იღებს სტრიქონს ან Uint8Array-ს. download აბრუნებს Uint8Array-ს, downloadText — სტრიქონს. ერთი გადაცემა 5 MB-ით შემოიფარგლება.

6. გრძელი სამუშაოები ცოცხალი გამოსავლით

await Sandbox.with({ tariff: "standard" }, async (sb) => {
  const task = await sb.exec("for i in 1 2 3 4 5; do echo step $i; sleep 20; done", { background: true });
  const res = await task.wait({ onOutput: (out) => process.stdout.write(out) });
  console.log(res.state, res.exit_code);   // done 0
});

ამოცანა მაშინვე ბრუნდება და 55-წამიანი ლიმიტი არ აქვს. wait ნაგულისხმევად ყოველ 2 წამში ამოწმებს (pollIntervalMs ამას ცვლის). task.kill() აჩერებს მას; sb.task(id) სხვა პროცესიდან ხელახლა უკავშირდება.

შეცდომები

import { Sandbox, InsufficientBalanceError, RateLimitError } from "@eqvps/sdk";

try {
  await Sandbox.with({}, async (sb) => console.log((await sb.run("print(1)")).stdout));
} catch (e) {
  if (e instanceof InsufficientBalanceError) console.log("Top up the balance");
  else if (e instanceof RateLimitError) console.log("Busy, retry in", e.retryAfter);
  else throw e;
}

SDK თავად იმეორებს 429-სა და 503-ს სამჯერ, როცა სერვერი Retry-After-ს აგზავნის. ყველაზე ხშირი 429 ჩნდება, როცა ერთ ანგარიშზე ერთდროულად ორზე მეტი ბრძანება მუშაობს. ყველა კლასი SDK-ის ცნობარშია.

ამ გზამკვლევის ღირებულება

თითოეული მაგალითი რამდენიმე წამი არსებობდა და მინიმალური 60 წამით დაირიცხა: small-ზე $0.00055, standard-ზე $0.0011. ნაბიჯი 6-ის სამუშაო standard-ზე დაახლოებით 100 წამი მუშაობდა, დაახლოებით $0.002. ყველაფერი ერთად ერთ ცენტზე გაცილებით ნაკლებია. ფასების სრული სია sandbox-ის ლიმიტებსა და ბილინგშია.

შემდეგი ნაბიჯები

ხდკ

რომელ გარემოებს უჭერს მხარს @eqvps/sdk?

Node.js 18 და უფრო ახალს, Deno-სა და Bun-ს. დამოკიდებულებები არ აქვს და ჩაშენებულ fetch-ს იყენებს, ამიტომ ბრაუზერშიც მუშაობს, მაგრამ ანგარიშის ტოკენი ფრონტენდის კოდში არ ჩადოთ.

შეუძლია sandbox-ს Python-ის გაშვება, თუ ჩემი აპი TypeScript-ზეა?

დიახ. თქვენი აპის ენა და sandbox-ში კოდის ენა ერთმანეთისგან დამოუკიდებელია. run იღებს language მნიშვნელობად python-ს, node-ს ან bash-ს, ხოლო exec ნებისმიერ shell ბრძანებას ასრულებს.

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

გამოიყენეთ Sandbox.with(options, fn), რომელიც შლის sandbox-ს, როცა fn სრულდება ან შეცდომას აგდებს. TypeScript 5.2-სა და უფრო ახალში შეგიძლიათ დაწეროთ await using sb = await Sandbox.create().

რას აბრუნებს run, როცა კოდი ვერ სრულდება?

ExecResult-ს არანულოვანი exit_code-ით და შეცდომით stderr-ში. არაფერი იგდება. გამონაკლისები მხოლოდ API-ის შეცდომებზეა, მაგალითად არასწორ ტოკენზე ან ცარიელ ბალანსზე.

კომენტარები

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

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

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