Claude 4モデル以降、Claude APIからの「streaming」(ストリーミング)レスポンスは、ストリーミング分類器が潜在的なポリシー違反を処理するために介入した場合に**stop_reason: "refusal"**を返します。この安全機能は、リアルタイムストリーミング中のコンテンツコンプライアンスの維持に役立ちます。
このページでは、ストリーミングレスポンスで拒否がどのように表示されるかを説明します。すべてのstop_reasonの値とその処理方法については、停止理由とフォールバックを参照してください。拒否されたリクエストを別のClaudeモデルで再試行するには、拒否とフォールバックを参照してください。
ストリーミング分類器が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はstop_reasonとともにmessage_deltaイベントで到着します。
ストリーミング分類器からのrefusalレスポンスには、categoryと、ユーザーに表示できる人間が読めるexplanationを含むstop_detailsオブジェクトが含まれます。完全なレスポンスの形式と利用可能なカテゴリについては、拒否とフォールバックを参照してください。
拒否時にはstop_detailsオブジェクトは常に存在しますが、そのcategoryフィールドとexplanationフィールドは、たとえば拒否が名前付きカテゴリにマッピングされない場合など、nullになることがあります。categoryとexplanationに値が入っていると仮定するのではなく、stop_reasonまたはstop_details.typeで分岐し、それらがnullの場合は独自のユーザー向けメッセージを提供してください。
**stop_reason: refusal**を受け取った場合、続行する前に会話のコンテキストをリセットする必要があります。拒否を引き起こしたターンを削除または言い換えるか、会話履歴を完全にクリアできます。リセットせずに続行しようとすると、拒否が継続されます。
レスポンスが拒否された場合でも、使用状況のメトリクスはレスポンスで提供されます。
Claudeが出力を生成する前に拒否が到着した場合、Claude APIではそのリクエストに対して課金されず、そのレスポンスの使用量カウントは情報提供のみを目的としています。拒否の前にClaudeが出力を生成した場合は、そのリクエストに対して課金されます。
コンテキストのリセットが唯一の回復方法ではありません。拒否されたリクエストを別のClaudeモデルで再試行することもできます。拒否とフォールバックページでは、サーバーサイドフォールバック、SDKミドルウェア、または手動再試行を使用してそれを設定する方法を示しています。
アプリケーションでストリーミングの拒否を検出して処理する方法は次のとおりです。
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は現在、3つの異なる方法で拒否を処理します。
| 拒否タイプ | レスポンス形式 | 発生するタイミング |
|---|---|---|
| ストリーミング分類器による拒否 | stop_reason: refusal | ストリーミング中にコンテンツがポリシーに違反した場合 |
| API入力および著作権の検証 | 400エラーコード | 入力が検証チェックに失敗した場合 |
| モデルが生成する拒否 | 標準のテキストレスポンス | モデル自体が拒否した場合 |
stop_reason: refusal**のチェックを含めるこの機能が最初にリリースされたときに拒否処理を構築した場合、または既存の統合に追加する場合は、次の点を確認してください。
stop_reason: "refusal"を含む成功したHTTP 200レスポンスとして到着するため、エラー率のみに基づいて構築された監視では検出されません。拒否を独自のシグナルとして追跡してください。stop_detailsオブジェクトも含まれます。完全なレスポンスの形式については、拒否とフォールバックを参照してください。stop_reason: "refusal"を含む成功結果として返されます。stop_reasonで処理を一元化する。 APIは引き続きstop_reason: "refusal"を中心に拒否処理を統合しているため、モデル固有の動作ではなく停止理由で分岐してください。拒否されたリクエストを、サーバーサイドまたはクライアント内で別のClaudeモデルで再試行します。
すべてのstop_reasonの値とその処理方法。
レスポンスをストリーミングし、到着したmessage_deltaイベントからstop_reasonを読み取ります。
Claudeの言語横断的な機能により、さまざまな言語のユーザーに対応します。
Was this page helpful?