400. Три кода безопасности
покрывают случаи, которые вы встретите: проверенный промпт или ответ,
отклонённый вызов инструмента и вызов инструмента, удержанный для подтверждения
человеком.
Эта страница — справочник по этим кодам: use-case каждого, точный HTTP-статус,
во что он вам обходится, и одно правило, которое важнее всего: логика повтора
должна обрабатывать их как особый случай. Все три помечены skip-retry;
слепой повторный прогон того же вызова просто снова срабатывает на том же
контроле.
Это коды применения — шлюз решает не пересылать ваш вызов. Они отличаются
от ошибок вышестоящего провайдера (429 модели, переполнение контекста) и от
сбоев аутентификации. О том, почему конкретный запрос был остановлен, см.
Почему это было заблокировано?.
1. Коды ошибок безопасности LLM с первого взгляда
Каждая блокировка безопасности возвращает HTTP 400 с телом ошибки в форме OpenAI (error.code — типизированная строка ниже). На нативных маршрутах Claude
(/v1/messages) тот же код едет в форме ошибки Claude, так что SDK-маршрутизация
детерминирована между протоколами.
| Код | Останавливает | Стоимость квоты |
|---|---|---|
guardrail_blocked | Промпт или ответ, попавший под правило block | Нет |
firewall_blocked | Отклонённый вызов инструмента / рекламу | Нет токенов модели |
firewall_approval_pending | Вызов инструмента, удержанный для ревьюера-человека | Нет токенов модели |
2. guardrail_blocked — проверенный промпт или ответ
Возвращается, когда срабатывает правило guardrail
с действием block — слово из denylist’а, совпадение по regex, сущность PII или
секрет, который вы решили блокировать, а не маскировать, вердикт llm_judge или
проваленная проверка grounding.
HTTP 400. Сообщение называет guardrail и сработавшее правило.
Влияние на квоту: нет
Влияние на квоту: нет
Заблокированный запрос не стоит квоты. Блокировка на стадии входа
срабатывает до учёта, так что ничего никогда не тарифицируется. Блокировка
на стадии выхода выполняется после того, как модель ответила, поэтому шлюз
возвращает предварительно списанную квоту перед возвратом ошибки. В любом
случае вы ничего не платите за заблокированный вызов.
Почему это skip-retry
Почему это skip-retry
Вердикт — свойство содержимого, а не канала. Повторный прогон того же
промпта — даже на другой модели — даёт ту же блокировку. Исправьте вход (или
политику) вместо повтора.
Как вместо этого выглядит маскирование
Как вместо этого выглядит маскирование
Правила
mask не возвращают этот код. Замаскированное совпадение
(например, jane@acme.com → [EMAIL]) редактируется на месте, и вызов
продолжается нормально — вы получаете 200, просто без чувствительного
фрагмента. Только действие block выдаёт guardrail_blocked. (flag вообще
ничего не меняет в трафике.)3. firewall_blocked — отклонённый вызов инструмента
Возвращается, когда firewall разрешает вердикт deny
для вызова инструмента — деструктивная shell-команда, fetch в форме SSRF,
egress-назначение в deny-списке или навык в
режиме block.
Как именно проявляется отказ, зависит от поверхности применения:
inbound / response / egress
HTTP 400 с
error.code = firewall_blocked. Тело несёт
структурированные error.metadata (reason_code, факторы риска factors,
risk_score), так что вы можете объяснить блокировку, а не просто увидеть её.поверхность mcp
Возвращается как ошибка инструмента (
firewall deny: <reason>), а не
сбой транспорта — так что модель видит отказ и может выбрать другой
инструмент, спросить пользователя или остановиться вместо падения прогона.4. firewall_approval_pending — удержано для человека
Возвращается в тот миг, когда вызов инструмента попадает под вердикт
pending_approval. Шлюз human-in-the-loop не может быть блокирующим inline-
ожиданием, так что шлюз возвращает ответ held немедленно, а не делает
long-polling.
HTTP 400. Ошибка несёт id подтверждения, так что ваш агент знает, какое
удержание разрешать.
Это единственный код, на который вы отвечаете разрешением и повторной отправкой,
а не трактовкой его как терминального сбоя:
Прочитайте id подтверждения из held-ошибки
Id восстанавливается из тела ошибки. Не повторяйте вызов пока — наивный
повтор просто снова удерживает.
Дождитесь решения
Ревьюер разрешает его из консоли (Developer+), или ваша система подтверждений
получает подписанный HMAC вебхук-колбэк. Ваш агент опрашивает
GET /api/v1/firewall/approvals/:id для состояния.Маршруты подтверждений (
/api/v1/firewall/approvals/*) работают на ключе с
областью firewall-gateway, а не на вашей консольной сессии. См.
Подтверждение человеком (HITL)
для полного цикла и Полезные нагрузки вебхуков
для подписи колбэка.5. Почему все три пропускают повтор
Стандартная SDK-логика повтора предполагает, что400 может удаться со второй
попытки. Эти коды ломают это предположение — блокировка детерминирована, так что
слепой повтор тратит round trip и (для удержанных вызовов) молча ставит
подтверждение в очередь заново.
Что 'skip-retry' значит на практике
Что 'skip-retry' значит на практике
Собственная внутренняя машинерия повтора/отката OrcaRouter никогда не
переотправляет вызов, вернувший один из этих кодов, на другой канал.
Отразите это в своём клиенте: на код безопасности остановитесь и
действуйте по вердикту, не зацикливайтесь.
Правильная реакция на каждый код
Правильная реакция на каждый код
guardrail_blocked→ исправьте вход или ослабьте политику; покажите отказ пользователю. Не повторяйте.firewall_blocked→ действие запрещено; пусть агент выберет другой инструмент или попросит помощи. Не повторяйте.firewall_approval_pending→ разрешите удержание, затем переотправьте один раз с заголовком подтверждения (§4). Повтор без заголовка удерживает заново.
6. Сводка по квоте и биллингу
Блокировка безопасности никогда не тарифицирует вам заблокированную единицу работы.| Код | Когда срабатывает | Итог по биллингу |
|---|---|---|
guardrail_blocked (вход) | До вызова модели | Никогда не учитывается |
guardrail_blocked (выход) | После того, как модель ответила | Предварительно списанная квота возвращается |
firewall_blocked (inbound) | До вызова модели | Нет токенов модели |
firewall_approval_pending | До диспетча | Нет токенов модели |
7. Сопутствующие справочники
Почему это было заблокировано?
Проследите одну блокировку до точного правила, поверхности и причины, которые
её произвели.
Глоссарий вердиктов
Каждый вердикт firewall — allow, audit, deny, sanitize, pending_approval,
cap_cost — и что каждый выдаёт.
Полезные нагрузки вебхуков и ошибок
Полный конверт ошибки, поля
error.metadata и подпись колбэка подтверждения.Режимы применения
Shadow, observe и enforce — когда вердикт реально меняет трафик.
