Komprimierung und beibehaltenes Denken
Wann Thinking-Blöcke in Turns, die nach einer Komprimierung auf Anfrage beibehalten werden, auf Modellen mit beibehaltenem Denken gültig bleiben, und wie du das prüfst.
Überspringe diese Seite, es sei denn, du sendest „thinking blocks“ (Thinking-Blöcke) an ein Modell mit „preserved thinking“ (beibehaltenem Denken) zurück und behältst Turns nach dem „compaction block“ (Komprimierungsblock) bei. „Kept turns“ (beibehaltene Turns) sind die Turns, die auf den Block folgen: die letzten Turns, die du aus der Komprimierungsanfrage herausgelassen hast, wie in Komprimierung, die die letzten Turns beibehält, oder Turns, die eingetroffen sind, während die Zusammenfassung geschrieben wurde, wie in Komprimierung im Hintergrund.
Modelle mit beibehaltenem Denken prüfen frühere Thinking-Blöcke gegen die Konversation, die sie erzeugt hat. Eine Zusammenfassung ersetzt einen Teil dieser Konversation, aber die Prüfung akzeptiert den Austausch, wenn die API die Zusammenfassung geschrieben hat, sodass das „thinking“ (Denken) in beibehaltenen Turns gültig bleiben kann.
Bedingungen, unter denen beibehaltenes Thinking gültig bleibt
Die Thinking-Blöcke in beibehaltenen Turns bleiben gültig, solange alle folgenden Bedingungen erfüllt sind:
- Die Komprimierungsanfrage läuft auf einem Modell mit beibehaltenem Denken. Diese Bedingung umfasst jede Komprimierungsanfrage, seit ein Thinking-Block erzeugt wurde, nicht nur die jüngste. Eine Möglichkeit, sie zu erfüllen, besteht darin, jede Komprimierungsanfrage an das Modell zu senden, das die Konversation verwendet.
- Die beibehaltenen Turns folgen direkt auf die zusammengefassten Nachrichten, und du sendest sie unverändert. Sende jede beibehaltene Nachricht genau so, wie sie in deinem Verlauf steht. Überspringe keine Nachricht zwischen der letzten zusammengefassten Nachricht und der ersten beibehaltenen, und füge dort auch keine hinzu. Die erste beibehaltene Nachricht muss außerdem eine andere Rolle haben als die letzte zusammengefasste Nachricht, und sie darf keine
role: "system"-Nachricht mitten in der Konversation sein. Andernfalls führt die API sie mit der letzten zusammengefassten Nachricht zusammen. Eine Möglichkeit, die erste beibehaltene Nachricht richtig zu setzen, besteht darin, genau diemessageseiner Anfrage zu komprimieren, die du bereits gesendet hast. Die beibehaltenen Turns beginnen dann mit Claudes Antwort darauf. systemund dietools, die nicht mitdefer_loading: truemarkiert sind, ändern sich nicht. Sie sind in der Komprimierungsanfrage dieselben wie in den Anfragen, die das beibehaltene Thinking erzeugt haben, und sie bleiben in den nachfolgenden Anfragen gleich. System-Prompt oder Tools ändern beschreibt, wie du sie sicher änderst.
Wenn eine Bedingung nicht erfüllt ist, schlägt beim Komprimieren nichts fehl, und die API akzeptiert den Block in späteren Anfragen so oder so. Der Fehler tritt bei der ersten späteren Anfrage auf, die das beibehaltene Thinking dort sendet, wo die API die Prüfung durchsetzt: standardmäßig ein 400-Fehler oder verworfene Thinking-Blöcke, wenn die Anfrage thinking.block_binding.prefix_mismatch_behavior auf "drop_block" setzt. In der Message Batches API schlägt ein Element, das das Feld nicht setzt, nicht fehl. Wo die Prüfung standardmäßig gilt, verwirft die API stattdessen die Blöcke. Was die API mit einem ungültigen Block macht beschreibt beide Ergebnisse, und Wann die API die Prüfung erzwingt gibt an, welche Anfragen geprüft werden.
Erneut komprimieren, ohne älteres Thinking ungültig zu machen
Du kannst erneut komprimieren und Turns beibehalten: Der neue Block umfasst die alte Zusammenfassung und jede Nachricht, die ihr in der Komprimierungsanfrage folgt, und alle Turns, die du aus dieser Anfrage herauslässt, sind beibehaltene Turns des neuen Blocks.
Die erste der Bedingungen für beibehaltenes Thinking zählt jede Komprimierung, seit ein Thinking-Block erzeugt wurde. Bei einem Turn, den du über zwei Komprimierungen hinweg beibehältst, müssen daher beide auf einem Modell mit beibehaltenem Denken gelaufen sein.
Komprimierungen, die stattfanden, bevor ein Thinking-Block erzeugt wurde, zählen nicht gegen ihn. Thinking, das erzeugt wird, nachdem ein Block vorhanden ist, ist an diesen Block gebunden und bleibt über spätere Komprimierungen hinweg gültig, die die Bedingungen erfüllen.
System-Prompt oder Tools ändern
Eine spätere Anfrage kann ein anderes system, andere tools oder ein anderes Modell als die Komprimierungsanfrage verwenden, und die API akzeptiert den Block trotzdem. Eine solche Änderung kann das Thinking in den beibehaltenen Turns ungültig machen, hat aber keine weitere Auswirkung.
Um system oder tools zu ändern, ohne beibehaltenes Thinking ungültig zu machen, komprimiere zuerst die gesamte Konversation, sodass keine Turns beibehalten werden. Ändere sie dann in der nächsten Anfrage.
Um eine Anweisung hinzuzufügen oder die verfügbaren Tools zu ändern, ohne system oder tools anzufassen, hänge die Änderung an messages an, wie in Änderungen vornehmen, ohne das Präfix zu bearbeiten beschrieben.
System-Nachrichten mitten in der Konversation innerhalb der zusammengefassten Turns werden ebenfalls zusammengefasst, sodass ihre Textanweisungen nach dem Austausch nicht mehr gelten. Um eine davon in Kraft zu halten, formuliere sie erneut in einer role: "system"-Nachricht direkt nach dem ersten neuen user-Turn, der auf die beibehaltenen Turns folgt. Tool-Änderungen innerhalb dieser Turns werden von selbst übernommen, wenn die Komprimierungsanfrage auch inline-tools-2026-09-15 enthält: Der zurückgegebene Block erfasst ihre Nettowirkung in seinem Feld tool_changes, also sende den Block unverändert zurück. Wenn der Block kein Feld tool_changes hat, formuliere diese Tool-Änderungen auf dieselbe Weise erneut. Eine System-Nachricht, die zwischen dem Block und den beibehaltenen Turns platziert wird, macht deren Thinking ungültig.
Prüfen, ob das beibehaltene Thinking gültig geblieben ist
Die Komprimierungsantwort sagt nicht, ob das beibehaltene Thinking gültig bleibt. Das zeigt erst die erste Anfrage nach dem Austausch. So prüfst du es in deinen Tests:
- Führe eine kurze Konversation mit aktiviertem Thinking. Verwende ein Modell, auf dem die API die Prüfung ausführt (siehe Wann die API die Prüfung erzwingt), und verwende es für jeden Schritt, denn ein Modell, das einen Thinking-Block nicht lesen kann, verwirft ihn ohne Fehler.
- Komprimiere die älteren Turns und behalte mindestens einen Turn bei, der einen Thinking-Block enthält.
- Sende die nächste Anfrage mit dem Block zuerst, dann dem beibehaltenen Turn, dann einer neuen
user-Nachricht, und mitthinking.block_binding.prefix_mismatch_behaviorauf"error"gesetzt. - Lies das Ergebnis. Eine 200-Antwort, deren
input_transformations-Array leer ist, bedeutet, dass jeder Thinking-Block die Prüfung bestanden hat und keiner verworfen wurde. Ein 400-Fehler, der besagt, dass der Block an eine andere Konversation gebunden ist, bedeutet, dass dies bei einem Block der Fall war. Die Meldung beginnt mit dem Pfad des ersten Blocks, der die Prüfung nicht bestanden hat, und Was die API mit einem ungültigen Block macht zeigt sie vollständig.
Das Feld prefix_mismatch_behavior benötigt den Beta-Header thinking-binding-controls-2026-08-01 zusätzlich zum Beta-Header compact-2026-09-04. Das Setzen des Feldes aktiviert die Prüfung für die Anfrage außerdem bei Konten, bei denen die Prüfung nicht standardmäßig aktiviert ist.
Das folgende Programm führt die vier Schritte aus. Es gibt aus, wie viele Thinking-Blöcke der beibehaltene Turn enthält und wie viele Einträge input_transformations hat; keine Einträge bedeuten, dass das beibehaltene Thinking gültig geblieben ist:
from anthropic.types.beta import BetaMessageParam, BetaThinkingConfigParam
client = anthropic.Anthropic()
# Claude Fable 5.1 ist das erste Modell, das zurückgesendetes Thinking mit der Konversation abgleicht.
MODEL = "claude-fable-5-1"
BETAS = ["compact-2026-09-04", "thinking-binding-controls-2026-08-01"]
SYSTEM = "You help plan a recipe app's release. Keep answers short."
# Mit "error" lässt ein Thinking-Block, der die Prüfung nicht besteht, die Anfrage mit einem 400 fehlschlagen.
THINKING: BetaThinkingConfigParam = {
"type": "adaptive",
"block_binding": {"prefix_mismatch_behavior": "error"},
}
# 1. Führe eine kurze Konversation mit aktiviertem Thinking.
history: list[BetaMessageParam] = [
{"role": "user", "content": "What are the main entities in the app's data model?"}
]
first = client.beta.messages.create(
model=MODEL,
max_tokens=8192,
system=SYSTEM,
betas=BETAS,
thinking=THINKING,
messages=history,
)
history += [
{"role": "assistant", "content": first.content},
{
"role": "user",
"content": "Testing starts on Tuesday, March 3, 2026, takes 10 weekdays, and pauses on March 9 and March 16. On which date does it end?",
},
]
second = client.beta.messages.create(
model=MODEL,
max_tokens=8192,
system=SYSTEM,
betas=BETAS,
thinking=THINKING,
messages=history,
)
history.append({"role": "assistant", "content": second.content})
thinking_blocks = sum(block.type == "thinking" for block in second.content)
print(f"Thinking blocks in the kept turn: {thinking_blocks}")
# 2. Fasse den ersten Turn zusammen. Der zweite Turn bleibt aus der Anfrage heraus.
summary = client.beta.messages.create(
model=MODEL,
max_tokens=4096,
system=SYSTEM,
betas=BETAS,
thinking=THINKING,
messages=history[:2],
compaction={"type": "summarize"},
)
if summary.stop_reason != "compaction":
raise SystemExit(f"No summary: {summary.stop_reason}")
# 3. Setze den Block vor den beibehaltenen Turn und stelle die nächste Frage.
history = [
{"role": "assistant", "content": summary.content},
*history[2:],
{"role": "user", "content": "Which day should the release go out?"},
]
third = client.beta.messages.create(
model=MODEL,
max_tokens=8192,
system=SYSTEM,
betas=BETAS,
thinking=THINKING,
messages=history,
)
# 4. Ein 200 ohne verworfene Blöcke bedeutet, dass das beibehaltene Thinking gültig war.
print(f"Dropped thinking blocks: {len(third.input_transformations)}")Thinking blocks in the kept turn: 1
Dropped thinking blocks: 0In der Produktion sorgt "drop_block" dafür, dass Anfragen weiterhin erfolgreich sind, wenn eine Bedingung nicht erfüllt ist, und meldet jeden verworfenen Block in input_transformations mit reason: "prefix_binding_mismatch". Ein Eintrag, dessen path in einen beibehaltenen Turn fällt, bedeutet, dass das Thinking dieses Turns nicht gültig geblieben ist. Was die API mit einem ungültigen Block macht beschreibt, was verworfen wird, und erklärt, wie du dafür Alarme einrichtest.
Compatibility
| Supported models |
|
|---|---|
| Supported platforms |
|
Was this page helpful?