Zum Inhalt springen

Multi-Agent System aufsetzen

iStand: September 2026

Modell-IDs (z.B. claude-opus-5, claude-sonnet-5) in den Code-Beispielen entsprechen dem Stand vom September 2026. Die Multi-Agent-Architektur und die Routing-Logik sind langlebig — nur die konkreten Modell-IDs ändern sich quartalsweise.

Wissen

Ein einzelner Agent stößt schnell an seine Grenzen: Er muss planen, ausführen und die Qualität seiner eigenen Arbeit bewerten -- alles in einem Loop. In der Produktion teilst du diese Verantwortung auf spezialisierte Agents auf. Das Ergebnis ist ein Multi-Agent System, das robuster, effizienter und kontrollierbarer ist als ein Einzelkämpfer.

Die Planner-Executor-Reviewer-Architektur

Die bewährteste Architektur für Produktions-Agents besteht aus drei Rollen:

RolleAufgabeModellWarum dieses Modell?
PlannerAnalysiert die Aufgabe, erstellt einen strukturierten PlanGroßes Modell (Claude Opus, GPT-5)Braucht starkes Reasoning für komplexe Planung
ExecutorFührt die einzelnen Schritte des Plans ausGünstiges Modell (Claude Haiku, GPT-5-mini)Repetitive Aufgaben brauchen kein teures Modell
ReviewerPrüft die Ergebnisse, gibt Feedback oder FreigabeMittleres Modell (Claude Sonnet)Braucht Urteilsvermögen, aber weniger als der Planner

Warum nicht ein einziger Agent? Drei spezialisierte Agents sind in der Summe günstiger und besser als ein universeller Agent, der alles gleichzeitig können muss. Der Planner wird nur einmal aufgerufen (teuer, aber selten), der Executor läuft oft (günstig), und der Reviewer sorgt für Qualität, ohne den gesamten Kontext des Executors zu brauchen.

Inter-Agent-Kommunikation

Agents kommunizieren über strukturierte Nachrichten -- typischerweise JSON-Objekte mit klaren Schemas. Das ist kein Freitext-Chat, sondern ein definiertes Protokoll:

# Nachrichtenformat für Inter-Agent-Kommunikation
from dataclasses import dataclass, field
from typing import Literal
from datetime import datetime

@dataclass
class AgentMessage:
    sender: Literal["planner", "executor", "reviewer"]
    receiver: Literal["planner", "executor", "reviewer"]
    message_type: Literal["plan", "task", "result", "feedback", "approval"]
    payload: dict
    timestamp: str = field(default_factory=lambda: datetime.now().isoformat())
    correlation_id: str = ""  # Verknüpft zusammengehörige Nachrichten

Verstehen

Vollständiges Multi-Agent System in Python

Das folgende Beispiel zeigt ein produktionsfähiges Multi-Agent System. Der Planner erstellt einen Plan, der Executor arbeitet ihn ab, und der Reviewer prüft das Ergebnis.

import anthropic
import json
from dataclasses import dataclass, field, asdict
from typing import Literal
from datetime import datetime

client = anthropic.Anthropic()

@dataclass
class AgentMessage:
    sender: str
    receiver: str
    message_type: str
    payload: dict
    timestamp: str = field(default_factory=lambda: datetime.now().isoformat())

class ProductionAgent:
    def __init__(self, name: str, model: str, system_prompt: str):
        self.name = name
        self.model = model
        self.system_prompt = system_prompt
        self.message_log: list[AgentMessage] = []

    def process(self, task: str) -> str:
        """Verarbeitet eine Aufgabe und gibt die Antwort zurück."""
        response = client.messages.create(
            model=self.model,
            max_tokens=2048,
            system=self.system_prompt,
            messages=[{"role": "user", "content": task}]
        )
        return response.content[0].text

