This feature is eligible for Zero Data Retention (ZDR). When your organization has a ZDR arrangement, data sent through this feature is not stored after the API response is returned.
Компактизация на стороне сервера — это рекомендуемая стратегия управления контекстом в долгосрочных разговорах и рабочих процессах агентов. Она автоматически управляет контекстом с минимальными затратами на интеграцию.
Компактизация расширяет эффективную длину контекста для долгосрочных разговоров и задач путем автоматического суммирования старого контекста при приближении к пределу контекстного окна. Это не просто вопрос соблюдения лимита токенов. По мере удлинения разговоров модели испытывают трудности с сохранением фокуса на всей истории. Компактизация сохраняет активный контекст сосредоточенным и производительным, заменяя устаревший контент краткими резюме.
Для более глубокого понимания того, почему длинные контексты деградируют и как компактизация помогает, см. Эффективная инженерия контекста.
Это идеально подходит для:
Компактизация находится в бета-версии. Включите бета-заголовок compact-2026-01-12 в ваши запросы API для использования этой функции.
Компактизация поддерживается на следующих моделях:
claude-mythos-preview)claude-opus-4-7)claude-opus-4-6)claude-sonnet-4-6)Когда компактизация включена, 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-7",
max_tokens=4096,
messages=messages,
context_management={"edits": [{"type": "compact_20260112"}]},
)
# Append the response (including any compaction block) to continue the conversation
messages.append({"role": "assistant", "content": response.content})| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
type | string | Обязательно | Должно быть "compact_20260112" |
trigger | object | 150,000 токенов | Когда запустить компактизацию. Должно быть не менее 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-7",
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 для полной замены этой подсказки. Пользовательские инструкции не дополняют значение по умолчанию; они полностью его заменяют:
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "Hello, Claude"}]
response = client.beta.messages.create(
betas=["compact-2026-01-12"],
model="claude-opus-4-7",
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-7",
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-7",
max_tokens=4096,
messages=messages,
context_management={"edits": [{"type": "compact_20260112"}]},
)Когда модель работает над длительными задачами с множеством итераций использования инструментов, общее потребление токенов может значительно увеличиться. Вы можете объединить 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-7",
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 при последующих запросах для продолжения разговора с сокращенной подсказкой. Самый простой подход — добавить все содержимое ответа в ваши сообщения:
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "Hello, Claude"}]
response = client.beta.messages.create(
betas=["compact-2026-01-12"],
model="claude-opus-4-7",
max_tokens=4096,
messages=messages,
context_management={"edits": [{"type": "compact_20260112"}]},
)
# 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-7",
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.
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "Hello, Claude"}]
with client.beta.messages.stream(
betas=["compact-2026-01-12"],
model="claude-opus-4-7",
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 в конце вашей системной подсказки. Это сохраняет системную подсказку в кэше отдельно от разговора, поэтому при компактификации:
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "Hello, Claude"}]
response = client.beta.messages.create(
betas=["compact-2026-01-12"],
model="claude-opus-4-7",
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 при включённой компактификации. Массив iterations заполняется только при срабатывании новой компактификации во время запроса. Повторное применение предыдущего блока 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-7",
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-7",
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 для сохранения предыдущего обмена и текущего сообщения пользователя (всего три сообщения) в неизменном виде вместо их суммирования:
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-7",
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 prior exchange + current user message (3 messages)
# by including them after the compaction block
preserved_messages = messages[-3:] if len(messages) >= 3 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-7",
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?