En agent som skriver kod är bara användbar om något kör koden säkert och rapporterar resultatet. Den här guiden bygger den loopen från början till slut: en modell skriver ett Python-skript, en sandlåda kör det, och om det misslyckas går felet tillbaka till modellen. Sedan samma uppgift utan en rad kod, via MCP.
Du behöver Python 3.8+, en EQVPS-kontotoken (se koppla ditt konto) och en API-nyckel för en modell.
1. Sätt ett utgiftstak först
En agent skapar sandlådor på egen hand, så ge den ett tak innan den börjar. Två dollar per dag och tjugo per månad räcker gott för experiment:
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}'
När ett tak nås får nya sandlådor 429 budget_exceeded och körande tillfälliga raderas. Detaljerna finns i sandlådors gränser och debitering.
2. Installera de två biblioteken
pip install eqvps anthropic
export EQVPS_API_KEY="your-eqvps-token"
export ANTHROPIC_API_KEY="your-model-key"
Exemplet använder en modelleverantör, men inget hänger på den. Bara funktionen ask() pratar med modellen.
3. Loopen skriv, kör, rätta
Spara detta som 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."},
]
Kör det:
python3 agent.py
En typisk körning skriver ut attempt 1: exit code 0 och sedan 78498. Om det första skriptet misslyckas ser du det andra försöket med felet rättat.
Vad varje del gör:
Sandbox.create(..., idle_timeout=120)startar en microVM på ungefär en sekund. Dör ditt skript halvvägs raderar sandlådan sig ändå själv efter 2 minuters inaktivitet.sb.run(code, timeout=55)kör koden och returnerar avslutningskod, stdout och stderr. En krasch i koden är ett vanligt resultat, inte ett undantag, så loopen kan visa den för modellen.r.stderr[-3000:]skickar bara slutet av felet. En fullständig traceback från ett stort skript kan slösa mycket av modellens kontext.- Tre försök är en medveten gräns. En modell som inte har lagat ett skript på tre försök behöver oftast en bättre uppgiftsbeskrivning, inte ett fjärde försök.
4. När uppgiften behöver mer än 55 sekunder
Ett synkront anrop får ta högst 55 sekunder. Starta längre arbete i bakgrunden och vänta:
task = sb.run(code, background=True)
result = task.wait(timeout=1800)
Uppgiften fortsätter köra även om din wait slår i tidsgränsen, och du kan ta upp den igen med sb.task(task_id).
5. Samma uppgift via MCP, utan kod
Använder du en MCP-klient som Claude Desktop eller Cursor med EQVPS MCP-server har agenten redan sandlådeverktygen: create_sandbox, run_code, exec_command, upload_file, download_file och kill_sandbox. En prompt räcker:
Skapa en liten tillfällig sandlåda. Skriv ett Python-skript som räknar primtalen under 1 000 000, kör det där, rätta det om det misslyckas, berätta resultatet och radera sandlådan.
Agenten gör samma anrop som skriptet ovan. Vilka verktyg du kan tillåta utan bekräftelse beskrivs i MCP-skyddsräcken.
Vad det kostade
Sandlådan levde långt kortare än en minut och debiterades minimitiden på 60 sekunder: 0,00055 $ på small. Modellanropet kostar mer än sandlådan. Provkrediten på 1 $ för ett nytt konto räcker till ungefär 1 800 sådana körningar.
Vart härnäst
- SDK:t steg för steg: Python-SDK för sandlådor på 5 minuter eller TypeScript.
- Alla metoder och fel: SDK-referens.
- Tariffer och provkredit: sandlådesidan.
Kommentarer
Inga kommentarer än. Bli först.