Claude Fable 5 и Claude Opus 5 включают классификаторы безопасности, которые могут отклонить запрос. Когда это происходит, вы получаете обычный ответ, а не ошибку, с stop_reason: "refusal". Обычно вы всё ещё можете получить ответ, отправив тот же запрос другой модели Claude. Эта страница показывает, как распознать «refusal» (отказ) и как настроить такой повтор.
Читайте эту страницу, когда вы разрабатываете на Claude Fable 5 или Claude Opus 5 и хотите, чтобы отклонённые запросы автоматически переходили к другой модели. Она также применима, когда вы только что увидели "refusal" в ответе и хотите знать, что делать дальше.
Связанные страницы:
stop_reason.Самая простая настройка, в бета-версии на Claude API: установите fallbacks в значение "default", и API повторит отклонённый запрос на резервной модели («fallback» model), которую Anthropic рекомендует для его категории отказа. Для категорий без рекомендованной резервной модели отказ остаётся в силе.
client = Anthropic()
response = client.beta.messages.create(
model="claude-fable-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Claude"}],
fallbacks="default",
betas=["server-side-fallback-2026-07-01"],
)
print(response.model)Следующие разделы описывают, что содержит ответ-отказ, когда использовать резервное переключение на стороне сервера или на стороне клиента и как каждое из них тарифицируется.
Отказ — это успешный ответ HTTP 200 с stop_reason: "refusal":
{
"id": "msg_01XFUDYJgAACzvnptvVoYEL",
"type": "message",
"role": "assistant",
"model": "claude-fable-5",
"content": [],
"stop_reason": "refusal",
"stop_details": {
"type": "refusal",
"category": "cyber",
"explanation": "This request was declined because it could enable cyber harm."
},
"usage": {
"input_tokens": 412,
"output_tokens": 0
}
}Объект stop_details объясняет отклонение:
category: называет область политики, которая вызвала срабатывание классификатора.explanation: человекочитаемое описание. Текст не является стабильным, поэтому отображайте его, а не разбирайте.null, когда отказ не соответствует именованной категории. Этот null — нормальное, постоянное значение, а не заполнитель.stop_details равен null для любой причины остановки, кроме refusal.category | Что это означает |
|---|---|
"cyber" | Запрос может способствовать киберущербу, например разработке вредоносного ПО или эксплойтов. Безобидная работа в области кибербезопасности также может вызвать срабатывание этой категории. |
"bio" | Запрос может способствовать биологическому вреду, например опасным лабораторным методам. Полезная работа в области наук о жизни также может вызвать срабатывание этой категории. |
"frontier_llm" | Запрос может содействовать разработке конкурирующих моделей ИИ, что ограничено коммерческими условиями Anthropic. Безобидная работа в области машинного обучения также может вызвать срабатывание этой категории. |
"reasoning_extraction" | Запрос просит модель воспроизвести её внутренние рассуждения в тексте ответа. Чтобы вместо этого получить рассуждения в структурированной форме, используйте адаптивное мышление. |
"general_harms" | Запрос может быть связан с областью, которая была определена как вредоносная. Безобидная работа иногда может вызвать срабатывание этой категории. |
Отказ может прийти до какого-либо вывода или в середине потока после частичного вывода. В любом случае рассматривайте любой частичный вывод как неполный и отбрасывайте его.
Как тарифицируются отказы: с вас не взимается плата за отказ, который приходит до какого-либо вывода. content пуст, а количество токенов отображается в usage, но не тарифицируется. Запрос всё равно учитывается в ваших ограничениях скорости (rate limits). Отказ в середине потока тарифицирует входные токены и уже переданный вывод по обычным тарифам.
Есть три способа повторить отклонённый запрос на другой модели. Правильный выбор зависит от того, где вы работаете и сколько контроля вам нужно.
| Ваша ситуация | Используйте | Почему |
|---|---|---|
| Claude API, самая простая настройка | Резервное переключение на стороне сервера | Один запрос, один ответ. API обрабатывает повтор. |
| Любая платформа, с использованием SDK Anthropic | Промежуточное ПО SDK | Настройте один раз на клиенте. Повторы происходят автоматически. |
| Чистый HTTP или собственная логика повторов | Ручной повтор с резервным кредитом | Полный контроль. Резервный кредит снижает стоимость. |
Резервное переключение на стороне сервера и промежуточное ПО SDK применяют резервный кредит за вас. Страница Резервный кредит нужна вам только тогда, когда вы строите повтор самостоятельно.
Резервное переключение на стороне сервера повторяет отклонённый запрос внутри одного вызова API. В режиме по умолчанию, когда основная модель отклоняет запрос и категория отказа имеет рекомендованную резервную модель, API выполняет тот же запрос на модели, которую Anthropic рекомендует для этой категории. Вместо этого вы можете указать до трёх собственных резервных моделей (ниже). В любом случае вы получаете один ответ, в котором указана ответившая модель, так что ваш пользователь получает ответ за один цикл обращения.
Резервное переключение на стороне сервера находится в бета-версии на Claude API. Параметр fallbacks не поддерживается в Message Batches API (элемент пакета, который его включает, возвращается как результат с ошибкой) и недоступен на Amazon Bedrock, Google Cloud или Microsoft Foundry. На этих платформах вместо этого используйте резервное переключение на стороне клиента с промежуточным ПО SDK.
Установите параметр fallbacks в строку "default" и отправьте бета-заголовок server-side-fallback-2026-07-01. Затем API применяет определённую на сервере маршрутизацию по умолчанию для запрошенной модели, которая выбирает рекомендованную резервную модель на основе категории отказа, сообщаемой классификатором, так что отклонённые запросы обслуживаются без необходимости поддерживать список моделей по мере изменения рекомендаций.
client = Anthropic()
response = client.beta.messages.create(
model="claude-fable-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Claude"}],
fallbacks="default",
betas=["server-side-fallback-2026-07-01"],
)
# Запись fallback_message в usage.iterations означает, что был запущен резервная модель;
# сопоставьте её со stop_reason, чтобы убедиться, что ответ был сформирован резервной моделью.
fallback_ran = any(
iteration.type == "fallback_message"
for iteration in response.usage.iterations or []
)
served_by_fallback = fallback_ran and response.stop_reason != "refusal"
print(
json.dumps(
{
"stop_reason": response.stop_reason,
"model": response.model,
"served_by_fallback": served_by_fallback,
}
)
)Anthropic устанавливает меры защиты для каждой модели индивидуально и для каждой категории политики в соответствии с возможностями модели: в зависимости от категории помеченный запрос может быть переключён на менее способную модель или отклонён. Режим "default" кодирует эти рекомендации для каждой модели и каждой категории за вас, так что отклонённый запрос повторяется на модели, которую Anthropic рекомендует для этой категории. Резервные переключения видны в любом случае: в ответе указана модель, которая его обслужила, а блок содержимого fallback отмечает передачу.
Маршрутизация применяется на стороне сервера и не публикуется для каждой модели в Models API. Чтобы увидеть, какая модель обслужила отклонённый запрос, проверьте поле model верхнего уровня в ответе и найдите запись fallback_message в usage.iterations, как это делают примеры на этой странице.
Только отклонение классификатором безопасности вызывает резервное переключение. Ограничение скорости, перегрузка или ошибка сервера на запрошенной модели возвращаются вам как есть.
Бета-заголовок должен содержать точно дату 2026-07-01, которая поддерживает как "default", так и форму явного списка ниже, или 2026-06-01, которая принимает только форму явного списка. При любом другом значении server-side-fallback-* параметр fallbacks отклоняется с ошибкой 400. Если вы разрабатывали на основе более ранней предварительной версии этой функции, обновите бета-заголовок и формы запроса и ответа вместе до тех, что приведены на этой странице.
Вместо маршрутизации по умолчанию вы можете установить fallbacks в список из не более чем трёх моделей. Когда запрошенная модель отклоняет запрос, API запускает следующую модель в цепочке на том же запросе. Используйте эту форму, когда вы хотите точно контролировать, какие модели обслуживают отклонённые запросы, например чтобы закрепить модель, которую ваше приложение квалифицировало.
client = Anthropic()
response = client.beta.messages.create(
model="claude-fable-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Claude"}],
fallbacks=[{"model": "claude-opus-4-8"}],
betas=["server-side-fallback-2026-07-01"],
)
print(response.model)К списку fallbacks применяется несколько правил:
allowed_fallback_models в записи модели в Models API.model и может переопределить max_tokens, thinking, output_config и speed только для этой попытки.Форма явного списка также работает с бета-заголовком server-side-fallback-2026-06-01; режим "default" — нет.
Ответ имеет одинаковую форму в обоих режимах: модель, обслужившая ход, появляется в поле model верхнего уровня, блок содержимого fallback отмечает передачу, а usage.iterations записывает каждую попытку.
Ответ выглядит как любое другое сообщение, с двумя дополнениями:
model верхнего уровня сообщает модель, которая создала возвращённое сообщение, будь то запрошенная модель или резервная.fallback отмечает каждую точку в content, где вывод одной модели уступает место следующей: {"type": "fallback", "from": {"model": ...}, "to": {"model": ...}}.
from.model повторяет строку модели, которую вы отправили, когда отклоняющим звеном является запрошенная модель.to.model — это всегда разрешённый идентификатор модели, которая продолжает работу.При отказе до какого-либо вывода блок fallback является первым блоком содержимого. Например, когда маршрутизация по умолчанию выбирает Claude Opus 4.8 для категории отказа:
{
"id": "msg_01XFUDYJgAACzvnptvVoYEL",
"type": "message",
"role": "assistant",
"model": "claude-opus-4-8",
"content": [
{
"type": "fallback",
"from": { "model": "claude-fable-5" },
"to": { "model": "claude-opus-4-8" }
},
{ "type": "text", "text": "Hi! How can I help you today?" }
],
"stop_reason": "end_turn",
"stop_details": null,
"usage": {
"input_tokens": 412,
"output_tokens": 264,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 0,
"iterations": [
{
"type": "message",
"model": "claude-fable-5",
"input_tokens": 535,
"output_tokens": 0,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 0
},
{
"type": "fallback_message",
"model": "claude-opus-4-8",
"input_tokens": 412,
"output_tokens": 264,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 0
}
]
}
}Массив usage.iterations записывает каждую попытку. Модель, которая отклонила запрос, появляется как обычная запись message, а модель, обслужившая ход, появляется как запись fallback_message. Если каждая модель в цепочке отклоняет запрос, ответом является отказ последней модели с записью message для каждого более раннего звена и записью fallback_message для последнего.
На следующем ходу отправьте содержимое ассистента обратно в том виде, в каком вы его получили. После резервного переключения в середине вывода content может включать типы блоков, которые отклонившая модель создала до передачи; следующая таблица описывает, какие из них сохранить, а какие отбросить, когда вы повторяете ход.
| Тип блока | На следующем ходу |
|---|---|
fallback | Сохраните его точно там, где он появился. API использует его позицию для проверки блоков мышления вокруг него, поэтому запрос, который повторяет блоки мышления с обеих сторон границы, отклоняется, если блок опущен или перемещён. |
text | Сохранить. |
Любой блок после последнего блока fallback | Сохранить. |
thinking, redacted_thinking или connector_text перед последним блоком fallback | Отбросить. |
Клиентский tool_use перед последним блоком fallback | Отбросить. |
server_tool_use перед последним блоком fallback | Сохранить, когда он сопряжён со своим результатом. Отбросить, когда у него нет соответствующего результата. |
Блок connector_text содержит текст повествования, который некоторые ответы с использованием инструментов включают между вызовами инструментов.
При потоковом запросе повтор происходит в том же потоке, и ничто из уже полученного вами не становится недействительным. То, что вы видите, зависит от того, когда происходит отклонение.
Когда отклонение происходит до какого-либо вывода:
message_start называет резервную модель, и блок fallback является первым блоком содержимого.message_start ожидает начала резервной попытки, время до первого байта включает отклонённую попытку.Когда отклонение происходит в середине вывода:
fallback (обычная пара content_block_start и content_block_stop без дельт) отмечает границу.text частичного вывода передаются резервной модели в качестве контекста; другие типы блоков остаются в content.message_start уже назвал запрошенную модель, поэтому считывайте обслуживающую модель из to.model блока fallback и из записи fallback_message в usage.iterations финального message_delta.При непотоковом запросе отклонение в середине вывода ведёт себя иначе: ответ опускает частичный вывод отклонённой модели, и резервная модель отвечает с нуля. Результат выглядит как отклонение до какого-либо вывода, где блок fallback идёт первым. Отклонённая попытка и её выходные токены всё равно появляются в usage.iterations.
Отклонения во время использования инструментов: завершённая работа инструментов не блокирует резервное переключение. Когда отклонение срабатывает после того, как серверные инструменты (например, веб-поиск или выполнение кода) завершили выполнение в рамках запроса, резервная попытка продолжается: завершённые результаты инструментов переносятся, и резервная модель может продолжать вызывать серверные инструменты. Единственный случай, который не повторяется, — это отклонение при потоковой передаче, которое срабатывает, пока блок использования инструментов любого типа (клиентский инструмент, серверный инструмент или вызов инструмента MCP) всё ещё открыт в потоке: такой отказ возвращается напрямую, и если установлен заголовок fallback-credit-2026-07-01, он всё равно несёт токен кредита, который можно погасить, продолжив частичный ответ. Непотоковые запросы не затрагиваются; API очищает частичную работу и повторяет попытку перед ответом.
Каждый SDK Anthropic включает «middleware» (промежуточное ПО) для резервного переключения при отказах. Вы настраиваете его один раз на клиенте со своим списком резервных моделей. Вызовы через client.beta.messages затем автоматически повторяют отклонённые запросы на любой платформе. Промежуточное ПО также отправляет бета-заголовок fallback-credit-2026-07-01 с каждым обрабатываемым запросом, поэтому повторы переоцениваются без настройки для каждого запроса.
Передайте промежуточное ПО в конструктор клиента и используйте один экземпляр BetaFallbackState для всех запросов разговора.
from anthropic import Anthropic, BetaFallbackState, BetaRefusalFallbackMiddleware
# При отказе middleware повторяет запрос на указанной резервной модели и
# автоматически отправляет бета-заголовок fallback-credit в каждом обрабатываемом запросе.
client = Anthropic(
middleware=[BetaRefusalFallbackMiddleware([{"model": "claude-opus-4-8"}])],
)
state = BetaFallbackState() # pins follow-ups to the model that accepted
# Потоковая передача: при отказе middleware повторяет запрос на резервной модели и
# вставляет её события в открытый поток.
with (
state,
client.beta.messages.stream(
max_tokens=1024,
model="claude-fable-5",
messages=[{"role": "user", "content": "Hello, Claude"}],
) as stream,
):
for text in stream.text_stream:
print(text, end="", flush=True)
final_message = stream.get_final_message()
print(f"\nserved by: {final_message.model}")
# Без потоковой передачи: повторное использование состояния сохраняет привязку диалога.
with state:
message = client.beta.messages.create(
max_tokens=1024,
model="claude-fable-5",
messages=[{"role": "user", "content": "Hello, Claude"}],
)
print(f"served by: {message.model}")fallback, которые оно само добавило.fallback на каждой границе моделей, так же как ответы резервного переключения на стороне сервера. Промежуточное ПО управляет этими блоками за вас в последующих запросах.BetaFallbackState, поэтому последующие запросы, использующие это состояние, остаются закреплёнными за ней, а не обращаются снова к модели, которая отказала.Промежуточное ПО и серверный параметр fallbacks выполняют одну и ту же работу. Настройте одно или другое, но никогда оба в одном запросе. Чтобы отправить запрос с серверным fallbacks из приложения, которое устанавливает промежуточное ПО, используйте отдельный экземпляр клиента без него.
Отклонённый запрос в Message Batch возвращается как result.type: "succeeded" с stop_reason: "refusal". Результаты пакетов несут тот же объект stop_details, что и синхронные ответы, поэтому вы можете обнаруживать отказы через stop_reason или stop_details.type. Одно отличие: отказы в пакетах не создают резервные кредиты, поэтому stop_details в результате пакета никогда не включает fallback_credit_token.
Резервное переключение на стороне сервера недоступно для пакетов (пакетный запрос, включающий fallbacks, создаёт результат с ошибкой для соответствующего элемента). Чтобы повторить отклонённые элементы пакета:
fallbacks не распространяется на вызовы моделей, выполняемые изнутри выполнения инструментов.fallback_message в usage.iterations отмечает последний), затем настройте оповещения на разрыв между двумя счётчиками.stop_reason или stop_details.type, а не по content или внутренним полям stop_details. Объект stop_details всегда присутствует при отказе, но его поля category и explanation могут быть null. Проверяйте stop_reason на равенство "refusal" напрямую.Избегайте двойной оплаты стоимости кэша подсказок, когда вы строите повтор самостоятельно.
Каждое значение stop_reason и как его обрабатывать.
Как работает промежуточное ПО SDK, включая вспомогательный компонент резервного переключения при отказах.
Переведите существующее приложение на Claude Fable 5.
Was this page helpful?