Multi-Tenant: Agenten zwischen Kunden isolieren

Eine gesteuerte Architektur-Schicht zur Isolation von Tenant-Daten: separater Kontext, scoped credentials, per-tenant Limits und Audit ohne cross-tenant Leaks.
Auf dieser Seite
  1. Die Idee in 30 Sekunden
  2. Problem
  3. Lösung
  4. Wie Multi-Tenant 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 Naechstes

Die Idee in 30 Sekunden

Multi-Tenant ist ein Architekturansatz, bei dem ein Agent-System viele Kunden bedient, aber jeder Tenant (ein einzelner Kunde) isoliert ist.

Isolation darf nicht nur in den Daten existieren. Sie wird in der ganzen Kette gebraucht:

  • Runtime-Kontext;
  • Memory und Cache;
  • Tool-Zugriffe;
  • Budget-Limits und Rate Limits;
  • Audit und Trace.

Wann man es braucht: wenn ein Service fĂŒr viele Kunden, Teams oder Workspaces auf gemeinsamer Infrastruktur lĂ€uft.

Ein LLM sollte den Tenant-Kontext nicht selbst festlegen. Tenant muss ĂŒber Auth oder Routing bestimmt werden, und das System muss ihn in jedem Schritt erzwingen.


Problem

Ohne klare multi-tenant Isolation funktioniert das System zwar, aber Risiken werden schnell kritisch.

LLM-Agenten erhöhen das Risiko von cross-tenant Leaks, weil eine Anfrage Memory lesen, Tools aufrufen und Daten in mehrere Systeme schreiben kann.

Typische AusfÀlle:

  • Kontext eines Tenants landet in der Antwort eines anderen;
  • ein Tool Call lĂ€uft mit fremden credentials;
  • Memory oder Cache werden zwischen Kunden vermischt;
  • ein Tenant verbraucht das gesamte gemeinsame Budget (noisy neighbor);
  • Audit kann nicht belegen, wer eine Aktion initiiert hat.

In Production bedeutet das Datenlecks, SicherheitsvorfÀlle und schwierige Compliance.

Lösung

Multi-Tenant als explizite Isolationsgrenze (tenant boundary) zwischen Agent Runtime und allen ZustĂ€nden/Aktionen des Systems hinzufĂŒgen.

Diese Grenze definiert:

  • wie der Tenant identifiziert wird;
  • welche Ressourcen diesem Tenant verfĂŒgbar sind;
  • welche Limits spezifisch auf diesen Tenant angewendet werden;
  • wie Tenant-Kontext in Logs und Traces erfasst wird.

Analogie: wie BankschließfĂ€cher.

Das GebĂ€ude ist eins, aber Zugriff auf jedes Fach hat nur der EigentĂŒmer.

Multi-Tenant ermöglicht genauso eine gemeinsame Plattform ohne Vermischung von Zugriff und Daten.

Wie Multi-Tenant funktioniert

Multi-Tenant ist eine gesteuerte Schicht zwischen eingehender Anfrage und AktionsausfĂŒhrung, die jeden Run per tenant_id erzwungen isoliert.

Diagram
Überblick ĂŒber den kompletten Flow: Identify → Isolate → Authorize → Execute → Audit

Identify
Das System bestimmt den Tenant ĂŒber Auth-Token, Org-Mapping oder Routing-Regeln.

Isolate
Runtime, Memory, Cache und Budget-Kontext werden an eine konkrete tenant_id gebunden.

Authorize
Die Policy-Schicht prĂŒft Role, tenant scopes, Allowlist und per-tenant Limits.

Execute
Tool Calls laufen nur mit tenant-scoped credentials und Ressourcen dieses Tenants.

Audit
Jeder kritische Schritt wird mit tenant_id, actor_id, reason_code, outcome geloggt.

Dieser Zyklus erlaubt, einen Service auf viele Kunden zu skalieren, ohne cross-tenant Vermischung.

Im Code sieht es so aus

