Production Stack: Verlässliche Agent-Systeme aufbauen

Production Stack kombiniert Runtime, Tools, Memory, Policy, HITL, Containerization und Multi-Tenant-Grenzen zu einem gesteuerten System.
Auf dieser Seite
  1. Die Idee in 30 Sekunden
  2. Problem
  3. Lösung
  4. Wie Production Stack funktioniert
  5. Im Code sieht es so aus
  6. So sieht es während der Ausführung aus
  7. Wann es passt und wann nicht
  8. Passt
  9. Passt nicht
  10. Typische Probleme und Ausfälle
  11. Wie es mit anderen Patterns zusammenspielt
  12. Kurz gesagt
  13. FAQ
  14. Was als Nächstes

Die Idee in 30 Sekunden

Production Stack ist keine einzelne Komponente, sondern ein abgestimmtes Set von Architektur-Schichten, die ein Agent-System in Production gemeinsam steuerbar machen.

Das ist nicht "mehr Prompts". Es sind explizite Verantwortungsgrenzen:

  • wer Entscheidungen trifft;
  • wer eine Aktion erlaubt oder blockiert;
  • wo State gespeichert wird;
  • wie Risiken, Budgets und Ausfälle kontrolliert werden.

Wann man es braucht: wenn ein Agent lange laufen, state-changing Aktionen ausführen, viele Kunden bedienen und unter Last vorhersagbar bleiben muss.

Das LLM schlägt den nächsten Schritt vor, aber der Production Stack entscheidet, ob der Schritt ausgeführt werden darf, wo er ausgeführt wird und wie der Prozess sicher gestoppt wird.


Problem

Wenn man einen Agenten als "Modell + ein paar Tool Calls" baut, wird das System schnell fragil.

Typische Folgen:

  • keine klaren stop conditions, daher bleibt der Agent in Loops hängen;
  • keine Policy-Grenzen, daher gehen riskante Aktionen ohne Kontrolle durch;
  • keine Memory-Qualität, daher entstehen Duplikate, Rauschen oder falsche Personalisierung;
  • keine Tenant-Isolation, daher steigt das Risiko für cross-tenant Leaks;
  • keine operative Disziplin, daher werden Rollout, Rollback und Incident Response chaotisch;
  • kein End-to-End-Audit, daher ist nach einem Ausfall schwer erklärbar, was passiert ist.

In Production bedeutet das meist Sicherheitsvorfälle, Budgetüberschreitungen und instabile Antwortqualität.

Lösung

Production Stack als explizites Architektur-Schema hinzufügen, in dem jede Schicht einen klaren Vertrag und ihre eigene Verantwortungszone hat.

Typische Stack-Zusammensetzung:

  1. Ingress + Auth (actor/tenant bestimmen);
  2. Orchestration Topology (route, handoff, stop);
  3. Agent Runtime (steps, Limits, reason_code);
  4. Tool Execution Layer (Validierung und Kontrolle von side effects, also Zustandsänderungen);
  5. Memory Layer (gesteuertes Memory-Retrieve/Write);
  6. Policy Boundaries + Human-in-the-Loop (erlauben, blockieren, freigeben);
  7. Containerization + Observability + Operations (reproduzierbarer Run, Health Checks, Rollback);
  8. Multi-Tenant Isolation (Isolation von Kontext, Zugriffen und Ressourcen).

Analogie: wie ein moderner Flughafen.

Es gibt Check-in, Sicherheitskontrolle, Routing, Dispatch, Event-Log und Notfallverfahren.

Production Stack verwandelt genauso "ein einzelnes smartes Modul" in ein gesteuertes System mit Ausführungsregeln.

Wie Production Stack funktioniert

Production Stack verbindet alle wichtigen Grenzen in einen gesteuerten Zyklus: von der eingehenden Anfrage bis zur kontrollierten Ausführung, Audit und Recovery.

Diagram
Überblick über den kompletten Flow: Identify → Plan → Decide → Gate → Execute → Learn → Observe → Recover

Identify
Ingress bestimmt actor, tenant, request_id und Start-Limits.

Plan
Orchestration Topology wählt die Task-Route: ein Agent, mehrere Agenten oder pipeline.

Decide
Agent Runtime bildet den nächsten Schritt anhand von aktuellem State und Memory.

Gate
Policy/HITL prüft Risiko, allowlist, scopes, Budget und entscheidet: allow, require_approval, deny.

Execute
Tool Execution Layer validiert Argumente, führt Aktion aus und liefert normalisiertes Ergebnis zurück.

Learn
Memory Layer speichert nur nützliche und sichere Fakten mit TTL, ohne Rauschen anzusammeln.

Observe
In Trace und Audit landen Entscheidungen, reason_code, Kontext sowie Ausführungs- oder Blockier-Ergebnis.

Recover
Container/Ops-Schicht liefert Health Checks, Rollback, Kill Switch und kontrollierten Restart.

Dieser Zyklus nimmt dem Agent-System die "Magie" und macht es unter realer Last vorhersagbar.

