• Сообщения
  • Управляемые агенты
  • Администрирование

Search...
⌘K
Первые шаги
Знакомство с ClaudeБыстрый старт
Разработка с Claude
Обзор возможностейИспользование Messages APIПричины остановки и резервный вариантОтказы и резервный вариантРезервный кредит
Возможности модели
Расширенное мышлениеАдаптивное мышлениеУсилиеБюджеты задач (бета)Быстрый режим (исследовательская предварительная версия)Структурированные выходные данныеЦитированиеПотоковая передача сообщенийПакетная обработкаРезультаты поискаПотоковая передача отказовМногоязычная поддержкаЭмбеддинги
Инструменты
ОбзорКак работает использование инструментовРуководство: создание агента с использованием инструментовОпределение инструментовОбработка вызовов инструментовПараллельное использование инструментовTool Runner (SDK)Строгое использование инструментовИспользование инструментов с кэшированием подсказокСерверные инструментыУстранение неполадокИнструмент веб-поискаИнструмент загрузки веб-страницИнструмент выполнения кодаИнструмент советникаИнструмент памятиИнструмент BashИнструмент использования компьютераИнструмент текстового редактора
Инфраструктура инструментов
Справочник по инструментамУправление контекстом инструментовКомбинации инструментовПоиск инструментовПрограммный вызов инструментовДетальная потоковая передача инструментов
Управление контекстом
Контекстные окнаСжатиеРедактирование контекстаКэширование подсказокСистемные сообщения в середине разговораСоздание режима оркестрацииДиагностика кэша (бета)Подсчёт токенов
Работа с файлами
Files APIПоддержка PDFИзображения и компьютерное зрение
Навыки
ОбзорБыстрый стартРекомендацииНавыки для предприятийНавыки в API
MCP
Удалённые серверы MCPКоннектор MCP
Claude на облачных платформах
Amazon BedrockAmazon Bedrock (устаревшая версия)Claude Platform на AWSMicrosoft FoundryVertex AI

Log in
Сжатие
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...

Solutions

  • AI agents
  • Code modernization
  • Coding
  • Customer support
  • Education
  • Financial services
  • Government
  • Life sciences

Partners

  • Amazon Bedrock
  • Google Cloud's Vertex AI

Learn

  • Blog
  • Courses
  • Use cases
  • Connectors
  • Customer stories
  • Engineering at Anthropic
  • Events
  • Powered by Claude
  • Service partners
  • Startups program

Company

  • Anthropic
  • Careers
  • Economic Futures
  • Research
  • News
  • Responsible Scaling Policy
  • Security and compliance
  • Transparency

Learn

  • Blog
  • Courses
  • Use cases
  • Connectors
  • Customer stories
  • Engineering at Anthropic
  • Events
  • Powered by Claude
  • Service partners
  • Startups program

Help and security

  • Availability
  • Status
  • Support
  • Discord

Terms and policies

  • Privacy policy
  • Responsible disclosure policy
  • Terms of service: Commercial
  • Terms of service: Consumer
  • Usage policy
Сообщения/Управление контекстом

Сжатие контекста

Серверное сжатие контекста для управления длинными разговорами, приближающимися к пределам контекстного окна.

Was this page helpful?

  • Поддерживаемые модели
  • Как работает сжатие контекста
  • Базовое использование
  • Параметры
  • Настройка триггера
  • Пользовательские инструкции для суммирования
  • Приостановка после сжатия контекста
  • Работа с блоками сжатия
  • Передача блоков сжатия обратно
  • Потоковая передача
  • Кэширование подсказок
  • Понимание использования
  • Сочетание с другими функциями
  • Серверные инструменты
  • Подсчёт токенов
  • Примеры
  • Текущие ограничения
  • Дальнейшие шаги


Эта функция соответствует требованиям Zero Data Retention (ZDR) (нулевого хранения данных). Если у вашей организации действует соглашение ZDR, данные, отправленные через эту функцию, не сохраняются после возврата ответа API.



