−25%

på Windows vid årsbetalning, till 31/10. Till paketen

EQVPS
Kom igång

Din första agentuppgift i en sandlåda: en LLM skriver koden, en microVM kör den

Bygg den minsta användbara loopen för AI-kodkörning: en modell skriver ett Python-skript, en Firecracker-sandlåda kör det, fel går tillbaka till modellen tills skriptet fungerar. Runt 40 rader, plus samma uppgift via MCP helt utan kod.

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

FAQ

Varför inte bara köra modellens kod på min egen maskin?

För att du inte vet vad den gör. Genererad kod kan radera filer, läsa dina nycklar eller fastna i en oändlig loop. I en sandlåda körs den i en separat microVM med egen kärna, och sandlådan raderas efteråt.

Fungerar det med andra modeller än den i exemplet?

Ja. Loopen behöver bara en funktion som tar emot meddelanden och returnerar text. Byt ut ask() mot vilket chatt-API som helst, även en lokal modell.

Vad hindrar en agent från att skapa sandlådor i all oändlighet?

Sätt ett dags- och månadstak innan du börjar. När taket nås nekas nya sandlådor med 429 budget_exceeded. Dessutom körs bara två kommandon samtidigt per konto, så en skenande loop kan inte föröka sig.

Kan den genererade koden nå internet?

Ja, sandlådorna har utgående internet så att koden kan installera paket och hämta data. De har inga inkommande portar. Lägg inte hemligheter i prompten eller koden; skicka de som ett skript verkligen behöver som miljövariabler.

Kommentarer

Inga kommentarer än. Bli först.

Lämna en kommentar

Kommentarer modereras innan de visas.