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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. Проведите короткий диалог с включёнными размышлениями. Используйте модель, на которой API выполняет проверку (см. Когда API применяет проверку), и используйте её на каждом шаге, поскольку модель, которая не может прочитать блок размышлений, отбрасывает его без ошибки.
  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

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

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, 5, and 5.5
  • Haiku 5.5
Supported platforms
  • Claude APIBeta
  • Claude Platform on AWSBeta
  • Google CloudBeta
  • Microsoft FoundryBeta

Was this page helpful?