400 de um controle de segurança não é um
bug no seu prompt. É uma política fazendo seu trabalho. Sua tarefa é encontrar
qual política, depois decidir se corrige a chamada ou relaxa a regra.
1. Por que minha requisição de llm foi bloqueada? — comece pelo código de erro
Todo bloqueio de segurança no gateway hospedado retorna HTTP 400 com umcode legível por máquina no corpo de erro no formato da OpenAI. Esse código é
a primeira bifurcação no caminho — ele lhe diz qual plano de controle depurar e
qual feed abrir.
firewall_approval_pending
Uma chamada de ferramenta está retida para aprovação humana — não
negada. Resolva-a, não a depure. Veja
§4.
Todos os três códigos são skip-retry: reexecutar a chamada idêntica roteia
para a mesma política e bloqueia de novo. Fazer retry é latência desperdiçada —
corrija a entrada ou a regra em vez disso. A tabela completa de códigos vive em
Códigos de erro.
2. guardrail_blocked — encontre a regra em Matches
guardrail_blocked significa que uma política de conteúdo vinculada à sua chave
(ou ao padrão do seu workspace) rodou uma ação block contra a entrada da
requisição ou a saída do modelo. A mensagem de bloqueio nomeia o guardrail e a
regra, e a requisição não custa cota a você — bloqueios de entrada disparam
antes da medição; bloqueios de saída reembolsam a cota pré-consumida.
Rastreie:
Abra o feed de Matches
No console, vá até a aba Matches na página de Guardrails
(
GET /api/guardrail/match, Member). Toda regra que dispara cai aqui — seu
RuleType, Action, Stage e uma string Detail como
pii: email, phone ou matched 3 keyword(s).Filtre pelo bloqueio
Filtre por
action = block e o horário da sua requisição. A linha
correspondente lhe diz o tipo de regra (pii, regex, keyword,
max_chars, llm_judge, grounding, external) e se disparou no estágio
input ou output.Veja o que ela realmente correspondeu
Por padrão, o feed registra que uma regra disparou e sua meta-string
Detail — não a substring correspondente. Ligue Log raw content
naquele guardrail (está desligado por padrão, a postura conservadora de
privacidade) para capturar a string ofensora para triagem. O interruptor é
não-retroativo.Um exemplo concreto
Você envia uma resposta de suporte que contém o SSN de um cliente. Seu guardrailpii-shield tem um override de entity_actions que bloqueia em ssn:
400 guardrail_blocked. O feed de Matches mostra
RuleType: pii, Action: block, Stage: input, Detail: pii: ssn. A correção
é uma decisão de produto, não uma mudança de código: relaxe o override para
mask (o modelo nunca vê o SSN, a chamada passa), ou mantenha o bloqueio e
remova o SSN upstream. Veja Guardrails para a
referência completa de tipos de regra e entidades de PII.
3. firewall_blocked — encontre o veredito em Events
firewall_blocked significa que uma política de Firewall
negou uma chamada de ferramenta. Na superfície inbound ela se manifesta como
400; através do gateway MCP ela se manifesta como um erro de ferramenta
(firewall deny: <reason>) para que o modelo possa reagir em vez de quebrar. O
metadata do erro carrega o código de motivo, fatores de risco e score.
Rastreie no feed de Events (GET /api/workspace/firewall/events,
Developer+) — o registro bruto por trás de cada avaliação. Cada evento carrega
um veredito e a superfície na qual foi visto:
| Veredito | O que significa para o seu bloqueio |
|---|---|
deny | Uma regra (ou o default_verdict) bloqueou a chamada. Este é o seu firewall_blocked. |
audit | Permitido mas registrado — incluindo um [shadow] “would deny” se a política está em shadow mode. |
cap_cost | O gasto acumulado da run cruzou um limite por regra em centavos; resolve para um deny. |
Filtre Events para a negação
Filtre por
verdict=deny, depois por tool, run_id ou session_id para
isolar a chamada exata. O evento nomeia a regra correspondente e a
superfície — inbound, response, mcp ou egress.Leia o motivo na regra correspondente
A string de motivo (ex.:
destructive shell command,
egress host not allowed) lhe diz se a regra correspondeu pelo nome da
ferramenta, por uma cláusula args_match ou por um destino de egress. O
glossário de vereditos e a
referência de glob & JSONPath
decodificam a correspondência.4. firewall_approval_pending — está retida, não negada
firewall_approval_pending é o único 400 que você não deve tratar como um
bloqueio. Um veredito pending_approval reteve a chamada de ferramenta para um
humano; o corpo do erro carrega um id de aprovação. A chamada não falhou —
ela está esperando.
- Um revisor a resolve — a partir do console (Developer+) ou via seu próprio
callback de webhook HMAC (
POST /api/v1/firewall/approvals/:id/callback). - Seu agente consulta
GET /api/v1/firewall/approvals/:id(token de gateway) com o id do erro. - Uma vez aprovada, reenvie a chamada original com o header de uso único
X-OrcaRouter-Firewall-Approval, e o gateway a deixa passar aquela única vez.
5. Não é um bloqueio de segurança? Descarte a chave primeiro
Nem todo400 é um veredito de guardrail ou firewall. Antes de mergulhar nos
feeds, descarte as restrições de chave — estas rejeitam antes de qualquer
política rodar e não carregam os códigos de segurança acima:
Modelo rejeitado antes da chamada upstream
Modelo rejeitado antes da chamada upstream
A allow-list
model_limits da chave não inclui o modelo requisitado.
Requisições para um modelo fora da lista são rejeitadas de antemão. Adicione
o modelo à chave ou chame um que esteja permitido.Rejeitado na autenticação por IP
Rejeitado na autenticação por IP
A chave tem uma allow-list
allow_ips e a requisição veio de um endereço
fora dela. Adicione o IP / CIDR do chamador ou chame de uma rede permitida.Limite de gasto atingido
Limite de gasto atingido
O teto
credit_limit_usd da chave foi esgotado (0 significa ilimitado).
Eleve o limite ou alterne para uma chave com folga.403 nas rotas /api/v1/firewall/*
403 nas rotas /api/v1/firewall/*
Os hooks do gateway (
evaluate, dispatch de MCP) exigem uma chave com
is_firewall_gateway=true. Uma chave de relay normal recebe 403. Cunhe
uma chave com escopo de firewall-gateway para essas rotas.6. O fluxo de triagem de dois minutos
Bloqueio em texto de prompt ou resposta
O código é
guardrail_blocked → abra Matches, filtre
action=block, leia o Stage + Detail. Corrija o conteúdo ou a regra;
prove na aba Test do guardrail.Bloqueio em uma chamada de ferramenta
O código é
firewall_blocked → abra Events, filtre verdict=deny,
leia a superfície + motivo. Corrija a chamada ou a regra; prove na aba
Test do firewall.A chamada está retida
O código é
firewall_approval_pending → consulte o id de aprovação e
reenvie com o header de aprovação. Nada a depurar.Nenhum dos acima
Sem código de segurança → verifique a chave:
model_limits, allow_ips,
credit_limit_usd, ou 403 por um escopo de gateway ausente.7. Referências relacionadas
Códigos de erro
A tabela completa de códigos — todo bloqueio, hold e rejeição que o gateway
pode retornar.
Glossário de vereditos
O que cada veredito de firewall significa e quando resolve para um deny.
Glob & JSONPath
Decodifique o
tool_name_glob e o args_match que corresponderam à sua
chamada.Guardrails vs Firewall
Qual plano disparou — filtragem de texto ou governança de ações.
