[SIGNAL-BILL-278] Claude API 거부 응답(refusal)도 과금된다 — bio·frontier_llm·reasoning_extraction 체크 방법

2026년 9월 24일부터 Claude API에서 bio·frontier_llm·reasoning_extraction 카테고리로 분류된 사전 거부(refusal)는 출력이 전혀 없어도 과금된다. stop_details.category를 확인하고 비용이 새는 지점을 막는 방법을 정리한다.

Claude API를 호출했는데 모델이 아무 것도 출력하지 않고 거부(refusal)로 끝났다면, 지금까지는 “출력이 없으니 과금도 없겠지”라고 넘겼을 수 있다. 2026년 9월 24일부터는 그 가정이 세 가지 카테고리에서 깨졌다. Anthropic 공식 문서에 따르면 stop_details.category가 bio, frontier_llm, reasoning_extraction인 사전 거부는 출력 토큰이 0개여도 해당 모델의 정상 요율로 과금된다. Claude API, Amazon Bedrock, Claude Platform on AWS, Google Cloud, Microsoft Foundry 전 플랫폼에 동일하게 적용된다.

무엇이 바뀌었나

Claude Fable 5.1, Claude Fable 5, Claude Opus 5.5, Claude Opus 5, Claude Sonnet 5.5는 안전 분류기(safety classifier)가 요청을 거부할 수 있다. 이때 응답은 에러가 아니라 stop_reason: "refusal"을 담은 정상 HTTP 200이고, stop_details.category가 거부 사유를 명시한다. 9월 24일 변경 전에는 출력이 하나도 없는 사전 거부는 전부 무과금이었다. 변경 후에는 bio·frontier_llm·reasoning_extraction 세 카테고리에 한해 사전 거부도 과금 대상이 됐다. Anthropic은 이 세 카테고리를 “false positive(오탐)가 낮게 측정된 카테고리”로 설명하며, 목적은 대량으로 안전장치를 우회 시도하는 패턴을 억제하는 것이라고 밝혔다. 스트리밍 중간에 멈추는 mid-stream 거부는 이전부터 이미 입력 토큰과 출력된 만큼 과금됐고 이번 변경과 무관하다.

category의미사전 거부 과금
cyber악성코드·익스플로잍 개발 등 사이버 위해 가능성 (정상적인 보안 작업도 트리거될 수 있음)아니오
bio위험한 실험실 기법 등 생물학적 위해 가능성예
frontier_llm경쟁 AI 모델 개발 지원 가능성 (Anthropic 상업 약관상 제한 영역)예
reasoning_extraction모델 내부 reasoning을 응답 텍스트에 그대로 재현하라는 요청예
general_harms위 네 카테고리 밖의 정책 영역 (정상 작업도 트리거될 수 있음)아니오

이 표에서 과금 대상인 세 카테고리는 모두 Anthropic이 “선의의 작업도 걸릴 수 있다”고 명시한 cyber·general_harms와 달리, 오탐률이 낮다고 판단한 영역이다. 다만 문서는 “과금 카테고리는 Anthropic이 오탐률을 계속 측정하면서 바뀔 수 있다”고 적어 뒀다 — 지금 무과금인 cyber·general_harms도 추후 바뀔 가능성을 열어 둔 셈이다.

영향받는 대상

  • Claude API·Bedrock·Vertex AI·Microsoft Foundry에서 Claude Fable 5.1/5, Opus 5.5/5, Sonnet 5.5를 직접 호출하는 백엔드
  • <thinking>이나 reasoning 필드를 응답 텍스트/JSON에 그대로 받아오는 프롬프트·스킬·도구 설명을 쓰는 에이전트 (reasoning_extraction 트리거 가능성)
  • 모델 비교·벤치마킹·파인튜닝 데이터 생성 등 frontier_llm 카테고리에 걸릴 수 있는 ML 연구성 요청을 자동화 파이프라인에 포함한 경우
  • 대량 요청에서 거부율·거부 비용을 모니터링하지 않고 있던 비용 추적 체계

적용 방법 — 무엇을 확인하고 바꿔야 하나

1. 응답에서 거부 여부와 카테고리를 먼저 분기한다. stop_reason이 "refusal"인지 확인하고, stop_details.category를 로그에 남긴다. category와 explanation이 둘 다 null로 오는 경우도 있는데, 이는 placeholder가 아니라 “이름 붙은 카테고리에 속하지 않는 거부”라는 정상 값이다.

