−25%

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

EQVPS
ابدأ الآن

بيئات الاختبار

أجهزة Linux افتراضية صغيرة ومعزولة للكود الذي تشغّله سكربتاتك ووكلاء الذكاء الاصطناعي. تبدأ البيئة خلال ثانية تقريبًا، وتشغّل Python أو Node.js أو bash، وتُحتسب بالثانية من الرصيد نفسه الذي تدفع منه لخوادمك.

ما هي بيئة الاختبار

جهاز Linux صغير تنشئه عبر الواجهة البرمجية (API) أو MCP، وتستخدمه بضع ثوانٍ أو بضعة أيام ثم تحذفه. الإنترنت الصادر يعمل (pip install وnpm install وgit clone). لا توجد منافذ واردة ولا SSH: الأوامر والملفات تمرّ عبر الواجهة البرمجية. في الداخل: Python 3.12 مع pip وNode.js 22 مع npm وbash وgit وcurl.

وضعان

مؤقتة (الافتراضي) — لمهمة واحدة. تُحذف عند استدعاء delete، أو بعد مهلة الخمول (5 دقائق افتراضيًا وحتى ساعة)، أو عند انتهاء TTL (حتى 24 ساعة). تُحتسب بالثانية، بحد أدنى 60 ثانية.
دائمة — تحتفظ بقرصها وحالتها حتى 30 يومًا. تُحتسب عن كل ساعة تبدأ، ولا يكلّف الشهر التقويمي أبدًا أكثر من 730 ساعة ناقص 25%. إذا نفد الرصيد تُوقف مؤقتًا في لقطة (دون رسوم) وتستأنف بعد الشحن؛ تُحفظ اللقطات الموقوفة 14 يومًا.

الباقات

الباقةvCPURAMالقرصالشبكةبالساعةدائمة، الحد الأقصى شهريًا
micro0.25512 MB3 GB50 Mbit/s$0.0165$9.03
small0.51 GB5 GB100 Mbit/s$0.033$18.07
standard12 GB10 GB200 Mbit/s$0.066$36.14
plus24 GB15 GB300 Mbit/s$0.132$72.27
pro48 GB20 GB400 Mbit/s$0.264$144.54
max816 GB40 GB500 Mbit/s$0.528$289.08

تدفع مقابل vCPU وذاكرة RAM للباقة التي تختارها: ‎$0.040 لكل ساعة vCPU و‎$0.013 لكل GiB في الساعة. الأسعار الحالية دون رمز: GET /sandboxes/tariffs.

حدود تستحق المعرفة

يعمل الأمر الواحد حتى 55 ثانية؛ المهام الأطول تعمل في الخلفية وتستعلم أنت عن نتيجتها. الملفات حتى 5 ميغابايت لكل طلب، والأكبر (حتى 2 غيغابايت) عبر روابط تنزيل ورفع لمرة واحدة. يمكن للحساب تشغيل حتى 20 بيئة وأمرين في الوقت نفسه.

متغيرات البيئة

مرّر الأسرار والإعدادات عبر env. إذا حُدِّدت عند الإنشاء فإنها تسري على كل أمر في بيئة الاختبار؛ وإذا حُدِّدت في exec أو run فإنها تسري على ذلك الاستدعاء فقط وتتجاوز قيم البيئة. حتى 64 متغيرًا، و32 كيلوبايت لكل قيمة، و64 كيلوبايت إجمالًا. تُخزَّن القيم مشفّرة، ولا يعيدها API أبدًا، ولا تُكتب في السجلات: تعرض الاستجابات الأسماء فقط (env_keys).

API=https://api.eqvps.com/api/v1/eqvps
AUTH="Authorization: Bearer $EQVPS_API_KEY"

# env for the whole sandbox (only the names come back, as env_keys)
SB=$(curl -s -X POST $API/sandboxes -H "$AUTH" -H "Content-Type: application/json" \
  -d '{"tariff":"small","env":{"DB_URL":"postgres://user:pass@db/app","MODE":"test"}}' | jq -r .id)

# env for one call, merged over the sandbox env
curl -s -X POST $API/sandboxes/$SB/exec -H "$AUTH" -H "Content-Type: application/json" \
  -d '{"command":"echo $MODE $RUN_ID","env":{"RUN_ID":"42"}}'

حد الإنفاق

افتراضيًا لا يوجد حد لإنفاق بيئات الاختبار. يمكنك تحديد سقف يومي وشهري من لوحة التحكم أو عبر PUT /sandboxes/budget. عند بلوغ السقف تتلقى البيئات الجديدة الرمز 429 budget_exceeded، وتُحذف المؤقتة العاملة، وتُوقف الدائمة مؤقتًا مع الاحتفاظ بقرصها. وتستأنف عملها عندما ترفع السقف أو يبدأ يوم أو شهر جديد (UTC).

# daily cap $5, monthly cap $50 (null = no cap)
curl -s -X PUT $API/sandboxes/budget -H "$AUTH" -H "Content-Type: application/json" \
  -d '{"daily_usd":5,"monthly_usd":50}'