Серверное сжатие контекста — рекомендуемая стратегия управления контекстом в длительных разговорах и агентных рабочих процессах. Оно автоматически управляет контекстом с минимальными усилиями по интеграции.

«Compaction» (сжатие контекста) увеличивает эффективную длину контекста для длительных разговоров и задач, автоматически суммируя более старый контекст при приближении к пределу контекстного окна. Речь идёт не только о том, чтобы оставаться в пределах лимита токенов. По мере удлинения разговоров моделям становится сложнее удерживать фокус на всей истории. Сжатие контекста сохраняет активный контекст сфокусированным и производительным, заменяя устаревшее содержимое краткими сводками.



Подробнее о том, почему длинные контексты деградируют и как помогает сжатие контекста, см. в статье Effective context engineering.

Это идеально подходит для:

  • Многоходовых разговоров в формате чата, где вы хотите, чтобы пользователи использовали один чат в течение длительного времени
  • Подсказок, ориентированных на задачи, которые требуют большого объёма последующей работы (часто с использованием инструментов) и могут превысить контекстное окно


Сжатие контекста находится в бета-версии. Включите бета-заголовок compact-2026-01-12 в ваши запросы к API, чтобы использовать эту функцию.

Поддерживаемые модели

Сжатие контекста поддерживается в следующих моделях:

  • Claude Fable 5 (claude-fable-5)
  • Claude Mythos 5 (claude-mythos-5)
  • Claude Mythos Preview (claude-mythos-preview)
  • Claude Opus 4.8 (claude-opus-4-8)
  • Claude Opus 4.7 (claude-opus-4-7)
  • Claude Opus 4.6 (claude-opus-4-6)
  • Claude Sonnet 4.6 (claude-sonnet-4-6)

Как работает сжатие контекста

Когда сжатие контекста включено, Claude автоматически суммирует ваш разговор при приближении к настроенному порогу токенов. API выполняет следующее:

  1. Определяет, когда входные токены превышают указанный вами порог срабатывания.
  2. Генерирует сводку текущего разговора.
  3. Создаёт блок compaction, содержащий сводку.
  4. Продолжает ответ со сжатым контекстом.

При последующих запросах добавьте ответ к вашим сообщениям. API автоматически отбрасывает все блоки сообщений, предшествующие блоку compaction, продолжая разговор со сводки.

Диаграмма потока, показывающая процесс сжатия контекста: когда входные токены превышают порог срабатывания, Claude генерирует сводку в блоке compaction и продолжает ответ со сжатым контекстом

Базовое использование

Включите сжатие контекста, добавив стратегию compact_20260112 в context_management.edits в вашем запросе к Messages API.

Параметры

ПараметрТипПо умолчаниюОписание
typestringОбязательныйДолжен быть "compact_20260112"
triggerobject150 000 токеновКогда запускать сжатие контекста. Должно быть не менее 50 000 токенов.
pause_after_compactionbooleanfalseПриостанавливать ли выполнение после генерации сводки сжатия
instructionsstringnullПользовательская подсказка для суммирования. Полностью заменяет подсказку по умолчанию, если указана.

Настройка триггера

Настройте момент срабатывания сжатия контекста с помощью параметра trigger:

Пользовательские инструкции для суммирования

По умолчанию сжатие контекста использует следующую подсказку для суммирования:

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, чтобы полностью заменить эту подсказку. Пользовательские инструкции не дополняют подсказку по умолчанию, а полностью её заменяют:

Приостановка после сжатия контекста

Используйте pause_after_compaction, чтобы приостановить API после генерации сводки сжатия. Это позволяет вам добавить дополнительные блоки содержимого (например, сохранить недавние сообщения или конкретные сообщения с инструкциями) до того, как API продолжит формирование ответа.

Когда этот параметр включён, API возвращает сообщение с причиной остановки compaction после генерации блока сжатия:

Соблюдение общего бюджета токенов

Когда модель работает над длительными задачами с множеством итераций использования инструментов, общее потребление токенов может значительно возрасти. Вы можете объединить pause_after_compaction со счётчиком сжатий, чтобы оценивать совокупное использование и корректно завершать задачу при достижении бюджета:

