यह गाइड JavaScript या TypeScript से सैंडबॉक्स चलाती है। आप एक अलग-थलग Firecracker microVM चालू करेंगे, तीन भाषाओं में कोड चलाएँगे, फ़ाइलें भेजेंगे और लंबे काम का आउटपुट देखेंगे। हर स्टेप एक छोटा कोड का टुकड़ा है।
आपको Node.js 18+ (या Deno, या Bun) और एक EQVPS अकाउंट चाहिए।
1. टोकन लें
SDK सामान्य अकाउंट टोकन से ऑथेंटिकेट करता है। इसे डैशबोर्ड, API या MCP सर्वर से कैसे पाएँ, यह अकाउंट जोड़ना पेज पर है।
export EQVPS_API_KEY="your-token"
बिना बैलेंस वाला नया अकाउंट जब पहली बार सैंडबॉक्स बनाता है, तो उसे $1 सैंडबॉक्स क्रेडिट मिलता है। यह इस गाइड के लिए कई बार काफ़ी है।
2. SDK इंस्टॉल करें
npm i @eqvps/sdk
उदाहरण ES मॉड्यूल और टॉप-लेवल await इस्तेमाल करते हैं। इन्हें .mjs फ़ाइलों के रूप में सेव करें, या .ts के रूप में सेव करके npx tsx से चलाएँ।
3. सैंडबॉक्स चालू करें और कोड चलाएँ
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_ और 24 और अक्षर) है, फिर 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 हो और कमांड टाइमआउट तक न पहुँची हो।
4. 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);
});
एक सिंक्रोनस कॉल ज़्यादा से ज़्यादा 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;
}
सर्वर Retry-After भेजे तो SDK खुद 429 और 503 को तीन बार तक दोबारा आज़माता है। सबसे आम 429 तब आता है जब एक अकाउंट पर एक साथ दो से ज़्यादा कमांड चलती हैं। सभी क्लास SDK संदर्भ में हैं।
इस गाइड का खर्च
हर उदाहरण कुछ सेकंड चला और न्यूनतम 60 सेकंड के हिसाब से बिल हुआ: small पर $0.00055, standard पर $0.0011। स्टेप 6 का काम standard पर लगभग 100 सेकंड चला, करीब $0.002। सब मिलाकर एक सेंट से बहुत कम। पूरी कीमत सूची सैंडबॉक्स की सीमाएँ और बिलिंग में है।
आगे क्या
- यही Python में: 5 मिनट में सैंडबॉक्स के लिए Python SDK।
- एक मॉडल जोड़ें और उसे अपना कोड खुद चलाने दें: सैंडबॉक्स में आपका पहला एजेंट टास्क।
- टैरिफ़ और $1 का ट्रायल: सैंडबॉक्स पेज।
टिप्पणियाँ
अभी तक कोई टिप्पणी नहीं। पहले बनें।