À partir des modèles Claude 4, les réponses en streaming de l'API de Claude renvoient stop_reason : "refusal" lorsque les classificateurs de streaming interviennent pour gérer des violations potentielles des politiques. Cette fonctionnalité de sécurité aide à maintenir la conformité du contenu pendant le streaming en temps réel.
Cette page explique comment les refus apparaissent dans les réponses en streaming. Pour chaque valeur de stop_reason et la manière de la gérer, consultez Raisons d'arrêt et repli. Pour réessayer les requêtes refusées sur un autre modèle Claude, consultez Refus et repli.
Lorsque les classificateurs de streaming détectent du contenu qui viole les politiques d'Anthropic, l'API renvoie cette réponse :
{
"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."
}
}Dans le flux d'événements, stop_details arrive sur l'événement message_delta aux côtés de stop_reason.
Une réponse refusal provenant des classificateurs de streaming peut inclure un objet stop_details avec une category et une explanation lisible par un humain que vous pouvez présenter à l'utilisateur. Consultez Refus et repli pour la forme complète de la réponse et les catégories disponibles.
stop_details (et ses category / explanation) peuvent être null, par exemple lorsque le refus ne correspond à aucune catégorie nommée, ou sur des modèles antérieurs. Effectuez un branchement sur stop_reason plutôt que de supposer que stop_details est renseigné, et fournissez votre propre message destiné à l'utilisateur lorsqu'il est null.
Lorsque vous recevez stop_reason : refusal, vous devez réinitialiser le contexte de la conversation avant de continuer. Vous pouvez supprimer ou reformuler le tour qui a déclenché le refus, ou effacer entièrement l'historique de la conversation. Tenter de continuer sans réinitialiser entraînera des refus continus.
Les métriques d'utilisation sont toujours fournies dans la réponse, même lorsque la réponse est refusée.
Lorsqu'un refus survient avant que Claude ne génère une sortie, la requête ne vous est pas facturée sur l'API Claude, et les décomptes d'utilisation dans cette réponse sont fournis à titre informatif uniquement. Lorsque Claude génère une sortie avant le refus, cette requête vous est facturée.
La réinitialisation du contexte n'est pas le seul moyen de récupérer. Vous pouvez également réessayer la requête refusée sur un modèle Claude différent, et la page Refus et repli montre comment configurer cela avec le repli côté serveur, le middleware du SDK, ou une nouvelle tentative manuelle.
Voici comment détecter et gérer les refus en streaming dans votre application :
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:
# Vérifier le refus dans le delta du message
if event.type == "message_delta":
if event.delta.stop_reason == "refusal":
reset_conversation()
break
except Exception as e:
print(f"Error: {e}")L'API gère actuellement les refus de trois manières différentes :
| Type de refus | Format de réponse | Quand cela se produit |
|---|---|---|
| Refus des classificateurs de streaming | stop_reason : refusal | Pendant le streaming lorsque le contenu viole les politiques |
| Validation des entrées de l'API et des droits d'auteur | Codes d'erreur 400 | Lorsque l'entrée échoue aux vérifications de validation |
| Refus générés par le modèle | Réponses textuelles standard | Lorsque le modèle lui-même décide de refuser |
Les futures versions de l'API étendront le modèle stop_reason : refusal pour unifier la gestion des refus pour tous les types.
stop_reason : refusal dans votre gestion des erreursSi vous avez construit une gestion des refus lorsque cette fonctionnalité a été lancée pour la première fois, ou si vous l'ajoutez à une intégration existante, vérifiez les points suivants :
stop_reason : "refusal", donc une surveillance basée uniquement sur les taux d'erreur ne le fera pas apparaître. Suivez les refus comme un signal à part entière.stop_details qui identifie la catégorie de politique à l'origine du refus. Consultez Refus et repli pour la forme complète de la réponse.stop_reason : "refusal", et non comme un résultat en erreur.stop_reason. L'API continue de consolider la gestion des refus autour de stop_reason : "refusal", donc effectuez un branchement sur la raison d'arrêt plutôt que sur un comportement spécifique au modèle.Réessayez les requêtes refusées sur un autre modèle Claude, côté serveur ou dans votre client.
Chaque valeur de stop_reason et comment la gérer.
Diffusez les réponses en streaming et lisez stop_reason à partir des événements message_delta au fur et à mesure de leur arrivée.
Servez des utilisateurs dans toutes les langues grâce aux capacités interlinguistiques de Claude.
Was this page helpful?