從 Claude 4 模型開始,當串流分類器介入處理潛在的政策違規時,Claude API 的串流回應會回傳 stop_reason: "refusal"。此安全功能有助於在即時串流期間維持內容合規性。
當串流分類器偵測到違反 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 回應包含一個 stop_details 物件,其中有 category 和人類可讀的 explanation,您可以將其呈現給使用者。請參閱拒絕與備援以了解完整的回應結構和可用的類別。
在拒絕發生時,stop_details 物件始終存在,但其 category 和 explanation 欄位可能為 null,例如當拒絕沒有對應到任何具名類別時。請根據 stop_reason 或 stop_details.type 進行分支處理,而不要假設 category 和 explanation 已填入值,並在它們為 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:
# 檢查訊息 delta 中是否有拒絕
if event.type == "message_delta":
if event.delta.stop_reason == "refusal":
reset_conversation()
break
except Exception as e:
print(f"Error: {e}")API 目前以三種不同的方式處理拒絕:
| 拒絕類型 | 回應格式 | 發生時機 |
|---|---|---|
| 串流分類器拒絕 | stop_reason: refusal | 串流期間內容違反政策時 |
| API 輸入和版權驗證 | 400 錯誤代碼 | 輸入未通過驗證檢查時 |
| 模型生成的拒絕 | 標準文字回應 | 模型本身拒絕時 |
stop_reason: refusal 檢查如果您在此功能首次推出時建構了拒絕處理,或者您正在將其新增到現有的整合中,請檢查以下事項:
stop_reason: "refusal",因此僅基於錯誤率建構的監控無法發現它。請將拒絕作為獨立的訊號進行追蹤。stop_details 物件,用於識別拒絕背後的政策類別。請參閱拒絕與備援以了解完整的回應結構。stop_reason: "refusal" 的成功結果回傳,而不是錯誤結果。stop_reason 上。 API 持續將拒絕處理整合到 stop_reason: "refusal" 上,因此請根據停止原因進行分支處理,而不是根據特定模型的行為。在另一個 Claude 模型上重試被拒絕的請求,可在伺服器端或您的用戶端進行。
每個 stop_reason 值及其處理方式。
串流回應並在 message_delta 事件到達時從中讀取 stop_reason。
透過 Claude 的跨語言能力為不同語言的使用者提供服務。
Was this page helpful?