class MultiAgentOrchestrator:
    def __init__(self):
        self.planner = ProductionAgent(
            name="planner",
            model="claude-opus-5",
            system_prompt=(
                "Du bist ein Planungs-Agent. Analysiere Aufgaben und erstelle "
                "strukturierte Pläne im JSON-Format. Jeder Schritt muss klar, "
                "atomar und ausführbar sein. Format: "
                '{"steps": [{"id": 1, "action": "...", "expected_output": "..."}]}'
            )
        )
        self.executor = ProductionAgent(
            name="executor",
            model="claude-haiku-4-5",
            system_prompt=(
                "Du bist ein Ausführungs-Agent. Du bekommst einen einzelnen "
                "Schritt und führst ihn präzise aus. Gib nur das Ergebnis "
                "zurück, keine Erklärungen."
            )
        )
        self.reviewer = ProductionAgent(
            name="reviewer",
            model="claude-sonnet-5",
            system_prompt=(
                "Du bist ein Review-Agent. Prüfe Ergebnisse auf Korrektheit, "
                "Vollständigkeit und Qualität. Antworte mit JSON: "
                '{"approved": true/false, "feedback": "...", "score": 0-10}'
            )
        )

    def run(self, task: str) -> dict:
        # 1. Planner erstellt den Plan
        plan_raw = self.planner.process(f"Erstelle einen Plan für: {task}")
        plan = json.loads(plan_raw)

        results = []
        # 2. Executor arbeitet jeden Schritt ab
        for step in plan["steps"]:
            result = self.executor.process(
                f"Führe aus: {step['action']}\n"
                f"Erwartetes Ergebnis: {step['expected_output']}"
            )
            results.append({"step_id": step["id"], "result": result})

        # 3. Reviewer prüft das Gesamtergebnis
        review = self.reviewer.process(
            f"Aufgabe: {task}\n"
            f"Plan: {json.dumps(plan, ensure_ascii=False)}\n"
            f"Ergebnisse: {json.dumps(results, ensure_ascii=False)}"
        )

        return {
            "plan": plan,
            "results": results,
            "review": json.loads(review)
        }

# Nutzung
orchestrator = MultiAgentOrchestrator()
output = orchestrator.run("Analysiere die Performance der API-Endpoints")

TypeScript-Variante

import Anthropic from "@anthropic-ai/sdk";

const client = new Anthropic();

interface AgentMessage {
  sender: string;
  receiver: string;
  messageType: string;
  payload: Record<string, unknown>;
  timestamp: string;
}

interface PlanStep {
  id: number;
  action: string;
  expected_output: string;
}

class ProductionAgent {
  constructor(
    private name: string,
    private model: string,
    private systemPrompt: string,
    public messageLog: AgentMessage[] = []
  ) {}

  async process(task: string): Promise<string> {
    const response = await client.messages.create({
      model: this.model,
      max_tokens: 2048,
      system: this.systemPrompt,
      messages: [{ role: "user", content: task }],
    });
    const block = response.content[0];
    return block.type === "text" ? block.text : "";
  }
}

class MultiAgentOrchestrator {
  private planner: ProductionAgent;
  private executor: ProductionAgent;
  private reviewer: ProductionAgent;

  constructor() {
    this.planner = new ProductionAgent(
      "planner",
      "claude-opus-5",
      "Du bist ein Planungs-Agent. Erstelle strukturierte Pläne als JSON."
    );
    this.executor = new ProductionAgent(
      "executor",
      "claude-haiku-4-5",
      "Du bist ein Ausführungs-Agent. Führe Schritte präzise aus."
    );
    this.reviewer = new ProductionAgent(
      "reviewer",
      "claude-sonnet-5",
      "Du bist ein Review-Agent. Prüfe Ergebnisse und antworte als JSON."
    );
  }

  async run(task: string) {
    // 1. Plan erstellen
    const planRaw = await this.planner.process(
      `Erstelle einen Plan für: ${task}`
    );
    const plan = JSON.parse(planRaw);

    // 2. Schritte ausführen
    const results = [];
    for (const step of plan.steps as PlanStep[]) {
      const result = await this.executor.process(
        `Führe aus: ${step.action}`
      );
      results.push({ stepId: step.id, result });
    }

    // 3. Review
    const review = await this.reviewer.process(
      `Aufgabe: ${task}\nErgebnisse: ${JSON.stringify(results)}`
    );

    return { plan, results, review: JSON.parse(review) };
  }
}

Anwenden

Vervollständige den Orchestrator, der den Executor-Agent mit dem richtigen Modell und der richtigen Aufgabe startet:

self.executor = ProductionAgent( name="executor", model="claude-",
for step in plan[""]:
result = self.executor.(f"Führe aus: {step['action']}")

Warum ist der Reviewer ein separater Agent und nicht Teil des Executors?

Reflektieren

Ein Multi-Agent System ist nicht automatisch besser als ein einzelner Agent. Der Mehrwert entsteht durch klare Rollentrennung, passende Modellwahl pro Rolle und strukturierte Kommunikation. In der Praxis startest du mit einem einzelnen Agent und teilst erst dann auf, wenn du merkst, dass eine Rolle zu komplex wird oder die Kosten zu hoch sind.