Краткий ответ
Когда запрос активирует политику безопасности провайдера, Claude не возвращает ошибку. API по-прежнему возвращает HTTP 200, но:content— это пустой массив[], аoutput_tokensимеет значение0;stop_reasonимеет значениеrefusal;stop_detailsуказывает категорию отказа (например,cyber) и содержит краткое пояснение на английском языке.
message.content[0], вызовет IndexError. В формате, совместимом с OpenAI, вы получаете пустую строку, а finish_reason имеет значение refusal.
Отказ обычно возвращается в течение 1–2 секунд. Тарифицируется ли он, зависит от категории: отказ до генерации какого-либо вывода в категории cyber (и некоторых других) не тарифицируется — см. «Правила тарификации» ниже.
Как выглядит отказ
Ниже приведен один и тот же запрос, вызывающий отказ по кибербезопасности, выполненный четырьмя способами (замеры от 29.09.2026, идентификаторы скрыты):- Нативный · Без потоковой передачи
- Нативный · Потоковая передача
- OpenAI-совместимый · Без потоковой передачи
- OpenAI-совместимый · Потоковая передача
POST /v1/messages, stream: false:stop_reason: "refusal". Этот частичный вывод является неполным и должен быть отброшен.Категории отказа
В настоящее времяstop_details.category имеет пять значений:
category, и explanation имеют значение null — это нормальное значение. Текст explanation может измениться в любой момент: отображайте его, не используйте сопоставление строк.
Распространенные триггеры
category: "cyber" — это то, с чем разработчики сталкиваются чаще всего. В Claude действуют защитные механизмы в реальном времени для запросов, связанных с кибербезопасностью, и любая из следующих задач может привести к их срабатыванию:
- Просьба к модели найти ошибки в коде, определить, «содержит ли фрагмент кода уязвимость», или указать тип уязвимости (CWE)
- Написание или дополнение кода эксплойтов либо шагов для тестирования на проникновение
- Анализ или переписывание вредоносного кода
Правила тарификации
Согласно правилам провайдера (по состоянию на сентябрь 2026 года; провайдер может скорректировать их по мере оценки доли ложных срабатываний):usage по-прежнему показывает количество tokens — это подсчет количества, а не обязательно списание средств.
Как это обнаружить и обработать
Проверяйте stop_reason перед чтением содержимого
stop_reason == "refusal"; в OpenAI-совместимом формате проверяйте finish_reason == "refusal". Читайте content только после того, как исключите отказ.Фиксируйте отказы как тип результата
stop_details.category, вместо того чтобы считать его сбоем, требующим повторной попытки.Не повторяйте запрос с тем же содержимым
Сбрасывайте контекст в многоэтапных диалогах
Анализируйте, какое содержимое отклоняется
category, чтобы увидеть, какие задачи их вызывают, а затем решите, стоит ли отправлять это содержимое другой модели.- Anthropic SDK
- OpenAI SDK
Что насчет легитимных исследований безопасности?
Упомянутая в тексте отказа программа Cyber Verification Program — это бесплатная программа подачи заявок от провайдера для легитимной работы в сфере безопасности: после подтверждения личности ограничения для задач «высокого риска двойного назначения», таких как эксплуатация уязвимостей или разработка инструментов для атак, могут быть смягчены. «Запрещенные сценарии использования», такие как разработка программ-вымогателей или массовая эксфильтрация данных, блокируются во всех случаях. Заявка на участие в программе подается администратором организации в прямом аккаунте у провайдера. Что касается сторонних платформ, провайдер отмечает, что «не все платформы участвуют», и APIYI в настоящее время не предоставляет доступ к этой программе. Поэтому при вызовах через APIYI для отклоненных примеров:- честно фиксируйте их как «отклоненные» в результатах вашей оценки, сгруппировав по категориям;
- либо обрабатывайте этот контент с помощью другой модели.
Чем это отличается от отказа OpenAI
Часто задаваемые вопросы
Тарифицируется ли отказ?
Тарифицируется ли отказ?
cyber, general_harms или null не тарифицируются; bio, frontier_llm и reasoning_extraction тарифицируют входные данные; отказ в процессе потоковой передачи тарифицирует входные данные и уже переданную часть вывода. См. раздел «Правила тарификации» выше.Можно ли отключить отказы?
Можно ли отключить отказы?
Почему для одних примеров из одного и того же набора данных возвращается отказ, а для других — нет?
Почему для одних примеров из одного и того же набора данных возвращается отказ, а для других — нет?
Почему output_tokens равен 0 в usage при отказе?
Почему output_tokens равен 0 в usage при отказе?
max_tokens: во втором случае возвращается stop_reason: "max_tokens", а количество выходных tokens равно установленному вами лимиту.