Partial Outage Handling (Agent-Failure + Degrade Mode + Code)

  • Erkenne den Fehler früh, bevor die Rechnung steigt.
  • Verstehe, was in Prod bricht – und warum.
  • Guardrails kopieren: Budgets, Stop-Reasons, Validation.
  • Wissen, wann das nicht die Root Cause ist.
Erkennungs-Signale
  • Tool-Calls pro Run steigen (oder wiederholen sich mit args-hash).
  • Kosten/Tokens pro Request steigen ohne bessere Ergebnisse.
  • Retries kippen von selten zu konstant (429/5xx).
Ein Tool ist flaky, der Rest läuft. Agents thrashen dann gerne und verbrennen Budgets. So degradierst du sicher: partial results + klare stop reasons.
Auf dieser Seite
  1. Problem (aus der Praxis)
  2. Warum das in Production bricht
  3. 1) Intermittenter Erfolg triggert “weiter versuchen”
  4. 2) Kein Konzept von Tool Health
  5. 3) Kein Safe-mode Verhalten
  6. 4) “All or nothing” API Contract
  7. Implementierungsbeispiel (echter Code)
  8. Echter Incident (mit Zahlen)
  9. Abwägungen
  10. Wann du es NICHT nutzen solltest
  11. Checkliste (Copy/Paste)
  12. Sicheres Default-Config-Snippet (JSON/YAML)
  13. FAQ (3–5)
  14. Verwandte Seiten (3–6 Links)
Interaktiver Ablauf
Szenario:
Schritt 1/2: Execution

Normal path: execute → tool → observe.

Problem (aus der Praxis)

Kein Full Outage. Schlimmer.

Ein Tool ist flaky:

  • manchmal 200
  • manchmal Timeout
  • manchmal 502

Dein Agent versucht “fertig zu werden”. User retry’n weil sie Timeouts sehen. Budgets brennen, weil jeder Retry ein neuer Run ist.

Partial Outages zeigen, ob dein Agent ein Engineer ist oder ein Gambler.

Warum das in Production bricht

Partial Outages sind fies, weil Erfolg intermittierend ist. Das verführt Loops.

1) Intermittenter Erfolg triggert “weiter versuchen”

LLMs sind optimistisch. Wenn einmal etwas klappt, wollen sie “vollständig” werden.

In Prod heißt das: runaway spend.

2) Kein Konzept von Tool Health

Ohne “tool X ist degraded” Signal wird der Agent:

  • weiter callen
  • retry’n
  • replan’n und wieder callen

Du brauchst Health:

  • breaker state
  • error rate
  • latency spikes

3) Kein Safe-mode Verhalten

Wenn Tool degraded ist, brauchst du ein Verhalten ohne das Tool:

  • cached data
  • partial results
  • stop reason und User entscheidet

4) “All or nothing” API Contract

Wenn dein API Contract “immer volle Antwort” ist, thrash’t der Agent.

Besser:

  • partial results + confidence + stop reason
  • optional: async continuation

Implementierungsbeispiel (echter Code)

Health Snapshot am Run-Start:

  • critical tool degraded → disable im Run
  • safe-mode
  • partial results + stop reason
PYTHON
from dataclasses import dataclass
from typing import Any


@dataclass(frozen=True)
class Health:
  degraded_tools: set[str]


def snapshot_health() -> Health:
  return Health(degraded_tools=set(get_degraded_tools()))  # (pseudo)


def safe_tools_for_run(health: Health) -> set[str]:
  allow = {"search.read", "kb.read", "http.get"}
  for t in health.degraded_tools:
      allow.discard(t)
  return allow


def run(task: str) -> dict[str, Any]:
  health = snapshot_health()
  allow = safe_tools_for_run(health)

  if "kb.read" not in allow:
      return {
          "status": "degraded",
          "reason": "kb.read degraded",
          "partial": "KB ist gerade nicht zuverlässig. Das kann ich ohne KB machen…",
      }

  return agent_loop(task, allow=allow)  # (pseudo)
JAVASCRIPT
export function snapshotHealth() {
return { degradedTools: new Set(getDegradedTools()) }; // (pseudo)
}

export function safeToolsForRun(health) {
const allow = new Set(["search.read", "kb.read", "http.get"]);
for (const t of health.degradedTools) allow.delete(t);
return allow;
}

export function run(task) {
const health = snapshotHealth();
const allow = safeToolsForRun(health);

if (!allow.has("kb.read")) {
  return {
    status: "degraded",
    reason: "kb.read degraded",
    partial: "KB ist gerade nicht zuverlässig. Das kann ich ohne KB machen…",
  };
}

return agentLoop(task, { allow }); // (pseudo)
}

Während Partial Outage ist das Ziel nicht “succeed um jeden Preis”. Ziel ist “mach aus Partial Outage keine Full Outage”.

