−25%

yıllık Windows ödemesinde, 31 Ekim'e kadar. Paketlere git

EQVPS
Hemen başla

Sandbox'ta ilk ajan göreviniz: bir LLM kodu yazar, bir microVM çalıştırır

Yapay zekâyla kod çalıştırmanın en küçük işe yarar döngüsünü kurun: bir model Python betiği yazar, bir Firecracker sandbox onu çalıştırır, hatalar betik çalışana kadar modele geri döner. Yaklaşık 40 satır, artı hiç kod yazmadan MCP üzerinden aynı görev.

Kod yazan bir ajan, ancak bir şey o kodu güvenle çalıştırıp sonucu bildirirse işe yarar. Bu rehber o döngüyü baştan sona kurar: bir model Python betiği yazar, bir sandbox onu çalıştırır, betik başarısız olursa hata modele geri gider. Ardından aynı görevi hiç kod yazmadan, MCP üzerinden yaparız.

Python 3.8+, bir EQVPS hesap token'ı (hesabınızı bağlama sayfasına bakın) ve bir model için API anahtarı gerekir.

1. Önce harcama limiti koyun

Ajan sandbox'ları kendi başına oluşturur; bu yüzden başlamadan önce ona bir tavan verin. Günde iki, ayda yirmi dolar denemeler için fazlasıyla yeterlidir:

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}'

Bir limite ulaşıldığında yeni sandbox'lar 429 budget_exceeded alır ve çalışan geçici sandbox'lar silinir. Ayrıntılar sandbox sınırları ve faturalama sayfasındadır.

2. İki kütüphaneyi kurun

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

Örnek tek bir model sağlayıcısı kullanır, ancak hiçbir şey ona bağlı değildir. Modelle yalnızca ask() fonksiyonu konuşur.

3. Yaz, çalıştır, düzelt döngüsü

Bunu agent.py olarak kaydedin:

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."},
        ]

Çalıştırın:

python3 agent.py

Tipik bir çalıştırma önce attempt 1: exit code 0, sonra 78498 yazdırır. İlk betik başarısız olursa hatası düzeltilmiş ikinci denemeyi görürsünüz.

Her parçanın yaptığı iş:

  • Sandbox.create(..., idle_timeout=120) yaklaşık bir saniyede bir microVM başlatır. Betiğiniz yarıda ölse bile sandbox 2 dakikalık hareketsizlikten sonra kendini yine siler.
  • sb.run(code, timeout=55) kodu çalıştırır ve çıkış kodunu, stdout ve stderr'i döndürür. Koddaki bir çökme istisna değil, normal bir sonuçtur; bu yüzden döngü onu modele gösterebilir.
  • r.stderr[-3000:] hatanın yalnızca sonunu gönderir. Büyük bir betiğin tam traceback'i modelin bağlamının büyük kısmını boşa harcayabilir.
  • Üç deneme bilinçli bir sınırdır. Bir betiği üç denemede düzeltemeyen bir modelin genellikle dördüncü denemeye değil, daha iyi bir görev tanımına ihtiyacı vardır.

4. Görev 55 saniyeden fazla sürdüğünde

Eşzamanlı bir çağrı en fazla 55 saniye sürebilir. Daha uzun işleri arka planda başlatıp bekleyin:

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

wait zaman aşımına uğrasa bile görev çalışmaya devam eder ve ona sb.task(task_id) ile yeniden bağlanabilirsiniz.

5. Aynı görev MCP üzerinden, kodsuz

Claude Desktop veya Cursor gibi bir MCP istemcisini EQVPS MCP sunucusuyla kullanıyorsanız ajanın sandbox araçları zaten vardır: create_sandbox, run_code, exec_command, upload_file, download_file ve kill_sandbox. Bir istem yeterlidir:

Küçük bir geçici sandbox oluştur. 1.000.000'dan küçük asal sayıları sayan bir Python betiği yaz, orada çalıştır, başarısız olursa düzelt, bana sonucu söyle ve sandbox'ı sil.

Ajan yukarıdaki betikle aynı çağrıları yapar. Hangi araçlara onay olmadan izin verilebileceği MCP güvenlik önlemleri sayfasında anlatılır.

Maliyeti

Sandbox bir dakikadan çok daha kısa yaşadı ve 60 saniyelik asgari süre üzerinden faturalandı: small tarifesinde 0,00055 $. Model çağrısı sandbox'tan daha pahalıdır. Yeni bir hesabın 1 $'lık deneme kredisi bunun gibi yaklaşık 1.800 çalıştırmayı karşılar.

Buradan sonra

SSS

Modelin kodunu neden doğrudan kendi makinemde çalıştırmayayım?

Çünkü ne yapacağını bilmezsiniz. Üretilen kod dosyaları silebilir, anahtarlarınızı okuyabilir ya da sonsuz döngüye girebilir. Sandbox'ta kendi çekirdeğine sahip ayrı bir microVM'de çalışır ve ardından sandbox silinir.

Örnektekinden başka modellerle de çalışır mı?

Evet. Döngünün tek ihtiyacı, mesajları alıp metin döndüren bir fonksiyondur. ask() fonksiyonunu yerel bir model dahil herhangi bir sohbet API'siyle değiştirin.

Bir ajanın sonsuza kadar sandbox oluşturmasını ne engeller?

Başlamadan önce günlük ve aylık bir harcama limiti belirleyin. Limite ulaşıldığında yeni sandbox'lar 429 budget_exceeded ile reddedilir. Ayrıca bir hesapta aynı anda yalnızca iki komut çalışır; bu yüzden kontrolden çıkmış bir döngü çoğalamaz.

Üretilen kod internete erişebilir mi?

Evet, sandbox'ların internete çıkışı vardır; böylece kod paket kurabilir ve veri indirebilir. Gelen portları yoktur. İstem ya da kod içine sır koymayın; bir betiğin gerçekten ihtiyaç duyduklarını ortam değişkeni olarak verin.

Yorumlar

Henüz yorum yok. İlk olun.

Bir yorum bırakın

Yorumlar görünmeden önce denetlenir.