Selbst bauen
Ein eigener Harness in 30 Zeilen
import subprocess, anthropic
client = anthropic.Anthropic()
tools = [{
"name": "bash",
"description": "Führt einen Shell-Befehl im Projektordner aus.",
"input_schema": {"type": "object",
"properties": {"command": {"type": "string"}},
"required": ["command"]},
}]
def run_tool(args):
if input(f"$ {args['command']} ausführen? [j/n] ") != "j":
return "Vom Nutzer abgelehnt."
p = subprocess.run(args["command"], shell=True,
capture_output=True, text=True, timeout=120)
return (p.stdout + p.stderr)[-8000:]
messages = [{"role": "user", "content": input("Aufgabe: ")}]
while True:
response = client.messages.create(
model="claude-opus-5-5", max_tokens=16000,
system="Du bist ein sorgfältiger Coding-Agent.",
tools=tools, messages=messages)
messages.append({"role": "assistant", "content": response.content})
if response.stop_reason != "tool_use":
break
messages.append({"role": "user", "content": [
{"type": "tool_result", "tool_use_id": b.id,
"content": run_tool(b.input)}
for b in response.content if b.type == "tool_use"]})
print("".join(b.text for b in response.content if b.type == "text"))
- Das ist alles. Mit → gehen wir den Code in sechs Schritten durch.
- WerkzeugeWerkzeug beschreiben: Name, Beschreibung, JSON-Schema. Mehr weiß das Modell über die Shell nicht.
- BerechtigungenAusführen – mit Freigabe: Diese eine Ja/Nein-Frage ist das gesamte Sicherheitsmodell unseres Mini-Harness.
- KontextDer Kontext ist eine Liste. Die API ist zustandslos – wir schicken jedes Mal den ganzen Verlauf.
- ModellaufrufEin Aufruf: Modell, System-Prompt, Werkzeuge, Verlauf.
- SchleifeAntwort anhängen. Ohne Werkzeug-Wunsch endet die Schleife hier; andere Stopgründe brauchen eine gesonderte Behandlung.
- SchleifeSonst: ausführen und zurückgeben. Jedes Ergebnis kommt mit der passenden ID als neue Nachricht dazu – und von vorn.
- Das ist der Kern von Claude Code, Codex & Co. Was fehlt, ist Handwerk: Kontext-Management, Sandbox, gute Datei-Werkzeuge, Fehlerbehandlung, Streaming, Kostenkontrolle.