Im Code sieht es so aus

PYTHON
class ProductionStack:
    def __init__(self, ingress, topology, runtime, memory, policy, hitl, tools, audit):
        self.ingress = ingress
        self.topology = topology
        self.runtime = runtime
        self.memory = memory
        self.policy = policy
        self.hitl = hitl
        self.tools = tools
        self.audit = audit

    def run(self, request, auth_token):
        ctx = self.ingress.identify(request=request, auth_token=auth_token)
        if not ctx.get("ok", False):
            return {"ok": False, "reason_code": ctx.get("reason_code", "auth_failed")}

        state = self.runtime.start(
            request=request,
            tenant_id=ctx["tenant_id"],
            budgets=ctx["budgets"],
        )

        while not self.runtime.should_stop(state):
            route = self.topology.next_step(state=state)
            route_mode = route.get("mode")

            if route_mode == "finish":
                return {
                    "ok": True,
                    "result": route.get("final_answer", ""),
                    "reason_code": "completed",
                }
            if route_mode != "action":
                return {"ok": False, "reason_code": "unknown_route_mode"}

            memory_items = self.memory.retrieve(
                tenant_id=ctx["tenant_id"],
                query=route["query"],
                top_k=4,
                min_score=0.7,
                exclude_expired=True,
            )

            action = self.runtime.decide(route=route, memory_items=memory_items)
            decision = self.policy.check(action=action, context=ctx)
            mode = decision.get("mode")

            if mode == "deny":
                self.audit.log(context=ctx, action=action, outcome="blocked", reason_code=decision.get("reason_code", "policy_denied"))
                return {"ok": False, "reason_code": decision.get("reason_code", "policy_denied")}
            elif mode == "require_approval":
                approval = self.hitl.review(action=action, context=ctx)
                if not approval.get("approved", False):
                    reason = approval.get("reason_code", "approval_rejected")
                    self.audit.log(context=ctx, action=action, outcome="blocked", reason_code=reason)
                    return {"ok": False, "reason_code": reason}
                action = approval.get("action_override", action)
            elif mode != "allow":
                reason = decision.get("reason_code", "policy_mode_invalid")
                self.audit.log(context=ctx, action=action, outcome="blocked", reason_code=reason)
                return {"ok": False, "reason_code": reason}

            result = self.tools.execute(action=action, context=ctx)
            self.audit.log(
                context=ctx,
                action=action,
                outcome="executed" if result.get("ok", False) else "failed",
                reason_code=result.get("reason_code", "tool_unknown"),
            )

            self.runtime.observe(state=state, action=action, result=result)
            self.memory.write_if_useful(
                tenant_id=ctx["tenant_id"],
                state=state,
                result=result,
            )

        return {"ok": False, "reason_code": self.runtime.stop_reason(state)}

So sieht es während der Ausführung aus

TEXT
Anfrage: "Erstelle ein kommerzielles Angebot, gleiche riskante Punkte ab und sende die finale Version an den Kunden"

Step 1
Ingress + Auth: bestimmt actor, tenant, Budgets und request_id
Orchestration Topology: teilt die Aufgabe in Phasen "sammeln", "entwurf", "finalisieren"

Step 2
Agent Runtime: bildet action
Policy + HITL: aktiviert require_approval für den Versand an den Kunden
Human gibt die finale Version frei

Step 3
Tool Execution Layer: führt die freigegebene Aktion aus
Memory Layer: speichert wichtige Fakten mit TTL
Audit + Trace: protokolliert decision, reason_code, outcome

Production Stack ersetzt keine einzelnen Patterns. Er verbindet sie zu einem gesteuerten Production-System.

Wann es passt und wann nicht

Production Stack wird dort gebraucht, wo ein Agent als Service laufen muss, nicht als einmaliges Demo-Skript.

Passt

SituationWarum Production Stack passt
Der Agent führt state-changing Aktionen in externen Systemen ausDer Stack ergänzt Policy/HITL-Gates, Kontrolle von side effects und Audit.
Der Service arbeitet mit mehreren Kunden und unterschiedlichen ZugriffsrechtenMulti-Tenant-Grenzen, scoped credentials und per-tenant Limits reduzieren Leak-Risiko.
Vorhersagbarkeit, SLO und ein klares Postmortem nach Ausfällen sind erforderlichExplizite stop reasons, Trace und operative Regeln machen Ausfälle kontrollierbar.

Passt nicht

SituationWarum Production Stack nicht passt
One-shot read-only Demo mit einem sicheren ToolDer volle Stack fügt Komplexität hinzu, die sich in dieser Phase nicht auszahlt.
Kurzer interner Prototyp ohne Compliance-, Audit- und SLA-AnforderungenAm Anfang reichen oft Runtime + Basis-Limits, den Rest der Schichten ergänzt man schrittweise.

Für einen minimalen Prototyp reicht manchmal ein einfacher Run:

PYTHON
result = runtime.run(task=request["text"], max_steps=8, max_seconds=20)

