400 de un control de seguridad no es un bug en tu
prompt. Es una política haciendo su trabajo. Tu trabajo es encontrar cuál
política, luego decidir si arreglar la llamada o relajar la regla.
1. ¿Por qué se bloqueó mi solicitud de llm? — empieza por el código de error
Cada bloqueo de seguridad en el gateway alojado devuelve HTTP 400 con uncode
legible por máquina en el cuerpo de error con forma de OpenAI. Ese código es la
primera bifurcación del camino — te dice qué plano de control depurar y qué feed
abrir.
firewall_approval_pending
Una llamada a herramienta está retenida para aprobación humana — no denegada.
Resuélvela, no la depures. Ve §4.
Los tres códigos son skip-retry: reejecutar la llamada idéntica enruta a la
misma política y bloquea de nuevo. Reintentar es latencia desperdiciada — arregla la
entrada o la regla en su lugar. La tabla completa de códigos vive en
Códigos de error.
2. guardrail_blocked — encuentra la regla en Matches
guardrail_blocked significa que una política de contenido adjunta a tu clave (o el
valor por defecto de tu espacio de trabajo) ejecutó una acción block contra la
entrada de la solicitud o la salida del modelo. El mensaje de bloqueo nombra el
guardrail y la regla, y la solicitud no te cuesta cuota — los bloqueos de entrada
se disparan antes del medido; los bloqueos de salida reembolsan la cuota preconsumida.
Rastréalo:
Abre el feed de Matches
En la consola, ve a la pestaña Matches en la página de Guardrails
(
GET /api/guardrail/match, Member). Cada regla que se dispara aterriza aquí — su
RuleType, Action, Stage y una cadena Detail como pii: email, phone o
matched 3 keyword(s).Filtra al bloqueo
Filtra por
action = block y la hora de tu solicitud. La fila coincidente te dice
el tipo de regla (pii, regex, keyword, max_chars, llm_judge, grounding,
external) y si se disparó en la etapa input o output.Ve qué coincidió realmente
Por defecto el feed registra que una regla se disparó y su meta-cadena
Detail —
no la subcadena coincidente. Activa Log raw content en ese guardrail (está
apagado por defecto, la postura conservadora con la privacidad) para capturar la
cadena ofensora para el triaje. El interruptor no es retroactivo.Un ejemplo concreto
Envías una respuesta de soporte que contiene el SSN de un cliente. Tu guardrailpii-shield tiene un override de entity_actions que bloquea en ssn:
400 guardrail_blocked. El feed de Matches muestra
RuleType: pii, Action: block, Stage: input, Detail: pii: ssn. El arreglo es
una decisión de producto, no un cambio de código: relaja el override a mask (el
modelo nunca ve el SSN, la llamada pasa), o mantén el bloqueo y elimina el SSN
upstream. Ve Guardrails para la referencia completa de tipos
de regla y entidades PII.
3. firewall_blocked — encuentra el veredicto en Events
firewall_blocked significa que una política de Firewall
denegó una llamada a herramienta. En la superficie inbound se manifiesta como 400;
a través del gateway MCP se manifiesta como un error de herramienta
(firewall deny: <reason>) para que el modelo pueda reaccionar en vez de tumbarse. La
metadata del error lleva el código de razón, los factores de riesgo y la puntuación.
Rastréalo en el feed de Events (GET /api/workspace/firewall/events, Developer+) —
el registro en bruto detrás de cada evaluación. Cada evento lleva un veredicto y la
superficie en la que se vio:
| Veredicto | Qué significa para tu bloqueo |
|---|---|
deny | Una regla (o el default_verdict) bloqueó la llamada. Este es tu firewall_blocked. |
audit | Permitido pero registrado — incluyendo un [shadow] “would deny” si la política está en modo shadow. |
cap_cost | El gasto acumulado de la ejecución cruzó un tope en centavos por regla; resuelve a un deny. |
Filtra Events a la denegación
Filtra por
verdict=deny, luego por tool, run_id o session_id para aislar
la llamada exacta. El evento nombra la regla coincidente y la superficie —
inbound, response, mcp o egress.Lee la razón en la regla coincidente
La cadena de razón (p. ej.
destructive shell command, egress host not allowed)
te dice si la regla coincidió por el nombre de herramienta, una cláusula
args_match o un destino de egress. El
glosario de veredictos y la
referencia de glob y JSONPath decodifican la
coincidencia.4. firewall_approval_pending — está retenida, no denegada
firewall_approval_pending es el único 400 que no deberías tratar como un
bloqueo. Un veredicto pending_approval retuvo la llamada a herramienta para un
humano; el cuerpo del error lleva un id de aprobación. La llamada no ha fallado —
está esperando.
- Un revisor la resuelve — desde la consola (Developer+) o vía tu propio callback
de webhook HMAC (
POST /api/v1/firewall/approvals/:id/callback). - Tu agente hace polling de
GET /api/v1/firewall/approvals/:id(token de gateway) sobre el id del error. - Una vez aprobado, reenvía la llamada original con la cabecera de un solo uso
X-OrcaRouter-Firewall-Approval, y el gateway la deja pasar esa única vez.
5. ¿No es un bloqueo de seguridad? Descarta la clave primero
No todo400 es un veredicto de guardrail o firewall. Antes de que te pongas a bucear
en los feeds, descarta las restricciones de la clave — estas rechazan antes de
que se ejecute cualquier política y no llevan los códigos de seguridad de arriba:
Modelo rechazado antes de la llamada upstream
Modelo rechazado antes de la llamada upstream
La allow-list de
model_limits de la clave no incluye el modelo solicitado. Las
solicitudes de un modelo fuera de la lista se rechazan de entrada. Añade el modelo a
la clave o llama a uno permitido.Rechazado en la autenticación por IP
Rechazado en la autenticación por IP
La clave tiene una allow-list
allow_ips y la solicitud vino de una dirección fuera
de ella. Añade la IP / CIDR del llamante o llama desde una red permitida.Tope de gasto alcanzado
Tope de gasto alcanzado
El techo
credit_limit_usd de la clave está agotado (0 significa ilimitado). Sube
el tope o rota a una clave con margen.403 en las rutas /api/v1/firewall/*
403 en las rutas /api/v1/firewall/*
Los hooks del gateway (
evaluate, despacho MCP) requieren una clave con
is_firewall_gateway=true. Una clave de relay normal obtiene 403. Acuña una clave
con alcance de gateway de firewall para esas rutas.6. El flujo de triaje de dos minutos
Bloqueo en texto de prompt o respuesta
El código es
guardrail_blocked → abre Matches, filtra action=block, lee
el Stage + Detail. Arregla el contenido o la regla; pruébalo en la pestaña
Test del guardrail.Bloqueo en una llamada a herramienta
El código es
firewall_blocked → abre Events, filtra verdict=deny, lee la
superficie + razón. Arregla la llamada o la regla; pruébalo en la pestaña Test
del firewall.La llamada está retenida
El código es
firewall_approval_pending → haz polling del id de aprobación y
reenvía con la cabecera de aprobación. Nada que depurar.Ninguno de los anteriores
Sin código de seguridad → revisa la clave:
model_limits, allow_ips,
credit_limit_usd, o 403 por un alcance de gateway faltante.7. Referencias relacionadas
Códigos de error
La tabla completa de códigos — cada bloqueo, retención y rechazo que el gateway
puede devolver.
Glosario de veredictos
Qué significa cada veredicto del firewall y cuándo resuelve a un deny.
Glob y JSONPath
Decodifica el
tool_name_glob y el args_match que coincidieron con tu llamada.Guardrails vs Firewall
Qué plano se disparó — examen de texto o gobierno de acciones.
