Was this page helpful?
Claude 4モデル以降、ClaudeのAPIからのストリーミング応答は、ストリーミング分類器がポリシー違反の可能性を処理する際に**stop_reason: "refusal"**を返します。この新しいセーフティ機能は、リアルタイムストリーミング中のコンテンツコンプライアンスを維持するのに役立ちます。
Claude Sonnet 4.5のAPIセーフティフィルターによってトリガーされた拒否について詳しく知るには、Understanding Sonnet 4.5's API Safety Filtersを参照してください。
ストリーミング分類器がAnthropicのポリシーに違反するコンテンツを検出すると、APIは以下の応答を返します:
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "Hello.."
}
],
"stop_reason": "refusal"
}追加の拒否メッセージは含まれません。応答を処理し、適切なユーザー向けメッセージを提供する必要があります。
stop_reason: refusalを受け取った場合、続行する前に拒否されたターンを削除または更新することでコンテキストをリセットする必要があります。リセットなしで続行しようとすると、拒否が続きます。
使用メトリクスは、応答が拒否された場合でも、課金目的で応答に含まれます。
拒否までの出力トークンについて課金されます。
Claude Sonnet 4.5またはOpus 4.1を使用している際にrefusalストップ理由が頻繁に発生する場合は、APIコールをHaiku 4.5(claude-haiku-4-5-20251001)を使用するように更新してみてください。これは異なる使用制限があります。Sonnet 4.5のAPIセーフティフィルターの理解について詳しく学びます。
アプリケーションでストリーミング拒否を検出して処理する方法は以下の通りです:
APIは現在、3つの異なる方法で拒否を処理します:
| 拒否タイプ | 応答形式 | 発生時期 |
|---|---|---|
| ストリーミング分類器拒否 | stop_reason: refusal | ストリーミング中にコンテンツがポリシーに違反する場合 |
| API入力および著作権検証 | 400エラーコード | 入力が検証チェックに失敗する場合 |
| モデル生成拒否 | 標準テキスト応答 | モデル自体が拒否を決定する場合 |
将来のAPIバージョンでは、**stop_reason: refusal**パターンを拡張して、すべてのタイプの拒否処理を統一します。
stop_reason: refusal**チェックを含めるclient = anthropic.Anthropic()
messages = []
def reset_conversation():
"""拒否後のコンテキストをリセット"""
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:
# メッセージデルタの拒否をチェック
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}")