Loading...
  • Разработка
  • Администрирование
  • Модели и цены
  • Клиентские SDK
  • Справочник API
Search...
⌘K
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
Разработка/Управление контекстом

Компактизация

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

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-mythos-preview)
  • 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 генерирует резюме в блоке компактизации и продолжает ответ с компактизированным контекстом

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

Включите компактизацию, добавив стратегию 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})

Параметры

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

Конфигурация триггера

Настройте, когда запускается компактизация, используя параметр 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 со счетчиком сжатия для оценки совокупного использования и корректного завершения задачи после достижения бюджета:

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-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 в начале ответа помощника.

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

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

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, все блоки содержимого перед ним игнорируются. Вы можете либо:

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

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

При потоковой передаче ответов с включенным сжатием вы получите событие 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 возвращает подробную информацию об использовании в ответе:

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

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?

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