เอเจนต์ที่เขียนโค้ดจะมีประโยชน์ก็ต่อเมื่อมีบางอย่างรันโค้ดนั้นอย่างปลอดภัยและรายงานผลกลับมา คู่มือนี้สร้างลูปนั้นตั้งแต่ต้นจนจบ: โมเดลเขียนสคริปต์ 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 ครั้ง
ไปต่อที่ไหน
- SDK ทีละขั้นตอน: Python SDK สำหรับแซนด์บ็อกซ์ใน 5 นาที หรือ TypeScript
- เมธอดและข้อผิดพลาดทั้งหมด: คู่มือ SDK
- แพ็กเกจและเครดิตทดลอง: หน้าแซนด์บ็อกซ์
ความคิดเห็น
ยังไม่มีความคิดเห็น เป็นคนแรกสิ