Начиная с моделей Claude 4, потоковые ответы от API Claude возвращают stop_reason: "refusal", когда классификаторы потоковой передачи вмешиваются для обработки потенциальных нарушений политики. Эта функция безопасности помогает поддерживать соответствие контента требованиям во время потоковой передачи в реальном времени.
На этой странице описано, как отказы отображаются в потоковых ответах. Все значения stop_reason и способы их обработки см. в разделе Причины остановки и резервный вариант. Чтобы повторить отклонённые запросы на другой модели Claude, см. раздел Отказы и резервный вариант.
Когда классификаторы потоковой передачи обнаруживают контент, нарушающий политики Anthropic, API возвращает следующий ответ:
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "Hello.."
}
],
"stop_reason": "refusal"
}Дополнительное сообщение об отказе не включается. Вы должны обработать ответ и предоставить соответствующие сообщения для пользователя.
Когда вы получаете stop_reason: refusal, вы должны сбросить контекст разговора перед продолжением. Вы можете удалить или переформулировать реплику, вызвавшую отказ, либо полностью очистить историю разговора. Попытка продолжить без сброса приведёт к повторным отказам.
Метрики использования по-прежнему предоставляются в ответе, даже если ответ был отклонён.
Если отказ поступает до того, как Claude сгенерирует какой-либо вывод, плата за запрос в API Claude не взимается, а показатели использования в этом ответе носят исключительно информационный характер. Если Claude генерирует вывод до отказа, плата за этот запрос взимается.
Сброс контекста — не единственный способ восстановления. Вы также можете повторить отклонённый запрос на другой модели Claude, и на странице Отказы и резервный вариант показано, как настроить это с помощью серверного резервного варианта, промежуточного ПО SDK или ручного повтора.
Вот как обнаруживать и обрабатывать отказы при потоковой передаче в вашем приложении:
client = anthropic.Anthropic()
messages = []
def reset_conversation():
"""Reset conversation context after refusal"""
global messages
messages = []
print("Conversation reset due to refusal")
try:
with client.messages.stream(
max_tokens=1024,
messages=messages + [{"role": "user", "content": "Hello"}],
model="claude-opus-4-8",
) as stream:
for event in stream:
# Проверка на отказ в дельте сообщения
if event.type == "message_delta":
if event.delta.stop_reason == "refusal":
reset_conversation()
break
except Exception as e:
print(f"Error: {e}")В настоящее время API обрабатывает отказы тремя различными способами:
| Тип отказа | Формат ответа | Когда возникает |
|---|---|---|
| Отказы классификаторов потоковой передачи | stop_reason: refusal | Во время потоковой передачи, когда контент нарушает политики |
| Валидация входных данных API и авторских прав | Коды ошибок 400 | Когда входные данные не проходят проверки валидации |
| Отказы, сгенерированные моделью | Стандартные текстовые ответы | Когда модель сама решает отказать |
В будущих версиях API шаблон stop_reason: refusal будет расширен для унификации обработки отказов всех типов.
stop_reason: refusal в вашу обработку ошибокЕсли вы реализовали обработку отказов, когда эта функция только появилась, или добавляете её в существующую интеграцию, проверьте следующее:
stop_reason: "refusal", поэтому мониторинг, основанный только на частоте ошибок, его не выявит. Отслеживайте отказы как отдельный сигнал.stop_details, который идентифицирует категорию политики, ставшую причиной отклонения. Полную структуру ответа см. в разделе Отказы и резервный вариант.stop_reason: "refusal", а не как результат с ошибкой.stop_reason. API продолжает консолидировать обработку отказов вокруг stop_reason: "refusal", поэтому ветвитесь по причине остановки, а не по поведению конкретной модели.Повторяйте отклонённые запросы на другой модели Claude — на стороне сервера или в вашем клиенте.
Все значения stop_reason и способы их обработки.
Передавайте ответы потоком и считывайте stop_reason из событий message_delta по мере их поступления.
Обслуживайте пользователей на разных языках с помощью межъязыковых возможностей Claude.
Was this page helpful?