−25%

על Windows בתשלום שנתי, עד 31.10. לחבילות

EQVPS
התחלה

מדריך API לארגזי חול: SDK ל־Python ול־TypeScript

כל המתודות של SDK ארגזי החול של EQVPS בעמוד אחד: פרמטרים, ערכי ברירת מחדל, ערכי החזרה וכל 11 מחלקות השגיאה, עם אותה דוגמה ב־Python וב־TypeScript.

נבדק לאחרונה: 2026-10-10 · SDK 0.2.0 (PyPI eqvps, npm @eqvps/sdk)

ה־SDK הוא שכבה דקה מעל ה־REST API של ארגזי החול. הוא חוסך לכם שלושה דברים: לבנות בקשות ביד, לנסות אותן שוב כשהפלטפורמה עמוסה, ולשכוח למחוק ארגז חול כשהקוד זורק חריגה. כל מה שכאן מתאים לגרסה 0.2.0 של שתי החבילות.

אם מעולם לא יצרתם ארגז חול, מדריך החיבור ב־5 דקות ייתן לכם קודם טוקן. מה זה ארגז חול ומה יש בתוכו מוסבר בארגזי חול.

התקנה והגדרה

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

אותה תוכנית בשתי השפות: יוצרים ארגז חול, מריצים קוד, מוחקים.

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.create(...) מפעילה ארגז חול, בדרך כלל תוך כשנייה. ב־Python היא מקבלת ארגומנטים בשם, וב־TypeScript אובייקט אפשרויות אחד.

PythonTypeScriptברירת מחדלמשמעות
modemode"ephemeral""ephemeral" (לפי שנייה) או "persistent" (לפי שעה שהתחילה, שומר את הדיסק)
tarifftariff"small"micro, small, standard, plus, pro, max
idle_timeoutidleTimeout300שניות ללא פעילות לפני שארגז זמני נמחק, עד 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.list() מחזירה את כל ארגזי החול בחשבון, הפעילים והמושהים.

מאפיינים: id (‏sb_ + ‏24 תווים הקסדצימליים), mode, tariff, state (‏running, starting, paused, pausing, resuming, deleting, deleted), env_keys / envKeys (רק שמות, הערכים לעולם לא חוזרים) ו־info (האובייקט הגולמי). ‏refresh() טוענת אותם מחדש.

המתודה kill() מוחקת את ארגז החול ועוצרת את החיוב. קריאה לה עבור ארגז שכבר נמחק אינה שגיאה.

הרצת קוד

המתודה 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) מריצה פקודת מעטפת: מחרוזת עוברת דרך bash -lc, ורשימה מורצת כ־argv בלי מעטפת.

שתיהן מחזירות ExecResult:

שדהמשמעות
exit_codeקוד היציאה של התהליך
stdout, stderrפלט, עד 1 MiB לכל זרם
timed_outהפקודה הגיעה לזמן הקצוב שלה
truncatedהפלט נחתך
duration_msכמה זמן רצה
okexit_code == 0 ובלי חריגת זמן

קריאה סינכרונית רצה 55 שניות לכל היותר. שתי המתודות מקבלות גם env לקריאה הזו בלבד, והוא גובר על הערכים שהוגדרו ביצירה.

עבודות ארוכות: משימות רקע

העבירו background=True (ב־TypeScript: ‏{ background: true }) ותקבלו מיד Task. אין לה מגבלת 55 שניות, והיא יכולה לרוץ עד סוף חייו של ארגז החול. עד 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, אבל המשימה ממשיכה לרוץ. משימה פעילה גם מונעת מחיקה של ארגז זמני בגלל חוסר פעילות.

קבצים וצריכה

המתודה upload(path, content, mode=None) כותבת קובץ בנתיב מוחלט ומחזירה את גודלו. ‏download(path) מחזירה בתים, ו־download_text(path) / downloadText(path) מחרוזת. העברה אחת מוגבלת ל־5 MB.

המתודה usage() מחזירה שניות ריצה, שניות CPU שנצרכו, בתים יוצאים, מחיר לשעה, billed_usd ו־estimated_total_usd. ‏tariffs() היא פונקציה רגילה שלא צריכה מפתח, ומחזירה את המחירים והמגבלות העדכניים. כללי החיוב נמצאים במגבלות וחיוב של ארגזי חול.

שגיאות

כל שגיאת API היא תת־מחלקה של EqvpsError עם status (‏HTTP), ‏code (מחרוזת קבועה) ו־body. ‏retry_after / retryAfter מתמלא כשהשרת שולח אותו.

מחלקהHTTPcode נפוץמה לעשות
AuthenticationError401unauthenticatedלבדוק את הטוקן
InsufficientBalanceError402insufficient_balanceלהטעין את היתרה
NotFoundError404not_foundמזהה שגוי או קובץ שלא קיים
SandboxPausedError409sandbox_pausedמושהה כי היתרה נגמרה; ממשיך אחרי טעינה
SandboxDeletedError410sandbox_deletedנמחק לצמיתות
FileTooLargeError413file_too_largeלשמור העברות מתחת ל־5 MB
ValidationError422invalid_requestלתקן את הפרמטרים
RateLimitError429too_many_concurrent, too_many_tasks, rate_limitedלהמתין ולנסות שוב
BudgetExceededError429budget_exceededהגעתם למגבלת ההוצאה היומית או החודשית לארגזי חול
CapacityError503capacityלנסות שוב בעוד רגע או לבחור תעריף קטן יותר
SandboxTimeoutError—request_timeout, wait_timeoutהזמן נגמר לבקשת ה־HTTP (או ל־wait), לא לפקודה

רוב שגיאות ה־429 נובעות משתי מגבלות: חשבון מריץ 2 פקודות בו־זמנית ומחזיק עד 20 ארגזי חול. ה־SDK מנסה שוב כשהשרת אומר כמה לחכות; אחרי שלושה ניסיונות תקבלו את החריגה.

מתי לא צריך את ה־SDK

כל שפה עם לקוח HTTP יכולה לקרוא ל־API ישירות; נקודות הקצה מתוארות בקובץ OpenAPI בכתובת https://eqvps.com/openapi.json. סוכנים ב־Claude, ב־Cursor או בלקוחות MCP אחרים לא צריכים קוד בכלל: לשרת ה־MCP יש את אותם כלי ארגזי חול. ואם רק רוצים לראות איך זה עובד, בעמוד ארגזי החול יש את התעריפים ואת הניסיון ב־$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, כמו יתרה ריקה או טוקן לא תקין.

איך מוודאים שארגז החול יימחק אם הקוד קורס?

השתמשו בצורה עם תחום: ב־Python ‏with Sandbox.create() as sb, וב־TypeScript ‏Sandbox.with(options, fn) או await using. ארגז החול נמחק כשהבלוק מסתיים, גם אחרי חריגה.

תגובות

אין עדיין תגובות. היו הראשונים.

השאירו תגובה

התגובות עוברות מודרציה לפני שהן מופיעות.