400. Drei Sicherheitscodes decken die
Fälle ab, die Ihnen begegnen: ein gescreenter Prompt oder eine gescreente
Antwort, ein abgelehnter Tool-Call und ein Tool-Call, der für eine menschliche
Freigabe zurückgehalten wird.
Diese Seite ist die Referenz für diese Codes — der Anwendungsfall für jeden, der
exakte HTTP-Status, was er Sie kostet, und die eine Regel, die am wichtigsten
ist: Retry-Logik muss sie als Sonderfall behandeln. Alle drei sind als
skip-retry markiert; denselben Aufruf blind erneut auszuführen löst einfach
wieder dieselbe Kontrolle aus.
Dies sind Durchsetzungs-Codes — das Gateway entscheidet, Ihren Aufruf nicht
weiterzuleiten. Sie sind verschieden von Upstream-Anbieterfehlern (ein Modell-429,
ein Context-Overflow) und von Auth-Fehlern. Warum ein bestimmter Request gestoppt
wurde, beschreibt Warum wurde das blockiert?.
1. Die LLM-Sicherheits-Fehlercodes auf einen Blick
Jeder Sicherheitsblock gibt HTTP 400 mit einem OpenAI-förmigen Fehler-Body zurück (error.code ist der typisierte String unten). Auf nativen Claude-Routen
(/v1/messages) reist derselbe Code in der Claude-Fehlerform, sodass das
SDK-Routing protokollübergreifend deterministisch ist.
| Code | Stoppt | Kontingentkosten |
|---|---|---|
guardrail_blocked | Einen Prompt oder eine Antwort, der/die auf eine block-Regel traf | Keine |
firewall_blocked | Einen abgelehnten Tool-Call / ein abgelehntes Angebot | Keine Modell-Tokens |
firewall_approval_pending | Einen Tool-Call, der für einen menschlichen Prüfer zurückgehalten wird | Keine Modell-Tokens |
2. guardrail_blocked — ein gescreenter Prompt oder eine Antwort
Wird zurückgegeben, wenn eine Guardrail-Regel mit der
block-Aktion feuert — ein gesperrtes Keyword, ein Regex-Treffer, eine PII- oder
Secret-Entität, die Sie zu blockieren statt zu maskieren gewählt haben, ein
llm_judge-Verdikt oder eine fehlgeschlagene Grounding-Prüfung.
HTTP 400. Die Nachricht benennt das Guardrail und die Regel, die gefeuert hat.
Kontingentauswirkung: keine
Kontingentauswirkung: keine
Ein blockierter Request kostet kein Kontingent. Ein Block im Input-Stage
feuert vor der Messung, sodass nie etwas berechnet wird. Ein Block im
Output-Stage läuft nachdem das Modell geantwortet hat, sodass das Gateway
das vorab verbrauchte Kontingent erstattet, bevor es den Fehler
zurückgibt. So oder so zahlen Sie nichts für einen blockierten Aufruf.
Warum es skip-retry ist
Warum es skip-retry ist
Das Verdikt ist eine Eigenschaft des Inhalts, nicht des Channels. Denselben
Prompt erneut auszuführen — selbst gegen ein anderes Modell — erzeugt denselben
Block. Beheben Sie den Input (oder die Policy), statt es erneut zu versuchen.
Wie eine Maske stattdessen aussieht
Wie eine Maske stattdessen aussieht
mask-Regeln geben diesen Code nicht zurück. Ein maskierter Treffer (z. B.
jane@acme.com → [EMAIL]) wird an Ort und Stelle redigiert und der Aufruf
läuft normal weiter — Sie erhalten einen 200, nur mit entferntem sensiblem
Bereich. Nur die block-Aktion bringt guardrail_blocked zum Vorschein.
(flag ändert am Traffic überhaupt nichts.)3. firewall_blocked — ein abgelehnter Tool-Call
Wird zurückgegeben, wenn die Firewall ein deny-Verdikt
für einen Tool-Call auflöst — ein destruktiver Shell-Befehl, ein SSRF-förmiger
Fetch, ein Egress-Ziel auf einer Deny-Liste oder ein
Skill im block-Mode.
Wie sich das Deny zeigt, hängt von der Enforcement-Surface ab:
inbound / response / egress
HTTP 400 mit
error.code = firewall_blocked. Der Body trägt
strukturierte error.metadata (reason_code, Risiko-factors, risk_score),
sodass Sie den Block erklären können, nicht nur sehen.mcp-Surface
Wird als Tool-Fehler (
firewall deny: <reason>) zurückgegeben, nicht als
Transportfehler — sodass das Modell die Ablehnung sieht und ein anderes Tool
wählen, den Nutzer fragen oder anhalten kann, statt den Run abstürzen zu lassen.4. firewall_approval_pending — für einen Menschen zurückgehalten
Wird in dem Moment zurückgegeben, in dem ein Tool-Call auf ein
pending_approval-Verdikt trifft. Ein Human-in-the-Loop-Gate kann kein
blockierendes Inline-Warten sein, sodass das Gateway sofort eine held-Antwort
zurückgibt, statt per Long-Polling zu warten.
HTTP 400. Der Fehler trägt die Approval-ID, sodass Ihr Agent weiß, welchen
Hold er auflösen muss.
Dies ist der eine Code, auf den Sie durch Auflösen und erneutes Einreichen
reagieren — nicht, indem Sie ihn als terminalen Fehler behandeln:
Lesen Sie die Approval-ID aus dem held-Fehler
Die ID ist aus dem Fehler-Body wiederherstellbar. Versuchen Sie den Aufruf
noch nicht erneut — ein naiver Retry hält ihn einfach erneut zurück.
Warten Sie auf eine Entscheidung
Ein Prüfer löst es über die Konsole (Developer+) auf, oder Ihr Approval-System
erhält einen HMAC-signierten Webhook-Callback. Ihr Agent pollt
GET /api/v1/firewall/approvals/:id auf den Zustand.Die Approval-Routen (
/api/v1/firewall/approvals/*) laufen auf einem
firewall-gateway-scoped Key, nicht auf Ihrer Konsolen-Session. Siehe
Menschliche Freigabe (HITL)
für die vollständige Schleife und Webhook-Payloads
für die Callback-Signatur.5. Warum alle drei den Retry überspringen
Standard-SDK-Retry-Logik nimmt an, dass ein400 bei einem zweiten Versuch
gelingen könnte. Diese Codes brechen diese Annahme — der Block ist deterministisch,
sodass ein blinder Retry einen Round-Trip verschwendet und (bei zurückgehaltenen
Aufrufen) stillschweigend eine Freigabe erneut einreiht.
Was 'skip-retry' in der Praxis bedeutet
Was 'skip-retry' in der Praxis bedeutet
OrcaRouters eigene interne Retry-/Fallback-Mechanik versucht nie einen Aufruf
erneut, der einen dieser Codes zurückgibt, gegen einen anderen Channel.
Spiegeln Sie das in Ihrem Client: Bei einem Sicherheitscode stoppen Sie und
handeln Sie nach dem Verdikt, schleifen Sie nicht.
Die richtige Reaktion pro Code
Die richtige Reaktion pro Code
guardrail_blocked→ beheben Sie den Input oder lockern Sie die Policy; bringen Sie die Ablehnung dem Nutzer zur Kenntnis. Nicht erneut versuchen.firewall_blocked→ die Aktion ist unzulässig; lassen Sie den Agenten ein anderes Tool wählen oder um Hilfe bitten. Nicht erneut versuchen.firewall_approval_pending→ lösen Sie den Hold auf und reichen Sie dann einmal mit dem Approval-Header erneut ein (§4). Ein Retry ohne den Header hält erneut zurück.
6. Kontingent- & Abrechnungszusammenfassung
Ein Sicherheitsblock berechnet Ihnen nie die blockierte Arbeitseinheit.| Code | Wann er feuert | Abrechnungsergebnis |
|---|---|---|
guardrail_blocked (input) | Vor dem Modellaufruf | Nie gemessen |
guardrail_blocked (output) | Nachdem das Modell antwortet | Vorab verbrauchtes Kontingent erstattet |
firewall_blocked (inbound) | Vor dem Modellaufruf | Keine Modell-Tokens |
firewall_approval_pending | Vor dem Dispatch | Keine Modell-Tokens |
7. Verwandte Referenzen
Warum wurde das blockiert?
Verfolgen Sie einen einzelnen Block zu der exakten Regel, Surface und dem
Grund, der ihn erzeugt hat.
Verdikt-Glossar
Jedes Firewall-Verdikt — allow, audit, deny, sanitize, pending_approval,
cap_cost — und was jedes erzeugt.
Webhook- & Fehler-Payloads
Das vollständige Fehler-Envelope, die
error.metadata-Felder und die
Approval-Callback-Signatur.Enforcement-Modes
Shadow, observe und enforce — wann ein Verdikt tatsächlich den Traffic ändert.
