−25%

på Windows ved årlig betaling, til 31/10. Se pakkerne

EQVPS
Kom i gang

Din første agentopgave i en sandkasse: en LLM skriver koden, en microVM kører den

Byg den mindste brugbare løkke til AI-kodekørsel: en model skriver et Python-script, en Firecracker-sandkasse kører det, fejl går tilbage til modellen, indtil scriptet virker. Omkring 40 linjer, plus den samme opgave via MCP helt uden kode.

En agent, der skriver kode, er kun nyttig, hvis noget kører koden sikkert og melder resultatet tilbage. Denne guide bygger den løkke fra start til slut: en model skriver et Python-script, en sandkasse kører det, og hvis det fejler, går fejlen tilbage til modellen. Derefter den samme opgave uden en linje kode, via MCP.

Du skal bruge Python 3.8+, en EQVPS-kontotoken (se forbind din konto) og en API-nøgle til en model.

1. Sæt et forbrugsloft først

En agent opretter sandkasser på egen hånd, så giv den et loft, før den starter. To dollar om dagen og tyve om måneden er rigeligt til eksperimenter:

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 et loft nås, får nye sandkasser 429 budget_exceeded, og kørende midlertidige slettes. Detaljerne står i grænser og afregning for sandboxes.

2. Installér de to biblioteker

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

Eksemplet bruger én modeludbyder, men intet afhænger af den. Kun funktionen ask() taler med modellen.

3. Løkken skriv, kør, ret

Gem dette 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ørsel udskriver attempt 1: exit code 0 og derefter 78498. Hvis det første script fejler, ser du det andet forsøg med fejlen rettet.

Hvad hver del gør:

  • Sandbox.create(..., idle_timeout=120) starter en microVM på cirka et sekund. Hvis dit script dør halvvejs, sletter sandkassen alligevel sig selv efter 2 minutters inaktivitet.
  • sb.run(code, timeout=55) kører koden og returnerer exitkode, stdout og stderr. Et crash i koden er et normalt resultat, ikke en exception, så løkken kan vise det til modellen.
  • r.stderr[-3000:] sender kun slutningen af fejlen. En fuld traceback fra et stort script kan spilde meget af modellens kontekst.
  • Tre forsøg er en bevidst grænse. En model, der ikke har rettet et script på tre forsøg, har som regel brug for en bedre opgavebeskrivelse, ikke et fjerde forsøg.

4. Når opgaven kræver mere end 55 sekunder

Et synkront kald må højst tage 55 sekunder. Start længere arbejde i baggrunden og vent:

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

Opgaven kører videre, selv om din wait rammer sin timeout, og du kan tage den op igen med sb.task(task_id).

5. Den samme opgave via MCP, uden kode

Bruger du en MCP-klient som Claude Desktop eller Cursor med EQVPS' MCP-server, har agenten allerede sandkasseværktøjerne: create_sandbox, run_code, exec_command, upload_file, download_file og kill_sandbox. En prompt er nok:

Opret en lille midlertidig sandkasse. Skriv et Python-script, der tæller primtallene under 1.000.000, kør det der, ret det, hvis det fejler, fortæl mig resultatet, og slet sandkassen.

Agenten foretager de samme kald som scriptet ovenfor. Hvilke værktøjer du kan tillade uden bekræftelse, står i MCP-værn.

Hvad det kostede

Sandkassen levede langt under et minut og blev afregnet med minimum på 60 sekunder: 0,00055 $ på small. Modelkaldet koster mere end sandkassen. Prøvekreditten på 1 $ til en ny konto dækker cirka 1.800 kørsler som denne.

Hvor du går hen nu

FAQ

Hvorfor ikke bare køre modellens kode på min egen maskine?

Fordi du ikke ved, hvad den gør. Genereret kode kan slette filer, læse dine nøgler eller køre i en uendelig løkke. I en sandkasse kører den i en separat microVM med sin egen kerne, og sandkassen slettes bagefter.

Virker det med andre modeller end den i eksemplet?

Ja. Løkken skal kun bruge en funktion, der tager imod beskeder og returnerer tekst. Udskift ask() med et hvilket som helst chat-API, også en lokal model.

Hvad forhindrer en agent i at oprette sandkasser i det uendelige?

Sæt et dagligt og månedligt forbrugsloft, før du starter. Når loftet nås, afvises nye sandkasser med 429 budget_exceeded. Derudover kører kun to kommandoer ad gangen pr. konto, så en løbsk løkke kan ikke formere sig.

Kan den genererede kode komme på internettet?

Ja, sandkasser har udgående internet, så koden kan installere pakker og hente data. De har ingen indgående porte. Læg ikke hemmeligheder i prompten eller koden; giv dem, som et script virkelig har brug for, med som miljøvariabler.

Kommentarer

Ingen kommentarer endnu. Vær den første.

Skriv en kommentar

Kommentarer modereres, før de vises.