Skip to main content

Краткий ответ

Когда запрос активирует политику безопасности провайдера, Claude не возвращает ошибку. API по-прежнему возвращает HTTP 200, но:
  • content — это пустой массив [], а output_tokens имеет значение 0;
  • stop_reason имеет значение refusal;
  • stop_details указывает категорию отказа (например, cyber) и содержит краткое пояснение на английском языке.
Это поведение модели, а не сбой API. Код, который напрямую считывает message.content[0], вызовет IndexError. В формате, совместимом с OpenAI, вы получаете пустую строку, а finish_reason имеет значение refusal. Отказ обычно возвращается в течение 1–2 секунд. Тарифицируется ли он, зависит от категории: отказ до генерации какого-либо вывода в категории cyber (и некоторых других) не тарифицируется — см. «Правила тарификации» ниже.

Как выглядит отказ

Ниже приведен один и тот же запрос, вызывающий отказ по кибербезопасности, выполненный четырьмя способами (замеры от 29.09.2026, идентификаторы скрыты):
POST /v1/messages, stream: false:
Отказ также может произойти в процессе потоковой передачи: сначала передается часть текста, а затем ответ завершается с stop_reason: "refusal". Этот частичный вывод является неполным и должен быть отброшен.

Категории отказа

В настоящее время stop_details.category имеет пять значений: Если отказ не сопоставляется с именованной категорией, и category, и explanation имеют значение null — это нормальное значение. Текст explanation может измениться в любой момент: отображайте его, не используйте сопоставление строк.

Распространенные триггеры

category: "cyber" — это то, с чем разработчики сталкиваются чаще всего. В Claude действуют защитные механизмы в реальном времени для запросов, связанных с кибербезопасностью, и любая из следующих задач может привести к их срабатыванию:
  • Просьба к модели найти ошибки в коде, определить, «содержит ли фрагмент кода уязвимость», или указать тип уязвимости (CWE)
  • Написание или дополнение кода эксплойтов либо шагов для тестирования на проникновение
  • Анализ или переписывание вредоносного кода
Пакетная оценка и дистилляция датасетов подвержены этому сильнее всего. При поочередном прогоне целого датасета уязвимостей через модель значительная часть примеров часто отклоняется. Скрипт, предполагающий, что content[0] существует всегда, аварийно завершится на отклоненном элементе, создавая впечатление, будто «API работает лишь время от времени».

Правила тарификации

Согласно правилам провайдера (по состоянию на сентябрь 2026 года; провайдер может скорректировать их по мере оценки доли ложных срабатываний): Тарифицируется запрос или нет, отклоненный запрос все равно учитывается в ваших лимитах запросов. usage по-прежнему показывает количество tokens — это подсчет количества, а не обязательно списание средств.

Как это обнаружить и обработать

1

Проверяйте stop_reason перед чтением содержимого

В нативном формате проверяйте stop_reason == "refusal"; в OpenAI-совместимом формате проверяйте finish_reason == "refusal". Читайте content только после того, как исключите отказ.
2

Фиксируйте отказы как тип результата

Отказ — это успешный вызов, а не сетевая ошибка. При оценке работы фиксируйте его отдельно как «refused» вместе с stop_details.category, вместо того чтобы считать его сбоем, требующим повторной попытки.
3

Не повторяйте запрос с тем же содержимым

Повторная отправка того же содержимого обычно приводит к такому же отказу, по-прежнему расходует лимиты запросов, а для некоторых категорий тарифицируется каждый раз.
4

Сбрасывайте контекст в многоэтапных диалогах

После того как на реплику был получен отказ, удалите или перепишите её либо очистите историю перед продолжением. Без сброса последующие запросы продолжат отклоняться.
5

Анализируйте, какое содержимое отклоняется

Группируйте отказы по category, чтобы увидеть, какие задачи их вызывают, а затем решите, стоит ли отправлять это содержимое другой модели.
Если вам нужна категория отказа, вызывайте нативный формат /v1/messages. OpenAI-совместимый формат сохраняет только finish_reason: "refusal" и не содержит stop_details.

Что насчет легитимных исследований безопасности?

Упомянутая в тексте отказа программа Cyber Verification Program — это бесплатная программа подачи заявок от провайдера для легитимной работы в сфере безопасности: после подтверждения личности ограничения для задач «высокого риска двойного назначения», таких как эксплуатация уязвимостей или разработка инструментов для атак, могут быть смягчены. «Запрещенные сценарии использования», такие как разработка программ-вымогателей или массовая эксфильтрация данных, блокируются во всех случаях. Заявка на участие в программе подается администратором организации в прямом аккаунте у провайдера. Что касается сторонних платформ, провайдер отмечает, что «не все платформы участвуют», и APIYI в настоящее время не предоставляет доступ к этой программе. Поэтому при вызовах через APIYI для отклоненных примеров:
  • честно фиксируйте их как «отклоненные» в результатах вашей оценки, сгруппировав по категориям;
  • либо обрабатывайте этот контент с помощью другой модели.
APIYI не изменяет и не может изменять политику безопасности провайдера.

Чем это отличается от отказа OpenAI

Чтобы узнать, как выглядит отказ OpenAI, см. раздел Как выглядит отказ модели OpenAI?.

Часто задаваемые вопросы

Это зависит от категории и момента возникновения. Отказы до начала вывода в cyber, general_harms или null не тарифицируются; bio, frontier_llm и reasoning_extraction тарифицируют входные данные; отказ в процессе потоковой передачи тарифицирует входные данные и уже переданную часть вывода. См. раздел «Правила тарификации» выше.
Нет. Решение об отказе принимает модель провайдера в рамках своей политики безопасности; APIYI не может отключить их или изменить степень их строгости. Зафиксируйте отклоненный контент как результат с отказом или обработайте его с помощью другой модели.
Защитный механизм оценивает каждый запрос по его собственному содержимому. И сам фрагмент кода, и формулировка prompt влияют на результат, поэтому отказ обычно возвращается только для части набора данных. В наших тестах повторная отправка того же отклоненного примера давала стабильный результат.
Модель остановилась до генерации какого-либо контента, поэтому вывод равен 0 и учитываются только входные данные. По этому же признаку можно отличить отказ от отсечения по max_tokens: во втором случае возвращается stop_reason: "max_tokens", а количество выходных tokens равно установленному вами лимиту.

Связанные документы

Обработка ответов Claude

Структура ответов с потоковой передачей и без нее, значения stop_reason

Как выглядит отказ модели OpenAI?

Как выглядит отказ GPT и как его обнаружить

Как обеспечивается безопасность контента и соответствие требованиям?

Политика платформы в отношении безопасности контента и соответствия требованиям