DEV Community

Cover image for 클로드 페이블 5.1 보존된 사고: 블록이 다른 대화에 연결되었습니다 오류 해결
Rihpig
Rihpig

Posted on Originally published at apidog.com

클로드 페이블 5.1 보존된 사고: 블록이 다른 대화에 연결되었습니다 오류 해결

에이전트 하네스를 Claude Fable 5.1로 마이그레이션한 뒤 생각 블록(thinking block)이 “다른 대화에 바인딩되었다”는 400 오류가 발생한다면, 요청 사이에서 대화 기록을 수정하고 있기 때문입니다. Fable 5.1은 이러한 변경을 거부하는 첫 번째 Claude 모델입니다. 이 글에서는 검사의 동작 원리, 적용 대상, 오류를 발생시키는 변경, 긴급 우회 방법, 프롬프트 캐시를 유지하는 추가 전용(append-only) 패턴을 정리합니다.

지금 Apidog를 사용해 보세요

이 검사는 보존된 사고(preserved thinking) 문서와 Claude Fable 5.1의 새로운 기능에 설명되어 있습니다. Fable 5.1의 세 가지 주요 변경 사항 중 하네스를 조용히 저하시킬 수 있는 변경 사항은 이것뿐입니다. 나머지 두 가지는 마이그레이션 가이드에서 확인할 수 있습니다.

오류 메시지

messages.5.content.0: Invalid `signature` in `thinking` block. The block is bound to a different conversation. Remove the block, or set `thinking.block_binding.prefix_mismatch_behavior` to "drop_block". That setting requires the `thinking-binding-controls-2026-08-01` value in the `anthropic-beta` header.
Enter fullscreen mode Exit fullscreen mode

이는 모델 출력 전에 발생하는 400 invalid_request_error입니다. 같은 본문으로 재시도해도 계속 실패합니다.

messages.5.content.0은 더 이상 일치하지 않는 첫 번째 생각 블록의 위치입니다. 오류 메시지에는 변경이 시작된 첫 번째 메시지의 이름이 포함될 수도 있습니다. 토큰 계산 엔드포인트에도 같은 검사가 적용됩니다.

다음과 같은 유사한 오류는 별개의 문제입니다.

The block is bound to a different conversation 문장 없이 동일한 접두사가 나타나는 경우

이때는 서명 자체가 손상되었거나 해독할 수 없는 상태이므로 prefix_mismatch_behavior가 적용되지 않습니다.

검사가 확인하는 내용

Fable 5.1의 모든 생각 블록에는 다음 두 정보를 포함하는 서명이 있습니다.

  1. 블록을 생성한 모델
  2. 블록 앞에 있는 정확한 대화 접두사

접두사에는 최상위 system 프롬프트, tools 배열, 해당 블록 이전의 모든 메시지가 포함됩니다. 생각 블록은 이전 생각 블록과도 연결됩니다.

대화 기록을 다시 전송하면 API는 블록을 생성할 당시의 접두사와 현재 접두사가 바이트 단위로 동일한지 확인합니다.

Anthropic이 제시한 명시적인 이유는 증류(distillation) 방지입니다. 출시 게시물에 따르면 새 API 계정에서는 멀티턴 대화의 이전 생각 기록을 보존하면서 Claude의 이전 컨텍스트를 수동으로 편집할 수 없습니다. 이는 문서화된 증류 기법을 차단합니다.

실질적인 운영상의 이유도 있습니다. 검사를 통과하지 못하는 편집은 프롬프트 캐시를 다시 시작합니다. 따라서 검사를 통과하는 하네스는 모든 턴에서 백만 토큰당 $0.25의 캐시 읽기 비용을 활용할 수 있습니다.

적용 대상

기본적으로 강제 적용되는 계정

2026년 8월 31일 이후 생성된 계정입니다.

  • Claude API 조직
  • Amazon Bedrock 계정
  • Google Cloud 프로젝트
  • Microsoft Foundry 리소스

기록되지만 기본 강제되지 않는 계정

이전에 생성된 계정에서는 API가 불일치를 기록하지만, 요청이 다음 필드를 설정한 경우에만 조치합니다.

