Idee in 30 Sekunden
Budget controls sind Runtime-Limits, die einen Run stoppen, wenn der Agent Grenzen bei Schritten, Zeit, Tool-Aufrufen oder Kosten überschreitet.
Wann das nötig ist: wenn der Agent externe Tools aufruft, Aktionen retryen kann und mit realem Budget in Production arbeitet.
Problem
Ohne Budgets gerät ein Agent in Production leicht in eine Schleife: mehr Schritte, mehr Tool-Aufrufe, mehr Kosten. Im Demo sieht man das kaum, weil die Last klein ist. In Production wird dieses Verhalten schnell zu einem Incident.
Eine instabile Tool-Antwort startet oft eine Kette: Retry -> neuer Tool-Aufruf -> mehr Tokens -> noch ein Retry. Ohne harte Runtime-Grenze läuft der Run länger und teurer als geplant.
Analogie: das ist wie eine Fahrt ohne Limit auf dem Firmen-Taxi-Account. Solange die Fahrt kurz ist, wirkt alles normal. Wenn sich die Route zieht, steigen die Kosten unbemerkt bis zur Abrechnung.
Lösung
Die Lösung ist, Budget-Prüfungen in die Runtime-Policy-Layer auszulagern.
Jeder Agent-Schritt wird gegen vier Limits geprüft: max_steps, max_seconds, max_tool_calls, max_usd.
Die Policy-Layer liefert eine technische Entscheidung: allow oder stop mit explizitem Grund (max_steps, max_seconds, max_tool_calls, max_usd).
Diese Entscheidung wird bei jedem Schritt getroffen, nicht nur am Ende des Runs.
Das ist eine eigene Systemebene, nicht Teil von Prompt oder Modelllogik.
Budget Controls != Rate Limiting
Das sind unterschiedliche Kontroll-Ebenen:
- Rate limiting begrenzt die Anfragefrequenz an ein System oder Tool.
- Budget controls begrenzen die Gesamtkosten eines einzelnen Runs.
Eines ohne das andere funktioniert nicht:
- ohne budget controls kann ein einzelner Run zu teuer werden
- ohne rate limiting können viele Runs Abhängigkeiten überlasten
Beispiel:
- rate limit: nicht mehr als 10 Anfragen pro Minute an
search_api - budget controls: nicht mehr als
max_tool_calls=12undmax_usd=1.00pro Run
Metriken der Budgetkontrolle
Diese Metriken und Signale wirken bei jedem Agent-Schritt zusammen.
| Metrik | Was sie kontrolliert | Wichtige Mechaniken | Warum |
|---|---|---|---|
| Step budget | Run-Länge in Schritten | max_stepsstop reason max_steps | Stoppt Schleifen bevor Kosten wachsen |
| Time budget | Run-Dauer in Sekunden | max_secondswall-clock timeout | Verhindert, dass lange Runs Ressourcen blockieren |
| Tool-call budget | Anzahl der Tool-Aufrufe | max_tool_callsLimit pro Run | Begrenzt Tool-Spam und Retry-Ketten |
| Spend budget | Geldausgaben pro Run | max_usdusage-Berechnung | Setzt eine harte finanzielle Grenze |
| Observability (budget) | Sichtbarkeit von Budget-Entscheidungen | audit logs alerts (Slack / PagerDuty) | Begrenzt Aktionen nicht direkt, hilft aber Überziehungen schnell zu finden und zu erklären |
Beispiel für alert:
Slack: 🛑 Agent Support-Bot hit max_usd limit ($100). Run stopped at step 12.
So sieht das in der Architektur aus
Die Budget-Policy-Layer steht zwischen Runtime und Aktionsausführung und prüft Limits vor jedem Schritt.
Jede Entscheidung (allow oder stop) wird im audit log gespeichert.
Jeder Agent-Schritt geht vor Ausführung durch diesen Flow: Runtime führt keine Aktion direkt aus — zuerst Budget-Prüfung, dann Ausführung.
Kurz zum Flow:
- Runtime aktualisiert usage (Schritte, Zeit, Tool-Aufrufe, Kosten)
- Budget-Policy-Layer prüft Limits
allow-> der nächste Schritt wird ausgeführtstop-> stop reason und partial response werden zurückgegeben- beide Entscheidungen werden in audit log geschrieben
Beispiel
Ein Support-Agent bearbeitet eine Anfrage und ruft wegen einer instabilen API wiederholt refund.lookup auf.
Mit budget controls:
max_tool_calls = 8max_seconds = 45max_usd = 1.00
-> der Run wird beim Erreichen des Limits gestoppt, nicht erst nach unkontrolliertem Kostenwachstum.
Budget controls stoppen den Incident auf Ausführungsebene, statt darauf zu hoffen, dass das Modell selbst stoppt.
Im Code sieht das so aus
Im vereinfachten Schema oben ist der zentrale control flow gezeigt. In der Praxis wird der Budget-Check oft zweimal ausgeführt: vor der Schrittausführung und nach dem Update des tatsächlichen usage. Der Schrittzähler wird vor der Prüfung erhöht, damit der aktuelle Schritt im Budget erfasst wird.
usage.update(step=1)
decision = budget.check(usage, limits)
if not decision.allowed:
audit.log(run_id, decision.outcome, reason=decision.reason, usage=usage.snapshot())
alerts.notify_if_needed(run_id, decision.reason, usage.snapshot())
return stop(decision.reason)
result = tool.execute(args)
usage.update(tool_call=1, usd=result.cost_usd)
decision = budget.check(usage, limits)
if not decision.allowed:
audit.log(run_id, decision.outcome, reason=decision.reason, usage=usage.snapshot())
alerts.notify_if_needed(run_id, decision.reason, usage.snapshot())
return stop(decision.reason)
audit.log(run_id, decision.outcome, reason=decision.reason, usage=usage.snapshot(), result=result.status)
return result
So sieht das während der Ausführung aus
Szenario 1: Limit erreicht (stop)
1. Runtime beendet Schritt 9 und aktualisiert das tatsächliche usage.
2. Budget policy sieht, dass max_usd überschritten ist.
3. Entscheidung: stop (max_usd).
4. Audit: decision=stop, reason=max_usd, step=9.
5. Der Nutzer erhält eine partial response mit stop reason.
---
Szenario 2: Limit nicht erreicht (allow)
1. Runtime startet Schritt 4 und aktualisiert usage.
2. Budget policy prüft Limits: alles im Rahmen.
3. Entscheidung: allow.
4. Tool-Aufruf wird ausgeführt.
5. Audit: decision=allow, usage aktualisiert, Ergebnis zurückgegeben.
Typische Fehler
- nur Tokens begrenzen und
max_seconds,max_tool_callssowiemax_usdignorieren - Budgets nur "am Ende" prüfen, nicht vor jedem Schritt
- keinen expliziten stop reason an Nutzer zurückgeben
- Budgetlogik über Runtime, Tools und UI verteilen
- budget decisions (
allow/stop) nicht im audit trail loggen - kein alerting auf
max_usdundmax_tool_calls
Im Ergebnis wirkt das System stabil, verliert unter Last aber schnell die Vorhersagbarkeit.
Selbst-Check
Schneller budget-controls Check vor dem Production-Start:
Fortschritt: 0/8
⚠ Grundlegende Governance-Kontrollen fehlen
Vor production brauchen Sie mindestens Zugriffskontrolle, Limits, audit logs und einen Not-Stopp.
FAQ
Q: Reicht ein token budget allein?
A: Nein. Tools können mehr kosten als Tokens. Minimum: max_steps, max_seconds, max_tool_calls, max_usd.
Q: Was zuerst einführen: max_steps oder max_usd?
A: Starte mit max_steps und max_tool_calls, um Schleifen sofort zu stoppen. Danach ergänze max_usd als finanzielle Grenze.
Q: Was soll der Nutzer bei budget stop erhalten?
A: Partial response + expliziter stop reason + kurze Next-Step-Hilfe (Anfrage eingrenzen oder mit höherem Budget erneut starten).
Q: Brauchen wir Budgets pro Tenant?
A: Ja. Unterschiedliche Tarife oder Teams brauchen unterschiedliche Limits, aber die Prüfmechanik sollte gleich bleiben.
Q: Ersetzen budget controls rate limiting?
A: Nein. Rate limiting schützt Abhängigkeiten vor Peaks, budget controls schützen den Run vor runaway-Kosten.
Wo Budget Controls im Gesamtsystem liegen
Budget controls sind eine der Ebenen von Agent Governance. Zusammen mit RBAC, execution limits, approval und audit bilden sie ein einheitliches Ausführungskontrollsystem.
Verwandte Seiten
Weiter zum Thema:
- Agent Governance Überblick — Gesamtmodell zur Agent-Kontrolle in Production.
- Zugriffskontrolle (RBAC) — wie man begrenzt, wer was aufrufen darf.
- Rate Limiting für Agenten — wie man Tools und APIs vor Lastspitzen schützt.
- Step Limits — wie man Endlosschleifen über die Schrittzahl stoppt.
- Audit Logs für Agenten — wie man Incidents über stop reasons und policy-layer Entscheidungen analysiert.