---
title: Исправление блока размышлений, привязанного к другому разговору
url: https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation
description: Возобновите разговор после ошибки 400, в которой говорится, что блок размышлений привязан к другому разговору, найдите, что изменил ваш код, и проверьте, что этого изменения больше нет.
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
---

Повторная отправка того же запроса не сработает, потому что в вашей истории по-прежнему содержится то, что изменил ваш код. Отправьте `"drop_block"`, чтобы [остановить ошибки сейчас](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#prefix-mismatch-error). Долгосрочное исправление — перевести ваш код в режим [«append-only» (только добавление)](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/prefix-checks#prefix-check).

## Ошибка: The block is bound to a different conversation

Блок размышлений не прошёл [проверку префикса](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/prefix-checks#prefix-check): что-то перед ним изменилось после того, как Claude его создал (см. [Что считается изменением](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/prefix-checks#what-counts-as-an-edit)), либо блок размышлений, находившийся между другими, был пропущен или перемещён. Ошибка выглядит так и может далее [назвать, что изменилось](https://platform.claude.com/docs/ru/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» означает другое содержимое перед блоком: [проверка префикса](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/prefix-checks#prefix-check) не сравнивает сеансы или пользователей. В сообщении об ошибке сказано удалить блок, но [удаления только этого блока недостаточно](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#remove-by-hand). [Другие ошибки](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#similar-errors) могут выглядеть похоже.

Если приложение не ваше, начните новый разговор и сообщите об этом его сопровождающему. Если вы [удалили секрет, персональные данные или внедрённый текст](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/change-tools-or-instructions#remove-sensitive-content) или ваши запросы [отключают размышления](https://platform.claude.com/docs/ru/build-with-claude/thinking#turning-thinking-off), вместо шага 1 [удалите размышления вручную](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#remove-by-hand).

<Steps>
  <Step title="Остановить ошибки сейчас">
    Установите для `thinking.block_binding.prefix_mismatch_behavior` значение `"drop_block"` и отправьте [«beta header» (бета-заголовок)](https://platform.claude.com/docs/ru/api/beta-headers#beta-features-on-other-platforms) `anthropic-beta: thinking-binding-controls-2026-08-01`. Делайте это в каждом последующем запросе в разговоре, потому что API не сохраняет настройку между запросами. Сохранённый разговор по-прежнему содержит изменение даже после того, как вы исправите код, поэтому храните настройку вместе с ним. Установите для `type` значение `"adaptive"`, как показано:

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

    В SDK вызовите бета-метод Messages и передайте значение заголовка, как это делает [тестовая программа](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#how-to-tell-whether-your-integration-is-impacted-details). Если ошибка [по-прежнему запрашивает заголовок](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#setting-not-received), заголовок не дошёл.

    Это останавливает ошибки за счёт отбрасывания недействительных размышлений, но [может стоить дороже](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#drop-block-cost) и может повлиять на качество вывода и «latency» (задержку). Следующий запрос выполняется успешно, и его массив `input_transformations` перечисляет каждый блок, который API отбросил.

    Если ваши запросы не задают параметр `thinking`, его добавление больше ничего не меняет, потому что [модели с сохранёнными размышлениями](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/prefix-checks#outcomes) по умолчанию размышляют адаптивно.
  </Step>

  <Step title="Долгосрочное исправление">
    Переведите вашу интеграцию в режим append-only:

    1. Найдите изменение. Ошибка может его назвать. Чтобы найти, где ваш код его вносит, выполните `claude update`, а затем выполните `/claude-api preserved-thinking-migration` в Claude Code в репозитории вашего кода. Или [ищите вручную](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#find-the-change-details).
    2. Перестаньте вносить это изменение, иначе новые разговоры тоже могут получить эту ошибку. [Вместо этого отправляйте обновление в конце](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/change-tools-or-instructions).
    3. Продолжайте отправлять в каждый текущий разговор `system` и `tools` [его последнего успешного запроса](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/change-tools-or-instructions#saved-sessions).
  </Step>
</Steps>

Если изменение было недавним, вы можете вместо этого отменить его: верните то, что изменил ваш код. Размышления, созданные до изменения, снова становятся действительными. Размышления, созданные после него, не проходят проверку префикса, поэтому удалите их или продолжайте отправлять `"drop_block"`.

## Во что обходится отбрасывание размышлений

Claude может тратить больше выходных токенов на повторное выстраивание рассуждений, которые он больше не может прочитать. Отбрасывание блоков также делает недействительным «prompt cache» (кэш подсказок) начиная с первого отброшенного блока.

Когда что-то меняется на каждом ходе, каждый ход теряет размышления предыдущих ходов, поэтому рост повторяется. Запустите «evals» (оценки) на собственной рабочей нагрузке, прежде чем полагаться на `"drop_block"`.

<Frame>
  ![Четыре запроса после изменения: первый отклоняется; следующие три отбрасывают (drop) старые размышления (thinking) и сохраняют каждый новый блок](https://platform.claude.com/docs/ru/images/preserved-thinking-drop-block-loss.svg)
</Frame>

Используйте `"drop_block"`, чтобы продолжать существующие разговоры, пока они содержат изменение, которое вы исправляете, а также для запланированного отбрасывания, например [после вашей собственной сводки](https://platform.claude.com/docs/ru/build-with-claude/compaction-thinking-blocks#own-summary). Не оставляйте его включённым, чтобы скрыть изменение, которое ваш код продолжает вносить. Вы можете [прекратить его отправку](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#drop-block-cost-details), как только недействительных блоков не останется в истории.

## Найдите, что изменил ваш код

Изменение находится перед первым блоком, который называет API. Ошибка 400 может сообщать, что изменилось, например `system`, `tools`, отсутствующий блок размышлений или первое отличающееся сообщение. Если ошибки нет или она этого не сообщает, [начните с того, что у вас есть](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#find-the-change-details), например с записи `prefix_binding_mismatch` или увеличения числа выходных токенов.

## Проверьте ваш код на провалы проверки префикса

Тесту можно доверять, когда вы увидели, как он проваливается. Сначала через собственный код запустите сеанс, в котором Claude размышляет, и намеренно что-нибудь измените. На этом шаге отправляйте `"drop_block"`, чтобы ответ перечислял каждый недействительный блок, а не останавливался на первом, как показывают [пять шагов и программа](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#how-to-tell-whether-your-integration-is-impacted-details).

Затем уберите это изменение и запустите ваши реальные сеансы. В каждом запросе отправляйте бета-заголовок `thinking-binding-controls-2026-08-01` и устанавливайте для [`prefix_mismatch_behavior`](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/prefix-checks#preserved-thinking-controls) значение `"error"`, чтобы изменение, которое ваш код вносит в этих сеансах, приводило к провалу сборки с ошибкой 400.

Тестируйте сеансы, которые выполняют «compaction» (сжатие контекста), добавляют инструменты позже, меняют инструкции, [переключают модели](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking#switching-models) или возобновляются: обычные ходы не доходят до этого кода.

Чистый прогон не содержит ни записи `prefix_binding_mismatch`, ни ошибки. Он показывает лишь, что проверенные им блоки действительны в тех сеансах, которые вы запустили. Он ничего не доказывает, если:

* в сеансе не было блоков размышлений
* ваш код удаляет все размышления или модель не поддерживает сохранённые размышления
* вы не отправили бета-заголовок, и [модель может пропустить блоки, не прошедшие проверку префикса,](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/prefix-checks#outcomes) без ошибки

## Следите за продакшеном и находите рассуждения, потерянные без ошибки

Записывайте в журнал каждую ошибку 400 и [обрабатывайте её в коде](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#handle-the-error-in-code), чтобы разговор продолжался. Если вместо этого вы не указываете `prefix_mismatch_behavior` в запросах, [отслеживайте рабочий трафик](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/prefix-checks#watch-production-traffic) на предмет размышлений, которые не прошли проверку префикса и дошли до Claude.

Рассуждения могут быть потеряны без ошибки из-за `"drop_block"`, элемента пакета, переключения модели, перехода на [другой аккаунт](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking#account-bound-thinking) или кода, который не отправляет размышления обратно. С бета-заголовком каждый из этих случаев, кроме последнего, оставляет запись. Для последнего проверьте, что ваши запросы содержат блоки `thinking`.

## Технические подробности

### Что ещё может говорить сообщение об ошибке

Далее сообщение об ошибке называет, что изменилось, если API может это определить, например `system`, `tools`, первое отличающееся сообщение или блок, отсутствующее или новое содержимое, либо более ранний блок размышлений, который отсутствует или стоит не на своём месте. Формулировка этого предложения может меняться, поэтому не сопоставляйте по ней. Если в запросе не было бета-заголовка, сообщение об ошибке добавляет такое предложение:

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

### Ошибка по-прежнему запрашивает заголовок или сообщает `Extra inputs are not permitted`

Если ошибка по-прежнему запрашивает заголовок, заголовок не дошёл до API: его могли удалить прокси или библиотека. Другая ошибка, оканчивающаяся на `block_binding: Extra inputs are not permitted`, означает то же самое либо то, что размышления отключены.

### Удалите недействительные размышления вручную

Используйте этот способ там, где вы не можете отправить настройку, или в одном из следующих случаев:

* После того как вы удалили секрет, персональные данные или внедрённый текст, потому что `"drop_block"` оставляет размышления в сохранённой истории.
* Когда размышления отключены (`"disabled"` или `"between_tools"`), потому что `"drop_block"` требует `"adaptive"`, что включило бы размышления и добавило бы выходные токены.

1. Удалите блок, который называет ошибка, и каждый блок `thinking` и [`redacted_thinking`](https://platform.claude.com/docs/ru/build-with-claude/thinking#redacted-thinking-blocks) после него, иначе та же ошибка затем назовёт следующий недействительный блок. Но если ваша история содержит сообщения `role: "system"` или два сообщения одной роли подряд, удалите все блоки `thinking` и `redacted_thinking`. Ошибка считает такое сообщение частью предыдущего, поэтому названная ею позиция может быть меньше индекса в вашем массиве. `path` записи `input_transformations` считает каждое сообщение отдельно.
2. Сохраните все остальные блоки и отправьте запрос снова. Не возвращайте удалённые блоки.

### Ошибки, похожие на эту

Эти ошибки не сообщают, что блок привязан к другому разговору, и установка `prefix_mismatch_behavior` может их не устранить:

* Сообщение, которое заканчивается на «Invalid `signature` in `thinking` block», говорит «cannot be modified» или касается `budget_tokens`: [Устранение неполадок размышлений](https://platform.claude.com/docs/ru/build-with-claude/thinking-troubleshooting)
* Сообщение о `temperature` или о предзаполненном ответе: [Ограничения и совместимость функций](https://platform.claude.com/docs/ru/build-with-claude/thinking#limits-and-feature-compatibility)

### Когда можно прекратить отправку `"drop_block"`

Чтобы прекратить отправку `"drop_block"`, удалите блоки, которые он отбрасывает, и сохраните размышления, созданные после этого. Если больше ничего не изменилось, разговор затем проходит с `"error"`.

### Обработайте ошибку в коде

Чтобы обработать ошибку в коде, отправляйте бета-заголовок и `"error"` в каждом запросе, чтобы провал был ошибкой 400 на любой модели. Когда она приходит, переключите только этот разговор на `"drop_block"` для всех последующих запросов, сохраните этот выбор вместе с ним, отправьте запрос ещё раз и запишите ошибку в журнал. Если та же ошибка возвращается, настройка не дошла до API: см. [Ошибка по-прежнему запрашивает заголовок или сообщает `Extra inputs are not permitted`](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#setting-not-received).

Ваш код должен распознавать эту ошибку по полю `message` — это исключение из общего совета не сопоставлять текст ошибки. Каждая ошибка 400 имеет тип `invalid_request_error`, и у этой нет `error.details.error_code`. Сопоставляйте только по «The block is bound to a different conversation», потому что остальная часть сообщения может меняться.

### У вас нет ошибки или она не сообщает, что изменилось

* **Ошибка 400, в которой не названо изменение:** Сравните запросы самостоятельно. Одна из причин — блок сжатия, отправленный без удаления сообщений, которые он обобщает.

* **Запись `prefix_binding_mismatch`:** Сравните `system`, `tools` и `messages` вплоть до `path` первой записи с разговором в том виде, в каком он был при создании этого блока. Если перечислены все блоки, начните с `system` и `tools`.

  Если ничего не отличается, ищите [URL изображения или документа, содержимое которого изменилось](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/change-tools-or-instructions#files-by-id), изменённый список инструментов сервера MCP (см. [Закрепите список инструментов сервера MCP](https://platform.claude.com/docs/ru/agents-and-tools/mcp-connector#pin-mcp-tool-list)) или блок размышлений, который был пропущен, перемещён или возвращён обратно. Без журналов запросов отправьте запрос снова с `"error"` и прочитайте предложение, в котором сказано, что отличается, если оно есть.

* **Чужой прокси или библиотека посередине:** Сравните то, что они отправляют, с тем, что отправили вы, и направьте их сопровождающего к разделу [Библиотеки, прокси и шлюзы](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/change-tools-or-instructions#libraries-proxies-gateways).

* **Только подозрение и нет Claude Code:** Зафиксируйте тела запросов разговора, в котором есть сжатие или изменение инструментов. Сравните каждое с предыдущим, не учитывая его новые ходы.

### Пять шагов для теста, который может провалиться, и программа, которая их выполняет

1. В собственном коде отправляйте бета-заголовок и `"drop_block"` в каждом запросе сеанса к [модели с сохранёнными размышлениями](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/prefix-checks#outcomes).
2. Используйте подсказки, которые заставляют Claude размышлять, и проверьте, что первый ответ содержит блок `thinking`. С адаптивными размышлениями Claude может пропустить размышления на простой подсказке.
3. Считайте тест проваленным только при записи `input_transformations`, причина которой — `prefix_binding_mismatch`. Тест, ожидающий пустой массив, также провалится после переключения модели, потому что тогда ожидаемы записи с `model_binding_mismatch` или `organization_binding_mismatch`.
4. Намеренно что-нибудь измените, например добавьте подсказку `system` только в третьем запросе.
5. Проверьте, что `input_transformations` перечисляет блоки размышлений, которые находятся после изменения. Если там ничего не перечислено, проверьте, что история содержит блок размышлений.

Эта программа выполняет шаги 1, 2, 4 и 5. Она выводит, сколько блоков размышлений и записей `input_transformations` содержит каждый ответ, а затем каждую запись — именно это проверяет шаг 3:

<CodeGroup exclude="shell:cURL, shell:CLI">
  <CodeGroupItem language="cURL">
    Этот рабочий процесс требует больше логики, чем одна команда оболочки. Используйте [Anthropic SDK](https://platform.claude.com/docs/ru/cli-sdks-libraries/overview), чтобы его выполнить.
  </CodeGroupItem>

  <CodeGroupItem language="CLI">
    Этот рабочий процесс требует больше логики, чем одна команда оболочки. Используйте [Anthropic SDK](https://platform.claude.com/docs/ru/cli-sdks-libraries/overview), чтобы его выполнить.
  </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"},
          },
          # Только последний запрос добавляет системную подсказку, что намеренно меняет префикс
          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" }
      },
      // Только последний запрос добавляет системную подсказку, что намеренно меняет префикс
      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,
                  },
              },
              // Только последний запрос добавляет системную подсказку, что намеренно изменяет префикс
              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)))
  	// Только последний запрос добавляет системную подсказку, намеренно изменяя префикс
  	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) {
              // Только последний запрос добавляет системную подсказку, что намеренно меняет префикс
              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,
              ),
          ),
          // Только последний запрос добавляет системную подсказку, что намеренно меняет префикс
          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 }
    # Только последний запрос добавляет системную подсказку, что намеренно меняет префикс
    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
```

С `"error"` вместо `"drop_block"` третий запрос получает [ошибку 400](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#prefix-mismatch-error).

### Что означает каждая запись `input_transformations` и какие из них исправлять вам

С бета-заголовком ответ от модели, поддерживающей размышления, содержит массив `input_transformations` рядом с `usage`. Он пуст, если ничего не было отброшено и ничего недействительного не было пропущено. При потоковой передаче он находится в `message` события `message_start`; после резервного переключения посреди потока актуальный массив содержит последнее событие `message_delta`. В отличие от позиции в ошибке, `path` всегда указывает место блока в том виде, в каком вы его отправили:

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

Значения `type` и `reason` каждой записи и что они означают:

* **`thinking_dropped`, `prefix_binding_mismatch`:** То, что предшествовало этому блоку, не совпадает с тем, что он зафиксировал. Исправлять вам: [Найдите, что изменил ваш код](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#find-the-change).
* **`thinking_mismatch_allowed`, `prefix_binding_mismatch`:** То же самое, но Claude прочитал блок без изменений, и за него выставляется счёт. Эта запись появляется только тогда, когда настройка не указана в запросе, на [некоторых моделях](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/prefix-checks#outcomes). Исправлять вам.
* **`thinking_dropped`, `model_binding_mismatch`:** Эта модель не может читать блоки модели, которая его создала. Исправлять не вам: [продолжайте отправлять весь разговор](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking#switching-models).
* **`thinking_dropped`, `organization_binding_mismatch`:** Блок создал другой аккаунт, поэтому [API отбросил его](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking#account-bound-thinking). Исправлять не вам.

Игнорируйте запись, `type` или `reason` которой вам незнакомы.

### Пакеты и подсчёт токенов

* **[Message Batches](https://platform.claude.com/docs/ru/build-with-claude/batch-processing):** Элемент, в котором `prefix_mismatch_behavior` не указан, никогда не получает ошибку 400. API отбрасывает недействительные блоки или, на [некоторых моделях](https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/prefix-checks#outcomes), может их пропустить. Элемент, в котором задано `"error"`, завершается со статусом `errored`, когда блок не проходит проверку префикса. `block_binding` указывается в `params.thinking` элемента.
* **[Подсчёт токенов](https://platform.claude.com/docs/ru/build-with-claude/token-counting):** В Claude API подсчёт токенов может вернуть ту же ошибку 400 и принимает `prefix_mismatch_behavior` с тем же заголовком. Он не учитывает отброшенные блоки при подсчёте и не возвращает `input_transformations`.

## Дальнейшие шаги

<CardGroup cols={2}>
  <Card title="Изменение инструментов или инструкций без провала проверки префикса" icon="edit" href="https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking/change-tools-or-instructions">
    Что отправлять вместо каждого изменения, которое ваш код вносит в разговор.
  </Card>

  <Card title="Сохранённые размышления" icon="book" href="https://platform.claude.com/docs/ru/build-with-claude/preserved-thinking">
    Что такое сохранённые размышления, к чему привязан блок размышлений, а также переключение моделей или аккаунтов.
  </Card>

  <Card title="Устранение неполадок размышлений" icon="wrench" href="https://platform.claude.com/docs/ru/build-with-claude/thinking-troubleshooting">
    Исправления других ошибок размышлений, например подписи, которая не проходит проверку.
  </Card>
</CardGroup>
