−25%

على الدفع السنوي لـ Windows حتى 31 أكتوبر. عرض الخطط

EQVPS
ابدأ الآن

مرجع API صناديق الرمل: SDK لـ Python و TypeScript

كل دوال SDK صناديق الرمل من EQVPS في صفحة واحدة: المعاملات والقيم الافتراضية وما يُعاد، وكل فئات الأخطاء الإحدى عشرة، مع المثال نفسه بلغتي 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() تُعيد ثواني التشغيل وثواني المعالج المستهلكة والبايتات الصادرة والسعر بالساعة و 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 سببها حدّان: الحساب ينفّذ أمرين في الوقت نفسه ويحتفظ بـ 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. المفتاح هو رمز (token) عادي لحساب 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، مثل الرصيد الفارغ أو رمز غير صالح.

كيف أضمن حذف صندوق الرمل إذا تعطّل الكود؟

استخدم الصيغة ذات النطاق: with Sandbox.create() as sb في Python، و Sandbox.with(options, fn) أو await using في TypeScript. يُحذف الصندوق عند انتهاء الكتلة، حتى بعد حدوث استثناء.

التعليقات

لا تعليقات بعد. كن الأول.

اترك تعليقًا

تُراجَع التعليقات قبل ظهورها.