# spent today / this month and when the caps reset (UTC)
curl -s $API/sandboxes/budget -H "$AUTH"

بداية سريعة: MCP (Claude Code وCursor وعملاء آخرون)

اربط خادم MCP مرة واحدة، ثم اطلب من الوكيل ما تريد بكلماتك. أدوات بيئات الاختبار: create_sandbox وrun_code وexec_command وget_task وkill_task وget_upload_url وget_download_url وlist_sandboxes وget_sandbox وkill_sandbox وsandbox_pricing.

claude mcp add --transport http eqvps https://mcp.eqvps.com/mcp \
  --header "Authorization: Bearer $EQVPS_API_KEY"
أنشئ بيئة اختبار صغيرة، وشغّل print(2 + 2) بلغة Python، وأرني الناتج، ثم احذف البيئة.

بداية سريعة: REST من Python وNode.js

لا حاجة إلى حزم إضافية. ضع رمزك في متغير البيئة EQVPS_API_KEY (طريقة الحصول عليه في «ربط حسابك»).

Python
# first_sandbox.py — Python 3.8+, standard library only
import json, os, urllib.request

API = "https://api.eqvps.com/api/v1/eqvps"
KEY = os.environ["EQVPS_API_KEY"]

def call(method, path, body=None):
    req = urllib.request.Request(API + path, method=method,
        data=json.dumps(body).encode() if body is not None else None,
        headers={"Authorization": "Bearer " + KEY,
                 "Content-Type": "application/json", "Accept": "application/json"})
    with urllib.request.urlopen(req, timeout=90) as r:   # HTTPError on 401/402/…
        return json.loads(r.read() or b"{}")

sb = call("POST", "/sandboxes", {"tariff": "small"})
try:
    r = call("POST", f"/sandboxes/{sb['id']}/run",
             {"language": "python", "code": "print(2 + 2)"})
    print(r["exit_code"], r["stdout"])                    # 0 4
finally:
    call("DELETE", f"/sandboxes/{sb['id']}")
Node.js
// first_sandbox.mjs — Node.js 18+ (built-in fetch), run: node first_sandbox.mjs
const API = "https://api.eqvps.com/api/v1/eqvps";
const KEY = process.env.EQVPS_API_KEY;

async function call(method, path, body) {
  const r = await fetch(API + path, {
    method,
    headers: { Authorization: `Bearer ${KEY}`, "Content-Type": "application/json", Accept: "application/json" },
    body: body ? JSON.stringify(body) : undefined,
  });
  const data = await r.json();
  if (!r.ok) throw new Error(`${r.status} ${data.error ?? ""} ${data.message ?? ""}`);
  return data;
}

const sb = await call("POST", "/sandboxes", { tariff: "small" });
try {
  const r = await call("POST", `/sandboxes/${sb.id}/run`, { language: "node", code: "console.log(2 + 2)" });
  console.log(r.exit_code, r.stdout); // 0 4
} finally {
  await call("DELETE", `/sandboxes/${sb.id}`);
}

SDK لـ Python وTypeScript

تفضّل مكتبة؟ تقوم حزمتا Python وTypeScript بالاستدعاءات نفسها عبر REST، وتعيدان المحاولة تلقائيًا عند 429 و503، وتحذفان البيئة دائمًا عند انتهاء الكتلة. التثبيت ومثال:

Python · eqvps
# pip install -U eqvps       https://pypi.org/project/eqvps/  (0.2.0+ for env)
# "eqvps sandbox create" = Sandbox.create() here · create_sandbox in MCP · POST /sandboxes in REST (no CLI)
from eqvps import Sandbox

# EQVPS_API_KEY from the environment; env = secrets for your code, stored encrypted
with Sandbox.create(tariff="small", env={"DB_URL": "postgres://user:pass@db/app"}) as sb:
    r = sb.run("print(2 + 2)")
    print(r.stdout, r.exit_code)             # "4\n" 0
    sb.upload("/root/data.csv", "a,b\n1,2\n")
    print(sb.exec("wc -l /root/data.csv").stdout)
    print(sb.exec("echo $RUN_ID", env={"RUN_ID": "42"}).stdout)   # env for one call
# the sandbox is deleted when the block exits, also on errors
TypeScript · @eqvps/sdk
// npm i @eqvps/sdk@latest   https://www.npmjs.com/package/@eqvps/sdk  (0.2.0+ for env)
import { Sandbox } from "@eqvps/sdk";

// EQVPS_API_KEY from the environment; env = secrets for your code, stored encrypted
await Sandbox.with({ tariff: "small", env: { DB_URL: "postgres://user:pass@db/app" } }, async (sb) => {
  const r = await sb.run("print(2 + 2)");
  console.log(r.stdout, r.exit_code);                    // "4\n" 0
  console.log((await sb.exec("echo $RUN_ID", { env: { RUN_ID: "42" } })).stdout); // env for one call
});                                                       // deleted afterwards, also on errors

ربط حسابك: الرمز والإعداد وأول بيئة والرصيد ←

التعليقات

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

اترك تعليقًا

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