Python
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 в начале ответа ассистента.

Длительный разговор может привести к нескольким сжатиям. Последний блок сжатия отражает итоговое состояние подсказки, заменяя предшествующее ему содержимое сгенерированной сводкой.

Output
{
  "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 при последующих запросах, чтобы продолжить разговор с укороченной подсказкой. Самый простой подход — добавить всё содержимое ответа к вашим сообщениям:

Когда API получает блок compaction, все блоки содержимого перед ним игнорируются. Вы можете либо:

  • Оставить исходные сообщения в вашем списке и позволить API самостоятельно удалить сжатое содержимое
  • Вручную удалить сжатые сообщения и включить только блок сжатия и всё, что следует за ним

Потоковая передача

При потоковой передаче ответов с включённым сжатием контекста вы получите событие content_block_start, когда начнётся сжатие. Блок сжатия передаётся потоком иначе, чем текстовые блоки. Вы получите событие content_block_start, за которым последует одно событие content_block_delta с полным содержимым сводки (без промежуточной потоковой передачи), а затем событие content_block_stop.

Кэширование подсказок

Сжатие контекста хорошо работает с кэшированием подсказок. Вы можете добавить точку останова cache_control на блоки сжатия, чтобы кэшировать суммированное содержимое. Исходное сжатое содержимое игнорируется.

{
  "role": "assistant",
  "content": [
    {
      "type": "compaction",
      "content": "[summary text]",
      "cache_control": { "type": "ephemeral" }
    },
    {
      "type": "text",
      "text": "Based on our conversation..."
    }
  ]
}

Максимизация попаданий в кэш с помощью системных подсказок

Когда происходит сжатие контекста, сводка становится новым содержимым, которое необходимо записать в кэш. Без дополнительных точек останова кэша это также сделало бы недействительной любую кэшированную системную подсказку, требуя её повторного кэширования вместе со сводкой сжатия.

Чтобы максимизировать частоту попаданий в кэш, добавьте точку останова cache_control в конце вашей системной подсказки. Это сохраняет системную подсказку в кэше отдельно от разговора, поэтому при сжатии контекста:

  • Кэш системной подсказки остаётся действительным и считывается из кэша
  • Только сводка сжатия должна быть записана как новая запись кэша

Этот подход особенно полезен для длинных системных подсказок, поскольку они остаются кэшированными даже при нескольких событиях сжатия контекста на протяжении разговора.

Понимание использования

Сжатие контекста требует дополнительного шага сэмплирования, который учитывается в ограничениях скорости и тарификации. API возвращает подробную информацию об использовании в ответе:

Output
{
  "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 в вашей подсказке, но не запускает новые сжатия. Используйте его, чтобы проверить эффективное количество токенов после предыдущих сжатий:

Примеры

Вот полный пример длительного разговора со сжатием контекста:

Вот пример, использующий pause_after_compaction для сохранения предыдущего обмена репликами и текущего сообщения пользователя (всего три сообщения) дословно вместо их суммирования:

Текущие ограничения

  • Та же модель для суммирования: Модель, указанная в вашем запросе, используется для суммирования. Нет возможности использовать другую (например, более дешёвую) модель для сводки.

  • Сжатие контекста может завершиться неудачей при определённых инструментах: Когда ваш запрос включает 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.

Дальнейшие шаги


Руководство по сжатию памяти сессии


Изучите практическую реализацию, которая управляет длительными разговорами с мгновенным сжатием памяти сессии, используя фоновую многопоточность и кэширование подсказок.

Контекстные окна

Узнайте о размерах контекстного окна и стратегиях управления.

Редактирование контекста

Изучите другие стратегии управления контекстом разговора, такие как очистка результатов инструментов и очистка блоков мышления.

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})
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},
            }
        ]
    },
)
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.",
            }
        ]
    },
)
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"}]},
    )
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"}]},
)
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})
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"}]},
)
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"))
# ... продолжайте столько, сколько потребуется
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"))
# ... продолжаем столько, сколько потребуется