Claude Platform Docs
СообщенияСжатие

Сжатие и сохранённые размышления

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

Пропустите эту страницу, если только вы не отправляете «thinking blocks» (блоки размышлений) обратно модели с «preserved thinking» (сохранёнными размышлениями) и не сохраняете ходы после блока «compaction» (сжатия). «Kept turns» (сохранённые ходы) — это ходы, следующие за блоком: недавние ходы, которые вы не включили в запрос на сжатие, как в разделе Сжатие с сохранением последних ходов, или ходы, поступившие во время написания сводки, как в разделе Сжатие в фоновом режиме.

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

Условия, при которых сохранённые размышления остаются действительными

Блоки размышлений в сохранённых ходах остаются действительными, пока выполняются все следующие условия:

  • Запрос на сжатие выполняется на модели с сохранёнными размышлениями. Это условие распространяется на каждый запрос на сжатие с момента создания блока размышлений, а не только на самый последний. Один из способов его выполнить — отправлять каждый запрос на сжатие той модели, которую использует диалог.
  • Сохранённые ходы непосредственно следуют за суммированными сообщениями, и вы отправляете их без изменений. Отправляйте каждое сохранённое сообщение точно в том виде, в каком оно есть в вашей истории. Не пропускайте и не добавляйте сообщения между последним суммированным сообщением и первым сохранённым. Первое сохранённое сообщение также должно иметь роль, отличную от роли последнего суммированного сообщения, и оно не может быть сообщением role: "system" в середине диалога. В противном случае API объединит его с последним суммированным сообщением. Один из способов правильно сформировать первое сохранённое сообщение — сжать ровно messages запроса, который вы уже отправили. Тогда сохранённые ходы начнутся с ответа Claude на него.
  • system и те tools, которые не помечены defer_loading: true, не меняются. Они одинаковы в запросе на сжатие и в запросах, в которых были созданы сохранённые размышления, и остаются такими же в последующих запросах. В разделе Изменение системной подсказки или инструментов описано, как безопасно их изменить.

Если какое-либо условие не выполняется, при сжатии ничего не даёт сбоя, и API в любом случае принимает блок сжатия в последующих запросах. Сбой происходит с оставленными размышлениями — в первом последующем запросе, который их отправляет. В разделе Что API делает с недействительным блоком описано, что происходит в этом случае, а в разделе Когда prefix_mismatch_behavior не задан рассматриваются запросы, в которых это поле не задано, включая элементы Message Batches.

Повторное сжатие без нарушения более ранних размышлений

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

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

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

Изменение системной подсказки или инструментов

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

Чтобы изменить system или tools, не делая недействительными сохранённые размышления, сначала сожмите весь диалог, чтобы не осталось сохранённых ходов. Затем измените их в следующем запросе.

Чтобы добавить инструкцию или изменить доступные инструменты, не затрагивая system или tools, добавьте изменение в messages, как описано в разделе Внесение изменений без редактирования префикса.

Системные сообщения в середине разговора внутри суммированных ходов тоже попадают в сводку, поэтому их текстовые инструкции перестают действовать после замены. Уровень усилий для отдельного сообщения, который они задают, также не переносится: пока более позднее сообщение не задаст уровень, ходы выполняются с output_config.effort верхнего уровня запроса или со значением модели по умолчанию, если вы его не задали. Чтобы инструкция или уровень усилий продолжали действовать, повторите их в сообщении role: "system" сразу после первого нового хода user, следующего за сохранёнными ходами. Изменения инструментов внутри этих ходов переносятся сами, если запрос на сжатие также содержит inline-tools-2026-09-15: возвращённый блок записывает их итоговый эффект в своё поле tool_changes, поэтому отправляйте блок обратно без изменений. Если у блока нет поля tool_changes, повторите эти изменения инструментов тем же способом. Системное сообщение, размещённое между блоком и сохранёнными ходами, нарушает их размышления.

Проверка того, что сохранённые размышления остались действительными

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

  1. Проведите короткий диалог с включёнными размышлениями. Используйте модель, которая выполняет проверку префикса (см. Сохранение префикса неизменным), и используйте её на каждом шаге, поскольку модель, которая не может прочитать блок размышлений, отбрасывает его без ошибки.
  2. Сожмите более ранние ходы и сохраните как минимум один ход, содержащий блок размышлений.
  3. Отправьте следующий запрос: сначала блок, затем сохранённый ход, затем новое сообщение user, а для thinking.block_binding.prefix_mismatch_behavior задайте значение "error".
  4. Прочитайте результат. Ответ 200 с пустым массивом input_transformations означает, что ни один блок размышлений не провалил проверку и не был отброшен. Ошибка 400 с сообщением о том, что блок привязан к другому диалогу, означает, что такой блок есть. Сообщение начинается с пути к первому блоку, не прошедшему проверку, а в разделе Что API делает с недействительным блоком оно приведено полностью.

