الوكيل الذي يكتب الشيفرة لا يفيد إلا إذا وُجد ما ينفّذ تلك الشيفرة بأمان ويُبلغ بالنتيجة. يبني هذا الدليل تلك الحلقة من البداية إلى النهاية: نموذج يكتب سكربت Python، وصندوق رمل ينفّذه، وإن فشل يعود الخطأ إلى النموذج. ثم المهمة نفسها دون سطر شيفرة واحد، عبر MCP.
تحتاج إلى Python 3.8+، ورمز وصول لحساب EQVPS (راجع ربط الحساب)، ومفتاح API لنموذج ما.
1. اضبط حد الإنفاق أولًا
ينشئ الوكيل صناديق الرمل بنفسه، فضع له سقفًا قبل أن يبدأ. دولاران في اليوم وعشرون في الشهر تكفي للتجارب وتزيد:
curl -X PUT https://api.eqvps.com/api/v1/eqvps/sandboxes/budget \
-H "Authorization: Bearer $EQVPS_API_KEY" -H "Content-Type: application/json" \
-d '{"daily_usd": 2, "monthly_usd": 20}'
عند بلوغ الحد تتلقى صناديق الرمل الجديدة 429 budget_exceeded وتُحذف المؤقتة العاملة. التفاصيل في حدود صناديق الرمل وفوترتها.
2. ثبّت المكتبتين
pip install eqvps anthropic
export EQVPS_API_KEY="your-eqvps-token"
export ANTHROPIC_API_KEY="your-model-key"
يستخدم المثال مزوّد نماذج واحدًا، لكن لا شيء يعتمد عليه. وحدها الدالة ask() تتحدث مع النموذج.
3. حلقة اكتب ثم نفّذ ثم أصلح
احفظ هذا باسم agent.py:
import re
import anthropic
from eqvps import Sandbox
TASK = "Count the prime numbers below 1,000,000 and print only the number."
client = anthropic.Anthropic()
def ask(messages):
msg = client.messages.create(model="claude-sonnet-5", max_tokens=2000, messages=messages)
return msg.content[0].text
def extract_code(text):
m = re.search(r"`{3}(?:python)?\n(.*?)`{3}", text, re.S)
return m.group(1) if m else text
messages = [{"role": "user", "content": "Write a Python 3 script for this task. "
"Reply with a single code block and nothing else.\n\nTask: " + TASK}]
with Sandbox.create(tariff="small", idle_timeout=120) as sb:
for attempt in range(1, 4):
reply = ask(messages)
r = sb.run(extract_code(reply), timeout=55)
print(f"attempt {attempt}: exit code {r.exit_code}")
if r.ok:
print(r.stdout.strip())
break
messages += [
{"role": "assistant", "content": reply},
{"role": "user", "content": f"The script failed with exit code {r.exit_code}.\n"
f"stderr:\n{r.stderr[-3000:]}\nFix it. Reply with a single code block."},
]
شغّله:
python3 agent.py
عادةً يطبع التشغيل attempt 1: exit code 0 ثم 78498. وإن فشل السكربت الأول فسترى المحاولة الثانية وقد أُصلح الخطأ.
ما يفعله كل جزء:
Sandbox.create(..., idle_timeout=120)تشغّل آلة microVM في نحو ثانية. وإن توقف سكربتك في منتصفه، يحذف صندوق الرمل نفسه على أي حال بعد دقيقتين من الخمول.sb.run(code, timeout=55)تنفّذ الشيفرة وتُرجع رمز الخروج وstdout وstderr. تعطّل الشيفرة نتيجة عادية لا استثناء، فتستطيع الحلقة عرضه على النموذج.r.stderr[-3000:]ترسل نهاية الخطأ فقط. قد يهدر تتبّع الأخطاء الكامل لسكربت كبير جزءًا كبيرًا من سياق النموذج.- ثلاث محاولات حد مقصود. النموذج الذي لم يُصلح السكربت في ثلاث محاولات يحتاج عادةً إلى وصف أفضل للمهمة، لا إلى محاولة رابعة.
4. حين تحتاج المهمة إلى أكثر من 55 ثانية
يدوم الاستدعاء المتزامن 55 ثانية على الأكثر. شغّل العمل الأطول في الخلفية وانتظر:
task = sb.run(code, background=True)
result = task.wait(timeout=1800)
تستمر المهمة في العمل حتى لو بلغت wait مهلتها، ويمكنك العودة إليها بـ sb.task(task_id).
5. المهمة نفسها عبر MCP، دون شيفرة
إن كنت تستخدم عميل MCP مثل Claude Desktop أو Cursor مع خادم MCP من EQVPS، فلدى الوكيل أدوات صناديق الرمل مسبقًا: create_sandbox وrun_code وexec_command وupload_file وdownload_file وkill_sandbox. يكفي طلب واحد:
أنشئ صندوق رمل مؤقتًا صغيرًا. اكتب سكربت Python يعدّ الأعداد الأولية الأصغر من 1,000,000، ونفّذه هناك، وأصلحه إن فشل، وأخبرني بالنتيجة ثم احذف صندوق الرمل.
ينفّذ الوكيل الاستدعاءات نفسها التي ينفّذها السكربت أعلاه. أي الأدوات يمكن السماح بها دون تأكيد، تشرحه صفحة ضوابط MCP.
كم كلّف ذلك
عاش صندوق الرمل أقل بكثير من دقيقة وحُسب بالحد الأدنى البالغ 60 ثانية: 0.00055 دولار على small. استدعاء النموذج يكلّف أكثر من صندوق الرمل. يكفي الرصيد التجريبي البالغ دولارًا واحدًا للحساب الجديد لنحو 1,800 تشغيل كهذا.
إلى أين بعد ذلك
- الحزمة خطوة بخطوة: حزمة Python لصناديق الرمل في 5 دقائق أو TypeScript.
- كل الدوال والأخطاء: مرجع الحزمة.
- الخطط والرصيد التجريبي: صفحة صناديق الرمل.
التعليقات
لا تعليقات بعد. كن الأول.