메인 콘텐츠로 건너뛰기

짧은 답변

요청이 제공업체의 안전 정책을 트리거하면 Claude는 오류를 반환하지 않습니다. API는 여전히 HTTP 200을 반환하지만 다음과 같습니다.
  • content는 빈 배열 []이고 output_tokens는 0입니다.
  • stop_reason는 refusal입니다.
  • stop_details는 거부 카테고리(예: cyber)를 나타내며 짧은 영어 설명을 포함합니다.
이는 API 오류가 아니라 모델 동작입니다. message.content[0]를 직접 읽는 코드는 IndexError를 발생시킵니다. OpenAI 호환 형식을 사용하면 빈 문자열을 받고 finish_reason는 refusal입니다. 거부 응답은 일반적으로 1–2초 이내에 반환됩니다. 과금 여부는 카테고리에 따라 달라집니다. cyber 카테고리(및 일부 다른 카테고리)에서 출력이 발생하기 전에 이루어진 거부는 과금되지 않습니다 — 아래의 “과금 규칙”을 참조하십시오.

거부가 표시되는 방식

아래는 사이버 거부를 트리거하는 동일한 요청을 네 가지 방식으로 호출한 예시입니다(2026-09-29 측정, ID 마스킹됨).
POST /v1/messages, stream: false:
거부는 스트리밍 중간에도 발생할 수 있습니다. 텍스트 일부가 먼저 스트리밍된 후 응답이 stop_reason: "refusal"로 종료됩니다. 해당 부분 출력은 불완전하므로 삭제해야 합니다.

거부 카테고리

stop_details.category에는 현재 다섯 가지 값이 있습니다. 거부가 명명된 카테고리에 해당하지 않는 경우 category와 explanation은 모두 null입니다. 이는 정상적인 값입니다. explanation 텍스트는 언제든지 변경될 수 있으므로 표시하되, 이를 문자열로 일치시키지 마십시오.

일반적인 트리거

category: "cyber"는 개발자가 가장 자주 마주치는 항목입니다. Claude에는 사이버 보안 요청을 위한 실시간 보호 기능이 있으며, 다음과 같은 모든 작업이 이를 트리거할 수 있습니다.
  • 모델에 코드에서 버그를 찾도록 요청하거나, 코드 일부에 “취약점이 있는지” 판단하도록 요청하거나, 취약점 유형(CWE)을 지정하도록 요청하는 경우
  • 익스플로잇 코드를 작성하거나 완성하는 경우 또는 침투 테스트 단계를 작성하는 경우
  • 악성 코드를 분석하거나 다시 작성하는 경우
배치 평가와 데이터셋 증류가 가장 큰 영향을 받습니다. 전체 취약점 데이터셋을 항목별로 모델에 전달하면 상당수 샘플이 거부되는 경우가 많습니다. content[0]가 항상 존재한다고 가정하는 스크립트는 거부된 항목에서 충돌하며, 이로 인해 “API가 가끔만 작동한다”는 것처럼 보입니다.

과금 규칙

제공업체의 규칙에 따릅니다(2026년 9월 기준이며, 제공업체는 오탐률을 측정하면서 규칙을 조정할 수 있습니다). 과금 여부와 관계없이 거부된 요청도 요청 제한에 포함됩니다. usage에는 여전히 token 수가 표시되지만, 이는 수량일 뿐 반드시 과금을 의미하지는 않습니다.

감지 및 처리 방법

1

콘텐츠를 읽기 전에 stop_reason을 확인합니다

네이티브 형식에서는 stop_reason == "refusal"을 확인하고, OpenAI 호환 형식에서는 finish_reason == "refusal"을 확인합니다. 거부가 아님을 확인한 후에만 content을 읽습니다.
2

거부를 결과 유형으로 기록합니다

거부는 네트워크 오류가 아니라 성공적인 호출입니다. 평가 작업에서는 이를 재시도해야 하는 실패로 간주하지 말고, stop_details.category과 함께 “refused”로 별도로 기록합니다.
3

동일한 콘텐츠를 재시도하지 않습니다

