---
title: Einen Thinking-Block beheben, der an eine andere Konversation gebunden ist
url: https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation
description: Bring eine Konversation nach dem 400-Fehler, der besagt, dass ein Thinking-Block an eine andere Konversation gebunden ist, wieder in Gang, finde heraus, was dein Code geändert hat, und teste, dass die Änderung verschwunden ist.
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
---

Dieselbe Anfrage erneut zu senden, kann nicht funktionieren, weil dein Verlauf immer noch enthält, was dein Code geändert hat. Sende `"drop_block"` ([Fehler jetzt stoppen](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#prefix-mismatch-error)). Die langfristige Lösung besteht darin, deinen Code [„append-only“ (nur anhängend)](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/prefix-checks#prefix-check) zu machen.

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

Der Thinking-Block hat die [„prefix check“ (Präfixprüfung)](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/prefix-checks#prefix-check) nicht bestanden: Etwas vor ihm hat sich geändert, nachdem Claude ihn erzeugt hat (siehe [Was als Änderung zählt](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/prefix-checks#what-counts-as-an-edit)), oder ein Thinking-Block zwischen anderen wurde weggelassen oder verschoben. Der Fehler sieht so aus und kann außerdem [benennen, was sich geändert hat](https://platform.claude.com/docs/de/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“ bedeutet anderen Inhalt vor dem Block: Die [Präfixprüfung](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/prefix-checks#prefix-check) vergleicht keine Sitzungen oder Benutzer. Die Fehlermeldung sagt, dass du den Block entfernen sollst, aber [nur diesen Block zu entfernen, reicht nicht aus](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#remove-by-hand). [Andere Fehler](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#similar-errors) können ähnlich aussehen.

Wenn die App nicht deine ist, starte eine neue Konversation und informiere ihren Maintainer. Wenn du [ein Geheimnis, personenbezogene Daten oder eingeschleusten Text entfernt hast](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/change-tools-or-instructions#remove-sensitive-content) oder deine Anfragen [das Nachdenken ausschalten](https://platform.claude.com/docs/de/build-with-claude/thinking#turning-thinking-off), [entferne das Nachdenken von Hand](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#remove-by-hand) anstelle von Schritt 1.

<Steps>
  <Step title="Fehler jetzt stoppen">
    Setze `thinking.block_binding.prefix_mismatch_behavior` auf `"drop_block"` und sende den [Beta-Header](https://platform.claude.com/docs/de/api/beta-headers#beta-features-on-other-platforms) `anthropic-beta: thinking-binding-controls-2026-08-01`. Tu dies bei jeder späteren Anfrage in der Konversation, weil die API die Einstellung zwischen Anfragen nicht speichert. Eine gespeicherte Konversation enthält die Änderung weiterhin, selbst nachdem du deinen Code behoben hast, also speichere die Einstellung mit ihr. Setze `type` auf `"adaptive"`, wie gezeigt:

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

    Rufe im SDK die Beta-Messages-Methode auf und übergib den Header-Wert, wie es [das Testprogramm](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#how-to-tell-whether-your-integration-is-impacted-details) tut. Wenn der Fehler [immer noch nach dem Header fragt](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#setting-not-received), ist der Header nicht angekommen.

    Das stoppt die Fehler, indem das ungültige Nachdenken weggelassen wird, aber es [kann mehr kosten](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#drop-block-cost) und kann die Ausgabequalität und die Latenz beeinflussen. Die nächste Anfrage ist erfolgreich, und ihr `input_transformations`-Array listet jeden Block auf, den die API weggelassen hat.

    Wenn deine Anfragen den Parameter `thinking` nicht setzen, ändert sein Hinzufügen sonst nichts, weil [Modelle mit bewahrtem Nachdenken](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/prefix-checks#outcomes) standardmäßig adaptiv nachdenken.
  </Step>

  <Step title="Langfristige Lösung">
    Mache deine Integration append-only:

    1. Finde die Änderung. Der Fehler kann sie benennen. Um herauszufinden, wo dein Code sie vornimmt, führe `claude update` aus und führe dann `/claude-api preserved-thinking-migration` in Claude Code im Repository deines Codes aus. Oder [suche von Hand](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#find-the-change-details).
    2. Höre auf, die Änderung vorzunehmen, sonst können auch neue Konversationen den Fehler bekommen. [Sende stattdessen am Ende ein Update](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/change-tools-or-instructions).
    3. Sende jeder laufenden Konversation weiterhin das `system` und die `tools` [ihrer letzten erfolgreichen Anfrage](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/change-tools-or-instructions#saved-sessions).
  </Step>
</Steps>

Wenn die Änderung neu war, kannst du sie stattdessen rückgängig machen: Stelle wieder her, was dein Code geändert hat. Das Nachdenken von vor der Änderung ist dann wieder gültig. Nachdenken, das seitdem erzeugt wurde, besteht die Präfixprüfung nicht, also entferne es oder sende weiterhin `"drop_block"`.

## Was das Weglassen von Nachdenken kostet

Claude kann mehr Ausgabe-Token dafür aufwenden, Reasoning zu erarbeiten, das es nicht mehr lesen kann. Das Weglassen der Blöcke macht außerdem den Prompt-Cache ab dem ersten weggelassenen Block ungültig.

Wenn sich bei jedem Turn etwas ändert, verliert jeder Turn das Nachdenken aus früheren Turns, sodass sich der Anstieg wiederholt. Führe Evals mit deiner eigenen Arbeitslast durch, bevor du dich auf `"drop_block"` verlässt.

<Frame>
  ![Vier Anfragen nach einer Änderung: Die erste wird abgelehnt; die nächsten drei lassen das alte Nachdenken weg und behalten jeden neuen Block](https://platform.claude.com/docs/de/images/preserved-thinking-drop-block-loss.svg)
</Frame>

Verwende `"drop_block"`, um bestehende Konversationen am Laufen zu halten, während sie eine Änderung enthalten, die du behebst, und für ein geplantes Weglassen, etwa [nach deiner eigenen Zusammenfassung](https://platform.claude.com/docs/de/build-with-claude/compaction-thinking-blocks#own-summary). Lass es nicht eingeschaltet, um eine Änderung zu verbergen, die dein Code immer wieder vornimmt. Du kannst [aufhören, es zu senden](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#drop-block-cost-details), sobald die ungültigen Blöcke aus dem Verlauf entfernt sind.

## Finde heraus, was dein Code geändert hat

Die Änderung liegt vor dem ersten Block, den die API benennt. Der 400-Fehler kann sagen, was sich geändert hat, etwa `system`, `tools`, ein fehlender Thinking-Block oder die erste Nachricht, die sich unterscheidet. Wenn es keinen Fehler gibt oder einen, der es nicht sagt, [beginne mit dem, was du hast](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#find-the-change-details), etwa einem `prefix_binding_mismatch`-Eintrag oder mehr Ausgabe-Token.

## Teste deinen Code auf nicht bestandene Präfixprüfungen

Du kannst einem Test vertrauen, sobald du ihn hast fehlschlagen sehen. Führe zuerst über deinen eigenen Code eine Sitzung aus, die Claude zum Nachdenken bringt, und ändere absichtlich etwas. Sende für diesen Schritt `"drop_block"`, damit die Antwort jeden ungültigen Block auflistet, statt beim ersten anzuhalten, wie [fünf Schritte und ein Programm](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#how-to-tell-whether-your-integration-is-impacted-details) zeigen.

Nimm diese Änderung dann wieder heraus und führe deine echten Sitzungen aus. Sende bei jeder Anfrage den Beta-Header `thinking-binding-controls-2026-08-01` und setze [`prefix_mismatch_behavior`](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/prefix-checks#preserved-thinking-controls) auf `"error"`, damit eine Änderung, die dein Code in diesen Sitzungen vornimmt, den Build mit dem 400-Fehler fehlschlagen lässt.

Teste Sitzungen, die komprimieren, spät Tools hinzufügen, Anweisungen ändern, [Modelle wechseln](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking#switching-models) oder fortgesetzt werden: Einfache Turns erreichen diesen Code nicht.

Ein sauberer Durchlauf hat keinen `prefix_binding_mismatch`-Eintrag und keinen Fehler. Er zeigt nur, dass die Blöcke, die er geprüft hat, gültig sind, und zwar in den Sitzungen, die du ausgeführt hast. Er beweist nichts, wenn:

* die Sitzung keine Thinking-Blöcke hatte
* dein Code das gesamte Nachdenken entfernt oder das Modell kein bewahrtes Nachdenken hat
* du den Beta-Header nicht gesendet hast und [das Modell Blöcke, die die Präfixprüfung nicht bestehen, möglicherweise ohne Fehler durchlässt](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/prefix-checks#outcomes)

## Überwache die Produktion und finde Reasoning, das ohne Fehler verloren ging

Protokolliere jeden 400-Fehler und [behandle ihn im Code](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#handle-the-error-in-code), damit die Konversation weiterläuft. Wenn du `prefix_mismatch_behavior` stattdessen nicht setzt, [überwache den Produktions-Traffic](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/prefix-checks#watch-production-traffic) auf Nachdenken, das die Präfixprüfung nicht besteht und Claude erreicht hat.

Reasoning kann ohne Fehler verloren gehen durch `"drop_block"`, ein Batch-Element, einen Modellwechsel, einen Wechsel zu [einem anderen Konto](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking#account-bound-thinking) oder Code, der kein Nachdenken zurücksendet. Mit dem Beta-Header hinterlässt jeder davon einen Eintrag, außer dem letzten. Prüfe für diesen, dass deine Anfragen `thinking`-Blöcke enthalten.

## Technische Details

### Was die Fehlermeldung sonst noch sagen kann

Die Fehlermeldung benennt außerdem, was sich geändert hat, sofern die API es erkennen kann, etwa `system`, `tools`, die erste Nachricht oder den ersten Block, der sich unterscheidet, Inhalt, der fehlt oder neu ist, oder einen früheren Thinking-Block, der fehlt oder nicht in der richtigen Reihenfolge ist. Der Wortlaut dieses Satzes kann sich ändern, also gleiche nicht darauf ab. Wenn die Anfrage keinen Beta-Header hatte, fügt die Fehlermeldung diesen Satz hinzu:

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

### Der Fehler fragt immer noch nach dem Header oder sagt `Extra inputs are not permitted`

Wenn der Fehler immer noch nach dem Header fragt, hat der Header die API nicht erreicht: Ein Proxy oder eine Bibliothek könnte ihn entfernt haben. Ein anderer Fehler, der mit `block_binding: Extra inputs are not permitted` endet, bedeutet dasselbe oder dass das Nachdenken ausgeschaltet ist.

### Das ungültige Nachdenken von Hand entfernen

Verwende dies dort, wo du die Einstellung nicht senden kannst, oder in einem dieser Fälle:

* Nachdem du ein Geheimnis, personenbezogene Daten oder eingeschleusten Text entfernt hast, weil `"drop_block"` das Nachdenken in deinem gespeicherten Verlauf belässt.
* Wenn das Nachdenken ausgeschaltet ist (`"disabled"` oder `"between_tools"`), weil `"drop_block"` `"adaptive"` benötigt, was das Nachdenken einschalten und Ausgabe-Token hinzufügen würde.

1. Entferne den Block, den der Fehler benennt, und jeden `thinking`- und [`redacted_thinking`](https://platform.claude.com/docs/de/build-with-claude/thinking#redacted-thinking-blocks)-Block danach, sonst benennt derselbe Fehler anschließend den nächsten ungültigen. Wenn dein Verlauf jedoch `role: "system"`-Nachrichten oder zwei Nachrichten derselben Rolle hintereinander enthält, entferne jeden `thinking`- und `redacted_thinking`-Block. Der Fehler zählt eine solche Nachricht als Teil der Nachricht davor, sodass die Position, die er benennt, niedriger sein kann als der Index in deinem Array. Der `path` eines `input_transformations`-Eintrags zählt jede Nachricht separat.
2. Behalte jeden anderen Block und sende die Anfrage erneut. Füge die entfernten Blöcke nicht wieder ein.

### Fehler, die diesem ähneln

Diese Fehler sagen nicht, dass der Block an eine andere Konversation gebunden ist, und das Setzen von `prefix_mismatch_behavior` behebt sie möglicherweise nicht:

* Eine Nachricht, die nach „Invalid `signature` in `thinking` block“ endet, „cannot be modified“ sagt oder sich auf `budget_tokens` bezieht: [Fehlerbehebung beim Nachdenken](https://platform.claude.com/docs/de/build-with-claude/thinking-troubleshooting)
* Eine Nachricht zu `temperature` oder einer vorausgefüllten Antwort: [Limits und Funktionskompatibilität](https://platform.claude.com/docs/de/build-with-claude/thinking#limits-and-feature-compatibility)

### Wann du aufhören kannst, `"drop_block"` zu senden

Um aufzuhören, `"drop_block"` zu senden, entferne die Blöcke, die es weglässt, und behalte das seitdem erzeugte Nachdenken. Wenn sich sonst nichts geändert hat, besteht die Konversation dann mit `"error"`.

### Den Fehler im Code behandeln

Um den Fehler im Code zu behandeln, sende bei jeder Anfrage den Beta-Header und `"error"`, damit eine nicht bestandene Präfixprüfung bei jedem Modell ein 400-Fehler ist. Wenn er auftritt, stelle nur diese Konversation für jede spätere Anfrage auf `"drop_block"` um, speichere diese Wahl mit ihr, sende einmal erneut und protokolliere den Fehler. Wenn derselbe Fehler zurückkommt, hat die Einstellung die API nicht erreicht: siehe [Der Fehler fragt immer noch nach dem Header oder sagt `Extra inputs are not permitted`](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#setting-not-received).

Dein Code muss diesen Fehler an seinem `message`-Feld erkennen, die Ausnahme von dem allgemeinen Rat, nicht auf den Text eines Fehlers abzugleichen. Jeder 400-Fehler hat den Typ `invalid_request_error`, und dieser hat keinen `error.details.error_code`. Gleiche nur auf „The block is bound to a different conversation“ ab, weil sich der Rest der Meldung ändern kann.

### Du hast keinen Fehler oder einen, der nicht sagt, was sich geändert hat

* **Der 400-Fehler, und er benennt keine Änderung:** Vergleiche die Anfragen selbst. Eine Ursache ist ein Komprimierungsblock, der gesendet wird, ohne die Nachrichten zu entfernen, die er zusammenfasst.

* **Ein `prefix_binding_mismatch`-Eintrag:** Vergleiche `system`, `tools` und `messages` bis zum `path` des ersten Eintrags mit der Konversation, wie sie war, als dieser Block erzeugt wurde. Wenn jeder Block aufgelistet ist, beginne mit `system` und `tools`.

  Wenn sich nichts unterscheidet, suche nach [einer Bild- oder Dokument-URL, deren Inhalt sich geändert hat](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/change-tools-or-instructions#files-by-id), der geänderten Tool-Liste eines MCP-Servers (siehe [Die Tool-Liste eines MCP-Servers fixieren](https://platform.claude.com/docs/de/agents-and-tools/mcp-connector#pin-mcp-tool-list)) oder einem Thinking-Block, der weggelassen, verschoben oder wieder eingefügt wurde. Ohne Anfrage-Logs sende die Anfrage erneut mit `"error"` und lies den Satz, der sagt, was sich unterscheidet, falls es einen gibt.

* **Ein Proxy oder eine Bibliothek dazwischen, die nicht deine ist:** Vergleiche, was sie sendet, mit dem, was du gesendet hast, und verweise ihren Maintainer auf [Bibliotheken, Proxys und Gateways](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/change-tools-or-instructions#libraries-proxies-gateways).

* **Nur ein Verdacht und kein Claude Code:** Zeichne die Anfrage-Bodies einer Konversation auf, einer mit einer Komprimierung oder einer Tool-Änderung. Vergleiche jeden mit dem vorherigen und lass dabei seine neuen Turns weg.

### Fünf Schritte für einen Test, der fehlschlagen kann, und ein Programm, das sie ausführt

1. Sende in deinem eigenen Code bei jeder Anfrage einer Sitzung den Beta-Header und `"drop_block"` an ein [Modell mit bewahrtem Nachdenken](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/prefix-checks#outcomes).
2. Verwende Prompts, die Claude zum Nachdenken bringen, und prüfe, dass die erste Antwort einen `thinking`-Block hat. Mit adaptivem Nachdenken kann Claude das Nachdenken bei einem einfachen Prompt überspringen.
3. Lass den Test nur bei einem `input_transformations`-Eintrag fehlschlagen, dessen Grund `prefix_binding_mismatch` ist. Ein Test, der ein leeres Array erwartet, schlägt auch nach einem Modellwechsel fehl, weil dann Einträge mit `model_binding_mismatch` oder `organization_binding_mismatch` zu erwarten sind.
4. Ändere absichtlich etwas, etwa indem du nur bei der dritten Anfrage einen `system`-Prompt hinzufügst.
5. Prüfe, dass `input_transformations` die Thinking-Blöcke auflistet, die nach der Änderung stehen. Wenn es keine auflistet, prüfe, dass der Verlauf einen Thinking-Block enthält.

Dieses Programm führt die Schritte 1, 2, 4 und 5 aus. Es gibt aus, wie viele Thinking-Blöcke und `input_transformations`-Einträge jede Antwort hat, und dann jeden Eintrag, was Schritt 3 prüft:

<CodeGroup exclude="shell:cURL, shell:CLI">
  <CodeGroupItem language="cURL">
    Dieser Workflow benötigt mehr Logik als ein einzelner Shell-Befehl. Verwende das [Anthropic SDK](https://platform.claude.com/docs/de/cli-sdks-libraries/overview), um ihn auszuführen.
  </CodeGroupItem>

  <CodeGroupItem language="CLI">
    Dieser Workflow benötigt mehr Logik als ein einzelner Shell-Befehl. Verwende das [Anthropic SDK](https://platform.claude.com/docs/de/cli-sdks-libraries/overview), um ihn auszuführen.
  </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"},
          },
          # Nur die letzte Anfrage fügt einen System-Prompt hinzu, was das Präfix absichtlich ändert
          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" }
      },
      // Nur die letzte Anfrage fügt einen System-Prompt hinzu, der das Präfix absichtlich ändert
      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,
                  },
              },
              // Nur die letzte Anfrage fügt einen System-Prompt hinzu, was das Präfix absichtlich ändert
              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)))
  	// Nur die letzte Anfrage fügt einen System-Prompt hinzu, was das Präfix absichtlich ändert
  	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) {
              // Nur die letzte Anfrage fügt einen System-Prompt hinzu, der das Präfix absichtlich ändert
              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,
              ),
          ),
          // Nur die letzte Anfrage fügt einen System-Prompt hinzu, der das Präfix absichtlich ändert
          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 }
    # Nur die letzte Anfrage fügt einen System-Prompt hinzu, was das Präfix absichtlich ändert
    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
```

Mit `"error"` anstelle von `"drop_block"` bekommt die dritte Anfrage [den 400-Fehler](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#prefix-mismatch-error).

### Was jeder `input_transformations`-Eintrag bedeutet und welche du beheben musst

Mit dem Beta-Header hat eine Antwort von einem Modell, das Nachdenken unterstützt, das `input_transformations`-Array neben `usage`. Es ist leer, wenn nichts weggelassen und nichts Ungültiges durchgelassen wurde. Beim Streaming befindet es sich in der `message` des `message_start`-Events; nach einem Fallback mitten im Stream enthält das abschließende `message_delta`-Event das maßgebliche. Anders als die Position im Fehler ist `path` immer die Stelle des Blocks, so wie du ihn gesendet hast:

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

Der `type` und `reason` jedes Eintrags und was sie bedeuten:

* **`thinking_dropped`, `prefix_binding_mismatch`:** Was vor diesem Block stand, ist nicht das, was er aufgezeichnet hat. Von dir zu beheben: [Finde heraus, was dein Code geändert hat](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/fix-bound-to-a-different-conversation#find-the-change).
* **`thinking_mismatch_allowed`, `prefix_binding_mismatch`:** Dasselbe, aber Claude hat den Block unverändert gelesen, und er wird in Rechnung gestellt. Dieser Eintrag erscheint nur dort, wo die Einstellung nicht gesetzt ist, bei [einigen Modellen](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/prefix-checks#outcomes). Von dir zu beheben.
* **`thinking_dropped`, `model_binding_mismatch`:** Dieses Modell kann keine Blöcke von dem Modell lesen, das ihn erzeugt hat. Nicht von dir zu beheben: [Sende weiterhin die gesamte Konversation](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking#switching-models).
* **`thinking_dropped`, `organization_binding_mismatch`:** Ein anderes Konto hat den Block erzeugt, daher [hat die API ihn weggelassen](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking#account-bound-thinking). Nicht von dir zu beheben.

Ignoriere einen Eintrag, dessen `type` oder `reason` du nicht kennst.

### Batches und Token-Zählung

* **[Message Batches](https://platform.claude.com/docs/de/build-with-claude/batch-processing):** Ein Element, das `prefix_mismatch_behavior` nicht setzt, bekommt nie den 400-Fehler. Die API lässt die ungültigen Blöcke weg oder kann sie bei [einigen Modellen](https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/prefix-checks#outcomes) durchlassen. Ein Element, das `"error"` setzt, wird als `errored` abgeschlossen, wenn ein Block die Präfixprüfung nicht besteht. `block_binding` gehört in `params.thinking` des Elements.
* **[Token-Zählung](https://platform.claude.com/docs/de/build-with-claude/token-counting):** Auf der Claude API kann die Token-Zählung denselben 400-Fehler zurückgeben und akzeptiert `prefix_mismatch_behavior` unter demselben Header. Sie lässt weggelassene Blöcke bei der Zählung außen vor und gibt keine `input_transformations` zurück.

## Nächste Schritte

<CardGroup cols={2}>
  <Card title="Tools oder Anweisungen ändern, ohne dass die Präfixprüfung fehlschlägt" icon="edit" href="https://platform.claude.com/docs/de/build-with-claude/preserved-thinking/change-tools-or-instructions">
    Was du anstelle jeder Änderung senden solltest, die dein Code an einer Konversation vornimmt.
  </Card>

  <Card title="Bewahrtes Nachdenken" icon="book" href="https://platform.claude.com/docs/de/build-with-claude/preserved-thinking">
    Was bewahrtes Nachdenken ist, woran ein Thinking-Block gebunden ist und wie du Modelle oder Konten wechselst.
  </Card>

  <Card title="Fehlerbehebung beim Nachdenken" icon="wrench" href="https://platform.claude.com/docs/de/build-with-claude/thinking-troubleshooting">
    Lösungen für andere Fehler beim Nachdenken, etwa eine Signatur, die sich nicht verifizieren lässt.
  </Card>
</CardGroup>
