−25%

Windows รายปี ถึง 31 ต.ค. ดูแพ็กเกจ

EQVPS
เริ่มต้นใช้งาน

งานแรกของเอเจนต์ในแซนด์บ็อกซ์: LLM เขียนโค้ด microVM รันให้

สร้างลูปรันโค้ดด้วย AI ที่เล็กที่สุดแต่ใช้งานได้จริง: โมเดลเขียนสคริปต์ Python แซนด์บ็อกซ์ Firecracker รันให้ และข้อผิดพลาดย้อนกลับไปหาโมเดลจนกว่าสคริปต์จะทำงาน ราว 40 บรรทัด พร้อมงานเดียวกันผ่าน MCP โดยไม่ต้องเขียนโค้ดเลย

เอเจนต์ที่เขียนโค้ดจะมีประโยชน์ก็ต่อเมื่อมีบางอย่างรันโค้ดนั้นอย่างปลอดภัยและรายงานผลกลับมา คู่มือนี้สร้างลูปนั้นตั้งแต่ต้นจนจบ: โมเดลเขียนสคริปต์ Python แซนด์บ็อกซ์รันให้ และถ้าล้มเหลว ข้อผิดพลาดจะย้อนกลับไปหาโมเดล จากนั้นทำงานเดียวกันโดยไม่ต้องเขียนโค้ดสักบรรทัดผ่าน MCP

คุณต้องมี Python 3.8+ โทเค็นบัญชี EQVPS (ดู เชื่อมต่อบัญชี) และ API key ของโมเดล

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 และแซนด์บ็อกซ์ชั่วคราวที่รันอยู่จะถูกลบ รายละเอียดอยู่ใน ขีดจำกัดและการคิดเงินของ sandbox

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 ในราว 1 วินาที ถ้าสคริปต์ของคุณตายกลางทาง แซนด์บ็อกซ์ก็ยังลบตัวเองหลังไม่มีกิจกรรม 2 นาที
  • sb.run(code, timeout=55) รันโค้ดและคืน exit code, stdout และ stderr โค้ดพังเป็นผลลัพธ์ปกติ ไม่ใช่ exception ลูปจึงส่งให้โมเดลดูได้
  • r.stderr[-3000:] ส่งเฉพาะท้ายข้อผิดพลาด traceback เต็มของสคริปต์ใหญ่อาจกินบริบทของโมเดลไปมาก
  • สามรอบ เป็นขีดจำกัดที่ตั้งใจ โมเดลที่แก้สคริปต์ไม่ได้ในสามรอบ มักต้องการคำอธิบายงานที่ดีกว่า ไม่ใช่รอบที่สี่

4. เมื่องานต้องใช้เวลาเกิน 55 วินาที

การเรียกแบบ synchronous ทำงานได้นานสุด 55 วินาที งานที่นานกว่านั้นให้เริ่มในเบื้องหลังแล้วรอ:

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

งานยังรันต่อแม้ wait ของคุณจะถึง timeout และคุณกลับมาจัดการต่อได้ด้วย 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 ของบัญชีใหม่พอสำหรับการรันแบบนี้ราว 1,800 ครั้ง

ไปต่อที่ไหน

คำถามที่พบบ่อย

ทำไมไม่รันโค้ดของโมเดลบนเครื่องตัวเองไปเลย

เพราะคุณไม่รู้ว่ามันจะทำอะไร โค้ดที่สร้างขึ้นอาจลบไฟล์ อ่านคีย์ของคุณ หรือวนลูปไม่รู้จบ ในแซนด์บ็อกซ์ โค้ดรันใน microVM แยกที่มีเคอร์เนลของตัวเอง และแซนด์บ็อกซ์ถูกลบหลังจากนั้น

ใช้กับโมเดลอื่นนอกจากในตัวอย่างได้ไหม

ได้ ลูปต้องการแค่ฟังก์ชันที่รับข้อความแล้วคืนค่าเป็นข้อความ เปลี่ยนฟังก์ชัน ask() เป็น API แชตใดก็ได้ รวมถึงโมเดลที่รันในเครื่อง

อะไรป้องกันไม่ให้เอเจนต์สร้างแซนด์บ็อกซ์ไม่หยุด

ตั้งขีดจำกัดการใช้จ่ายรายวันและรายเดือนก่อนเริ่ม เมื่อถึงขีดจำกัด แซนด์บ็อกซ์ใหม่จะถูกปฏิเสธด้วย 429 budget_exceeded นอกจากนี้ บัญชีหนึ่งรันคำสั่งพร้อมกันได้แค่สองคำสั่ง ลูปที่หลุดควบคุมจึงขยายตัวไม่ได้

โค้ดที่สร้างขึ้นเข้าอินเทอร์เน็ตได้ไหม

ได้ แซนด์บ็อกซ์มีอินเทอร์เน็ตขาออกเพื่อให้โค้ดติดตั้งแพ็กเกจและดึงข้อมูลได้ แต่ไม่มีพอร์ตขาเข้า อย่าใส่ความลับไว้ในพรอมต์หรือโค้ด สิ่งที่สคริปต์ต้องใช้จริงให้ส่งเป็นตัวแปรสภาพแวดล้อม

ความคิดเห็น

ยังไม่มีความคิดเห็น เป็นคนแรกสิ

แสดงความคิดเห็น

ความคิดเห็นจะถูกตรวจสอบก่อนแสดง