ストリーミング拒否の処理
ストリーミングレスポンスにおける拒否の停止理由を検出して処理し、拒否されたリクエストをフォールバックモデルで再試行します。
使用方法は製品によって異なります
stop_reason "refusal"で終了し、stop_details(categoryとexplanation)がmessage_deltaイベントで届きます。stop_details.typeまたはstop_reason.typeが"refusal"の場合は、そのターンが拒否されたものとして扱ってください。Claude 4モデル以降、ClaudeのAPIからの「streaming」(ストリーミング)レスポンスは、ストリーミング分類器が潜在的なポリシー違反を処理するために介入した場合に stop_reason: "refusal" を返します。この安全機能は、リアルタイムストリーミング中のコンテンツコンプライアンスの維持に役立ちます。
APIレスポンス形式
ストリーミング分類器が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 イベントで届きます。
拒否後のコンテキストのリセット
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-5",
) as stream:
for event in stream:
# message delta で拒否(refusal)が返されていないか確認します
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のチェックを含めてください。 - 自動的にリセットする: 拒否が検出されたときに自動的にコンテキストをリセットする仕組みを実装してください。
- 別のモデルにフォールバックする: サーバーサイドフォールバックまたはSDKミドルウェアを設定して、拒否をユーザーに表示する代わりに、拒否されたリクエストを別のClaudeモデルで再試行するようにしてください。Claude Haiku 5.5にはサーバーサイドフォールバックがないため、その再試行はクライアント側で設定してください。
- 手動の再試行でフォールバッククレジットを利用する: 再試行を自分で構築する場合は、拒否のフォールバッククレジットトークンを渡して、再試行でプロンプトキャッシュのコストを二重に支払わないようにしてください。Claude Haiku 5.5の拒否にはフォールバッククレジットが付与されません。
- カスタムメッセージを提供する: 拒否が発生したときのUXを向上させるため、ユーザーフレンドリーなメッセージを作成してください。
- 拒否のパターンを追跡する: 拒否の頻度を監視して、プロンプトの潜在的な問題を特定してください。
移行に関する注意事項
この機能が最初にリリースされたときに拒否処理を構築した場合、または既存の統合に追加する場合は、次の点を確認してください。
- 拒否はエラーではなくレスポンスです。 拒否は
stop_reason:"refusal"を持つ成功したHTTP 200レスポンスとして届くため、エラー率のみに基づく監視では検出されません。拒否は独自のシグナルとして追跡してください。 - 拒否には構造化された詳細が含まれます。 すべてのモデルにおいて、拒否には拒否の背後にあるポリシーカテゴリを識別する
stop_detailsオブジェクトも含まれます。完全なレスポンスの形式については、拒否の表示形式を参照してください。 - 別のモデルで再試行してください。 拒否されたリクエストを同じモデルに再送信すると、通常は再び拒否されます。コンテキストをリセットするだけでなく、サーバーサイドフォールバック、SDKミドルウェア、または手動での再試行を使ってフォールバックモデルで再試行し、再試行を自分で構築する場合はフォールバッククレジットを利用してください。Claude Haiku 5.5にはサーバーサイドフォールバックがなく、その拒否にはフォールバッククレジットが付与されないため、その再試行はクライアント側で設定してください。
- バッチ結果の拒否を確認してください。 メッセージバッチ内で拒否されたリクエストは、エラー結果ではなく、
stop_reason:"refusal"を持つ成功結果として返されます。 - 処理を
stop_reasonに集約してください。 APIは引き続き拒否処理をstop_reason:"refusal"に集約していくため、モデル固有の動作ではなく停止理由で分岐してください。
次のステップ
拒否されたリクエストを、サーバーサイドまたはクライアントで別のClaudeモデルで再試行します。
すべての stop_reason の値とその処理方法。
レスポンスをストリーミングし、届いた message_delta イベントから stop_reason を読み取ります。
Claudeの言語横断的な機能で、さまざまな言語のユーザーに対応します。
利用可能状況
Claude API
- API
- Messages API
- Managed Agents ベータ
- モデル
- すべてのモデル
Claude Platform on AWS
- API
- Messages API
- Managed Agents ベータ
- モデル
- すべてのモデル
Amazon Bedrock
- API
- Messages API
- モデル
- すべてのモデル
Amazon Bedrock (InvokeModel)
- API
- Messages API
- モデル
- すべてのモデル
Claude Models on Google Cloud (Google managed)
- API
- Messages API
- モデル
- すべてのモデル
Microsoft Foundry
- API
- Messages API
- モデル
- すべてのモデル
このページは役に立ちましたか?