−25%

روی پرداخت سالانه Windows، تا ۳۱ اکتبر. مشاهده پلن‌ها

EQVPS
شروع کنید

اولین کار عامل در سندباکس: مدل زبانی کد می‌نویسد، microVM اجرایش می‌کند

کوچک‌ترین حلقهٔ مفید اجرای کد با هوش مصنوعی را بسازید: مدل یک اسکریپت پایتون می‌نویسد، سندباکس Firecracker اجرایش می‌کند و خطاها تا وقتی اسکریپت کار کند به مدل برمی‌گردند. حدود ۴۰ خط، به‌علاوهٔ همین کار از طریق MCP بدون هیچ کدی.

عاملی که کد می‌نویسد فقط وقتی به کار می‌آید که چیزی آن کد را امن اجرا کند و نتیجه را گزارش دهد. این راهنما آن حلقه را از ابتدا تا انتها می‌سازد: مدل یک اسکریپت پایتون می‌نویسد، سندباکس آن را اجرا می‌کند و اگر شکست خورد، خطا به مدل برمی‌گردد. سپس همین کار بدون حتی یک خط کد، از طریق MCP.

به پایتون ۳٫۸+‎، توکن حساب EQVPS (نگاه کنید به اتصال حساب) و کلید API یک مدل نیاز دارید.

۱. اول سقف هزینه بگذارید

عامل خودش سندباکس می‌سازد، پس پیش از شروع برایش سقف تعیین کنید. روزی دو دلار و ماهی بیست دلار برای آزمایش بیش از کافی است:

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 می‌گیرند و سندباکس‌های موقتِ در حال اجرا حذف می‌شوند. جزئیات در محدودیت‌ها و صورتحساب سندباکس است.

۲. دو کتابخانه را نصب کنید

pip install eqvps anthropic
export EQVPS_API_KEY="your-eqvps-token"
export ANTHROPIC_API_KEY="your-model-key"

مثال از یک ارائه‌دهندهٔ مدل استفاده می‌کند، اما هیچ چیز به آن وابسته نیست. فقط تابع ask() با مدل حرف می‌زند.

۳. حلقهٔ بنویس، اجرا کن، اصلاح کن

این را با نام 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:] فقط انتهای خطا را می‌فرستد. traceback کامل یک اسکریپت بزرگ می‌تواند بخش زیادی از بافت مدل را هدر دهد.
  • سه تلاش یک محدودیت عمدی است. مدلی که در سه بار اسکریپت را درست نکرده، معمولاً به توصیف بهتری از کار نیاز دارد، نه به تلاش چهارم.

۴. وقتی کار بیش از ۵۵ ثانیه لازم دارد

یک فراخوانی هم‌زمان حداکثر ۵۵ ثانیه طول می‌کشد. کار طولانی‌تر را در پس‌زمینه شروع کنید و منتظر بمانید:

task = sb.run(code, background=True)
result = task.wait(timeout=1800)

حتی اگر wait شما به مهلتش برسد، کار ادامه پیدا می‌کند و می‌توانید با sb.task(task_id) دوباره سراغش بروید.

۵. همین کار از طریق MCP، بدون کد

اگر از یک کلاینت MCP مثل Claude Desktop یا Cursor با سرور MCP ‏EQVPS استفاده می‌کنید، عامل از قبل ابزارهای سندباکس را دارد: create_sandbox، run_code، exec_command، upload_file، download_file و kill_sandbox. یک پرامپت کافی است:

یک سندباکس موقت کوچک بساز. یک اسکریپت پایتون بنویس که اعداد اول کمتر از 1,000,000 را بشمارد، آنجا اجرایش کن، اگر شکست خورد اصلاحش کن، نتیجه را به من بگو و سندباکس را حذف کن.

عامل همان فراخوانی‌هایی را انجام می‌دهد که اسکریپت بالا. اینکه کدام ابزارها را می‌توان بدون تأیید مجاز کرد، در محافظ‌های MCP آمده است.

چقدر هزینه شد

سندباکس خیلی کمتر از یک دقیقه زنده بود و با حداقل ۶۰ ثانیه حساب شد: 0.00055 دلار روی small. فراخوانی مدل گران‌تر از سندباکس است. اعتبار آزمایشی ۱ دلاری حساب تازه برای حدود ۱٬۸۰۰ اجرای این‌چنینی کافی است.

قدم بعدی

پرسش‌های متداول

چرا کد مدل را مستقیم روی ماشین خودم اجرا نکنم؟

چون نمی‌دانید چه کاری می‌کند. کد تولیدشده ممکن است فایل پاک کند، کلیدهای شما را بخواند یا در حلقهٔ بی‌پایان بیفتد. در سندباکس، در یک microVM جدا با هستهٔ خودش اجرا می‌شود و بعد سندباکس حذف می‌شود.

با مدل‌هایی جز مدل مثال هم کار می‌کند؟

بله. حلقه فقط به تابعی نیاز دارد که پیام بگیرد و متن برگرداند. تابع ask() را با هر API گفت‌وگو، از جمله یک مدل محلی، عوض کنید.

چه چیزی عامل را از ساختن بی‌پایان سندباکس بازمی‌دارد؟

پیش از شروع، سقف هزینهٔ روزانه و ماهانه تعیین کنید. با رسیدن به سقف، سندباکس‌های تازه با خطای 429 budget_exceeded رد می‌شوند. افزون بر این، روی هر حساب فقط دو دستور هم‌زمان اجرا می‌شود، پس حلقهٔ افسارگسیخته نمی‌تواند تکثیر شود.

کد تولیدشده به اینترنت دسترسی دارد؟

بله، سندباکس‌ها به اینترنت بیرونی دسترسی دارند تا کد بتواند بسته نصب کند و داده بگیرد. پورت ورودی ندارند. راز را در پرامپت یا کد نگذارید؛ آنچه اسکریپت واقعاً لازم دارد را به شکل متغیر محیطی بدهید.

نظرات

هنوز نظری نیست. اولین نفر باشید.

یک نظر بگذارید

نظرات پیش از نمایش بررسی می‌شوند.