Сжатие контекста на стороне сервера — это рекомендуемая стратегия управления контекстом в долгосрочных диалогах и рабочих процессах агентов. Оно автоматически обрабатывает управление контекстом с минимальными затратами на интеграцию.
Сжатие контекста расширяет эффективную длину контекста для долгосрочных диалогов и задач путём автоматического суммирования старого контекста при приближении к пределу контекстного окна. Это идеально подходит для:
Сжатие контекста в настоящее время находится в бета-версии. Включите бета-заголовок compact-2026-01-12 в ваши запросы API для использования этой функции.
This feature is in beta and is not covered by Zero Data Retention (ZDR) arrangements. Beta features are excluded from ZDR.
Сжатие контекста поддерживается на следующих моделях:
claude-opus-4-6)Когда сжатие контекста включено, Claude автоматически суммирует ваш диалог при приближении к настроенному пороговому значению токенов. API:
compaction, содержащий сводку.При последующих запросах добавьте ответ к вашим сообщениям. API автоматически удаляет все блоки сообщений до блока compaction, продолжая диалог со сводки.
Включите сжатие контекста, добавив стратегию compact_20260112 в context_management.edits в вашем запросе Messages API.
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"
}
]
}
}'| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
type | string | Обязательно | Должно быть "compact_20260112" |
trigger | object | 150 000 токенов | Когда запустить сжатие контекста. Должно быть не менее 50 000 токенов. |
pause_after_compaction | boolean | false | Следует ли приостановить работу после создания сводки сжатия контекста |
instructions | string | null | Пользовательская подсказка суммирования. Полностью заменяет подсказку по умолчанию при предоставлении. |
Настройте, когда запускается сжатие контекста, используя параметр trigger:
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},
}
]
},
)По умолчанию сжатие контекста использует следующую подсказку суммирования:
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.Вы можете предоставить пользовательские инструкции через параметр instructions для полной замены этой подсказки. Пользовательские инструкции не дополняют значение по умолчанию; они полностью его заменяют:
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.",
}
]
},
)Используйте pause_after_compaction для приостановки API после создания сводки сжатия контекста. Это позволяет вам добавить дополнительные блоки контента (такие как сохранение недавних сообщений или конкретных ориентированных на инструкции сообщений) перед тем, как API продолжит ответ.
Когда включено, API возвращает сообщение с причиной остановки compaction после создания блока сжатия контекста:
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"}]},
)Когда модель работает над длительными задачами с множеством итераций использования инструментов, общее потребление токенов может значительно возрасти. Вы можете объединить pause_after_compaction со счётчиком сжатия контекста для оценки совокупного использования и корректного завершения задачи после достижения бюджета:
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.",
}
)Когда сжатие контекста запускается, API возвращает блок compaction в начале ответа ассистента.
Долгосрочный диалог может привести к множественным сжатиям контекста. Последний блок сжатия контекста отражает финальное состояние подсказки, заменяя контент до него созданной сводкой.
{
"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..."
}
]
}Вы должны передать блок compaction обратно в API при последующих запросах для продолжения диалога с сокращённой подсказкой. Самый простой подход — добавить весь контент ответа к вашим сообщениям:
# 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"}]},
)Когда API получает блок compaction, все блоки контента до него игнорируются. Вы можете либо:
При потоковой передаче ответов со включённым сжатием контекста вы получите событие content_block_start при начале сжатия контекста. Блок сжатия контекста передаётся потоком иначе, чем текстовые блоки. Вы получите событие content_block_start, затем одно событие content_block_delta с полным контентом сводки (без промежуточной потоковой передачи), а затем событие content_block_stop.
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})Сжатие контекста хорошо работает с кэшированием подсказок. Вы можете добавить точку разрыва cache_control на блоки сжатия контекста для кэширования суммированного контента. Исходный сжатый контент игнорируется.
{
"role": "assistant",
"content": [
{
"type": "compaction",
"content": "[summary text]",
"cache_control": {"type": "ephemeral"}
},
{
"type": "text",
"text": "Based on our conversation..."
}
]
}Когда происходит сжатие контекста, сводка становится новым контентом, который необходимо записать в кэш. Без дополнительных точек разрыва кэша это также аннулирует любую кэшированную системную подсказку, требуя её повторного кэширования вместе со сводкой сжатия контекста.
Для максимизации частоты попаданий в кэш добавьте точку разрыва cache_control в конце вашей системной подсказки. Это сохраняет системную подсказку кэшированной отдельно от диалога, поэтому при сжатии контекста:
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"}]},
)Этот подход особенно полезен для длинных системных подсказок, так как они остаются кэшированными даже при множественных событиях сжатия контекста на протяжении диалога.
Сжатие контекста требует дополнительного этапа выборки, который влияет на ограничения скорости и выставление счётов. API возвращает подробную информацию об использовании в ответе:
{
"usage": {
"input_tokens": 45000,
"output_tokens": 1234,
"iterations": [
{
"type": "compaction",
"input_tokens": 180000,
"output_tokens": 3500
},
{
"type": "message",
"input_tokens": 23000,
"output_tokens": 1000
}
]
}
}Массив iterations показывает использование для каждой итерации выборки. Когда происходит сжатие контекста, вы видите итерацию compaction, за которой следует основная итерация message. Подсчёты токенов финальной итерации отражают эффективный размер контекста после сжатия контекста.
Верхнеуровневые input_tokens и output_tokens не включают использование итерации сжатия контекста — они отражают сумму всех итераций, не связанных со сжатием контекста. Для расчёта общего количества потреблённых и выставленных счётом токенов для запроса просуммируйте все записи в массиве usage.iterations.
Если вы ранее полагались на usage.input_tokens и usage.output_tokens для отслеживания затрат или аудита, вам потребуется обновить логику отслеживания для агрегирования по usage.iterations при включённом сжатии контекста. Массив iterations заполняется только при запуске нового сжатия контекста во время запроса. Повторное применение предыдущего блока compaction не влечёт дополнительных затрат на сжатие контекста, и верхнеуровневые поля использования остаются точными в этом случае.
При использовании серверных инструментов (таких как веб-поиск) триггер сжатия контекста проверяется в начале каждой итерации выборки. Сжатие контекста может произойти несколько раз в одном запросе в зависимости от вашего порогового триггера и объёма созданного вывода.
Конечная точка подсчёта токенов (/v1/messages/count_tokens) применяет существующие блоки compaction в вашей подсказке, но не запускает новые сжатия контекста. Используйте её для проверки вашего эффективного подсчёта токенов после предыдущих сжатий контекста:
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}")Вот полный пример долгосрочного диалога со сжатием контекста:
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 neededВот пример, который использует pause_after_compaction для сохранения последних двух сообщений (один ход пользователя + один ход ассистента) в неизменённом виде вместо их суммирования:
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 neededИзучите практические примеры и реализации в справочнике.
Узнайте о размерах контекстных окон и стратегиях управления.
Изучите другие стратегии управления контекстом диалога, такие как очистка результатов инструментов и очистка блоков размышлений.
Was this page helpful?