Эта функция соответствует требованиям Zero Data Retention (ZDR) (нулевого хранения данных). Если у вашей организации действует соглашение ZDR, данные, отправленные через эту функцию, не сохраняются после возврата ответа API.
Серверная компактизация — рекомендуемая стратегия управления контекстом в длительных разговорах и агентных рабочих процессах. Она автоматически управляет контекстом без необходимости писать клиентский код для суммаризации.
«Compaction» (компактизация) увеличивает эффективную длину контекста для длительных разговоров и задач, автоматически суммируя более старый контекст при приближении к пределу контекстного окна. Она также поддерживает активный контекст небольшим: по мере роста разговора качество ответов снижается, поэтому компактизация заменяет более старое содержимое кратким резюме.
Подробнее о том, почему длинные контексты ухудшают качество и как помогает компактизация, см. в статье Effective context engineering.
Это идеально подходит для:
Компактизация находится в стадии бета-тестирования. Включите бета-заголовок compact-2026-01-12 в ваши запросы к API, чтобы использовать эту функцию.
Компактизация поддерживается в следующих моделях:
Когда компактизация включена, Claude автоматически суммирует ваш разговор, когда он достигает настроенного порога токенов. API:
compaction, содержащий резюме.При последующих запросах добавьте ответ к вашим сообщениям. API автоматически отбрасывает все блоки содержимого, предшествующие блоку compaction, продолжая разговор с резюме.
Включите компактизацию, добавив стратегию compact_20260112 в context_management.edits в вашем запросе к Messages API.
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "Help me build a website"}]
response = client.beta.messages.create(
betas=["compact-2026-01-12"],
model="claude-opus-4-8",
max_tokens=4096,
messages=messages,
context_management={"edits": [{"type": "compact_20260112"}]},
)
# Добавьте ответ (включая любой блок компактизации), чтобы продолжить разговор
messages.append({"role": "assistant", "content": response.content})| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
type | string | Обязательный | Должен быть "compact_20260112" |
trigger | object | {"type": "input_tokens", "value": 150000} | Когда запускать компактизацию. input_tokens — единственный поддерживаемый тип триггера. value должно быть не менее 50 000 токенов. |
pause_after_compaction | boolean | false | Приостанавливать ли выполнение после генерации резюме компактизации |
instructions | string | null | Пользовательская подсказка для суммаризации. Полностью заменяет подсказку по умолчанию, если указана. |
Настройте момент срабатывания компактизации с помощью параметра trigger:
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "Hello, Claude"}]
response = client.beta.messages.create(
betas=["compact-2026-01-12"],
model="claude-opus-4-8",
max_tokens=4096,
messages=messages,
context_management={
"edits": [
{
"type": "compact_20260112",
"trigger": {"type": "input_tokens", "value": 150000},
}
]
},
)Подсказка для суммаризации по умолчанию различается в зависимости от модели. Каждая подсказка по умолчанию инструктирует Claude написать резюме внутри тегов <summary></summary> с информацией, необходимой для продолжения задачи в будущем контекстном окне. Например, некоторые модели используют следующую подсказку:
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. Пользовательские инструкции не дополняют подсказку по умолчанию. Они полностью её заменяют:
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "Hello, Claude"}]
response = client.beta.messages.create(
betas=["compact-2026-01-12"],
model="claude-opus-4-8",
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 после генерации блока компактизации:
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "Hello, Claude"}]
response = client.beta.messages.create(
betas=["compact-2026-01-12"],
model="claude-opus-4-8",
max_tokens=4096,
messages=messages,
context_management={
"edits": [{"type": "compact_20260112", "pause_after_compaction": True}]
},
)
# Проверяем, вызвало ли уплотнение паузу
if response.stop_reason == "compaction":
# Ответ содержит только блок уплотнения
messages.append({"role": "assistant", "content": response.content})
# Продолжаем запрос
response = client.beta.messages.create(
betas=["compact-2026-01-12"],
model="claude-opus-4-8",
max_tokens=4096,
messages=messages,
context_management={"edits": [{"type": "compact_20260112"}]},
)Когда модель работает над длительными задачами с множеством итераций использования инструментов, общее потребление токенов может значительно возрасти. Вы можете объединить pause_after_compaction со счётчиком компактизаций, чтобы оценивать совокупное использование и корректно завершать задачу при достижении бюджета.
Этот пример представлен только на языках SDK: его ценность — в логике отслеживания бюджета вокруг запроса. Сам запрос объединяет trigger из раздела Настройка триггера с pause_after_compaction из раздела Приостановка после компактизации.
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "Hello, Claude"}]
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-8",
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})
# Оценить общее число потреблённых токенов; при превышении бюджета предложить завершение
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 при последующих запросах, чтобы продолжить разговор с укороченной подсказкой. Самый простой подход — добавить всё содержимое ответа к вашим сообщениям:
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "Hello, Claude"}]
response = client.beta.messages.create(
betas=["compact-2026-01-12"],
model="claude-opus-4-8",
max_tokens=4096,
messages=messages,
context_management={"edits": [{"type": "compact_20260112"}]},
)
# После получения ответа с блоком уплотнения
messages.append({"role": "assistant", "content": response.content})
# Продолжите разговор
messages.append({"role": "user", "content": "Now add error handling"})
response = client.beta.messages.create(
betas=["compact-2026-01-12"],
model="claude-opus-4-8",
max_tokens=4096,
messages=messages,
context_management={"edits": [{"type": "compact_20260112"}]},
)Когда API получает блок compaction, все блоки содержимого перед ним игнорируются. Вы можете либо:
Блок компактизации передаётся потоком иначе, чем текстовые блоки. Вы получаете событие content_block_start, за которым следует одно событие content_block_delta с полным содержимым резюме (без промежуточной потоковой передачи), а затем событие content_block_stop.
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "Hello, Claude"}]
with client.beta.messages.stream(
betas=["compact-2026-01-12"],
model="claude-opus-4-8",
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 or '')} chars")
elif event.delta.type == "text_delta":
print(event.delta.text, end="", flush=True)
# Получить итоговое накопленное сообщение
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 в конце вашей системной подсказки. Это позволяет кэшировать системную подсказку отдельно от разговора, поэтому при компактизации:
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "Hello, Claude"}]
response = client.beta.messages.create(
betas=["compact-2026-01-12"],
model="claude-opus-4-8",
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": 23000,
"output_tokens": 1000,
"iterations": [
{
"type": "compaction",
"input_tokens": 180000,
"output_tokens": 3500
},
{
"type": "message",
"input_tokens": 23000,
"output_tokens": 1000
}
]
}
}Массив iterations показывает использование для каждой итерации сэмплирования. Когда происходит компактизация, вы увидите итерацию compaction, за которой следует основная итерация message. Верхнеуровневые input_tokens и output_tokens в этом примере точно совпадают с итерацией message, поскольку есть только одна итерация, не связанная с компактизацией. Количество токенов последней итерации отражает эффективный размер контекста после компактизации.
Верхнеуровневые input_tokens и output_tokens не включают использование итерации компактизации. Они отражают сумму всех итераций, не связанных с компактизацией. Чтобы рассчитать общее количество токенов, потреблённых и тарифицированных для запроса, просуммируйте все записи в массиве usage.iterations.
Если вы ранее полагались на usage.input_tokens и usage.output_tokens для отслеживания затрат или аудита, вам потребуется обновить логику отслеживания, чтобы агрегировать данные по usage.iterations, когда компактизация включена. При включённой бета-версии компактизации каждый ответ включает usage.iterations, даже если компактизация не произошла. Запись compaction появляется только тогда, когда новая компактизация запускается во время запроса. Повторное применение предыдущего блока compaction не влечёт дополнительных затрат на компактизацию, и верхнеуровневые поля использования остаются точными в этом случае.
При использовании серверных инструментов (таких как веб-поиск) триггер компактизации проверяется в начале каждой итерации сэмплирования. Компактизация может происходить несколько раз в рамках одного запроса в зависимости от вашего порога срабатывания и объёма сгенерированного вывода.
Конечная точка подсчёта токенов (/v1/messages/count_tokens) применяет существующие блоки compaction в вашей подсказке, но не запускает новые компактизации. Используйте её, чтобы проверить эффективное количество токенов после предыдущих компактизаций:
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "Hello, Claude"}]
count_response = client.beta.messages.count_tokens(
betas=["compact-2026-01-12"],
model="claude-opus-4-8",
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}")Вот полный пример длительного разговора с компактизацией:
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-8",
max_tokens=4096,
messages=messages,
context_management={
"edits": [
{
"type": "compact_20260112",
"trigger": {"type": "input_tokens", "value": 100000},
}
]
},
)
# Добавляем ответ (блоки уплотнения включаются автоматически)
messages.append({"role": "assistant", "content": response.content})
# Возвращаем текстовое содержимое
return next(block.text for block in response.content if block.type == "text")
# Запускаем длинный разговор
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"))
# Продолжайте вызывать chat() столько, сколько требует разговорВот пример, использующий pause_after_compaction для сохранения предыдущего обмена репликами и текущего сообщения пользователя (всего три сообщения) дословно вместо их суммаризации:
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-8",
max_tokens=4096,
messages=messages,
context_management={
"edits": [
{
"type": "compact_20260112",
"trigger": {"type": "input_tokens", "value": 100000},
"pause_after_compaction": True,
}
]
},
)
# Проверяем, произошло ли уплотнение и была ли приостановка
if response.stop_reason == "compaction":
# Получаем блок уплотнения из ответа
compaction_block = response.content[0]
# Сохраняем предыдущий обмен + текущее сообщение пользователя (3 сообщения),
# включив их после блока уплотнения
preserved_messages = messages[-3:] if len(messages) >= 3 else messages
# Формируем новый список сообщений: уплотнение + сохранённые сообщения
new_assistant_content = [compaction_block]
messages_after_compaction = [
{"role": "assistant", "content": new_assistant_content}
] + preserved_messages
# Продолжаем запрос с уплотнённым контекстом + сохранёнными сообщениями
response = client.beta.messages.create(
betas=["compact-2026-01-12"],
model="claude-opus-4-8",
max_tokens=4096,
messages=messages_after_compaction,
context_management={"edits": [{"type": "compact_20260112"}]},
)
# Обновляем наш список сообщений, чтобы отразить уплотнение
messages.clear()
messages.extend(messages_after_compaction)
# Добавляем финальный ответ
messages.append({"role": "assistant", "content": response.content})
# Возвращаем текстовое содержимое
return next(block.text for block in response.content if block.type == "text")
# Запускаем длинный диалог
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"))
# Продолжаем вызывать chat() столько, сколько требует диалогТа же модель для суммаризации: Модель, указанная в вашем запросе, используется для суммаризации. Нет возможности использовать другую (например, более дешёвую) модель для резюме.
Компактизация может завершиться неудачей, когда определены инструменты: Когда ваш запрос включает tools, модель иногда вызывает инструмент во время внутреннего шага суммаризации вместо написания резюме. Когда это происходит, ответ содержит блок compaction с content: null. Чтобы предотвратить это, задайте в instructions подсказку, которая явно указывает модели не вызывать инструменты, например:
Summarize the transcript inside <summary></summary> tags. Include relevant information in the summary for continuing the task in the next context window. Do not call any tools while writing this summary; respond with text only.Автоматически управляйте контекстом разговора по мере его роста с помощью редактирования контекста.
Узнайте о размерах контекстных окон и стратегиях управления ими.
Изучите практическую реализацию, которая управляет длительными разговорами с мгновенной компактизацией памяти сессии, используя фоновые потоки и кэширование подсказок.
Was this page helpful?