从 Claude 4 模型开始,当流式传输分类器介入处理潜在的策略违规时,Claude API 的流式传输响应会返回 stop_reason: "refusal"。此安全功能有助于在实时流式传输期间维护内容合规性。
当流式传输分类器检测到违反 Anthropic 策略的内容时,API 会返回以下响应:
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "Hello.."
}
],
"stop_reason": "refusal"
}响应中不包含额外的拒绝消息。您必须自行处理该响应并提供适当的面向用户的消息。
当您收到 stop_reason: refusal 时,必须在继续之前重置对话上下文。您可以删除或重新表述触发拒绝的那一轮对话,或者完全清除对话历史记录。如果不重置就尝试继续,将会导致持续的拒绝。
即使响应被拒绝,响应中仍会提供使用量指标。
当拒绝在 Claude 生成任何输出之前到达时,您在 Claude API 上不会为该请求付费,该响应中的使用量计数仅供参考。当 Claude 在拒绝之前已生成输出时,您需要为该请求付费。
重置上下文并非唯一的恢复方式。您还可以在不同的 Claude 模型上重试被拒绝的请求,拒绝与备用方案页面展示了如何通过服务器端备用方案、SDK 中间件或手动重试来进行设置。
以下是如何在您的应用程序中检测和处理流式传输拒绝:
API 目前以三种不同的方式处理拒绝:
| 拒绝类型 | 响应格式 | 发生时机 |
|---|---|---|
| 流式传输分类器拒绝 | stop_reason: refusal | 在流式传输期间内容违反策略时 |
| API 输入和版权验证 | 400 错误代码 | 当输入未通过验证检查时 |
| 模型生成的拒绝 | 标准文本响应 | 当模型自身决定拒绝时 |
未来的 API 版本将扩展 stop_reason: refusal 模式,以统一所有类型的拒绝处理。
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。
Was this page helpful?
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}")