−25%

auf Windows bei Jahreszahlung, bis 31.10. Zu den Tarifen

EQVPS
Loslegen

Ihre erste Agentenaufgabe in einer Sandbox: ein LLM schreibt Code, eine MicroVM führt ihn aus

Bauen Sie die kleinste nützliche Schleife für KI-Codeausführung: Ein Modell schreibt ein Python-Skript, eine Firecracker-Sandbox führt es aus, Fehler gehen an das Modell zurück, bis das Skript läuft. Rund 40 Zeilen, dazu dieselbe Aufgabe über MCP ganz ohne Code.

Ein Agent, der Code schreibt, nützt nur, wenn etwas diesen Code sicher ausführt und das Ergebnis zurückmeldet. Diese Anleitung baut genau diese Schleife von Anfang bis Ende: Ein Modell schreibt ein Python-Skript, eine Sandbox führt es aus, und schlägt es fehl, geht der Fehler zurück an das Modell. Danach dieselbe Aufgabe ohne eine Zeile Code, über MCP.

Sie brauchen Python 3.8+, einen EQVPS-Konto-Token (siehe Konto verbinden) und einen API-Schlüssel für ein Modell.

1. Zuerst ein Ausgabenlimit setzen

Ein Agent erstellt Sandboxes selbstständig, geben Sie ihm also vorher eine Obergrenze. Zwei Dollar pro Tag und zwanzig pro Monat reichen für Experimente reichlich:

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}'

Ist ein Limit erreicht, bekommen neue Sandboxes 429 budget_exceeded, laufende kurzlebige werden gelöscht. Details unter Sandbox-Limits und Abrechnung.

2. Die beiden Bibliotheken installieren

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

Das Beispiel nutzt einen Modellanbieter, aber nichts hängt davon ab. Nur die Funktion ask() spricht mit dem Modell.

3. Die Schleife aus Schreiben, Ausführen, Korrigieren

Speichern Sie das als 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."},
        ]

Starten:

python3 agent.py

Ein typischer Lauf gibt attempt 1: exit code 0 und dann 78498 aus. Schlägt das erste Skript fehl, sehen Sie den zweiten Versuch mit behobenem Fehler.

Was die einzelnen Teile tun:

  • Sandbox.create(..., idle_timeout=120) startet eine MicroVM in etwa einer Sekunde. Stirbt Ihr Skript mittendrin, löscht sich die Sandbox nach 2 Minuten Leerlauf trotzdem selbst.
  • sb.run(code, timeout=55) führt den Code aus und liefert Exit-Code, stdout und stderr. Ein Absturz im Code ist ein normales Ergebnis, keine Exception, die Schleife kann ihn also dem Modell zeigen.
  • r.stderr[-3000:] schickt nur das Ende des Fehlers. Ein vollständiger Traceback eines großen Skripts kann viel Kontext des Modells verschwenden.
  • Drei Versuche sind eine bewusste Grenze. Ein Modell, das ein Skript in drei Anläufen nicht repariert hat, braucht meist eine bessere Aufgabenbeschreibung, keinen vierten Versuch.

4. Wenn die Aufgabe länger als 55 Sekunden braucht

Ein synchroner Aufruf darf höchstens 55 Sekunden laufen. Längere Arbeit starten Sie im Hintergrund und warten:

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

Der Task läuft weiter, auch wenn Ihr wait ins Timeout läuft, und Sie können ihn mit sb.task(task_id) wieder aufnehmen.

5. Dieselbe Aufgabe über MCP, ohne Code

Nutzen Sie einen MCP-Client wie Claude Desktop oder Cursor mit dem EQVPS-MCP-Server, hat der Agent die Sandbox-Tools schon: create_sandbox, run_code, exec_command, upload_file, download_file und kill_sandbox. Ein Prompt genügt:

Erstelle eine kleine kurzlebige Sandbox. Schreibe ein Python-Skript, das die Primzahlen unter 1.000.000 zählt, führe es dort aus, korrigiere es bei Fehlern, nenne mir das Ergebnis und lösche die Sandbox.

Der Agent macht dieselben Aufrufe wie das Skript oben. Welche Tools Sie ohne Bestätigung erlauben können, steht unter MCP-Leitplanken.

Was es gekostet hat

Die Sandbox lebte deutlich unter einer Minute und wurde mit dem 60-Sekunden-Minimum abgerechnet: $0.00055 auf small. Der Modellaufruf kostet mehr als die Sandbox. Das $1-Testguthaben eines neuen Kontos reicht für etwa 1.800 solcher Läufe.

Wie es weitergeht

FAQ

Warum nicht einfach den Code des Modells auf meinem Rechner ausführen?

Weil Sie nicht wissen, was er tut. Generierter Code kann Dateien löschen, Ihre Schlüssel lesen oder endlos laufen. In einer Sandbox läuft er in einer eigenen MicroVM mit eigenem Kernel, und die Sandbox wird danach gelöscht.

Funktioniert das auch mit anderen Modellen als im Beispiel?

Ja. Die Schleife braucht nur eine Funktion, die Nachrichten nimmt und Text zurückgibt. Ersetzen Sie ask() durch eine beliebige Chat-API, auch ein lokales Modell.

Was hält einen Agenten davon ab, endlos Sandboxes zu erstellen?

Setzen Sie vor dem Start ein Tages- und Monatslimit. Ist es erreicht, werden neue Sandboxes mit 429 budget_exceeded abgelehnt. Außerdem laufen pro Konto nur zwei Befehle gleichzeitig, eine außer Kontrolle geratene Schleife kann sich also nicht vervielfachen.

Kann der generierte Code ins Internet?

Ja, Sandboxes haben ausgehenden Internetzugang, damit Code Pakete installieren und Daten abrufen kann. Eingehende Ports gibt es nicht. Legen Sie keine Geheimnisse in Prompt oder Code; die, die ein Skript wirklich braucht, übergeben Sie als Umgebungsvariablen.

Kommentare

Noch keine Kommentare. Sei der Erste.

Kommentar hinterlassen

Kommentare werden vor der Anzeige moderiert.