Typische Probleme und Ausfälle

ProblemWas passiertWie man es verhindert
Unklare Schicht-GrenzenPolicy-, Memory- und Runtime-Logik vermischen sich an einer StelleExplizite Verträge zwischen Schichten: wer entscheidet, wer ausführt, wer loggt
Keine globalen LimitsAgent verbraucht zu viele Tokens, Schritte oder BudgetHarte Limits für steps/time/cost und standardisierter stop_reason
Schwacher Policy-KontextPolicy Check trifft Entscheidungen ohne actor/tenant/scopesVollständigen Kontext übergeben: actor, tenant, resource, risk, budget
Schlechte Memory-QualitätAgent personalisiert Antwort auf Basis veralteter oder schwacher FaktenMemory-Qualitätsregeln: relevance, freshness, source, sensitivity, TTL
Schwache Tenant-IsolationCache, Memory oder credentials werden zwischen Kunden vermischtTenant-scoped Namespace, Zugriffsschlüssel und per-tenant Budgets
Operative InstabilitätNach Deploy ändert sich Verhalten durch mutable image oder ungepinnte AbhängigkeitenImmutable images, pinned dependencies, health checks, canary und schneller rollback

Die meisten Production-Probleme entstehen nicht durch einen einzelnen "Modellfehler", sondern durch schwache Grenzen zwischen Architektur-Schichten.

Wie es mit anderen Patterns zusammenspielt

Production Stack konkurriert nicht mit anderen Patterns. Er bündelt sie in ein abgestimmtes System.

Anders gesagt:

  • Production Stack definiert wie all diese Schichten zusammen als ein System arbeiten
  • Jedes einzelne Pattern deckt seinen eigenen spezifischen Risikotyp ab

Kurz gesagt

Kurzfazit

Production Stack:

  • verwandelt einen Agenten von Demo in ein gesteuertes Production-System
  • trennt Verantwortlichkeiten zwischen Runtime, policy, tools, memory und ops
  • ergänzt Risikokontrolle über Budgets, Approval-Gates und Audit
  • macht Agent-Verhalten unter Last vorhersagbar

FAQ

Q: Womit starten, wenn es nicht sofort Ressourcen für den ganzen Stack gibt?
A: Mit Runtime (Limits + stop reasons), Tool Execution Layer (Validierung + timeout) und Audit starten. Danach schrittweise policy/HITL, Memory-Qualität und Multi-Tenant-Isolation ergänzen.

Q: Kann man Production Stack mit nur einem Agenten haben, ohne Multi-Agent-Topologie?
A: Ja. Die Topologie kann einfach sein, aber die anderen Schichten bleiben nötig, wenn riskante Aktionen oder Production-Last vorhanden sind.

Q: Ersetzt Production Stack Observability oder SRE-Praktiken?
A: Nein. Es enthält sie als Teil der Architektur, braucht aber weiterhin operative Disziplin: Monitoring, Alerts, Rollout und Incident Response.

Q: Was bricht zuerst, wenn der Stack unvollständig ist?
A: Meist brechen zuerst Ausführungsgrenzen: entweder unkontrollierte Tool Calls, noisy Memory oder Policy-Lücken ohne Audit.

Was als Nächstes

Production Stack ist die Karte des Gesamtsystems. Jetzt kannst du tiefer in die Schichten gehen, die am häufigsten zuerst ausfallen:

  • Tool Execution Layer — Kontrolle von Tools, Timeouts und side effects (Seiteneffekten, also Zustandsänderungen).
  • Memory Layer — Memory-Qualität, TTL und Kontrolle sensibler Daten.
  • Policy Boundaries — allow/deny/approval für riskante Aktionen.
  • Multi-Tenant — Isolation von Kontext, Ressourcen und Budgets über Kunden hinweg.
⏱️ 9 Min. LesezeitAktualisiert 9. März 2026Schwierigkeit: ★★★
Integriert: Production ControlOnceOnly
Guardrails für Tool-Calling-Agents
Shippe dieses Pattern mit Governance:
  • Budgets (Steps / Spend Caps)
  • Tool-Permissions (Allowlist / Blocklist)
  • Kill switch & Incident Stop
  • Idempotenz & Dedupe
  • Audit logs & Nachvollziehbarkeit
Integrierter Hinweis: OnceOnly ist eine Control-Layer für Production-Agent-Systeme.

Autor

Nick — Engineer, der Infrastruktur für KI-Agenten in Produktion aufbaut.

Fokus: Agent-Patterns, Failure-Modes, Runtime-Steuerung und Systemzuverlässigkeit.

🔗 GitHub: https://github.com/mykolademyanov


Redaktioneller Hinweis

Diese Dokumentation ist KI-gestützt, mit menschlicher redaktioneller Verantwortung für Genauigkeit, Klarheit und Produktionsrelevanz.

Der Inhalt basiert auf realen Ausfällen, Post-Mortems und operativen Vorfällen in produktiv eingesetzten KI-Agenten-Systemen.