−25%

untuk Windows tahunan, hingga 31 Okt. Lihat paket

EQVPS
Mulai

Tugas agen pertama Anda di sandbox: LLM menulis kode, microVM menjalankannya

Bangun loop eksekusi kode AI terkecil yang berguna: model menulis skrip Python, sandbox Firecracker menjalankannya, error kembali ke model sampai skripnya berhasil. Sekitar 40 baris, ditambah tugas yang sama lewat MCP tanpa kode sama sekali.

Agen yang menulis kode hanya berguna jika ada yang menjalankan kode itu dengan aman dan melaporkan hasilnya. Panduan ini membangun loop tersebut dari awal sampai akhir: model menulis skrip Python, sandbox menjalankannya, dan jika gagal, error dikembalikan ke model. Lalu tugas yang sama tanpa menulis kode, lewat MCP.

Anda butuh Python 3.8+, token akun EQVPS (lihat menghubungkan akun), dan kunci API untuk sebuah model.

1. Tetapkan batas pengeluaran dulu

Agen membuat sandbox sendiri, jadi beri ia batas atas sebelum mulai. Dua dolar per hari dan dua puluh per bulan lebih dari cukup untuk bereksperimen:

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

Saat batas tercapai, sandbox baru mendapat 429 budget_exceeded dan sandbox sementara yang berjalan dihapus. Detailnya ada di batas dan penagihan sandbox.

2. Pasang dua pustaka

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

Contoh ini memakai satu penyedia model, tetapi tidak ada yang bergantung padanya. Hanya fungsi ask() yang berbicara dengan model.

3. Loop tulis, jalankan, perbaiki

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

Jalankan:

python3 agent.py

Run yang umum mencetak attempt 1: exit code 0 lalu 78498. Jika skrip pertama gagal, Anda akan melihat percobaan kedua dengan error yang sudah diperbaiki.

Apa yang dilakukan setiap bagian:

  • Sandbox.create(..., idle_timeout=120) menyalakan microVM dalam sekitar satu detik. Jika skrip Anda mati di tengah jalan, sandbox tetap menghapus dirinya setelah 2 menit tidak aktif.
  • sb.run(code, timeout=55) menjalankan kode dan mengembalikan kode keluar, stdout, dan stderr. Crash di kode adalah hasil biasa, bukan exception, jadi loop bisa menunjukkannya ke model.
  • r.stderr[-3000:] hanya mengirim bagian akhir error. Traceback lengkap dari skrip besar bisa membuang banyak konteks model.
  • Tiga percobaan adalah batas yang disengaja. Model yang belum memperbaiki skrip dalam tiga kali biasanya butuh deskripsi tugas yang lebih baik, bukan percobaan keempat.

4. Saat tugas butuh lebih dari 55 detik

Panggilan sinkron paling lama 55 detik. Untuk pekerjaan yang lebih lama, jalankan di latar belakang lalu tunggu:

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

Tugas tetap berjalan meskipun wait Anda kena batas waktu, dan Anda bisa melanjutkannya dengan sb.task(task_id).

5. Tugas yang sama lewat MCP, tanpa kode

Jika Anda memakai klien MCP seperti Claude Desktop atau Cursor dengan server MCP EQVPS, agen sudah punya alat sandbox: create_sandbox, run_code, exec_command, upload_file, download_file, dan kill_sandbox. Cukup satu prompt:

Buat sandbox sementara yang kecil. Tulis skrip Python yang menghitung bilangan prima di bawah 1.000.000, jalankan di sana, perbaiki jika gagal, beri tahu saya hasilnya, lalu hapus sandbox-nya.

Agen melakukan panggilan yang sama dengan skrip di atas. Alat mana yang aman diizinkan tanpa konfirmasi dijelaskan di pengaman MCP.

Berapa biayanya

Sandbox hidup jauh kurang dari satu menit dan ditagih minimum 60 detik: $0.00055 di small. Panggilan model lebih mahal daripada sandbox. Kredit uji coba $1 untuk akun baru cukup untuk sekitar 1.800 run seperti ini.

Ke mana selanjutnya

FAQ

Kenapa tidak langsung menjalankan kode model di mesin saya sendiri?

Karena Anda tidak tahu apa yang akan dilakukannya. Kode hasil generasi bisa menghapus file, membaca kunci Anda, atau berputar tanpa henti. Di sandbox, kode berjalan di microVM terpisah dengan kernel sendiri, lalu sandbox dihapus.

Apakah ini bekerja dengan model selain yang ada di contoh?

Ya. Loop ini hanya butuh fungsi yang menerima pesan dan mengembalikan teks. Ganti fungsi ask() dengan API chat apa pun, termasuk model lokal.

Apa yang mencegah agen membuat sandbox tanpa henti?

Tetapkan batas pengeluaran harian dan bulanan sebelum mulai. Saat batas tercapai, sandbox baru ditolak dengan 429 budget_exceeded. Selain itu, satu akun hanya menjalankan dua perintah sekaligus, jadi loop yang lepas kendali tidak bisa berlipat ganda.

Bisakah kode hasil generasi mengakses internet?

Bisa, sandbox punya akses internet keluar agar kode bisa memasang paket dan mengambil data. Tidak ada port masuk. Jangan taruh rahasia di prompt atau kode; berikan rahasia yang benar-benar dibutuhkan skrip sebagai variabel lingkungan.

Komentar

Belum ada komentar. Jadilah yang pertama.

Tinggalkan komentar

Komentar dimoderasi sebelum muncul.