Serverseitige Komprimierung ist die empfohlene Strategie zur Verwaltung von Kontext in langfristigen Gesprächen und agentengesteuerten Workflows. Sie verwaltet den Kontext automatisch mit minimalem Integrationaufwand.
Komprimierung erweitert die effektive Kontextlänge für langfristige Gespräche und Aufgaben, indem älterer Kontext automatisch zusammengefasst wird, wenn sich das Kontextfenster-Limit nähert. Dies ist ideal für:
Komprimierung ist derzeit in Beta. Fügen Sie den Beta-Header compact-2026-01-12 in Ihre API-Anfragen ein, um diese Funktion zu nutzen.
This feature is in beta and is not covered by Zero Data Retention (ZDR) arrangements. Beta features are excluded from ZDR.
Komprimierung wird auf den folgenden Modellen unterstützt:
claude-opus-4-6)Wenn Komprimierung aktiviert ist, fasst Claude Ihr Gespräch automatisch zusammen, wenn es sich dem konfigurierten Token-Schwellenwert nähert. Die API:
compaction-Block mit der Zusammenfassung.Bei nachfolgenden Anfragen fügen Sie die Antwort zu Ihren Nachrichten hinzu. Die API löscht automatisch alle Nachrichtenblöcke vor dem compaction-Block und setzt das Gespräch von der Zusammenfassung aus fort.
Aktivieren Sie Komprimierung, indem Sie die compact_20260112-Strategie zu context_management.edits in Ihrer Messages API-Anfrage hinzufügen.
curl https://api.anthropic.com/v1/messages \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "anthropic-beta: compact-2026-01-12" \
--header "content-type: application/json" \
--data \
'{
"model": "claude-opus-4-6",
"max_tokens": 4096,
"messages": [
{
"role": "user",
"content": "Help me build a website"
}
],
"context_management": {
"edits": [
{
"type": "compact_20260112"
}
]
}
}'| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
type | string | Erforderlich | Muss "compact_20260112" sein |
trigger | object | 150.000 Token | Wann Komprimierung ausgelöst wird. Muss mindestens 50.000 Token sein. |
pause_after_compaction | boolean | false | Ob nach der Generierung der Komprimierungszusammenfassung pausiert werden soll |
instructions | string | null | Benutzerdefinierter Zusammenfassungs-Prompt. Ersetzt den Standard-Prompt vollständig, wenn bereitgestellt. |
Konfigurieren Sie, wann Komprimierung ausgelöst wird, mit dem trigger-Parameter:
response = client.beta.messages.create(
betas=["compact-2026-01-12"],
model="claude-opus-4-6",
max_tokens=4096,
messages=messages,
context_management={
"edits": [
{
"type": "compact_20260112",
"trigger": {"type": "input_tokens", "value": 150000},
}
]
},
)Standardmäßig verwendet Komprimierung den folgenden Zusammenfassungs-Prompt:
You have written a partial transcript for the initial task above. Please write a summary of the transcript. The purpose of this summary is to provide continuity so you can continue to make progress towards solving the task in a future context, where the raw history above may not be accessible and will be replaced with this summary. Write down anything that would be helpful, including the state, next steps, learnings etc. You must wrap your summary in a <summary></summary> block.Sie können benutzerdefinierte Anweisungen über den instructions-Parameter bereitstellen, um diesen Prompt vollständig zu ersetzen. Benutzerdefinierte Anweisungen ergänzen den Standard nicht; sie ersetzen ihn vollständig:
response = client.beta.messages.create(
betas=["compact-2026-01-12"],
model="claude-opus-4-6",
max_tokens=4096,
messages=messages,
context_management={
"edits": [
{
"type": "compact_20260112",
"instructions": "Focus on preserving code snippets, variable names, and technical decisions.",
}
]
},
)Verwenden Sie pause_after_compaction, um die API nach der Generierung der Komprimierungszusammenfassung zu pausieren. Dies ermöglicht es Ihnen, zusätzliche Inhaltsblöcke hinzuzufügen (z. B. um aktuelle Nachrichten oder spezifische anweisungsorientierte Nachrichten zu bewahren), bevor die API mit der Antwort fortfährt.
Wenn aktiviert, gibt die API eine Nachricht mit dem compaction-Stoppgrund nach der Generierung des Komprimierungsblocks zurück:
response = client.beta.messages.create(
betas=["compact-2026-01-12"],
model="claude-opus-4-6",
max_tokens=4096,
messages=messages,
context_management={
"edits": [{"type": "compact_20260112", "pause_after_compaction": True}]
},
)
# Check if compaction triggered a pause
if response.stop_reason == "compaction":
# Response contains only the compaction block
messages.append({"role": "assistant", "content": response.content})
# Continue the request
response = client.beta.messages.create(
betas=["compact-2026-01-12"],
model="claude-opus-4-6",
max_tokens=4096,
messages=messages,
context_management={"edits": [{"type": "compact_20260112"}]},
)Wenn ein Modell an langen Aufgaben mit vielen Tool-Use-Iterationen arbeitet, kann der Gesamttoken-Verbrauch erheblich wachsen. Sie können pause_after_compaction mit einem Komprimierungszähler kombinieren, um die kumulative Nutzung zu schätzen und die Aufgabe elegant abzuschließen, sobald ein Budget erreicht ist:
TRIGGER_THRESHOLD = 100_000
TOTAL_TOKEN_BUDGET = 3_000_000
n_compactions = 0
response = client.beta.messages.create(
betas=["compact-2026-01-12"],
model="claude-opus-4-6",
max_tokens=4096,
messages=messages,
context_management={
"edits": [
{
"type": "compact_20260112",
"trigger": {"type": "input_tokens", "value": TRIGGER_THRESHOLD},
"pause_after_compaction": True,
}
]
},
)
if response.stop_reason == "compaction":
n_compactions += 1
messages.append({"role": "assistant", "content": response.content})
# Estimate total tokens consumed; prompt wrap-up if over budget
if n_compactions * TRIGGER_THRESHOLD >= TOTAL_TOKEN_BUDGET:
messages.append(
{
"role": "user",
"content": "Please wrap up your current work and summarize the final state.",
}
)Wenn Komprimierung ausgelöst wird, gibt die API einen compaction-Block am Anfang der Assistenten-Antwort zurück.
Ein langfristiges Gespräch kann zu mehreren Komprimierungen führen. Der letzte Komprimierungsblock spiegelt den endgültigen Zustand des Prompts wider und ersetzt den Inhalt davor durch die generierte Zusammenfassung.
{
"content": [
{
"type": "compaction",
"content": "Summary of the conversation: The user requested help building a web scraper..."
},
{
"type": "text",
"text": "Based on our conversation so far..."
}
]
}Sie müssen den compaction-Block bei nachfolgenden Anfragen an die API zurückgeben, um das Gespräch mit dem verkürzten Prompt fortzusetzen. Der einfachste Ansatz ist, den gesamten Antwortinhalt zu Ihren Nachrichten hinzuzufügen:
# After receiving a response with a compaction block
messages.append({"role": "assistant", "content": response.content})
# Continue the conversation
messages.append({"role": "user", "content": "Now add error handling"})
response = client.beta.messages.create(
betas=["compact-2026-01-12"],
model="claude-opus-4-6",
max_tokens=4096,
messages=messages,
context_management={"edits": [{"type": "compact_20260112"}]},
)Wenn die API einen compaction-Block empfängt, werden alle Inhaltsblöcke davor ignoriert. Sie können entweder:
Beim Streaming von Antworten mit aktivierter Komprimierung erhalten Sie ein content_block_start-Ereignis, wenn die Komprimierung beginnt. Der Komprimierungsblock streamt anders als Textblöcke. Sie erhalten ein content_block_start-Ereignis, gefolgt von einem einzelnen content_block_delta mit dem vollständigen Zusammenfassungsinhalt (kein Zwischenstreaming) und dann ein content_block_stop-Ereignis.
import anthropic
client = anthropic.Anthropic()
with client.beta.messages.stream(
betas=["compact-2026-01-12"],
model="claude-opus-4-6",
max_tokens=4096,
messages=messages,
context_management={"edits": [{"type": "compact_20260112"}]},
) as stream:
for event in stream:
if event.type == "content_block_start":
if event.content_block.type == "compaction":
print("Compaction started...")
elif event.content_block.type == "text":
print("Text response started...")
elif event.type == "content_block_delta":
if event.delta.type == "compaction_delta":
print(f"Compaction complete: {len(event.delta.content)} chars")
elif event.delta.type == "text_delta":
print(event.delta.text, end="", flush=True)
# Get the final accumulated message
message = stream.get_final_message()
messages.append({"role": "assistant", "content": message.content})Komprimierung funktioniert gut mit Prompt-Caching. Sie können einen cache_control-Breakpoint auf Komprimierungsblöcken hinzufügen, um den zusammengefassten Inhalt zu cachen. Der ursprüngliche komprimierte Inhalt wird ignoriert.
{
"role": "assistant",
"content": [
{
"type": "compaction",
"content": "[summary text]",
"cache_control": {"type": "ephemeral"}
},
{
"type": "text",
"text": "Based on our conversation..."
}
]
}Wenn Komprimierung auftritt, wird die Zusammenfassung zu neuem Inhalt, der in den Cache geschrieben werden muss. Ohne zusätzliche Cache-Breakpoints würde dies auch jeden gecachten System-Prompt ungültig machen, was erfordert, dass er zusammen mit der Komprimierungszusammenfassung neu gecacht wird.
Um Cache-Trefferquoten zu maximieren, fügen Sie einen cache_control-Breakpoint am Ende Ihres System-Prompts hinzu. Dies hält den System-Prompt separat gecacht von der Konversation, sodass bei Komprimierung:
response = client.beta.messages.create(
betas=["compact-2026-01-12"],
model="claude-opus-4-6",
max_tokens=4096,
system=[
{
"type": "text",
"text": "You are a helpful coding assistant...",
"cache_control": {
"type": "ephemeral"
}, # Cache the system prompt separately
}
],
messages=messages,
context_management={"edits": [{"type": "compact_20260112"}]},
)Dieser Ansatz ist besonders vorteilhaft für lange System-Prompts, da sie auch über mehrere Komprimierungsereignisse hinweg während eines Gesprächs gecacht bleiben.
Komprimierung erfordert einen zusätzlichen Sampling-Schritt, der zu Ratenlimits und Abrechnung beiträgt. Die API gibt detaillierte Nutzungsinformationen in der Antwort zurück:
{
"usage": {
"input_tokens": 45000,
"output_tokens": 1234,
"iterations": [
{
"type": "compaction",
"input_tokens": 180000,
"output_tokens": 3500
},
{
"type": "message",
"input_tokens": 23000,
"output_tokens": 1000
}
]
}
}Das iterations-Array zeigt die Nutzung für jede Sampling-Iteration. Wenn Komprimierung auftritt, sehen Sie eine compaction-Iteration gefolgt von der Haupt-message-Iteration. Die Token-Zählungen der endgültigen Iteration spiegeln die effektive Kontextgröße nach Komprimierung wider.
Die Top-Level-input_tokens und output_tokens enthalten nicht die Nutzung der Komprimierungsiteration – sie spiegeln die Summe aller Nicht-Komprimierungsiterationen wider. Um die Gesamttoken zu berechnen, die für eine Anfrage verbraucht und abgerechnet werden, summieren Sie alle Einträge im usage.iterations-Array.
Wenn Sie sich zuvor auf usage.input_tokens und usage.output_tokens für Kostenverfolgung oder Auditing verlassen haben, müssen Sie Ihre Verfolgungslogik aktualisieren, um über usage.iterations zu aggregieren, wenn Komprimierung aktiviert ist. Das iterations-Array wird nur gefüllt, wenn eine neue Komprimierung während der Anfrage ausgelöst wird. Das erneute Anwenden eines vorherigen compaction-Blocks verursacht keine zusätzlichen Komprimierungskosten, und die Top-Level-Nutzungsfelder bleiben in diesem Fall genau.
Bei Verwendung von Server-Tools (wie Web-Suche) wird der Komprimierungstrigger am Anfang jeder Sampling-Iteration überprüft. Komprimierung kann mehrmals innerhalb einer einzelnen Anfrage auftreten, je nach Ihrem Triggerschwellenwert und der Menge des generierten Outputs.
Der Token-Zählungs-Endpunkt (/v1/messages/count_tokens) wendet vorhandene compaction-Blöcke in Ihrem Prompt an, löst aber keine neuen Komprimierungen aus. Verwenden Sie ihn, um Ihre effektive Token-Zählung nach vorherigen Komprimierungen zu überprüfen:
count_response = client.beta.messages.count_tokens(
betas=["compact-2026-01-12"],
model="claude-opus-4-6",
messages=messages,
context_management={"edits": [{"type": "compact_20260112"}]},
)
print(f"Current tokens: {count_response.input_tokens}")
print(f"Original tokens: {count_response.context_management.original_input_tokens}")Hier ist ein vollständiges Beispiel eines langfristigen Gesprächs mit Komprimierung:
import anthropic
client = anthropic.Anthropic()
messages: list[dict] = []
def chat(user_message: str) -> str:
messages.append({"role": "user", "content": user_message})
response = client.beta.messages.create(
betas=["compact-2026-01-12"],
model="claude-opus-4-6",
max_tokens=4096,
messages=messages,
context_management={
"edits": [
{
"type": "compact_20260112",
"trigger": {"type": "input_tokens", "value": 100000},
}
]
},
)
# Append response (compaction blocks are automatically included)
messages.append({"role": "assistant", "content": response.content})
# Return the text content
return next(block.text for block in response.content if block.type == "text")
# Run a long conversation
print(chat("Help me build a Python web scraper"))
print(chat("Add support for JavaScript-rendered pages"))
print(chat("Now add rate limiting and error handling"))
# ... continue as long as neededHier ist ein Beispiel, das pause_after_compaction verwendet, um die letzten zwei Nachrichten (ein Benutzer + ein Assistenten-Turn) wörtlich zu bewahren, anstatt sie zusammenzufassen:
import anthropic
from typing import Any
client = anthropic.Anthropic()
messages: list[dict[str, Any]] = []
def chat(user_message: str) -> str:
messages.append({"role": "user", "content": user_message})
response = client.beta.messages.create(
betas=["compact-2026-01-12"],
model="claude-opus-4-6",
max_tokens=4096,
messages=messages,
context_management={
"edits": [
{
"type": "compact_20260112",
"trigger": {"type": "input_tokens", "value": 100000},
"pause_after_compaction": True,
}
]
},
)
# Check if compaction occurred and paused
if response.stop_reason == "compaction":
# Get the compaction block from the response
compaction_block = response.content[0]
# Preserve the last 2 messages (1 user + 1 assistant turn)
# by including them after the compaction block
preserved_messages = messages[-2:] if len(messages) >= 2 else messages
# Build new message list: compaction + preserved messages
new_assistant_content = [compaction_block]
messages_after_compaction = [
{"role": "assistant", "content": new_assistant_content}
] + preserved_messages
# Continue the request with the compacted context + preserved messages
response = client.beta.messages.create(
betas=["compact-2026-01-12"],
model="claude-opus-4-6",
max_tokens=4096,
messages=messages_after_compaction,
context_management={"edits": [{"type": "compact_20260112"}]},
)
# Update our message list to reflect the compaction
messages.clear()
messages.extend(messages_after_compaction)
# Append the final response
messages.append({"role": "assistant", "content": response.content})
# Return the text content
return next(block.text for block in response.content if block.type == "text")
# Run a long conversation
print(chat("Help me build a Python web scraper"))
print(chat("Add support for JavaScript-rendered pages"))
print(chat("Now add rate limiting and error handling"))
# ... continue as long as neededErkunden Sie praktische Beispiele und Implementierungen im Cookbook.
Erfahren Sie mehr über Kontextfenstergröße und Verwaltungsstrategien.
Erkunden Sie andere Strategien zur Verwaltung von Gesprächskontext wie Tool-Ergebnis-Clearing und Thinking-Block-Clearing.
Was this page helpful?