Claude 4モデル以降、ClaudeのAPIからのストリーミングレスポンスは、ストリーミング分類器が潜在的なポリシー違反を処理するために介入した場合に stop_reason: "refusal" を返します。この新しい安全機能は、リアルタイムストリーミング中のコンテンツコンプライアンスの維持に役立ちます。
Claude Sonnet 4.5のAPI安全フィルターによってトリガーされる拒否について詳しくは、Sonnet 4.5のAPI安全フィルターについてを参照してください。
ストリーミング分類器がAnthropicのポリシーに違反するコンテンツを検出すると、APIは次のレスポンスを返します。
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "Hello.."
}
],
"stop_reason": "refusal"
}追加の拒否メッセージは含まれません。レスポンスを処理し、ユーザー向けの適切なメッセージを提供する必要があります。
stop_reason: refusal を受け取った場合、続行する前に会話のコンテキストをリセットする必要があります。拒否をトリガーしたターンを削除または言い換えるか、会話履歴を完全にクリアすることができます。リセットせずに続行しようとすると、拒否が継続されます。
レスポンスが拒否された場合でも、使用状況メトリクスはレスポンスに含まれます。
Claudeが出力を生成する前に拒否が発生した場合、Claude APIではそのリクエストに対して課金されず、そのレスポンス内の使用量カウントは情報提供のみを目的としています。拒否の前にClaudeが出力を生成した場合は、そのリクエストに対して課金されます。
Claude Sonnet 4.5またはOpus 4.1(非推奨)の使用中にrefusalのstop reasonが頻繁に発生する場合は、使用制限が異なるHaiku 4.5(claude-haiku-4-5-20251001)を使用するようにAPI呼び出しを更新してみてください。詳しくは、Sonnet 4.5のAPI安全フィルターについてを参照してください。
アプリケーションでストリーミングの拒否を検出して処理する方法は次のとおりです。
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は現在、拒否を3つの異なる方法で処理しています。
| 拒否タイプ | レスポンス形式 | 発生タイミング |
|---|---|---|
| ストリーミング分類器による拒否 | stop_reason: refusal | ストリーミング中にコンテンツがポリシーに違反した場合 |
| API入力および著作権の検証 | 400エラーコード | 入力が検証チェックに失敗した場合 |
| モデル生成による拒否 | 標準テキストレスポンス | モデル自体が拒否を判断した場合 |
将来のAPIバージョンでは、stop_reason: refusal パターンが拡張され、すべてのタイプで拒否処理が統一される予定です。
stop_reason: refusal のチェックを含めますWas this page helpful?