동일한 콘텐츠를 다시 보내면 일반적으로 동일한 거부가 발생하고, 요청 제한을 계속 소모하며, 일부 범주에서는 매번 과금됩니다.
4

다중 턴 대화에서 컨텍스트를 초기화합니다

한 턴이 거부된 후 계속 진행하기 전에 해당 턴을 삭제하거나 다시 작성하거나, 기록을 지웁니다. 초기화하지 않으면 이후 요청도 계속 거부됩니다.
5

어떤 콘텐츠가 거부되는지 검토합니다

category별로 거부를 그룹화하여 어떤 작업이 거부를 유발하는지 확인한 다음, 해당 콘텐츠를 다른 모델로 보낼지 결정합니다.
거부 범주가 필요한 경우 네이티브 /v1/messages 형식을 호출합니다. OpenAI 호환 형식에는 finish_reason: "refusal"만 포함되며 stop_details은 없습니다.

합법적인 보안 연구는 어떻습니까?

거부 문구에 언급된 사이버 검증 프로그램은 합법적인 보안 작업을 위한 공급업체의 무료 신청 프로그램입니다. 신원 확인 후에는 익스플로잇 또는 공격 도구 개발과 같은 “고위험 이중 용도” 작업에 대한 제한이 완화될 수 있습니다. 랜섬웨어 개발 또는 대규모 데이터 유출과 같은 “금지된 사용”은 어떤 경우에도 차단됩니다. 이 프로그램은 공급업체의 자사 계정에서 조직 관리자가 신청합니다. 서드파티 플랫폼의 경우 공급업체는 “모든 플랫폼이 참여하는 것은 아니다”라고 명시하며, APIYI는 현재 이 프로그램에 대한 액세스를 제공하지 않습니다. 따라서 APIYI를 통해 호출할 때 거부된 샘플에 대해서는 다음과 같이 처리합니다.
  • 평가 결과에 해당 샘플을 카테고리별로 그룹화하여 정직하게 “거부됨”으로 기록합니다.
  • 또는 해당 콘텐츠를 다른 모델로 처리합니다.
APIYI는 공급업체의 안전 정책을 조정하지 않으며, 조정할 수도 없습니다.

OpenAI 거부와 다른 점

OpenAI 거부가 어떻게 표시되는지 확인하려면 OpenAI 모델 거부는 어떻게 표시됩니까?를 참조하십시오.

자주 묻는 질문

카테고리와 시점에 따라 다릅니다. cyber, general_harms 또는 null에서 출력 전에 발생한 거부에는 과금되지 않습니다. bio, frontier_llm 및 reasoning_extraction에서는 입력에 과금되며, 스트리밍 중 발생한 거부에는 입력과 이미 스트리밍된 출력에 대해 과금됩니다. 위의 “과금 규칙”을 참조하십시오.
아니요. 거부 여부는 공급자의 모델이 자체 안전 정책에 따라 결정합니다. APIYI는 거부를 해제하거나 엄격도를 변경할 수 없습니다. 거부된 콘텐츠는 거부 결과로 기록하거나 다른 모델로 처리하십시오.
안전장치는 각 요청의 콘텐츠를 개별적으로 판단합니다. 코드 스니펫 자체와 prompt의 표현 방식이 모두 결과에 영향을 주므로 일반적으로 데이터셋의 일부만 거부됩니다. 테스트 결과, 동일하게 거부된 샘플을 다시 전송해도 일관된 결과가 나왔습니다.
모델이 아무것도 생성하기 전에 중지되었으므로 출력은 0이고 입력만 계산됩니다. 이는 거부와 max_tokens 잘림을 구분하는 방법이기도 합니다. 후자의 경우 stop_reason: "max_tokens"가 있으며 출력 token 수는 설정한 제한과 같습니다.

관련 문서

Claude 응답 처리

스트리밍 및 비스트리밍 응답 구조, stop_reason 값

OpenAI 모델 거부는 어떻게 표시됩니까?

GPT 거부의 형태와 감지 방법

콘텐츠 안전 및 규정 준수는 어떻게 보장됩니까?

플랫폼 콘텐츠 안전 및 규정 준수 정책