PYTHON
class MultiTenantArchitecture:
    def __init__(self, auth, runtime, policy, tools, memory, budgets, audit):
        self.auth = auth
        self.runtime = runtime
        self.policy = policy
        self.tools = tools
        self.memory = memory
        self.budgets = budgets
        self.audit = audit

    def run(self, request, auth_token):
        identity = self.auth.resolve(auth_token) or {}
        tenant_id = identity.get("tenant_id")
        actor_id = identity.get("actor_id")
        if not tenant_id:
            return {"ok": False, "reason_code": "tenant_missing"}

        if not self.budgets.allowed(tenant_id=tenant_id):
            return {"ok": False, "reason_code": "tenant_budget_exceeded"}

        # Der gesamte Kontext ist strikt an den Tenant gebunden.
        state = self.runtime.start(request=request, tenant_id=tenant_id)
        memory_items = self.memory.retrieve(tenant_id=tenant_id, query=request["text"], top_k=4)
        action = self.runtime.decide(state=state, memory_items=memory_items)

        gate = self.policy.authorize(
            tenant_id=tenant_id,
            actor_id=actor_id,
            action=action,
        )
        if not gate["ok"]:
            self.audit.log(
                tenant_id=tenant_id,
                actor_id=actor_id,
                action=action.get("name"),
                outcome="denied",
                reason_code=gate.get("reason_code", "policy_denied"),
            )
            return {"ok": False, "reason_code": gate.get("reason_code", "policy_denied")}

        result = self.tools.execute(
            action=action,
            tenant_id=tenant_id,
            scopes=gate.get("scopes", []),
        )

        self.audit.log(
            tenant_id=tenant_id,
            actor_id=actor_id,
            action=action.get("name"),
            outcome="executed",
            reason_code=result.get("reason_code", "ok"),
        )
        return result

So sieht es wĂ€hrend der AusfĂŒhrung aus

TEXT
Anfrage: "Aktualisiere den Status von Bestellung #918 und sende dem Kunden eine BestÀtigung"

Step 1
Auth + Routing: bestimmt tenant_id = tenant_acme
Multi-Tenant Boundary: setzt Tenant-Kontext und per-tenant Limits

Step 2
Agent Runtime: bildet action
Policy: prĂŒft role + tenant scopes + allowlist
Tool Execution: fĂŒhrt die Aktion nur mit credentials von tenant_acme aus

Step 3
Audit: speichert tenant_id, actor_id, action, outcome, reason_code
Runtime: liefert Ergebnis ohne Vermischung mit anderen Kunden zurĂŒck

Multi-Tenant Ă€ndert die Agent-Logik nicht. Es macht sie vorhersagbar und sicher fĂŒr eine Multi-Kunden-Umgebung.

Wann es passt und wann nicht

Multi-Tenant wird dort benötigt, wo ein System viele Kunden oder Teams mit unterschiedlichen Zugriffsrechten bedient.

Passt

SituationWarum Multi-Tenant passt
✅Ein Agent-Service bedient viele KundenTenant boundary verhindert cross-tenant Leaks von Daten und Zugriffsrechten.
✅FĂŒr unterschiedliche Tenants sind unterschiedliche Budgets, Quoten und policy rules nötigPer-tenant Limits schĂŒtzen das System vor dem noisy-neighbor Effekt.
✅Audit ist fĂŒr Sicherheit und Compliance erforderlichLogs und Trace erfassen Aktionen mit klarer Tenant-Zuordnung.

Passt nicht

SituationWarum Multi-Tenant nicht passt
❌Das System bedient nur einen Kunden ohne SkalierungsplĂ€neVolle multi-tenant UmhĂŒllung kann am Anfang unnötige KomplexitĂ€t sein.
❌Daten und Zugriffe sind bereits physisch durch separate Installationen isoliertDann reicht oft eine single-tenant Architektur pro Installation.

In einem einfachen single-tenant Szenario reicht manchmal ein Basiskontext:

PYTHON
result = runtime.run(request=request, tenant_id="default")

Typische Probleme und AusfÀlle

