−25%

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

EQVPS
ابدأ الآن

أول مهمة لوكيل في صندوق رمل: نموذج لغوي يكتب الشيفرة وآلة microVM تنفّذها

ابنِ أصغر حلقة مفيدة لتنفيذ الشيفرة بالذكاء الاصطناعي: نموذج يكتب سكربت Python، وصندوق رمل Firecracker ينفّذه، والأخطاء تعود إلى النموذج حتى يعمل السكربت. نحو 40 سطرًا، إضافةً إلى المهمة نفسها عبر MCP دون أي شيفرة.

الوكيل الذي يكتب الشيفرة لا يفيد إلا إذا وُجد ما ينفّذ تلك الشيفرة بأمان ويُبلغ بالنتيجة. يبني هذا الدليل تلك الحلقة من البداية إلى النهاية: نموذج يكتب سكربت 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 تشغيل كهذا.

إلى أين بعد ذلك

الأسئلة الشائعة

لماذا لا أشغّل شيفرة النموذج مباشرة على جهازي؟

لأنك لا تعرف ما الذي ستفعله. قد تحذف الشيفرة المولَّدة ملفات، أو تقرأ مفاتيحك، أو تدور في حلقة لا نهائية. في صندوق الرمل تعمل في آلة microVM منفصلة بنواتها الخاصة، ثم يُحذف صندوق الرمل.

هل يعمل هذا مع نماذج غير النموذج في المثال؟

نعم. لا تحتاج الحلقة إلا إلى دالة تستقبل الرسائل وتُرجع نصًا. استبدل الدالة ask() بأي واجهة محادثة برمجية، بما فيها نموذج محلي.

ما الذي يمنع الوكيل من إنشاء صناديق رمل بلا نهاية؟

اضبط حدًا يوميًا وشهريًا للإنفاق قبل البدء. عند بلوغه تُرفض صناديق الرمل الجديدة بالخطأ 429 budget_exceeded. كما لا يعمل على الحساب الواحد إلا أمران في الوقت نفسه، فلا تستطيع حلقة منفلتة أن تتكاثر.

هل تستطيع الشيفرة المولَّدة الوصول إلى الإنترنت؟

نعم، لصناديق الرمل اتصال صادر بالإنترنت حتى تثبّت الشيفرة الحزم وتجلب البيانات. ليس لها منافذ واردة. لا تضع أسرارًا في الطلب أو الشيفرة؛ ومرّر ما يحتاجه السكربت فعلًا كمتغيرات بيئة.

التعليقات

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

اترك تعليقًا

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