{
  "thinking": {
    "block_binding": {
      "prefix_mismatch_behavior": "error"
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Anthropic은 향후 모델에서 모든 사용자에게 검사를 강제 적용할 예정이라고 밝혔습니다.

영향을 받지 않는 표면

다음 표면은 접두사를 그대로 유지하므로 일반적으로 이 오류가 발생하지 않습니다.

  • Claude Code
  • claude.ai
  • Claude Managed Agents
  • Claude Agent SDK

Claude Mythos 5.1은 기록 편집으로 캐시가 다시 시작되더라도 이 검사를 실행하지 않습니다.

영향을 받는 코드

messages 배열을 직접 구성하는 모든 코드가 영향을 받습니다.

  • 사용자 지정 에이전트 루프
  • 채팅 백엔드
  • Messages API 래퍼 프레임워크

도구 개발자가 주의할 점

사용자가 자신의 API 키로 실행하는 제품을 배포한다면, 개발자 계정은 오래된 계정이고 사용자의 계정은 새 계정일 수 있습니다. 테스트 환경에서 필드를 명시적으로 설정해 사용자가 문제를 겪기 전에 발견하십시오.

계정이 강제 적용 대상인지 확인하려면 베타 헤더 없이 기록을 편집하는 요청을 보내 보십시오. 헤더를 명시했을 때 400 오류가 발생하면 해당 계정은 강제 적용 대상입니다.

이후의 모든 생각 블록을 무효화하는 변경

다음 변경은 해당 지점 이후의 생각 블록을 무효화합니다.

  • 이전 턴 편집, 재정렬 또는 제거
    • 오래된 도구 결과 삭제
    • 대화 중간에서 턴 잘라내기
    • 요약 후 최근 턴을 그대로 유지하는 클라이언트 측 압축
  • 지속되지 않는 콘텐츠 삽입
    • 도구 결과 뒤에 추가했다가 다음 요청에서 삭제하는 턴별 알림
    • 상태 라인
    • 매 턴 달라지는 남은 토큰 수
  • 요청 사이에서 system 또는 tools 재구성
    • 시스템 프롬프트의 현재 날짜 업데이트
    • 세션 중간에 도구 추가 또는 제거
  • 이후 요청에서 다른 바이트를 반환하는 이미지 또는 문서 URL
    • 바이트가 바인딩되므로 URL 문자열이 아닌 실제 파일 내용이 달라지면 실패합니다.
    • 동일한 파일을 가리키는 회전 서명 URL은 허용됩니다.
  • 실행 시작 지점이 아닌 곳에서 생각 블록 제거
    • 선행 블록은 오래된 것부터 제거할 수 있습니다.
    • 중간 블록은 제거할 수 없습니다.

유효하게 유지되는 변경

다음 패턴은 접두사 검사를 통과합니다.

  • 추가 전용 기록
  • 포함된 role: "system" 메시지
  • 제자리에 남아 있는 클리어된 턴 스코프 메시지
  • 가장 오래된 것부터 제거하는 선행 생각 블록 묶음
  • system, tools, messages 외 매개변수 변경
    • max_tokens
    • output_configeffort
    • tool_choice
    • metadata
  • cache_control 마커 추가, 이동 또는 제거
  • 서버 측 압축 및 컨텍스트 편집
    • 검사는 서버가 편집한 복사본이 아니라 클라이언트가 보낸 대화를 비교합니다.
    • 압축 후에는 압축 블록부터 검사되는 접두사가 다시 시작됩니다.

긴급 우회: drop_block

다음 베타 헤더를 보내고 동작을 명시적으로 설정하십시오.

response = client.beta.messages.create(
    model="claude-fable-5-1",
    max_tokens=16000,
    thinking={
        "type": "adaptive",
        "block_binding": {
            "prefix_mismatch_behavior": "drop_block"
        }
    },
    betas=["thinking-binding-controls-2026-08-01"],
    messages=history,
)

for t in response.input_transformations or []:
    print(t.type, t.path, t.reason)
Enter fullscreen mode Exit fullscreen mode

"drop_block"을 사용하면 API는 불일치가 시작되는 첫 번째 블록과 이후의 모든 생각 블록을 제거한 뒤 요청을 계속 처리합니다. 삭제 내역은 최상위 input_transformations 배열에 보고됩니다.

"input_transformations": [
  {
    "type": "thinking_dropped",
    "path": "messages.1.content.0",
    "reason": "prefix_binding_mismatch"
  }
]
Enter fullscreen mode Exit fullscreen mode

drop_block 사용 시 주의점

  1. 이 설정은 현재 요청에만 적용됩니다. 이후 요청에도 계속 보내야 합니다.
  2. 기본 동작은 표면에 따라 다릅니다.
    • 헤더가 없으면 강제 적용 계정은 오류를 반환합니다.
    • 헤더만 보내면 베타의 기본값인 drop_block으로 전환될 수 있습니다.
  3. 따라서 기본값에 의존하지 말고 항상 동작을 명시하십시오.
  4. 헤더 없이 block_binding을 보내면 다음과 같은 오류가 발생합니다.
block_binding: Extra inputs are not permitted
Enter fullscreen mode Exit fullscreen mode

reason 값은 다음 두 상황을 구분합니다.

  • prefix_binding_mismatch: 대화 기록이 변경됨
  • model_binding_mismatch: 라우터, 재시도 또는 폴백으로 모델이 바뀌어 대상 모델이 Fable 5.1 블록을 읽을 수 없음

두 번째 경우는 코드 버그가 아닙니다. 베타 헤더를 사용하면 삭제가 없을 때도 모든 응답에 빈 input_transformations 배열이 포함됩니다.

압축 경계에서 블록을 한 번 삭제하는 것은 비용이 적습니다. 반면 매 요청마다 기록을 무효화하는 하네스는 매 턴 모델의 추론을 잃고 프롬프트 캐시를 다시 시작합니다. Anthropic도 이 패턴이 작업당 비용을 증가시킬 수 있다고 경고합니다.

따라서 drop_block은 안정적인 운영 방식이 아니라 진단 및 안전망으로 사용하십시오.

베타 기능이 없는 플랫폼에서 복구하기

컨트롤을 지원하지 않는 플랫폼에서는 다음 방식으로 한 번 복구할 수 있습니다.

  1. 기록에서 모든 thinkingredacted_thinking 블록을 제거합니다.
  2. 각 턴의 texttool_use 블록은 유지합니다.
  3. 요청을 한 번 재시도합니다.

모델은 제거된 추론 없이 해당 턴에 응답합니다. 이는 일회성 복구 방법이며, 지속적인 운영 패턴으로 사용해서는 안 됩니다.

3단계 감사

트래픽을 전환하기 전에 다음 감사를 완료하십시오.

1. 실제 요청 본문 캡처

압축이나 도구 변경이 있는 제품이라면 일반적인 멀티턴 세션에서 하네스가 보내는 실제 요청 본문을 캡처합니다.

연속된 각 요청 쌍에서 다음 항목을 비교하십시오.

  • system 프롬프트
  • tools 배열
  • messages의 공유 접두사

새로 추가된 턴까지 바이트 단위로 동일해야 합니다.

2. drop_block으로 테스트 실행

다음 설정으로 claude-fable-5-1의 일반적인 멀티턴 세션을 실행합니다.

  • 베타 헤더: thinking-binding-controls-2026-08-01
  • prefix_mismatch_behavior: "drop_block"

각 응답의 input_transformations를 기록합니다.

  • 빈 배열: 기록이 온전함
  • prefix_binding_mismatch: 해당 path의 블록 이전에 무언가 변경됨

이 필드를 설정하면 계정 유형과 관계없이 검사가 강제되므로 테스트에 적합합니다. CI에서는 "error"를 사용해 기록 편집이 즉시 실패하도록 하십시오.

3. 프로덕션 동작 선택

베타 헤더 아래에 동작을 명시적으로 설정하십시오.

  • 불일치가 버그만 의미한다면 "error"
  • 실패 대신 성능 저하를 허용한다면 "drop_block"

어느 쪽이든 다음 항목을 모니터링해야 합니다.

  • 400 오류
  • input_transformations 항목

오래된 계정에서 필드를 생략하지 마십시오. 그러면 검사가 서버 측에만 기록되어 애플리케이션에서 모니터링할 수 없습니다.

Apidog에서는 2단계 감사를 두 가지 요청 테스트로 구성할 수 있습니다.

  1. 첫 번째 턴을 보냅니다.
  2. 시스템 프롬프트를 편집합니다.
  3. 헤더가 설정된 상태로 다음 턴을 보냅니다.
  4. input_transformations를 검증합니다.

모든 하네스 변경 사항을 다시 실행할 수 있도록 컬렉션에 저장하십시오. 테스트를 구축하려면 Apidog를 다운로드하십시오.

하네스를 추가 전용으로 만들기

기록을 수정하는 대신 다음 패턴을 사용하면 접두사를 유지하고 캐시를 따뜻하게 유지할 수 있습니다.

이전 작업 대신 이렇게 하십시오
세션 중간에 시스템 프롬프트 편집 세션 시작 시 system을 고정합니다. 변경 시점에 {"role": "system", "content": "현재 날짜는 2026-09-14입니다."}를 추가합니다(대화 중간 시스템 메시지). 베타 헤더는 필요하지 않습니다.
세션 중간에 tools 배열 편집 세션 시작 시 전체 도구 세트를 선언합니다. 처음에는 숨길 도구에 defer_loading: true를 사용합니다. 이후 role: "system" 메시지에 tool_additiontool_removal 블록을 보내고 mid-conversation-tool-changes-2026-07-01 베타를 사용합니다.
턴별 알림을 삽입한 뒤 다음 요청에서 삭제 도구 결과 메시지 뒤에 턴 스코프 시스템 메시지로 보냅니다: {"role": "system", "clear_at": "next_user_message", "content": "..."}. mid-conversation-system-clear-at-2026-08-21 베타를 사용하고 이전 사본은 그대로 둡니다. 베타가 없으면 같은 사용자 메시지의 tool_result 뒤에 텍스트 블록으로 알림을 추가합니다.
클라이언트 측에서 오래된 도구 결과 삭제 도구 결과 삭제를 포함한 서버 측 컨텍스트 편집을 사용합니다.
클라이언트에서 압축 수행 서버 측 압축을 우선 사용합니다. compact-2026-01-12 베타의 instructions 매개변수에 요약 프롬프트를 전달할 수 있습니다. 클라이언트 측 압축이 필요하다면 전체 기록을 하나의 요약 메시지와 새 사용자 턴으로 대체하고 나머지는 재현하지 마십시오.
턴을 넘어 이미지 또는 문서를 URL로 참조 파일 API에 한 번 업로드한 뒤 file_id를 사용하거나 base64를 전송합니다.

클라이언트 측 압축의 함정

두 가지 클라이언트 측 압축 방식은 유지되는 턴에서 검사를 통과하지 못합니다. drop_block을 사용하거나 생각 블록을 제거해야 합니다.

  • 꼬리 유지 압축: 오래된 턴을 요약하고 최근 턴을 그대로 유지합니다. 최근 생각은 전체 기록을 기준으로 생성되었으므로 실패합니다.
  • 백그라운드 압축: 기본 경로에서 요약을 만든 뒤 나중에 교체합니다. 요약 시작과 교체 사이에 생성된 모든 턴이 실패합니다.

대화 중간의 개별 턴을 잘라내면 이후의 모든 블록이 무효화됩니다. 클라이언트 측 압축으로는 이를 피할 수 없습니다.

지침을 변경하려면 대화 중간 시스템 메시지를 사용하고, 선택적 삭제가 필요하면 서버 측 컨텍스트 편집을 사용하십시오.

비용 측면

캐시 읽기 비용이 이제 백만 토큰당 $0.25이므로 Fable 5.1에서는 비용 절감을 위해 너무 일찍 압축하는 것이 최선의 절충이 아닐 수 있습니다. Anthropic은 더 늦은 압축 지점을 실험해 볼 것을 제안합니다.

캐시 문제이기도 한 이유

위 표의 변경 사항은 모두 프롬프트 캐시를 다시 시작시키는 요인이기도 합니다.

Fable 5.1은 Fable 5보다 캐시 적중 비용이 4배 저렴하고, 캐시 미스 비용은 비례적으로 더 비쌉니다. 따라서 추가 전용 하네스는 두 가지 이점을 제공합니다.

  • 모델의 추론을 보존합니다.
  • 매 턴 전체 접두사를 $12.50에 다시 작성하는 대신 $0.25에 캐시에서 읽습니다.

관련 내용은 다음 문서에서 확인할 수 있습니다.

자주 묻는 질문

“블록이 다른 대화에 바인딩되었다”는 무슨 의미인가요?

Claude Fable 5.1 생각 블록이 생성된 후 시스템 프롬프트, 도구 배열 또는 이전 메시지가 변경되었다는 뜻입니다. 강제 적용 계정에서는 API가 400 오류로 요청을 거부합니다.

어떤 계정에서 Fable 5.1 기록 검사를 강제하나요?

모든 플랫폼에서 2026년 8월 31일 이후 생성된 계정입니다. 오래된 계정은 요청에서 thinking.block_binding.prefix_mismatch_behavior를 설정한 경우에만 강제 적용됩니다. Anthropic은 향후 모델에서 모든 사용자에게 검사를 적용할 계획입니다.

오류를 빠르게 없애려면 어떻게 해야 하나요?

thinking-binding-controls-2026-08-01 베타 헤더와 함께 prefix_mismatch_behavior: "drop_block"을 사용하십시오. API가 영향을 받은 블록을 제거하고 요청을 계속 처리합니다.

그 후에는 기록을 수정하는 원인을 해결해야 합니다. 매 턴 블록을 삭제하면 모델의 추론을 잃고 캐시가 다시 시작되기 때문입니다.

effort 또는 max_tokens를 변경하면 생각 블록이 무효화되나요?

아니요. system, tools, messages 외의 매개변수는 변경할 수 있습니다. cache_control 마커도 자유롭게 추가, 이동 또는 제거할 수 있습니다.

서버 측 압축이 검사를 무효화하나요?

아니요. 서버 측 압축 및 컨텍스트 편집은 검사가 수행된 뒤 적용됩니다. 검사는 클라이언트가 전송한 대화를 비교합니다.

반면 최근 턴을 그대로 유지하는 클라이언트 측 압축은 생각 블록을 무효화합니다.

Claude Mythos 5.1도 같은 검사를 수행하나요?

아니요. Mythos 5.1은 대화 접두사 검사를 수행하지 않습니다. 다만 여전히 생각 블록을 생성 모델에 바인딩하므로, 기록을 편집하면 프롬프트 캐시는 다시 시작됩니다.

Top comments (0)