ProblemWas passiertWie man es verhindert
Credential bleedEin Tool Call nutzt SchlĂŒssel eines anderen TenantsTenant-scoped credentials + Verbot globaler Clients
Cache / memory bleedCache oder Memory liefert Daten eines anderen Tenants zurĂŒckNamespace Key mit tenant_id, Store-Isolation und Leak-TestfĂ€lle
Noisy neighborEin Tenant verbraucht das gemeinsame Budget und degradiert den Service fĂŒr anderePer-tenant budgets, rate limits, Quoten und PrioritĂ€ten
Tenant-Kontext-SpoofingDas System akzeptiert tenant_id aus Prompt oder Payload ohne Auth-PrĂŒfungTenant wird nur ĂŒber Auth/Routing bestimmt, nicht aus dem Request-Text des Modells
UnvollstÀndiges AuditEs ist nicht belegbar, welcher Tenant eine riskante Aktion initiiert hatPflichtfelder im Audit: tenant_id, actor_id, action, reason_code, outcome
Wiederholte Write-OperationenRetry dupliziert einen Write oder eine Belastung innerhalb des TenantsIdempotency Keys und Deduplizierung fĂŒr Mutation-Aktionen

Die meisten multi-tenant VorfĂ€lle entstehen nicht im Modell, sondern an einer schwachen Grenze zwischen Kontext und AusfĂŒhrung.

Wie es mit anderen Patterns zusammenspielt

Multi-Tenant ist eine querschnittliche Architektur-Schicht, die Sicherheit und StabilitÀt des gesamten Systems verstÀrkt.

  • Agent Runtime — Runtime fĂŒhrt Schritte aus, und Multi-Tenant setzt Tenant-Kontext-Grenzen in jedem Schritt.
  • Tool Execution Layer — jeder tool_call muss mit tenant-scoped Zugriffsrechten laufen.
  • Memory Layer — Memory und Cache mĂŒssen nach tenant_id isoliert sein.
  • Policy Boundaries — policy rules werden unter BerĂŒcksichtigung von tenant, role und scopes angewendet.
  • Orchestration Topologies — in multi-agent Flows muss Tenant-Kontext ĂŒber alle Branches weitergegeben werden.
  • Hybrid Workflow Agent — workflow-Commits mĂŒssen innerhalb der Ressourcen des jeweiligen Tenants bleiben.
  • Human-in-the-Loop Architecture — auch Approval-Schritte brauchen tenant-gebundenes Audit und Zugriffsrechte.
  • Containerizing Agents — Container liefern eine stabile Umgebung, aber Tenant-Isolation wird spezifisch durch die Multi-Tenant-Grenze sichergestellt.

Anders gesagt:

  • Multi-Tenant definiert wessen Aktion das ist und wessen Kontext das ist
  • Andere Architektur-Schichten definieren wie diese Aktion ausgefĂŒhrt wird

Kurz gesagt

Kurzfazit

Multi-Tenant:

  • isoliert Daten, Zugriffe und State zwischen Kunden
  • wendet per-tenant Budget-Limits und Rate Limits an
  • bindet tool calls erzwungen an tenant-scoped credentials
  • macht Audit transparent ĂŒber tenant_id + reason_code

FAQ

Q: Reicht es, einfach tenant_id zur Anfrage hinzuzufĂŒgen?
A: Nein. tenant_id muss durch Runtime, Policy, Tools, Memory, Cache und Audit erzwungen werden.

Q: Wo passieren cross-tenant Leaks am hÀufigsten?
A: Am hĂ€ufigsten in Caches, Memory und globalen Clients fĂŒr externe APIs.

Q: Wie migriert man sicher von single-tenant zu multi-tenant?
A: Mit tenant_id in Auth/Routing starten, dann Memory/Cache/Tools isolieren, per-tenant Limits und Audit hinzufĂŒgen und erst dann Daten schrittweise migrieren.

Q: Was ist zuerst wichtiger: per-tenant Budgets oder per-tenant Policy?
A: Beides ist wichtig. Policy schĂŒtzt Zugriffe, Budgets schĂŒtzen vor noisy-neighbor und Kostenexplosion.

Was als Naechstes

Multi-Tenant-Architektur beginnt mit Isolation, endet aber nicht dort. Als Naechstes schau, wie Stabilitaet unter realer Last gehalten wird:

⏱ 8 Min. Lesezeit ‱ Aktualisiert 8. 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.