Для поля prefix_mismatch_behavior требуется бета-заголовок thinking-binding-controls-2026-08-01 в дополнение к бета-заголовку compact-2026-09-04. Значение, заданное в запросе, действует для любой учётной записи.

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

from anthropic.types.beta import BetaMessageParam, BetaThinkingConfigParam

client = anthropic.Anthropic()

# Claude Fable 5.1 — первая модель, которая сверяет возвращённые ей блоки размышлений с ходом диалога.
MODEL = "claude-fable-5-1"
BETAS = ["compact-2026-09-04", "thinking-binding-controls-2026-08-01"]
SYSTEM = "You help plan a recipe app's release. Keep answers short."
# При значении "error" блок размышлений, не прошедший проверку, приводит к ошибке запроса с кодом 400.
THINKING: BetaThinkingConfigParam = {
    "type": "adaptive",
    "block_binding": {"prefix_mismatch_behavior": "error"},
}

# 1. Проведите короткий диалог с включёнными размышлениями.
history: list[BetaMessageParam] = [
    {"role": "user", "content": "What are the main entities in the app's data model?"}
]
first = client.beta.messages.create(
    model=MODEL,
    max_tokens=8192,
    system=SYSTEM,
    betas=BETAS,
    thinking=THINKING,
    messages=history,
)
history += [
    {"role": "assistant", "content": first.content},
    {
        "role": "user",
        "content": "Testing starts on Tuesday, March 3, 2026, takes 10 weekdays, and pauses on March 9 and March 16. On which date does it end?",
    },
]
second = client.beta.messages.create(
    model=MODEL,
    max_tokens=8192,
    system=SYSTEM,
    betas=BETAS,
    thinking=THINKING,
    messages=history,
)
history.append({"role": "assistant", "content": second.content})
thinking_blocks = sum(block.type == "thinking" for block in second.content)
print(f"Thinking blocks in the kept turn: {thinking_blocks}")

# 2. Кратко изложите первый ход. Второй ход в запрос не включается.
summary = client.beta.messages.create(
    model=MODEL,
    max_tokens=4096,
    system=SYSTEM,
    betas=BETAS,
    thinking=THINKING,
    messages=history[:2],
    compaction={"type": "summarize"},
)
if summary.stop_reason != "compaction":
    raise SystemExit(f"No summary: {summary.stop_reason}")

# 3. Поместите блок перед сохранённым ходом и задайте следующий вопрос.
history = [
    {"role": "assistant", "content": summary.content},
    *history[2:],
    {"role": "user", "content": "Which day should the release go out?"},
]
third = client.beta.messages.create(
    model=MODEL,
    max_tokens=8192,
    system=SYSTEM,
    betas=BETAS,
    thinking=THINKING,
    messages=history,
)

# 4. Ответ 200 без отброшенных блоков означает, что сохранённые размышления прошли проверку.
print(f"Dropped thinking blocks: {len(third.input_transformations)}")
Output
Thinking blocks in the kept turn: 1
Dropped thinking blocks: 0

В рабочей среде («production») "drop_block" обеспечивает успешное выполнение запросов, когда какое-либо условие не выполняется. В ответе каждый отброшенный блок указывается в input_transformations с reason: "prefix_binding_mismatch". Запись, path которой попадает в «kept turn» (сохранённый ход), означает, что для размышлений этого хода какое-то условие не выполнилось. В разделе Что API делает с недействительным блоком описано, что отбрасывается, и объясняется, как настроить оповещения об этом. На Claude Sonnet 5.5 и Claude Haiku 5.5 block_binding работает только с thinking: {"type": "adaptive"}. При любой другой настройке размышлений на этих моделях отправить block_binding нельзя, поэтому убедитесь, что все условия выполняются, или удалите блоки thinking и redacted_thinking из сохранённых ходов.

Доступность

Сжатие и сохранённые размышления находятся в бета-версии для некоторых моделей.

Поддержка API

СтатусБета
Облачные платформы
Модели

Обязательные бета-заголовки

Обзор бета-заголовков

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

Заголовок
  • compact-2026-09-04

Эта страница была полезной?