Начиная с моделей Claude 4, потоковые ответы из API Claude возвращают stop_reason: "refusal" когда потоковые классификаторы вмешиваются для обработки потенциальных нарушений политики. Эта новая функция безопасности помогает поддерживать соответствие содержимого во время потоковой передачи в реальном времени.
Чтобы узнать больше об отказах, вызванных фильтрами безопасности API для Claude Sonnet 4.5, см. Understanding Sonnet 4.5's API Safety Filters.
Когда потоковые классификаторы обнаруживают содержимое, нарушающее политики Anthropic, API возвращает этот ответ:
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "Hello.."
}
],
"stop_reason": "refusal"
}Дополнительное сообщение об отказе не включается. Вы должны обработать ответ и предоставить соответствующее сообщение для пользователя.
Когда вы получаете stop_reason: refusal, вы должны сбросить контекст разговора удалив или обновив отклоненный ход перед продолжением. Попытка продолжить без сброса приведет к продолжению отказов.
Метрики использования по-прежнему предоставляются в ответе в целях выставления счетов, даже когда ответ отклонен.
Вам будут выставлены счета за выходные токены до отказа.
Если вы часто встречаете причины остановки refusal при использовании Claude Sonnet 4.5 или Opus 4.1, вы можете попробовать обновить вызовы API для использования Haiku 4.5 (claude-haiku-4-5-20251001), который имеет другие ограничения использования. Узнайте больше о понимании фильтров безопасности API Sonnet 4.5.
Вот как обнаруживать и обрабатывать потоковые отказы в вашем приложении:
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-sonnet-4-6",
) as stream:
for event in stream:
# Check for refusal in message delta
if hasattr(event, "type") and 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 в обработку ошибокWas this page helpful?