Начиная с моделей Claude 4, потоковые ответы от API Claude возвращают stop_reason: "refusal", когда потоковые классификаторы вмешиваются для обработки потенциальных нарушений политики. Эта функция безопасности помогает поддерживать соответствие контента требованиям во время потоковой передачи (streaming) в реальном времени.
Когда потоковые классификаторы обнаруживают контент, нарушающий политики Anthropic, API возвращает следующий ответ:
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "Hello.."
}
],
"stop_reason": "refusal",
"stop_details": {
"type": "refusal",
"category": "cyber",
"explanation": "This request was declined because it could enable cyber harm."
}
}В потоке событий stop_details приходит в событии message_delta вместе со stop_reason.
Когда вы получаете stop_reason: refusal, вы должны сбросить контекст разговора перед продолжением. Вы можете удалить или перефразировать реплику, вызвавшую отказ, или полностью очистить историю разговора. Попытка продолжить без сброса приведёт к повторным отказам.
Вот как обнаруживать и обрабатывать отказы при потоковой передаче в вашем приложении:
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-5",
) 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 | Когда входные данные не проходят проверки валидации |
| Отказы, сгенерированные моделью | Стандартные текстовые ответы | Когда сама модель отказывается |
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?