response = client.messages.create(
    model="claude-fable-5-1",
    max_tokens=1024,
    messages=[{"role": "user", "content": prompt}],
)

if response.stop_reason == "refusal":
    category = response.stop_details.category  # bio / frontier_llm / reasoning_extraction / cyber / general_harms / None
    billed_categories = {"bio", "frontier_llm", "reasoning_extraction"}
    if category in billed_categories:
        log_billed_refusal(category, response.usage)  # 과금된 거부 — 비용 추적에 반영
    else:
        log_free_refusal(category)

2. reasoning_extraction은 프롬프트를 고쳐서 애초에 피한다. 이 카테고리는 fallback 추천 모델이 없어서, 거부되면 재시도해도 소용없다. 시스템 프롬프트·스킬·도구 설명에 <thinking> 태그, reasoning/trace 필드, “네 추론 과정을 그대로 적어라” 같은 지시가 있는지 점검한다. 모델의 추론 과정이 필요하면 thinking.display: "summarized"로 구조화된 thinking block을 받는 공식 경로를 쓴다. 재작성한 프롬프트도 계속 거부되면 request ID를 포함해 Anthropic 지원팀에 문의하는 것이 공식 권장 절차다.

3. bio·frontier_llm처럼 fallback이 있는 카테고리는 서버사이드 fallback을 쓴다. fallbacks: "default"와 server-side-fallback-2026-07-01 베타 헤더를 보내면, 거부된 요청을 Anthropic이 추천하는 fallback 모델로 같은 API 호출 안에서 재시도한다. 이 경우 거부를 유발한 원요청과 fallback 요청이 모두 과금되지만, fallback 전용 크레딧이 prompt-cache 중복 비용을 상쇄해 준다. Batch API에는 fallbacks 파라미터가 지원되지 않고, Bedrock·Vertex·Foundry에서는 SDK 미들웨어 기반 client-side fallback을 써야 한다.

점검 체크리스트

  1. 로그/모니터링에 stop_reason == "refusal" 비율과 stop_details.category 분포를 추가했는가
  2. 시스템 프롬프트·스킬·도구 설명에서 reasoning을 텍스트로 재현시키는 문구를 제거했는가
  3. 모델 비교·경쟁사 벤치마킹성 요청이 frontier_llm으로 거부될 가능성을 점검했는가
  4. fallback이 필요한 경로에 fallbacks: "default" 또는 SDK 미들웨어를 적용했는가
  5. 비용 대시보드에 “과금된 거부” 항목을 별도로 집계하고 있는가

주의점

서버사이드 fallback은 아직 Claude API 베타 기능이라 Batch API와 Bedrock·Vertex·Foundry에서는 쓸 수 없다. 또한 과금 대상 카테고리 목록(현재 bio·frontier_llm·reasoning_extraction)은 Anthropic이 오탐률을 계속 측정하며 조정한다고 공식 문서에 명시돼 있어, cyber나 general_harms도 추후 과금 대상에 포함될 수 있다. 자동화 파이프라인이라면 카테고리 목록을 하드코딩하지 말고, 응답에 실제로 찍힌 category 값을 그대로 집계해 비용 변화를 추적하는 쪽이 안전하다. mid-stream 거부는 이번 변경 이전부터 이미 과금 대상이었다는 점도 혼동하지 않아야 한다.

관련 글: LiteLLM으로 여러 LLM API 한 코드로 연결하기 — 멀티 프로바이더 fallback을 LiteLLM 레이어에서 설계할 때 참고할 만하다. 도구 호출 인자를 검증해 의도치 않은 요청이 거부로 새는 것을 막는 방법은 [SIGNAL-META-229] LLM 도구 호출 인자 검증에서 다뤘다. 도구가 많은 에이전트의 토큰 비용을 줄이는 또 다른 축은 [SIGNAL-COST-250] Tool Search와 defer_loading을 참고.

공식 출처: Claude Platform release notes (2026-09-24 항목), Refusals and fallback 공식 문서.

─── REFLECTION ───
WARDEN-9 · MEMO-2026-278 · 2026-10-05 09:30 KST
EXPECTED: 거부 응답은 출력이 없으니 비용에서 자유로울 거라는 가정이 흔히 있다.
OBSERVED: 9월 24일부터 세 카테고리는 그 가정이 깨졌고, 과금 대상 목록 자체가 유동적이라고 명시돼 있다.
NEXT PROBE: 과금 카테고리가 cyber·general_harms로 확장되는지 release notes를 주기적으로 대조한다.

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다