Claude Platform Docs
MessagesKomprimierung

Komprimierung, die die letzten Turns beibehält

Fasse die älteren Turns einer Unterhaltung mit Komprimierung auf Anfrage zusammen und sende die neuesten Turns wortwörtlich nach der Zusammenfassung.

„Keep-tail compaction“ (Komprimierung mit beibehaltenem Ende) behält die letzten paar „turns“ (Gesprächsrunden) einer Unterhaltung nach der Zusammenfassung wortwörtlich bei. Sie ändert zwei Dinge in der Komprimierungsschleife: welche Nachrichten in die Komprimierungsanfrage eingehen und was du nach dem Block sendest. Alles in Ab der Zusammenfassung fortfahren gilt unverändert.

Auswählen, welche Turns beibehalten werden

Kein Parameter legt fest, welche Turns beibehalten werden. Du wählst einen Schnittpunkt in deinem Verlauf: Die Nachrichten davor gehen in die Komprimierungsanfrage ein, und die Nachrichten ab diesem Punkt werden beibehalten.

Beibehaltene Turns gehen in voller Länge an Claude zurück. Je mehr du also beibehältst, desto weniger Platz schafft die Komprimierung.

Setze den Schnitt dort, wo kein „tool call“ (Tool-Aufruf) offen bleibt, sodass jeder Tool-Aufruf und sein Ergebnis auf derselben Seite liegen. Wenn die Nachrichten, die du sendest, mit einem assistant-Turn enden, dessen Tool-Aufruf noch kein Ergebnis hat, lehnt die API die Komprimierungsanfrage ab.

Die älteren Turns komprimieren und den Rest nach dem Block senden

Um die letzten Turns wortwörtlich beizubehalten, lass diese Turns aus der Komprimierungsanfrage heraus. Die API fasst jede Nachricht zusammen, die ihr gesendet wird. Sende also nur die älteren Turns und setze dann den Block vor die Turns, die du beibehalten hast.

Sende die beibehaltenen Turns genau so, wie sie in deinem Verlauf stehen, einschließlich der Thinking-Blöcke. Beide Anfragen enthalten den Beta-Header, wie in Eine Zusammenfassung anfordern.

Im folgenden Beispiel enthält der Verlauf zwei Turns, und der Schnitt behält den zweiten bei. Die Komprimierungsanfrage enthält den ersten Turn:

{
  "model": "claude-opus-5-5",
  "max_tokens": 4096,
  "messages": [
    {
      "role": "user",
      "content": "I am building a recipe app. Help me name the main entities in the data model."
    },
    {
      "role": "assistant",
      "content": "Start with Recipe, Ingredient, and Step. Add a RecipeIngredient entry that holds the quantity and unit for each ingredient in a recipe."
    }
  ],
  "compaction": { "type": "summarize" }
}

Die nächste Anfrage sendet zuerst den zurückgegebenen Block, dann den beibehaltenen Turn genau so, wie er war, und dann die neue user-Nachricht. Ab der Zusammenfassung fortfahren zeigt eine Anfrage, die mit einem Block beginnt.

Das folgende Programm ist die Schleife aus In einer Schleife komprimieren, so geändert, dass die letzten zwei Turns beibehalten werden. Die hervorgehobenen Zeilen zeigen, wo es sich von der Schleife unterscheidet.

from anthropic.types.beta import BetaMessageParam

client = anthropic.Anthropic()

# Setze dies nahe an dein echtes Input-Budget. Hier ist es niedrig, damit ein kurzes Gespräch kompaktiert wird.
COMPACT_AT_TOKENS = 2500
SYSTEM = "You help design a recipe app's data model. Keep answers short."
KEEP_TURNS = 2

QUESTIONS = [
    "What are the main entities in the data model?",
    "Which fields should Recipe have?",
    "Which fields should Ingredient have?",
    "Which fields should RecipeIngredient have?",
    "Which fields should Step have?",
    "Which indexes should these tables have?",
    "Which fields should be required?",
    "Which fields should have default values?",
]

history: list[BetaMessageParam] = []
for turn, question in enumerate(QUESTIONS, start=1):
    history.append({"role": "user", "content": question})
    response = client.beta.messages.create(
        model="claude-opus-5-5",
        max_tokens=8192,
        system=SYSTEM,
        betas=["compact-2026-09-04"],
        messages=history,
    )
    history.append({"role": "assistant", "content": response.content})

    # Die nächste Anfrage sendet diese Antwort mit, also zähle sie mit.
    conversation_tokens = response.usage.input_tokens + response.usage.output_tokens
    if conversation_tokens > COMPACT_AT_TOKENS and KEEP_TURNS < turn < len(QUESTIONS):
        # Ein Turn besteht aus einer User-Nachricht und einer Assistant-Antwort,
        # daher beginnen die behaltenen Turns mit einer User-Nachricht.
        split = -2 * KEEP_TURNS
        older, recent = history[:split], history[split:]
        summary = client.beta.messages.create(
            model="claude-opus-5-5",
            max_tokens=4096,
            system=SYSTEM,
            betas=["compact-2026-09-04"],
            messages=older,
            compaction={"type": "summarize"},
        )
        if summary.stop_reason == "compaction":
            history = [{"role": "assistant", "content": summary.content}, *recent]
            print(f"Kept {len(recent) // 2} turns after the block")
  • Den Schnitt wählen: Das Programm behält die letzten zwei Turns bei, wobei ein Turn aus einer user-Nachricht und der Antwort darauf besteht. Es teilt den Verlauf vier Nachrichten vor dem Ende, sodass die beibehaltenen Turns mit einer user-Nachricht beginnen.
  • Entscheiden, wann komprimiert wird: Die Größenprüfung verlangt außerdem, dass die Unterhaltung mehr Turns hat, als das Programm beibehält, sodass der ältere Teil nie leer ist.
  • Die Komprimierungsanfrage: Wo die Schleife den gesamten Verlauf sendet, sendet diese Version nur die älteren Nachrichten.
  • Der Austausch: Wo die Schleife den gesamten Verlauf durch die zurückgegebene Nachricht ersetzt, besteht der neue Verlauf dieser Version aus der zurückgegebenen Nachricht, gefolgt von den beibehaltenen Turns.

Die stop_reason-Prüfung und jede Anfrage nach dem Austausch sind gegenüber der Schleife unverändert.

Thinking in den beibehaltenen Turns gültig halten

Wenn du Thinking-Blöcke bei einem Modell mit „preserved thinking“ (beibehaltenem Denken) zurücksendest, bleibt das Thinking in den beibehaltenen Turns nur gültig, solange die Bedingungen für beibehaltenes Thinking erfüllt sind, und eine davon schränkt ein, wo der Schnitt liegen kann.

Der Schnitt des Programms, zwischen einer Antwort und der nächsten user-Nachricht, erfüllt diese Bedingung. Das gilt auch für einen Schnitt am Ende einer Anfrage, die du bereits gestellt hast: Komprimiere genau die messages dieser Anfrage und behalte alles bei, was dein Verlauf seitdem hinzugewonnen hat.

Compatibility

Supported models
  • Fable 5 and 5.1
  • Mythos 5, 5.1, and Preview
  • Opus 4.6, 4.7, 4.8, 5, and 5.5
  • Sonnet 4.6 and 5
Supported platforms
  • Claude APIBeta
  • Claude Platform on AWSBeta
  • Google CloudBeta
  • Microsoft FoundryBeta

Was this page helpful?