---
title: Corrija um bloco de pensamento vinculado a uma conversa diferente
url: https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation
description: Retome uma conversa após o erro 400 que diz que um bloco de pensamento está vinculado a uma conversa diferente, encontre o que seu código alterou e teste se a alteração foi eliminada.
featureMetadata:
  status: stable
  supportedModels:
    - claude-fable-5-2
    - claude-mythos-5-2
    - claude-fable-5-1
    - claude-mythos-5-1
    - claude-opus-5-5
    - claude-sonnet-5-5
    - claude-haiku-5-5
  supportedPlatforms:
    Claude API: stable
    Amazon Bedrock: stable
    Amazon Bedrock (bedrock-runtime): stable
    Claude Platform on AWS: stable
    Claude Models on Google Cloud (Anthropic managed): stable
    Claude Models on Google Cloud (Google managed): stable
    Microsoft Foundry: stable
---

Enviar a mesma requisição novamente não pode funcionar, porque seu histórico ainda contém o que seu código alterou. Envie `"drop_block"` para [interromper os erros agora](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#prefix-mismatch-error). A correção de longo prazo é tornar seu código [append-only (somente acréscimo)](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/prefix-checks#prefix-check).

## Erro: The block is bound to a different conversation

O “thinking block” (bloco de pensamento) falhou na [“prefix check” (verificação de prefixo)](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/prefix-checks#prefix-check): algo antes dele foi alterado depois que Claude o produziu (consulte [O que conta como uma mudança](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/prefix-checks#what-counts-as-an-edit)), ou um bloco de pensamento entre outros foi omitido ou movido. O erro tem esta aparência e pode continuar para [nomear o que foi alterado](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#prefix-mismatch-error-details):

```text wrap
messages.1.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".
```

“A different conversation” significa conteúdo diferente antes do bloco: a [verificação de prefixo](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/prefix-checks#prefix-check) não compara sessões nem usuários. A mensagem de erro diz para remover o bloco, mas [remover apenas esse bloco não é suficiente](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#remove-by-hand). [Outros erros](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#similar-errors) podem parecer semelhantes.

Se o aplicativo não for seu, inicie uma nova conversa e avise o mantenedor dele. Se você [removeu um segredo, dados pessoais ou texto injetado](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/change-tools-or-instructions#remove-sensitive-content), ou se suas requisições [desativam o pensamento](https://platform.claude.com/docs/pt-BR/build-with-claude/thinking#turning-thinking-off), [remova o pensamento manualmente](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#remove-by-hand) em vez de seguir a etapa 1.

<Steps>
  <Step title="Interromper os erros agora">
    Defina `thinking.block_binding.prefix_mismatch_behavior` como `"drop_block"` e envie o [cabeçalho beta](https://platform.claude.com/docs/pt-BR/api/beta-headers#beta-features-on-other-platforms) `anthropic-beta: thinking-binding-controls-2026-08-01`. Faça isso em todas as requisições posteriores da conversa, porque a API não armazena a configuração entre requisições. Uma conversa salva ainda contém a alteração, mesmo depois que você corrigir seu código, então armazene a configuração junto com ela. Defina `type` como `"adaptive"`, conforme mostrado:

    ```json
    {
      "thinking": {
        "type": "adaptive",
        "block_binding": {
          "prefix_mismatch_behavior": "drop_block"
        }
      }
    }
    ```

    No SDK, chame o método beta de Messages e passe o valor do cabeçalho, como faz [o programa de teste](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#how-to-tell-whether-your-integration-is-impacted-details). Se o erro [ainda pedir o cabeçalho](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#setting-not-received), o cabeçalho não chegou.

    Isso interrompe os erros descartando o pensamento inválido, mas [pode custar mais](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#drop-block-cost) e pode afetar a qualidade da saída e a latência. A próxima requisição é bem-sucedida, e seu array `input_transformations` lista cada bloco que a API descartou.

    Se suas requisições não definem o parâmetro `thinking`, adicioná-lo não altera mais nada, porque [modelos com pensamento preservado](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/prefix-checks#outcomes) pensam de forma adaptativa por padrão.
  </Step>

  <Step title="Correção de longo prazo">
    Torne sua integração append-only:

    1. Encontre a alteração. O erro pode nomeá-la. Para encontrar onde seu código a faz, execute `claude update` e, em seguida, execute `/claude-api preserved-thinking-migration` no Claude Code, no repositório do seu código. Ou [procure manualmente](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#find-the-change-details).
    2. Pare de fazer a alteração, ou novas conversas também podem receber o erro. [Envie uma atualização no final em vez disso](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/change-tools-or-instructions).
    3. Continue enviando a cada conversa em andamento o `system` e as `tools` de [sua última requisição bem-sucedida](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/change-tools-or-instructions#saved-sessions).
  </Step>
</Steps>

Se a alteração foi recente, você pode desfazê-la em vez disso: restaure o que seu código alterou. O pensamento de antes da alteração volta a ser válido. O pensamento produzido desde então falha, então remova-o ou continue enviando `"drop_block"`.

## Quanto custa descartar pensamento

Claude pode gastar mais tokens de saída elaborando um raciocínio que não consegue mais ler. Descartar os blocos também invalida o “prompt cache” (cache de prompt) a partir do primeiro bloco descartado.

Quando algo muda a cada turno, cada turno perde o pensamento dos turnos anteriores, então o aumento se repete. Execute avaliações na sua própria carga de trabalho antes de depender de `"drop_block"`.

<Frame>
  ![Quatro requisições após uma alteração: a primeira é rejeitada; as três seguintes descartam o pensamento antigo e mantêm cada novo bloco](https://platform.claude.com/docs/pt-BR/images/preserved-thinking-drop-block-loss.svg)
</Frame>

Use `"drop_block"` para manter conversas existentes em andamento enquanto elas contêm uma alteração que você está corrigindo, e para um descarte planejado, como [após seu próprio resumo](https://platform.claude.com/docs/pt-BR/build-with-claude/compaction-thinking-blocks#own-summary). Não o deixe ativado para esconder uma alteração que seu código continua fazendo. Você pode [parar de enviá-lo](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#drop-block-cost-details) assim que os blocos inválidos estiverem fora do histórico.

## Encontre o que seu código alterou

A alteração está antes do primeiro bloco que a API nomeia. O erro 400 pode dizer o que foi alterado, como `system`, `tools`, um bloco de pensamento ausente ou a primeira mensagem que difere. Sem erro, ou com um que não diz, [comece pelo que você tem](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#find-the-change-details), como uma entrada `prefix_binding_mismatch` ou mais tokens de saída.

## Teste seu código para falhas na verificação de prefixo

Você pode confiar em um teste depois de vê-lo falhar. Primeiro, por meio do seu próprio código, execute uma sessão que faça Claude pensar e altere algo de propósito. Envie `"drop_block"` nesta etapa, para que a resposta liste todos os blocos inválidos em vez de parar no primeiro, como mostram [cinco etapas e um programa](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#how-to-tell-whether-your-integration-is-impacted-details).

Em seguida, remova essa alteração e execute suas sessões reais. Em cada requisição, envie o cabeçalho beta `thinking-binding-controls-2026-08-01` e defina [`prefix_mismatch_behavior`](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/prefix-checks#preserved-thinking-controls) como `"error"`, para que uma alteração que seu código faça nessas sessões faça o build falhar com o erro 400.

Teste sessões que compactam, adicionam ferramentas tardiamente, alteram instruções, [trocam de modelo](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking#switching-models) ou são retomadas: turnos simples não chegam a esse código.

Uma execução limpa não tem nenhuma entrada `prefix_binding_mismatch` e nenhum erro. Ela mostra apenas que os blocos que verificou são válidos, nas sessões que você executou. Ela não prova nada se:

* a sessão não tinha blocos de pensamento
* seu código remove todo o pensamento, ou o modelo não tem pensamento preservado
* você não enviou o cabeçalho beta, e [o modelo pode deixar passar blocos que falharam](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/prefix-checks#outcomes) sem um erro

## Monitore a produção e encontre raciocínio perdido sem erro

Registre cada erro 400 e [trate-o no código](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#handle-the-error-in-code) para que a conversa continue. Se, em vez disso, você deixar `prefix_mismatch_behavior` não definido, [monitore o tráfego de produção](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/prefix-checks#watch-production-traffic) em busca de pensamento que falhou na verificação de prefixo e chegou a Claude.

O raciocínio pode ser perdido sem erro por meio de `"drop_block"`, um item de lote, uma troca de modelo, uma mudança para [outra conta](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking#account-bound-thinking) ou um código que não envia nenhum pensamento de volta. Com o cabeçalho beta, cada um deixa uma entrada, exceto o último. Para esse, verifique se suas requisições contêm blocos `thinking`.

## Detalhes técnicos

### O que mais a mensagem de erro pode dizer

A mensagem de erro continua nomeando o que foi alterado, quando a API consegue identificar, como `system`, `tools`, a primeira mensagem ou bloco que difere, conteúdo ausente ou novo, ou um bloco de pensamento anterior ausente ou fora de ordem. A redação dessa frase pode mudar, então não faça correspondência com ela. Se a requisição não tinha cabeçalho beta, a mensagem de erro adiciona esta frase:

```text wrap
That setting requires the `thinking-binding-controls-2026-08-01` value in the `anthropic-beta` header.
```

### O erro ainda pede o cabeçalho ou diz `Extra inputs are not permitted`

Se o erro ainda pede o cabeçalho, o cabeçalho não chegou à API: um proxy ou biblioteca pode tê-lo removido. Um erro diferente, terminando em `block_binding: Extra inputs are not permitted`, significa o mesmo, ou que o pensamento está desativado.

### Remova o pensamento inválido manualmente

Use isto onde você não pode enviar a configuração, ou em um destes casos:

* Depois de remover um segredo, dados pessoais ou texto injetado, porque `"drop_block"` deixa o pensamento no seu histórico armazenado.
* Quando o pensamento está desativado (`"disabled"` ou `"between_tools"`), porque `"drop_block"` requer `"adaptive"`, o que ativaria o pensamento e adicionaria tokens de saída.

1. Remova o bloco que o erro nomeia e todos os blocos `thinking` e [`redacted_thinking`](https://platform.claude.com/docs/pt-BR/build-with-claude/thinking#redacted-thinking-blocks) depois dele, ou o mesmo erro então nomeia o próximo inválido. Mas se seu histórico contém mensagens `role: "system"`, ou duas mensagens do mesmo papel seguidas, remova todos os blocos `thinking` e `redacted_thinking`. O erro conta tal mensagem como parte da mensagem anterior, então a posição que ele nomeia pode ser menor que o índice no seu array. O `path` de uma entrada `input_transformations` conta cada mensagem separadamente.
2. Mantenha todos os outros blocos e envie a requisição novamente. Não coloque de volta os blocos removidos.

### Erros parecidos com este

Estes erros não dizem que o bloco está vinculado a uma conversa diferente, e definir `prefix_mismatch_behavior` pode não resolvê-los:

* Uma mensagem que termina após “Invalid `signature` in `thinking` block”, diz “cannot be modified” ou trata de `budget_tokens`: [Solução de problemas do pensamento](https://platform.claude.com/docs/pt-BR/build-with-claude/thinking-troubleshooting)
* Uma mensagem sobre `temperature` ou uma resposta pré-preenchida: [Limites e compatibilidade de recursos](https://platform.claude.com/docs/pt-BR/build-with-claude/thinking#limits-and-feature-compatibility)

### Quando você pode parar de enviar `"drop_block"`

Para parar de enviar `"drop_block"`, remova os blocos que ele descarta e mantenha o pensamento produzido desde então. Se nada mais tiver mudado, a conversa então passa com `"error"`.

### Trate o erro no código

Para tratar o erro no código, envie o cabeçalho beta e `"error"` em cada requisição, para que uma falha seja um erro 400 em todos os modelos. Quando ele ocorrer, mude apenas essa conversa para `"drop_block"` em todas as requisições posteriores, armazene essa escolha junto com ela, envie novamente uma vez e registre o erro. Se o mesmo erro voltar, a configuração não chegou à API: consulte [O erro ainda pede o cabeçalho ou diz `Extra inputs are not permitted`](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#setting-not-received).

Seu código precisa reconhecer este erro pelo campo `message`, a exceção ao conselho geral de não fazer correspondência com o texto de um erro. Todo erro 400 tem o tipo `invalid_request_error`, e este não tem `error.details.error_code`. Faça correspondência apenas com “The block is bound to a different conversation”, porque o restante da mensagem pode mudar.

### Você não tem erro, ou tem um que não diz o que foi alterado

* **O erro 400, e ele não nomeia nenhuma alteração:** Compare as requisições você mesmo. Uma causa é um bloco de compactação enviado sem remover as mensagens que ele resume.

* **Uma entrada `prefix_binding_mismatch`:** Compare `system`, `tools` e `messages` até o `path` da primeira entrada com a conversa como estava quando esse bloco foi produzido. Se todos os blocos estiverem listados, comece por `system` e `tools`.

  Se nada diferir, procure [uma URL de imagem ou documento cujo conteúdo mudou](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/change-tools-or-instructions#files-by-id), uma lista de ferramentas alterada de um servidor MCP (consulte [Fixe a lista de ferramentas de um servidor MCP](https://platform.claude.com/docs/pt-BR/agents-and-tools/mcp-connector#pin-mcp-tool-list)), ou um bloco de pensamento omitido, movido ou colocado de volta. Sem logs de requisições, envie a requisição novamente com `"error"` e leia a frase que diz o que difere, se houver uma.

* **Um proxy ou biblioteca que não é seu, no meio do caminho:** Compare o que ele envia com o que você enviou e indique ao mantenedor dele [Bibliotecas, proxies e gateways](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/change-tools-or-instructions#libraries-proxies-gateways).

* **Apenas uma suspeita, e sem Claude Code:** Capture os corpos das requisições de uma conversa, uma com uma compactação ou uma alteração de ferramentas. Compare cada um com o anterior, deixando de fora seus novos turnos.

### Cinco etapas para um teste que pode falhar e um programa que as executa

1. No seu próprio código, envie o cabeçalho beta e `"drop_block"` em cada requisição de uma sessão, para um [modelo com pensamento preservado](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/prefix-checks#outcomes).
2. Use prompts que façam Claude pensar e verifique se a primeira resposta tem um bloco `thinking`. Com o pensamento adaptativo, Claude pode pular o pensamento em um prompt fácil.
3. Falhe apenas em uma entrada `input_transformations` cujo motivo seja `prefix_binding_mismatch`. Um teste que espera um array vazio também falha após uma troca de modelo, porque entradas com `model_binding_mismatch` ou `organization_binding_mismatch` são esperadas nesse caso.
4. Altere algo de propósito, como adicionar um prompt `system` apenas na terceira requisição.
5. Verifique se `input_transformations` lista os blocos de pensamento que ficam depois da alteração. Se não listar nenhum, verifique se o histórico contém um bloco de pensamento.

Este programa executa as etapas 1, 2, 4 e 5. Ele imprime quantos blocos de pensamento e entradas `input_transformations` cada resposta tem e, em seguida, cada entrada, que é o que a etapa 3 verifica:

<CodeGroup exclude="shell:cURL, shell:CLI">
  <CodeGroupItem language="cURL">
    Este fluxo de trabalho precisa de mais lógica do que um único comando de shell. Use o [Anthropic SDK](https://platform.claude.com/docs/pt-BR/cli-sdks-libraries/overview) para executá-lo.
  </CodeGroupItem>

  <CodeGroupItem language="CLI">
    Este fluxo de trabalho precisa de mais lógica do que um único comando de shell. Use o [Anthropic SDK](https://platform.claude.com/docs/pt-BR/cli-sdks-libraries/overview) para executá-lo.
  </CodeGroupItem>

  ```python Python
  client = anthropic.Anthropic()

  user_turns = [
      "How many positive integers below 500 have exactly 6 positive divisors?",
      "How many have exactly 8?",
      "How many have exactly 10?",
  ]

  messages = []
  for turn, user_turn in enumerate(user_turns, start=1):
      messages.append({"role": "user", "content": user_turn})
      response = client.beta.messages.create(
          model="claude-opus-5-5",
          max_tokens=16000,
          thinking={
              "type": "adaptive",
              "block_binding": {"prefix_mismatch_behavior": "drop_block"},
          },
          # Apenas a última requisição adiciona um prompt do sistema, o que altera o prefixo de propósito
          system="Answer briefly." if turn == len(user_turns) else anthropic.omit,
          messages=messages,
          betas=["thinking-binding-controls-2026-08-01"],
      )
      messages.append({"role": "assistant", "content": response.content})
      thinking_blocks = sum(block.type == "thinking" for block in response.content)
      entries = response.input_transformations or []
      print(f"thinking blocks: {thinking_blocks}, entries: {len(entries)}")
      for entry in entries:
          if entry.type == "thinking_dropped":
              print(entry.type, entry.path, entry.reason)
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  const userTurns = [
    "How many positive integers below 500 have exactly 6 positive divisors?",
    "How many have exactly 8?",
    "How many have exactly 10?"
  ];

  const messages: Anthropic.Beta.BetaMessageParam[] = [];
  for (const [turnIndex, userTurn] of userTurns.entries()) {
    messages.push({ role: "user", content: userTurn });
    const response = await client.beta.messages.create({
      model: "claude-opus-5-5",
      max_tokens: 16000,
      thinking: {
        type: "adaptive",
        block_binding: { prefix_mismatch_behavior: "drop_block" }
      },
      // Somente a última solicitação adiciona um prompt do sistema, o que altera o prefixo de propósito
      system: turnIndex === userTurns.length - 1 ? "Answer briefly." : undefined,
      messages,
      betas: ["thinking-binding-controls-2026-08-01"]
    });
    messages.push({ role: "assistant", content: response.content });
    const thinkingBlocks = response.content.filter((block) => block.type === "thinking");
    const entries = response.input_transformations ?? [];
    console.log(`thinking blocks: ${thinkingBlocks.length}, entries: ${entries.length}`);
    for (const entry of entries) {
      if (entry.type === "thinking_dropped") {
        console.log(entry.type, entry.path, entry.reason);
      }
    }
  }
  ```

  ```csharp C#
  using Anthropic.Models.Beta;
  using Anthropic.Models.Beta.Messages;
  using Model = Anthropic.Models.Messages.Model;

  AnthropicClient client = new();

  string[] userTurns =
  [
      "How many positive integers below 500 have exactly 6 positive divisors?",
      "How many have exactly 8?",
      "How many have exactly 10?",
  ];

  List<BetaMessageParam> messages = [];
  foreach (var (turnIndex, userTurn) in userTurns.Index())
  {
      messages.Add(new BetaUserMessageParam { Content = userTurn });
      var response = await client.Beta.Messages.Create(
          new()
          {
              Model = Model.ClaudeOpus5_5,
              MaxTokens = 16000,
              Thinking = new BetaThinkingConfigAdaptive
              {
                  BlockBinding = new()
                  {
                      PrefixMismatchBehavior = BetaThinkingPrefixMismatchBehavior.DropBlock,
                  },
              },
              // Apenas a última solicitação adiciona um prompt do sistema, o que altera o prefixo de propósito
              System = turnIndex == userTurns.Length - 1 ? new("Answer briefly.") : null,
              Messages = messages,
              Betas = [AnthropicBeta.ThinkingBindingControls2026_08_01],
          }
      );
      messages.Add(new BetaAssistantMessageParam
      {
          Content = response.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList(),
      });
      var thinkingBlocks = response.Content.Count(block => block.TryPickThinking(out _));
      var entries = response.InputTransformations ?? [];
      Console.WriteLine($"thinking blocks: {thinkingBlocks}, entries: {entries.Count}");
      foreach (var entry in entries)
      {
          if (entry.TryPickThinkingDropped(out var dropped))
          {
              Console.WriteLine($"{dropped.Type} {dropped.Path} {dropped.Reason.Raw()}");
          }
      }
  }
  ```

  ```go Go
  client := anthropic.NewClient()

  userTurns := []string{
  	"How many positive integers below 500 have exactly 6 positive divisors?",
  	"How many have exactly 8?",
  	"How many have exactly 10?",
  }

  messages := []anthropic.BetaMessageParam{}
  for turnIndex, userTurn := range userTurns {
  	messages = append(messages, anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock(userTurn)))
  	// Somente a última requisição adiciona um prompt do sistema, o que altera o prefixo de propósito
  	var system []anthropic.BetaTextBlockParam
  	if turnIndex == len(userTurns)-1 {
  		system = []anthropic.BetaTextBlockParam{{Text: "Answer briefly."}}
  	}
  	response, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
  		Model:     anthropic.ModelClaudeOpus5_5,
  		MaxTokens: 16000,
  		Thinking: anthropic.BetaThinkingConfigParamUnion{
  			OfAdaptive: &anthropic.BetaThinkingConfigAdaptiveParam{
  				BlockBinding: anthropic.BetaThinkingBlockBindingParam{
  					PrefixMismatchBehavior: anthropic.BetaThinkingPrefixMismatchBehaviorDropBlock,
  				},
  			},
  		},
  		System:   system,
  		Messages: messages,
  		Betas:    []anthropic.AnthropicBeta{anthropic.AnthropicBetaThinkingBindingControls2026_08_01},
  	})
  	if err != nil {
  		log.Fatal(err)
  	}
  	messages = append(messages, response.ToParam())
  	thinkingBlocks := 0
  	for _, block := range response.Content {
  		if block.Type == "thinking" {
  			thinkingBlocks++
  		}
  	}
  	fmt.Printf("thinking blocks: %d, entries: %d\n", thinkingBlocks, len(response.InputTransformations))
  	for _, entry := range response.InputTransformations {
  		if entry.Type == "thinking_dropped" {
  			fmt.Println(entry.Type, entry.Path, entry.Reason)
  		}
  	}
  }
  ```

  ```java Java
  import com.anthropic.models.beta.AnthropicBeta;
  import com.anthropic.models.beta.messages.BetaContentBlock;
  import com.anthropic.models.beta.messages.BetaInputTransformation;
  import com.anthropic.models.beta.messages.BetaMessage;
  import com.anthropic.models.beta.messages.BetaThinkingBlockBinding;
  import com.anthropic.models.beta.messages.BetaThinkingConfigAdaptive;
  import com.anthropic.models.beta.messages.BetaThinkingPrefixMismatchBehavior;
  import com.anthropic.models.beta.messages.MessageCreateParams;
  import com.anthropic.models.messages.Model;

  void main() {
      AnthropicClient client = AnthropicOkHttpClient.fromEnv();

      List<String> userTurns = List.of(
          "How many positive integers below 500 have exactly 6 positive divisors?",
          "How many have exactly 8?",
          "How many have exactly 10?");

      MessageCreateParams.Builder conversation = MessageCreateParams.builder()
          .model(Model.CLAUDE_OPUS_5_5)
          .maxTokens(16000L)
          .thinking(BetaThinkingConfigAdaptive.builder()
              .blockBinding(BetaThinkingBlockBinding.builder()
                  .prefixMismatchBehavior(BetaThinkingPrefixMismatchBehavior.DROP_BLOCK)
                  .build())
              .build())
          .addBeta(AnthropicBeta.THINKING_BINDING_CONTROLS_2026_08_01);

      for (int turnIndex = 0; turnIndex < userTurns.size(); turnIndex++) {
          if (turnIndex == userTurns.size() - 1) {
              // Apenas a última solicitação adiciona um prompt do sistema, o que altera o prefixo de propósito
              conversation.system("Answer briefly.");
          }
          conversation.addUserMessage(userTurns.get(turnIndex));
          BetaMessage response = client.beta().messages().create(conversation.build());
          conversation.addMessage(response);
          long thinkingBlocks = response.content().stream()
              .filter(BetaContentBlock::isThinking)
              .count();
          List<BetaInputTransformation> entries = response.inputTransformations().orElse(List.of());
          IO.println("thinking blocks: " + thinkingBlocks + ", entries: " + entries.size());
          for (BetaInputTransformation entry : entries) {
              entry.thinkingDropped().ifPresent(dropped ->
                  IO.println(entry.type() + " " + dropped.path() + " " + dropped.reason()));
          }
      }
  }
  ```

  ```php PHP
  use Anthropic\Beta\AnthropicBeta;
  use Anthropic\Beta\Messages\BetaThinkingBlock;
  use Anthropic\Beta\Messages\BetaThinkingBlockBinding;
  use Anthropic\Beta\Messages\BetaThinkingConfigAdaptive;
  use Anthropic\Beta\Messages\BetaThinkingDroppedInputTransformation;
  use Anthropic\Beta\Messages\BetaThinkingPrefixMismatchBehavior;
  use Anthropic\Client;
  use Anthropic\Messages\Model;

  $client = new Client();

  $userTurns = [
      'How many positive integers below 500 have exactly 6 positive divisors?',
      'How many have exactly 8?',
      'How many have exactly 10?',
  ];

  $messages = [];
  foreach ($userTurns as $turnIndex => $userTurn) {
      $messages[] = ['role' => 'user', 'content' => $userTurn];
      $response = $client->beta->messages->create(
          model: Model::CLAUDE_OPUS_5_5,
          maxTokens: 16000,
          thinking: BetaThinkingConfigAdaptive::with(
              blockBinding: BetaThinkingBlockBinding::with(
                  prefixMismatchBehavior: BetaThinkingPrefixMismatchBehavior::DROP_BLOCK,
              ),
          ),
          // Só a última requisição adiciona um prompt do sistema, o que altera o prefixo de propósito
          system: $turnIndex === array_key_last($userTurns) ? 'Answer briefly.' : null,
          messages: $messages,
          betas: [AnthropicBeta::THINKING_BINDING_CONTROLS_2026_08_01],
      );
      $messages[] = ['role' => 'assistant', 'content' => $response->content];
      $thinkingBlocks = array_filter(
          $response->content,
          fn ($block) => $block instanceof BetaThinkingBlock,
      );
      $entries = $response->inputTransformations ?? [];
      echo 'thinking blocks: ', count($thinkingBlocks), ', entries: ', count($entries), PHP_EOL;
      foreach ($entries as $entry) {
          if ($entry instanceof BetaThinkingDroppedInputTransformation) {
              echo $entry->type, ' ', $entry->path, ' ', $entry->reason, PHP_EOL;
          }
      }
  }
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  user_turns = [
    "How many positive integers below 500 have exactly 6 positive divisors?",
    "How many have exactly 8?",
    "How many have exactly 10?"
  ]

  messages = []
  user_turns.each_with_index do |user_turn, turn_index|
    messages << { role: "user", content: user_turn }
    # Só a última requisição adiciona um prompt do sistema, o que altera o prefixo de propósito
    system_param = (turn_index == user_turns.length - 1) ? { system_: "Answer briefly." } : {}
    response = client.beta.messages.create(
      model: Anthropic::Model::CLAUDE_OPUS_5_5,
      max_tokens: 16_000,
      thinking: {
        type: "adaptive",
        block_binding: { prefix_mismatch_behavior: "drop_block" }
      },
      messages: messages,
      betas: [Anthropic::AnthropicBeta::THINKING_BINDING_CONTROLS_2026_08_01],
      **system_param
    )
    messages << { role: "assistant", content: response.content }
    thinking_blocks = response.content.count { |block| block.is_a?(Anthropic::Beta::BetaThinkingBlock) }
    entries = response.input_transformations || []
    puts "thinking blocks: #{thinking_blocks}, entries: #{entries.length}"
    entries.each do |entry|
      if entry.is_a?(Anthropic::Beta::BetaThinkingDroppedInputTransformation)
        puts "#{entry.type} #{entry.path} #{entry.reason}"
      end
    end
  end
  ```
</CodeGroup>

```text Output wrap
thinking blocks: 1, entries: 0
thinking blocks: 1, entries: 0
thinking blocks: 1, entries: 2
thinking_dropped messages.1.content.0 prefix_binding_mismatch
thinking_dropped messages.3.content.0 prefix_binding_mismatch
```

Com `"error"` no lugar de `"drop_block"`, a terceira requisição recebe [o erro 400](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#prefix-mismatch-error).

### O que cada entrada `input_transformations` significa e quais cabe a você corrigir

Com o cabeçalho beta, uma resposta de um modelo que suporta pensamento tem o array `input_transformations` ao lado de `usage`. Ele fica vazio quando nada foi descartado e nada inválido passou. Quando você faz streaming, ele está na `message` do evento `message_start`; após um fallback no meio do stream, o evento `message_delta` final traz o que vale. Diferentemente da posição do erro, `path` é sempre o lugar do bloco como você o enviou:

```json
{
  "input_transformations": [
    {
      "type": "thinking_dropped",
      "path": "messages.1.content.0",
      "reason": "prefix_binding_mismatch"
    }
  ]
}
```

O `type` e o `reason` de cada entrada, e o que significam:

* **`thinking_dropped`, `prefix_binding_mismatch`:** O que veio antes deste bloco não é o que ele registrou. Cabe a você corrigir: [Encontre o que seu código alterou](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#find-the-change).
* **`thinking_mismatch_allowed`, `prefix_binding_mismatch`:** O mesmo, mas Claude leu o bloco sem alterações, e ele é cobrado. Esta entrada aparece apenas onde a configuração não é definida, em [alguns modelos](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/prefix-checks#outcomes). Cabe a você corrigir.
* **`thinking_dropped`, `model_binding_mismatch`:** Este modelo não consegue ler blocos do modelo que o produziu. Não cabe a você corrigir: [continue enviando a conversa inteira](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking#switching-models).
* **`thinking_dropped`, `organization_binding_mismatch`:** Outra conta produziu o bloco, então [a API o descartou](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking#account-bound-thinking). Não cabe a você corrigir.

Ignore uma entrada cujo `type` ou `reason` você não reconhece.

### Lotes e contagem de tokens

* **[Lotes de Mensagens](https://platform.claude.com/docs/pt-BR/build-with-claude/batch-processing):** Um item que deixa `prefix_mismatch_behavior` não definido nunca recebe o erro 400. A API descarta os blocos inválidos ou, em [alguns modelos](https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/prefix-checks#outcomes), pode deixá-los passar. Um item que define `"error"` é resolvido como `errored` quando um bloco falha na verificação de prefixo. `block_binding` vai em `params.thinking` do item.
* **[Contagem de tokens](https://platform.claude.com/docs/pt-BR/build-with-claude/token-counting):** Na Claude API, a contagem de tokens pode retornar o mesmo erro 400 e aceita `prefix_mismatch_behavior` com o mesmo cabeçalho. Ela deixa os blocos descartados fora da contagem e não retorna `input_transformations`.

## Próximos passos

<CardGroup cols={2}>
  <Card title="Altere ferramentas ou instruções sem falhar na verificação de prefixo" icon="edit" href="https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking/change-tools-or-instructions">
    O que enviar em vez de cada alteração que seu código faz em uma conversa.
  </Card>

  <Card title="Pensamento preservado" icon="book" href="https://platform.claude.com/docs/pt-BR/build-with-claude/preserved-thinking">
    O que é o pensamento preservado, ao que um bloco de pensamento está vinculado, e a troca de modelo ou de conta.
  </Card>

  <Card title="Solução de problemas do pensamento" icon="wrench" href="https://platform.claude.com/docs/pt-BR/build-with-claude/thinking-troubleshooting">
    Correções para outros erros de pensamento, como uma assinatura que não é verificada.
  </Card>
</CardGroup>
