400. Tre codici di sicurezza coprono i casi che
incontrerai: un prompt o una risposta filtrati, una chiamata a tool negata e una
chiamata a tool messa in attesa di approvazione umana.
Questa pagina è il riferimento per quei codici — il caso d’uso di ciascuno, lo stato
HTTP esatto, cosa ti costa, e l’unica regola che conta di più: la logica di retry
deve trattarli come casi speciali. Tutti e tre sono marcati skip-retry;
ri-eseguire ciecamente la stessa chiamata si limita a far scattare di nuovo lo stesso
controllo.
Questi sono codici di applicazione — il gateway che decide di non inoltrare la
tua chiamata. Sono distinti dagli errori del provider upstream (un 429 del modello, un
overflow di contesto) e dai fallimenti di autenticazione. Per il motivo per cui una
richiesta specifica è stata fermata, vedi
Perché è stato bloccato?.
1. I codici di errore di sicurezza llm in sintesi
Ogni block di sicurezza restituisce HTTP 400 con un corpo di errore in forma OpenAI (error.code è la stringa tipizzata qui sotto). Sulle rotte native Claude
(/v1/messages) lo stesso codice viaggia nella forma di errore Claude, quindi il routing
dell’SDK è deterministico tra i protocolli.
| Codice | Ferma | Costo in quota |
|---|---|---|
guardrail_blocked | Un prompt o una risposta che ha colpito una regola block | Nessuno |
firewall_blocked | Una chiamata a tool / pubblicizzazione negata | Nessun token del modello |
firewall_approval_pending | Una chiamata a tool in attesa di un revisore umano | Nessun token del modello |
2. guardrail_blocked — un prompt o una risposta filtrati
Restituito quando scatta una regola guardrail con l’azione
block — una keyword in denylist, un hit di regex, un’entità PII o segreto che hai
scelto di bloccare anziché mascherare, un verdetto llm_judge o un controllo di
grounding fallito.
HTTP 400. Il messaggio nomina il guardrail e la regola che è scattata.
Impatto sulla quota: nessuno
Impatto sulla quota: nessuno
Una richiesta bloccata non costa quota. Un block in fase di input scatta prima
del metering, quindi non viene mai fatturato nulla. Un block in fase di output gira
dopo che il modello ha risposto, quindi il gateway rimborsa la quota
pre-consumata prima di restituire l’errore. In entrambi i casi non paghi nulla per
una chiamata bloccata.
Perché è skip-retry
Perché è skip-retry
Il verdetto è una proprietà del contenuto, non del canale. Ri-eseguire lo stesso
prompt — anche contro un modello diverso — produce lo stesso block. Correggi
l’input (o la policy) invece di fare retry.
Com'è invece fatto un mask
Com'è invece fatto un mask
Le regole
mask non restituiscono questo codice. Un match mascherato (es.
jane@acme.com → [EMAIL]) viene redatto in posto e la chiamata procede
normalmente — ottieni un 200, solo con la porzione sensibile rimossa. Solo
l’azione block fa emergere guardrail_blocked. (flag non cambia assolutamente
nulla del traffico.)3. firewall_blocked — una chiamata a tool negata
Restituito quando il firewall risolve un verdetto deny per
una chiamata a tool — un comando shell distruttivo, un fetch in forma di SSRF, una
destinazione di egress su una deny list o una skill in
modalità block.
Come emerge il deny dipende dalla superficie di applicazione:
inbound / response / egress
HTTP 400 con
error.code = firewall_blocked. Il corpo porta error.metadata
strutturati (reason_code, factors di rischio, risk_score) così puoi spiegare
il block, non solo vederlo.superficie mcp
Restituito come errore di tool (
firewall deny: <reason>), non come fallimento
di trasporto — così il modello vede il rifiuto e può scegliere un altro tool,
chiedere all’utente o fermarsi, invece di andare in crash.4. firewall_approval_pending — in attesa di un umano
Restituito nell’istante in cui una chiamata a tool colpisce un verdetto
pending_approval. Un gate human-in-the-loop non può essere un’attesa inline
bloccante, quindi il gateway restituisce subito una risposta held anziché fare
long-polling.
HTTP 400. L’errore porta l’id di approvazione così il tuo agent sa quale hold
risolvere.
Questo è l’unico codice a cui rispondi risolvendo e ri-inviando — non trattandolo come
un fallimento terminale:
Leggi l'id di approvazione dall'errore held
L’id è recuperabile dal corpo dell’errore. Non fare ancora retry della chiamata —
un retry ingenuo si limita a ri-trattenerla.
Attendi una decisione
Un revisore la risolve dalla console (Developer+), o il tuo sistema di approvazione
riceve un callback webhook firmato con HMAC. Il tuo agent fa polling su
GET /api/v1/firewall/approvals/:id per lo stato.Le rotte di approvazione (
/api/v1/firewall/approvals/*) girano su una chiave con
scope firewall-gateway, non sulla tua sessione di console. Vedi
Approvazione umana (HITL) per il loop
completo e Payload di webhook per la firma del
callback.5. Perché tutti e tre saltano il retry
La logica di retry standard degli SDK assume che un400 possa avere successo a un
secondo tentativo. Questi codici rompono quell’assunzione — il block è deterministico,
quindi un retry cieco spreca un round trip e (per le chiamate held) ri-accoda
silenziosamente un’approvazione.
Cosa significa 'skip-retry' in pratica
Cosa significa 'skip-retry' in pratica
Il meccanismo interno di retry/fallback di OrcaRouter non ri-tenta mai una chiamata
che restituisce uno di questi codici contro un altro canale. Rispecchia ciò nel tuo
client: su un codice di sicurezza, fermati e agisci sul verdetto, non ciclare.
La reazione giusta per ogni codice
La reazione giusta per ogni codice
guardrail_blocked→ correggi l’input o allenta la policy; fai emergere il rifiuto all’utente. Non fare retry.firewall_blocked→ l’azione è vietata; fai scegliere all’agent un tool diverso o chiedere aiuto. Non fare retry.firewall_approval_pending→ risolvi l’hold, poi ri-invia una volta con l’header di approvazione (§4). Un retry senza l’header ri-trattiene.
6. Riepilogo quota e fatturazione
Un block di sicurezza non ti fattura mai l’unità di lavoro bloccata.| Codice | Quando scatta | Esito di fatturazione |
|---|---|---|
guardrail_blocked (input) | Prima della chiamata al modello | Mai conteggiato |
guardrail_blocked (output) | Dopo che il modello risponde | Quota pre-consumata rimborsata |
firewall_blocked (inbound) | Prima della chiamata al modello | Nessun token del modello |
firewall_approval_pending | Prima del dispatch | Nessun token del modello |
7. Riferimenti correlati
Perché è stato bloccato?
Risali da un singolo block alla regola, superficie e motivazione esatte che lo hanno
prodotto.
Glossario dei verdetti
Ogni verdetto del firewall — allow, audit, deny, sanitize, pending_approval,
cap_cost — e cosa emette ciascuno.
Payload di webhook ed errore
L’envelope di errore completo, i campi
error.metadata e la firma del callback di
approvazione.Modalità di applicazione
Shadow, observe ed enforce — quando un verdetto modifica davvero il traffico.
