بيئات الاختبار
أجهزة 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.
وضعان
الباقات
| الباقة | vCPU | RAM | القرص | الشبكة | بالساعة | دائمة، الحد الأقصى شهريًا |
|---|---|---|---|---|---|---|
| micro | 0.25 | 512 MB | 3 GB | 50 Mbit/s | $0.0165 | $9.03 |
| small | 0.5 | 1 GB | 5 GB | 100 Mbit/s | $0.033 | $18.07 |
| standard | 1 | 2 GB | 10 GB | 200 Mbit/s | $0.066 | $36.14 |
| plus | 2 | 4 GB | 15 GB | 300 Mbit/s | $0.132 | $72.27 |
| pro | 4 | 8 GB | 20 GB | 400 Mbit/s | $0.264 | $144.54 |
| max | 8 | 16 GB | 40 GB | 500 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 (طريقة الحصول عليه في «ربط حسابك»).
# 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']}")// 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، وتحذفان البيئة دائمًا عند انتهاء الكتلة. التثبيت ومثال:
# 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// 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
التعليقات
لا تعليقات بعد. كن الأول.