400 von einer Sicherheitskontrolle ist
kein Bug in Ihrem Prompt. Es ist eine Policy, die ihre Arbeit tut. Ihre Aufgabe
ist es, herauszufinden, welche Policy, und dann zu entscheiden, ob Sie den
Aufruf beheben oder die Regel lockern.
1. Warum wurde mein LLM-Request blockiert? — beginnen Sie mit dem Fehlercode
Jeder Sicherheitsblock auf dem gehosteten Gateway gibt HTTP 400 mit einem maschinenlesbarencode im OpenAI-förmigen Fehler-Body zurück. Dieser Code ist
die erste Weggabelung — er sagt Ihnen, welche Control-Plane Sie debuggen und
welchen Feed Sie öffnen müssen.
firewall_approval_pending
Ein Tool-Call ist für eine menschliche Freigabe zurückgehalten — nicht
abgelehnt. Lösen Sie es auf, debuggen Sie es nicht. Siehe
§4.
Alle drei Codes sind skip-retry: Denselben Aufruf identisch erneut auszuführen
routet zu derselben Policy und blockiert wieder. Ein Retry ist verschwendete
Latenz — beheben Sie stattdessen den Input oder die Regel. Die vollständige
Code-Tabelle steht in Fehlercodes.
2. guardrail_blocked — die Regel in Matches finden
guardrail_blocked bedeutet, dass eine an Ihren Key (oder Ihren
Workspace-Default) angehängte Inhaltspolicy eine block-Aktion gegen den
Request-Input oder die Modellausgabe ausgeführt hat. Die Block-Nachricht benennt
das Guardrail und die Regel, und der Request kostet Sie kein Kontingent —
Input-Blocks feuern vor der Messung; Output-Blocks erstatten das vorab verbrauchte
Kontingent.
So verfolgen Sie es:
Öffnen Sie den Matches-Feed
Gehen Sie in der Konsole zum Matches-Tab auf der Guardrails-Seite
(
GET /api/guardrail/match, Member). Jede Regel, die feuert, landet hier —
ihr RuleType, ihre Action, ihre Stage und ein Detail-String wie
pii: email, phone oder matched 3 keyword(s).Filtern Sie auf den Block
Filtern Sie nach
action = block und der Zeit Ihres Requests. Die gematchte
Zeile sagt Ihnen den Regeltyp (pii, regex, keyword, max_chars,
llm_judge, grounding, external) und ob sie im input- oder
output-Stage gefeuert hat.Sehen Sie, was sie tatsächlich gematcht hat
Standardmäßig zeichnet der Feed auf, dass eine Regel gefeuert hat, und ihren
Detail-Meta-String — nicht den gematchten Teilstring. Schalten Sie
Log raw content auf diesem Guardrail ein (es ist standardmäßig aus, die
datenschutzkonservative Haltung), um den anstößigen String zur Triage zu
erfassen. Der Schalter ist nicht rückwirkend.Ein konkretes Beispiel
Sie senden eine Support-Antwort, die eine Kunden-SSN enthält. Ihrpii-shield-
Guardrail hat ein entity_actions-Override, das auf ssn blockiert:
400 guardrail_blocked zurück. Der Matches-Feed zeigt
RuleType: pii, Action: block, Stage: input, Detail: pii: ssn. Der Fix
ist eine Produktentscheidung, keine Code-Änderung: Lockern Sie das Override auf
mask (das Modell sieht die SSN nie, der Aufruf geht durch), oder behalten Sie
den Block bei und entfernen Sie die SSN upstream. Siehe Guardrails
für die vollständige Regeltyp- und PII-Entitäten-Referenz.
3. firewall_blocked — das Verdikt in Events finden
firewall_blocked bedeutet, dass eine Firewall-Policy
einen Tool-Call abgelehnt hat. Auf der inbound-Surface zeigt es sich als 400;
durch das MCP-Gateway zeigt es sich als Tool-Fehler (firewall deny: <reason>),
sodass das Modell reagieren kann, statt abzustürzen. Die Fehler-metadata trägt
den Reason-Code, die Risikofaktoren und den Score.
Verfolgen Sie es im Events-Feed (GET /api/workspace/firewall/events,
Developer+) — dem Rohdatensatz hinter jeder Auswertung. Jedes Event trägt ein
Verdikt und die Surface, auf der es gesehen wurde:
| Verdikt | Was es für Ihren Block bedeutet |
|---|---|
deny | Eine Regel (oder das default_verdict) hat den Aufruf blockiert. Das ist Ihr firewall_blocked. |
audit | Erlaubt, aber geloggt — einschließlich eines [shadow] „would deny”, wenn die Policy im Shadow-Mode ist. |
cap_cost | Die kumulierten Ausgaben des Runs haben eine Pro-Regel-Cent-Obergrenze überschritten; löst sich zu einem Deny auf. |
Filtern Sie Events auf die Ablehnung
Filtern Sie nach
verdict=deny, dann nach tool, run_id oder
session_id, um den exakten Aufruf zu isolieren. Das Event benennt die
gematchte Regel und die Surface — inbound, response, mcp oder egress.Lesen Sie den Grund auf der gematchten Regel
Der Grund-String (z. B.
destructive shell command, egress host not allowed)
sagt Ihnen, ob die Regel auf dem Tool-Namen, einer args_match-Klausel oder
einem Egress-Ziel gematcht hat. Das Verdikt-Glossar
und die Glob- & JSONPath-Referenz
dekodieren das Matching.4. firewall_approval_pending — es ist zurückgehalten, nicht abgelehnt
firewall_approval_pending ist der eine 400, den Sie nicht als Block
behandeln sollten. Ein pending_approval-Verdikt hat den Tool-Call für einen
Menschen zurückgehalten; der Fehler-Body trägt eine Approval-ID. Der Aufruf
ist nicht fehlgeschlagen — er wartet.
- Ein Prüfer löst es auf — über die Konsole (Developer+) oder über Ihren eigenen
HMAC-Webhook-Callback (
POST /api/v1/firewall/approvals/:id/callback). - Ihr Agent pollt
GET /api/v1/firewall/approvals/:id(Gateway-Token) auf die ID aus dem Fehler. - Sobald genehmigt, reichen Sie den ursprünglichen Aufruf mit dem einmal
nutzbaren
X-OrcaRouter-Firewall-Approval-Header erneut ein, und das Gateway lässt ihn dieses eine Mal durch.
5. Kein Sicherheitsblock? Schließen Sie zuerst den Key aus
Nicht jeder400 ist ein Guardrail- oder Firewall-Verdikt. Bevor Sie ins
Feed-Tauchen gehen, schließen Sie die Key-Constraints aus — diese lehnen ab,
bevor irgendeine Policy läuft, und tragen nicht die obigen Sicherheitscodes:
Modell vor dem Upstream-Aufruf abgelehnt
Modell vor dem Upstream-Aufruf abgelehnt
Die
model_limits-Allowlist des Keys schließt das angefragte Modell nicht
ein. Requests für ein Modell außerhalb der Liste werden vorab abgelehnt. Fügen
Sie das Modell dem Key hinzu oder rufen Sie eines auf, das erlaubt ist.Bei der Authentifizierung nach IP abgelehnt
Bei der Authentifizierung nach IP abgelehnt
Der Key hat eine
allow_ips-Allowlist und der Request kam von einer Adresse
außerhalb davon. Fügen Sie die IP / CIDR des Aufrufers hinzu oder rufen Sie aus
einem erlaubten Netzwerk auf.Ausgabenobergrenze erreicht
Ausgabenobergrenze erreicht
Die
credit_limit_usd-Obergrenze des Keys ist erschöpft (0 bedeutet
unbegrenzt). Heben Sie die Obergrenze an oder wechseln Sie zu einem Key mit
Spielraum.403 auf /api/v1/firewall/*-Routen
403 auf /api/v1/firewall/*-Routen
Die Gateway-Hooks (
evaluate, MCP-Dispatch) erfordern einen Key mit
is_firewall_gateway=true. Ein regulärer Relay-Key erhält 403. Prägen Sie
einen firewall-gateway-scoped Key für diese Routen.6. Der Zwei-Minuten-Triage-Flow
Block auf Prompt- oder Antworttext
Code ist
guardrail_blocked → öffnen Sie Matches, filtern Sie
action=block, lesen Sie Stage + Detail. Beheben Sie den Inhalt oder die
Regel; beweisen Sie es im Guardrail-Test-Tab.Block auf einem Tool-Call
Code ist
firewall_blocked → öffnen Sie Events, filtern Sie
verdict=deny, lesen Sie Surface + Grund. Beheben Sie den Aufruf oder die
Regel; beweisen Sie es im Firewall-Test-Tab.Aufruf ist zurückgehalten
Code ist
firewall_approval_pending → pollen Sie die Approval-ID und
reichen Sie mit dem Approval-Header erneut ein. Nichts zu debuggen.Nichts davon
Kein Sicherheitscode → prüfen Sie den Key:
model_limits, allow_ips,
credit_limit_usd oder 403 für einen fehlenden Gateway-Scope.7. Verwandte Referenzen
Fehlercodes
Die vollständige Code-Tabelle — jeder Block, Hold und jede Ablehnung, die das
Gateway zurückgeben kann.
Verdikt-Glossar
Was jedes Firewall-Verdikt bedeutet und wann es sich zu einem Deny auflöst.
Glob & JSONPath
Dekodieren Sie das
tool_name_glob und args_match, das Ihren Aufruf gematcht
hat.Guardrails vs. Firewall
Welche Plane gefeuert hat — Text-Screening oder Aktions-Governance.
