এই গাইড JavaScript বা TypeScript থেকে একটি স্যান্ডবক্স চালায়। আপনি একটি বিচ্ছিন্ন Firecracker microVM চালু করবেন, তিনটি ভাষায় কোড চালাবেন, ফাইল আনা-নেওয়া করবেন এবং লম্বা কাজের আউটপুট দেখবেন। প্রতিটি ধাপ একটি ছোট কোডের অংশ।
আপনার লাগবে Node.js 18+ (বা Deno, বা Bun) এবং একটি EQVPS অ্যাকাউন্ট।
১. টোকেন নিন
SDK সাধারণ অ্যাকাউন্ট টোকেন দিয়ে প্রমাণীকরণ করে। ড্যাশবোর্ড, API বা MCP সার্ভার থেকে কীভাবে টোকেন পাবেন, তা আছে অ্যাকাউন্ট সংযোগ পাতায়।
export EQVPS_API_KEY="your-token"
ব্যালেন্সহীন নতুন অ্যাকাউন্ট প্রথমবার স্যান্ডবক্স তৈরি করলে $1 স্যান্ডবক্স ক্রেডিট পায়। এই গাইড বহুবার চালানোর জন্য এটুকুই যথেষ্ট।
২. SDK ইনস্টল করুন
npm i @eqvps/sdk
উদাহরণগুলোতে ES মডিউল ও টপ-লেভেল await ব্যবহার করা হয়েছে। এগুলো .mjs ফাইল হিসেবে সেভ করুন, অথবা .ts হিসেবে সেভ করে npx tsx দিয়ে চালান।
৩. স্যান্ডবক্স চালু করুন এবং কোড চালান
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);
});
আউটপুট হলো স্যান্ডবক্সের id (sb_ আর আরও ২৪টি অক্ষর), তারপর 0 3.12.x। callback শেষ হলে Sandbox.with স্যান্ডবক্স মুছে দেয়, ত্রুটি ছুড়লেও।
ডিফল্ট ভাষা 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 এবং কমান্ড টাইমআউটে পৌঁছায়নি।
৪. shell কমান্ড ও প্যাকেজ
exec একটি shell স্ট্রিং বা argv অ্যারে নেয়। স্যান্ডবক্স ইন্টারনেটে যেতে পারে, তাই 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);
});
একটি সিনক্রোনাস কল সর্বোচ্চ ৫৫ সেকেন্ড চলে। এর চেয়ে লম্বা কিছু ব্যাকগ্রাউন্ড টাস্কে যায় (ধাপ ৬)।
৫. ফাইল
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 পর্যন্ত।
৬. লাইভ আউটপুটসহ লম্বা কাজ
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
});
টাস্ক সঙ্গে সঙ্গে ফিরে আসে এবং এতে ৫৫ সেকেন্ডের সীমা নেই। wait ডিফল্টভাবে প্রতি ২ সেকেন্ডে খোঁজ নেয় (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;
}
সার্ভার Retry-After পাঠালে SDK নিজেই 429 ও 503 তিনবার পর্যন্ত আবার চেষ্টা করে। সবচেয়ে সাধারণ 429 আসে একটি অ্যাকাউন্টে একসঙ্গে দুটির বেশি কমান্ড চালালে। সব ক্লাস আছে SDK রেফারেন্স-এ।
এই গাইডের খরচ
প্রতিটি উদাহরণ কয়েক সেকেন্ড ছিল এবং সর্বনিম্ন ৬০ সেকেন্ড হিসেবে বিল হয়েছে: small-এ $0.00055, standard-এ $0.0011। ধাপ ৬-এর কাজ standard-এ প্রায় ১০০ সেকেন্ড চলেছে, মোটামুটি $0.002। সব মিলিয়ে এক সেন্টের অনেক নিচে। পুরো দামের তালিকা আছে স্যান্ডবক্সের সীমা ও বিলিং-এ।
এরপর কী
- একই জিনিস Python-এ: ৫ মিনিটে স্যান্ডবক্সের Python SDK।
- একটি মডেল যুক্ত করুন এবং তাকে নিজের কোড চালাতে দিন: স্যান্ডবক্সে আপনার প্রথম এজেন্ট টাস্ক।
- ট্যারিফ আর $1-এর ট্রায়াল: স্যান্ডবক্স পাতা।
মন্তব্য
এখনো কোনো মন্তব্য নেই। প্রথম হোন।