Claude 4 모델부터 Claude API의 스트리밍 응답은 스트리밍 분류기가 잠재적 정책 위반을 처리하기 위해 개입할 때 **stop_reason: "refusal"**을 반환합니다. 이 새로운 안전 기능은 실시간 스트리밍 중에 콘텐츠 규정 준수를 유지하는 데 도움이 됩니다.
Claude Sonnet 4.5의 API 안전 필터로 인해 트리거된 거부에 대해 자세히 알아보려면 Sonnet 4.5의 API 안전 필터 이해하기를 참조하세요.
스트리밍 분류기가 Anthropic의 정책을 위반하는 콘텐츠를 감지하면 API는 다음 응답을 반환합니다:
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "Hello.."
}
],
"stop_reason": "refusal"
}추가 거부 메시지는 포함되지 않습니다. 응답을 처리하고 적절한 사용자 대면 메시징을 제공해야 합니다.
**stop_reason: refusal**을 받으면 계속하기 전에 거부된 턴을 제거하거나 업데이트하여 대화 컨텍스트를 재설정해야 합니다. 재설정 없이 계속하려고 하면 계속된 거부가 발생합니다.
사용 메트릭은 거부된 응답일 때에도 청구 목적으로 응답에 제공됩니다.
거부될 때까지의 출력 토큰에 대해 청구됩니다.
Claude Sonnet 4.5 또는 Opus 4.1을 사용하는 동안 refusal 중지 이유가 자주 발생하면 API 호출을 업데이트하여 Haiku 4.5(claude-haiku-4-5-20251001)를 사용해 볼 수 있습니다. 이는 다른 사용 제한이 있습니다. Sonnet 4.5의 API 안전 필터 이해하기에 대해 자세히 알아보세요.
애플리케이션에서 스트리밍 거부를 감지하고 처리하는 방법은 다음과 같습니다:
client = anthropic.Anthropic()
messages = []
def reset_conversation():
"""거부 후 대화 컨텍스트 재설정"""
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-sonnet-4-6",
) as stream:
for event in stream:
# 메시지 델타에서 거부 확인
if hasattr(event, "type") and 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 오류 코드 | 입력이 검증 확인에 실패할 때 |
| 모델 생성 거부 | 표준 텍스트 응답 | 모델 자체가 거부하기로 결정할 때 |
향후 API 버전은 모든 유형의 거부 처리를 통합하기 위해 stop_reason: refusal 패턴을 확장할 것입니다.
stop_reason: refusal 확인 포함Was this page helpful?