에이전트 하네스를 Claude Fable 5.1로 옮긴 후 생각 블록(thinking block)이 "다른 대화에 바인딩되었다"는 메시지가 있는 400 오류가 보이기 시작했다면, 이는 귀하의 코드가 요청 간에 대화 기록을 편집하며 Fable 5.1이 이를 거부하는 첫 번째 Claude 모델이기 때문입니다. 이 가이드는 해당 검사가 무엇인지, 누구에게 적용되는지, 정확히 무엇이 오류를 유발하는지, 비상 탈출구는 무엇인지, 그리고 프롬프트 캐시를 따뜻하게 유지하면서 오류를 없애는 추가 전용(append-only) 패턴에 대해 설명합니다.
이 검사는 보존된 사고(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.
이 오류는 출력 이전에 결정되는 400 invalid_request_error입니다. 동일한 본문으로 재시도해도 같은 방식으로 실패합니다. 경로(messages.5.content.0)는 더 이상 일치하지 않는 첫 번째 생각 블록을 가리키며, 메시지는 변경된 첫 번째 메시지의 이름을 포함하는 한 문장을 추가로 포함할 수 있습니다. 이는 원하는 진단 정보입니다. 토큰 계산 엔드포인트도 동일한 검사를 실행합니다.
유사하게 보이지만 다른 유형의 오류도 있습니다. "다른 대화에 바인딩되었다"는 문장 없이 동일한 선행 구문이 나타나면 서명 자체가 손상되었거나 해독 불가능하다는 의미이며, 이때는 prefix_mismatch_behavior가 적용되지 않습니다.
검사가 하는 일
모든 Fable 5.1 생각 블록에는 두 가지를 기록하는 서명이 있습니다. 즉, 어떤 모델이 이를 생성했는지와 해당 블록 앞에 위치한 정확한 대화 접두사(최상위 system 프롬프트, tools 배열, 그리고 블록 이전의 모든 메시지)입니다. 각 블록은 이전 생각 블록에 연결됩니다. 대화 기록을 다시 보낼 때, API는 해당 접두사가 블록을 생성한 것과 바이트 단위로 동일한지 확인합니다.
Anthropic은 두 가지 이유를 제시합니다. 명시된 이유는 증류 방지입니다. 출시 게시물에 따르면 새로운 API 계정은 다중 턴 대화에서 이전 생각의 기록을 보존하면서 Claude의 이전 컨텍스트를 수동으로 편집할 수 없게 되며, 이는 문서화된 증류 기술을 차단합니다. 실질적인 이유는 검사를 통과하지 못하게 하는 편집이 프롬프트 캐시를 다시 시작시키기 때문에, 검사를 통과하는 코드는 모든 턴에서 백만 건당 $0.25의 캐시 읽기를 얻는 코드이기도 합니다.
적용 대상
기본적으로 강제 적용: 2026년 8월 31일 이후에 생성된 계정. 여기에는 Claude API 조직, Amazon Bedrock 계정, Google Cloud 프로젝트 및 Microsoft Foundry 리소스가 포함됩니다.
기록되지만 강제 적용되지 않음: 이전에 생성된 계정. API는 불일치를 기록하지만, 요청이 thinking.block_binding.prefix_mismatch_behavior를 "error"를 포함한 어떤 값으로든 설정할 때만 조치합니다. 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은 괜찮습니다.
- 실행 시작 외의 위치에서 생각 블록을 제거하는 경우. 선행 블록은 가장 오래된 것부터 제거할 수 있습니다. 중간에 있는 블록은 제거할 수 없습니다.
유효하게 유지하는 것
- 추가 전용 기록(append-only histories), 포함된
role: "system"메시지 및 제자리에 남아있는 클리어된 턴 스코프 메시지. - 가장 오래된 것부터 선행하는 생각 블록 묶음 제거.
system,tools및messages외의 모든 매개변수 변경:max_tokens,effort를 포함한output_config,tool_choice,metadata.cache_control마커 추가, 이동 또는 제거.- 생각 블록 지우기를 포함한 서버 측 압축 및 컨텍스트 편집. 이는 편집으로 간주되지 않습니다. 왜냐하면 검사는 서버의 편집된 복사본이 아니라 귀하가 보낸 대화를 비교하기 때문입니다. 압축 후에는 검사된 접두사가 압축 블록부터 시작됩니다.
비상 탈출구: drop_block
thinking-binding-controls-2026-08-01 베타 헤더를 보내고 필드를 명시적으로 설정하십시오.
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)
"drop_block"을 사용하면 API는 불일치하는 첫 번째 블록과 그 이후의 모든 생각 블록을 삭제하고, 요청을 진행하며, 각 삭제를 최상위 input_transformations 배열에 보고합니다:
"input_transformations": [
{"type": "thinking_dropped", "path": "messages.1.content.0", "reason": "prefix_binding_mismatch"}
]
이 필드에 대해 알아야 할 세 가지가 있습니다. 이 필드는 해당 요청에만 적용되므로 세션의 나머지 부분에 대해서도 계속 보내야 합니다. 기본값은 표면에 따라 다릅니다. 헤더가 없으면 강제 적용되는 계정은 오류를 발생시킵니다. 헤더만 보내면 베타의 자체 기본값인 drop_block으로 전환됩니다. 따라서 명시적으로 설정하고 어떤 기본값에도 의존하지 마십시오. 그리고 헤더 없이 block_binding을 보내면 block_binding: Extra inputs are not permitted로 끝나는 400 오류가 발생합니다.
reason 필드는 두 가지 경우를 구별합니다. prefix_binding_mismatch는 기록이 변경되었음을 의미합니다. model_binding_mismatch는 대화가 모델을 전환했고(라우터, 재시도, 거부 대체) 대상이 Fable 5.1 블록을 읽을 수 없었음을 의미합니다. 후자는 코드의 버그가 아닙니다. 헤더가 있으면 모든 응답에는 아무것도 삭제되지 않은 경우 빈 배열이 포함됩니다.
압축 경계에서 블록을 한 번 삭제하는 것은 비용이 적게 듭니다. 매 요청마다 자신의 기록을 무효화하는 하네스는 매 턴마다 모델의 추론을 잃고 프롬프트 캐시를 다시 시작하며, Anthropic은 이로 인해 작업당 비용이 증가한다고 경고합니다. drop_block을 안정적인 상태가 아닌 진단 및 안전망으로 취급하십시오.
베타 없는 복구
컨트롤이 없는 플랫폼(Microsoft Foundry는 출시 당시 제공하지 않았으며, Bedrock 및 Google Cloud는 모델별로 추가 중이었음)에서는 기록에서 모든 thinking 및 redacted_thinking 블록을 제거하고, 각 턴의 text 및 tool_use 블록을 유지한 다음 한 번 재시도하십시오. 모델은 해당 블록이 포함하던 추론 없이 해당 턴에 응답합니다. 이는 일회성 복구이며 패턴이 아닙니다.
3단계 감사
트래픽을 전환하기 전이 아니라 그 후에 이를 실행하십시오.
- 정확한 요청 본문을 캡처하십시오. 귀하의 제품에 압축 또는 도구 변경 사항이 있다면, 일반적인 몇 턴 동안 하네스가 보내는 요청 본문을 캡처하십시오. 연속된 각 요청 쌍에 대해
system프롬프트,tools배열, 그리고messages의 공유 접두사를 비교하십시오. 새로 추가된 턴까지 바이트 단위로 동일해야 합니다. - 베타 헤더와
prefix_mismatch_behavior: "drop_block"을 사용하여claude-fable-5-1에 대해 일반적인 다중 턴 세션을 실행하십시오. 각 응답에서input_transformations를 기록하십시오. 매 턴마다 빈 배열은 기록이 온전하다는 것을 의미합니다.prefix_binding_mismatch항목은path에 있는 블록 이전의 무언가가 변경되었음을 의미합니다. 이 필드를 설정하면 요청이 강제 적용되므로 어떤 계정에서든 작동합니다. CI에서는 대신"error"를 설정하여 편집이 실행을 실패하게 하십시오. - 프로덕션 설정을 선택하고 헤더 아래에 명시적으로 설정하십시오. 불일치가 버그만을 의미할 수 있다면
"error"를, 실패하는 대신 저하되려면"drop_block"을 설정하십시오. 어느 쪽이든 400 오류 또는input_transformations항목을 모니터링하십시오. 오래된 계정에서 필드를 설정하지 않은 채로 두지 마십시오. 그러면 검사가 서버 측에서만 기록되고 모니터링할 아무것도 얻지 못합니다.
Apidog에서는 2단계가 두 가지 요청 테스트입니다. 턴을 보내고, 시스템 프롬프트를 편집하고, 헤더가 설정된 상태로 다음 턴을 보내고, input_transformations에 대해 단언합니다. 모든 하네스 변경 사항이 재실행되도록 컬렉션에 보관하십시오. 이를 구축하려면 Apidog를 다운로드하십시오.
하네스를 추가 전용으로 만들기
각 행은 기록 편집을 접두사를 그대로 유지하고 캐시를 따뜻하게 유지하는 것으로 대체합니다.
| 이전 작업 | 대신 이렇게 하십시오 |
|---|---|
| 세션 중간에 시스템 프롬프트 편집(새 날짜, 새 모드) | 세션 시작 시 system을 고정하십시오. 변경 사항이 적용되는 시점에 {"role": "system", "content": "현재 날짜는 2026-09-14입니다."}를 추가하십시오(대화 중간 시스템 메시지). 베타 헤더는 필요 없습니다. 이는 시스템 프롬프트 권한을 얻고 나중에 블록이 바인딩되는 접두사의 일부가 됩니다. |
세션 중간에 tools 배열 편집 |
세션 시작 시 전체 세트를 선언하십시오(숨겨진 상태로 시작하는 도구에 defer_loading: true). role: "system" 메시지에 tool_addition 및 tool_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로 접두사를 읽습니다. 가격 분석에는 숫자가 나와 있고, API 워크스루는 턴 스코프 및 메시지별 노력 요청 형태를 컨텍스트에서 보여주며, 프롬프팅 가이드는 어떤 턴별 지침을 그 방식으로 보내는 것이 가치가 있는지 다루고, Claude Code 가이드는 Claude Code 사용자가 이 오류를 결코 보지 않는 이유를 설명합니다.
자주 묻는 질문
"블록이 다른 대화에 바인딩되었다"는 무슨 의미인가요? 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은 대화 검사를 수행하지 않지만, 여전히 생각 블록을 생성 모델에 바인딩하며 기록 편집은 여전히 캐시를 다시 시작시킵니다.