Echter Incident (mit Zahlen)

Support Agent nutzte kb.read.

KB degradete (p95 von ~300ms → 9s, intermittierende Timeouts). Agent machte weiter, weil es manchmal ging.

Impact:

  • avg run time: 8s → 52s
  • client retries verdoppelten Traffic
  • Pager wegen “agent timeouts” statt wegen KB Root Cause
  • spend +~$180/Tag durch Retries + größere Prompts

Fix:

  1. health snapshot + degrade mode
  2. fail fast wenn breaker open
  3. partial results + stop reason
  4. “retry later” statt silent timeouts

Lesson: Stop Reasons sind User-Features.

Abwägungen

  • Degrade Antworten sind weniger komplett.
  • Fail fast senkt momentane success rate.
  • Health kann falsch liegen. Besser als Thrash.

Wann du es NICHT nutzen solltest

  • Wenn Vollständigkeit Pflicht ist: async workflows + progress.
  • Wenn du keine partial semantics hast: du endest in timeouts.
  • Wenn du keine Health Signals hast: starte mit Budgets + Breaker Defaults.

Checkliste (Copy/Paste)

  • [ ] Tool Health Snapshot am Start
  • [ ] Degrade Mode Policy (tools disabled, read-only, cached)
  • [ ] Fail fast bei breaker open
  • [ ] Partial results + stop reason
  • [ ] Budgets gelten trotzdem
  • [ ] Alerting: degraded runs vs normal runs

Sicheres Default-Config-Snippet (JSON/YAML)

YAML
degrade_mode:
  enabled: true
  disable_tools_when_degraded: true
  allow_partial_results: true
health:
  breaker_open_means_degraded: true
budgets:
  max_seconds: 60
  max_tool_calls: 12

FAQ (3–5)

Warum nicht einfach retry’n bis es klappt?
Weil intermittente Failures + Retries Outages verstärken. Der Agent wird zum Load Generator.
Was returne ich im Degrade Mode?
Partial results, cached data oder ein klares ‘geht gerade nicht’ mit stop reason.
Brauche ich per-tool Health?
Ja für externe Dependencies. Starte mit breaker state + error rate.
Kommen User mit partial klar?
Besser als Timeouts. Gib stop reason und Option ‘retry later’.

Q: Warum nicht einfach retry’n bis es klappt?
A: Weil intermittente Failures + Retries Outages verstärken. Der Agent wird zum Load Generator.

Q: Was returne ich im Degrade Mode?
A: Partial results, cached data oder ein klares “geht gerade nicht” mit stop reason.

Q: Brauche ich per-tool Health?
A: Ja für externe Dependencies. Starte mit breaker state + error rate.

Q: Kommen User mit partial klar?
A: Besser als Timeouts. Gib stop reason und Option “retry later”.

Nicht sicher, ob das dein Fall ist?

Agent gestalten ->
⏱️ 5 Min. LesezeitAktualisiert Mär, 2026Schwierigkeit: ★★☆
In OnceOnly umsetzen
Guardrails for loops, retries, and spend escalation.
In OnceOnly nutzen
# onceonly guardrails (concept)
version: 1
budgets:
  max_steps: 25
  max_tool_calls: 12
  max_seconds: 60
  max_usd: 1.00
policy:
  tool_allowlist:
    - search.read
    - http.get
controls:
  loop_detection:
    enabled: true
    dedupe_by: [tool, args_hash]
  retries:
    max: 2
    backoff_ms: [200, 800]
stop_reasons:
  enabled: true
logging:
  tool_calls: { enabled: true, store_args: false, store_args_hash: true }
Integriert: Production ControlOnceOnly
Guardrails für Tool-Calling-Agents
Shippe dieses Pattern mit Governance:
  • Budgets (Steps / Spend Caps)
  • Kill switch & Incident Stop
  • Audit logs & Nachvollziehbarkeit
  • Idempotenz & Dedupe
  • Tool-Permissions (Allowlist / Blocklist)
Integrierter Hinweis: OnceOnly ist eine Control-Layer für Production-Agent-Systeme.
Beispiel-Policy (Konzept)
# Example (Python — conceptual)
policy = {
  "budgets": {"steps": 20, "seconds": 60, "usd": 1.0},
  "controls": {"kill_switch": True, "audit": True},
}
Autor

Diese Dokumentation wird von Engineers kuratiert und gepflegt, die AI-Agenten in der Produktion betreiben.

Die Inhalte sind KI-gestützt, mit menschlicher redaktioneller Verantwortung für Genauigkeit, Klarheit und Produktionsrelevanz.

Patterns und Empfehlungen basieren auf Post-Mortems, Failure-Modes und operativen Incidents in produktiven Systemen, auch bei der Entwicklung und dem Betrieb von Governance-Infrastruktur für Agenten bei OnceOnly.