Claude Platform Docs
MessagesСжатие

Сжатие с сохранением последних ходов

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

«Keep-tail compaction» (сжатие с сохранением хвоста) сохраняет последние несколько «turns» (ходов) разговора дословно после сводки. Оно меняет две вещи в цикле сжатия: какие сообщения попадают в запрос на сжатие и что вы отправляете после блока. Всё, что описано в разделе Продолжение со сводки, применяется без изменений.

Выбор сохраняемых ходов

Никакой параметр не задаёт, какие ходы сохраняются. Вы выбираете «cut point» (точку отсечения) в своей истории: сообщения до неё попадают в запрос на сжатие, а сообщения начиная с неё сохраняются.

Сохранённые ходы возвращаются к Claude в полном объёме, поэтому чем больше вы сохраняете, тем меньше места освобождает сжатие.

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

Сжатие более ранних ходов и отправка остальных после блока

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

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

В следующем примере история содержит два хода, и точка отсечения сохраняет второй. Запрос на сжатие содержит первый ход:

{
  "model": "claude-opus-5-5",
  "max_tokens": 4096,
  "messages": [
    {
      "role": "user",
      "content": "I am building a recipe app. Help me name the main entities in the data model."
    },
    {
      "role": "assistant",
      "content": "Start with Recipe, Ingredient, and Step. Add a RecipeIngredient entry that holds the quantity and unit for each ingredient in a recipe."
    }
  ],
  "compaction": { "type": "summarize" }
}

Следующий запрос отправляет сначала возвращённый блок, затем сохранённый ход точно в прежнем виде, затем новое сообщение user. В разделе Продолжение со сводки показан запрос, который начинается с блока.

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

from anthropic.types.beta import BetaMessageParam

client = anthropic.Anthropic()

# Задайте значение, близкое к вашему реальному бюджету входных токенов. Здесь оно занижено, чтобы короткий диалог сжимался.
COMPACT_AT_TOKENS = 2500
SYSTEM = "You help design a recipe app's data model. Keep answers short."
KEEP_TURNS = 2

QUESTIONS = [
    "What are the main entities in the data model?",
    "Which fields should Recipe have?",
    "Which fields should Ingredient have?",
    "Which fields should RecipeIngredient have?",
    "Which fields should Step have?",
    "Which indexes should these tables have?",
    "Which fields should be required?",
    "Which fields should have default values?",
]

history: list[BetaMessageParam] = []
for turn, question in enumerate(QUESTIONS, start=1):
    history.append({"role": "user", "content": question})
    response = client.beta.messages.create(
        model="claude-opus-5-5",
        max_tokens=8192,
        system=SYSTEM,
        betas=["compact-2026-09-04"],
        messages=history,
    )
    history.append({"role": "assistant", "content": response.content})

    # Следующий запрос тоже отправит этот ответ, поэтому учитывайте его.
    conversation_tokens = response.usage.input_tokens + response.usage.output_tokens
    if conversation_tokens > COMPACT_AT_TOKENS and KEEP_TURNS < turn < len(QUESTIONS):
        # Ход — это одно сообщение пользователя и один ответ ассистента,
        # поэтому сохранённые ходы начинаются с сообщения пользователя.
        split = -2 * KEEP_TURNS
        older, recent = history[:split], history[split:]
        summary = client.beta.messages.create(
            model="claude-opus-5-5",
            max_tokens=4096,
            system=SYSTEM,
            betas=["compact-2026-09-04"],
            messages=older,
            compaction={"type": "summarize"},
        )
        if summary.stop_reason == "compaction":
            history = [{"role": "assistant", "content": summary.content}, *recent]
            print(f"Kept {len(recent) // 2} turns after the block")
  • Выбор точки отсечения: Программа сохраняет последние два хода, где ход — это одно сообщение user и ответ на него. Она разделяет историю в четырёх сообщениях от конца, поэтому сохранённые ходы начинаются с сообщения user.
  • Решение о том, когда выполнять сжатие: Проверка размера также требует, чтобы в разговоре было больше ходов, чем сохраняет программа, поэтому более ранняя часть никогда не бывает пустой.
  • Запрос на сжатие: Там, где цикл отправляет всю историю, эта версия отправляет только более ранние сообщения.
  • Замена: Там, где цикл заменяет всю историю возвращённым сообщением, новая история в этой версии — это возвращённое сообщение, за которым следуют сохранённые ходы.

Проверка stop_reason и все запросы после замены не отличаются от цикла.

Сохранение действительности мышления в сохранённых ходах

Если вы отправляете блоки мышления обратно модели с «preserved thinking» (сохранённым мышлением), мышление в сохранённых ходах остаётся действительным только до тех пор, пока выполняются условия, при которых сохранённое мышление остаётся действительным, и одно из них ограничивает, где может проходить точка отсечения.

Точка отсечения в программе, между ответом и следующим сообщением user, удовлетворяет этому условию. Как и точка отсечения в конце уже выполненного вами запроса: сожмите ровно messages этого запроса и сохраните всё, что добавилось в вашу историю с тех пор.

Compatibility

Supported models
  • Fable 5 and 5.1
  • Mythos 5, 5.1, and Preview
  • Opus 4.6, 4.7, 4.8, 5, and 5.5
  • Sonnet 4.6 and 5
Supported platforms
  • Claude APIBeta
  • Claude Platform on AWSBeta
  • Google CloudBeta
  • Microsoft FoundryBeta

Was this page helpful?