Claude 4 모델부터 Claude API의 스트리밍 응답은 스트리밍 분류기가 잠재적인 정책 위반을 처리하기 위해 개입할 때 **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:
# 메시지 델타에서 거부(refusal) 여부 확인
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"이 포함된 성공적인 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?