Compactación y pensamiento preservado
Cuándo siguen siendo válidos los bloques de pensamiento de los turnos conservados tras la compactación bajo demanda en modelos con pensamiento preservado, y cómo comprobarlo.
Omite esta página a menos que envíes bloques de pensamiento de vuelta a un modelo con "preserved thinking" (pensamiento preservado) y conserves turnos después del bloque de compactación. Los "kept turns" (turnos conservados) son los turnos que siguen al bloque: turnos recientes que dejaste fuera de la solicitud de compactación, como en Compactación que conserva los turnos recientes, o turnos que llegaron mientras se escribía el resumen, como en Compactación en segundo plano.
Los modelos con pensamiento preservado comprueban los bloques de pensamiento anteriores contra la conversación que los produjo. Un resumen reemplaza parte de esa conversación, pero la comprobación acepta el intercambio cuando la API escribió el resumen, por lo que el pensamiento de los turnos conservados puede seguir siendo válido.
Condiciones para que el pensamiento conservado siga siendo válido
Los bloques de pensamiento de los turnos conservados siguen siendo válidos mientras se cumplan todas estas condiciones:
- La solicitud de compactación se ejecuta en un modelo con pensamiento preservado. Esta condición abarca cada solicitud de compactación desde que se produjo un bloque de pensamiento, no solo la más reciente. Una forma de cumplirla es enviar cada solicitud de compactación al modelo que usa la conversación.
- Los turnos conservados siguen directamente a los mensajes resumidos, y los envías sin cambios. Envía cada mensaje conservado exactamente como está en tu historial. No omitas ni agregues ningún mensaje entre el último mensaje resumido y el primero conservado. El primer mensaje conservado también debe tener un rol diferente al del último mensaje resumido, y no puede ser un mensaje
role: "system"a mitad de la conversación. De lo contrario, la API lo fusiona con el último mensaje resumido. Una forma de acertar con el primer mensaje conservado es compactar exactamente losmessagesde una solicitud que ya enviaste. Así, los turnos conservados comienzan con la respuesta de Claude a esa solicitud. systemy lastoolsno marcadas condefer_loading: trueno cambian. Son las mismas en la solicitud de compactación que en las solicitudes que produjeron el pensamiento conservado, y siguen siendo las mismas en las solicitudes posteriores. Cambiar la indicación del sistema o las herramientas explica cómo cambiarlas de forma segura.
Si una condición no se cumple, nada falla al compactar, y la API acepta el bloque en las solicitudes posteriores de todos modos. El fallo llega en la primera solicitud posterior que envía el pensamiento conservado donde la API aplica la comprobación: un error 400 de forma predeterminada, o bloques de pensamiento descartados si la solicitud establece thinking.block_binding.prefix_mismatch_behavior en "drop_block". En la Message Batches API, un elemento que deja el campo sin establecer no falla. Donde la comprobación se aplica de forma predeterminada, la API descarta los bloques en su lugar. Qué hace la API con un bloque no válido describe ambos resultados, y Cuándo aplica la API la verificación indica qué solicitudes se comprueban.
Compactar de nuevo sin romper el pensamiento anterior
Puedes compactar de nuevo y conservar turnos: el nuevo bloque abarca el resumen anterior y cada mensaje que lo sigue en la solicitud de compactación, y cualquier turno que dejes fuera de esa solicitud es un turno conservado del nuevo bloque.
La primera de las condiciones para el pensamiento conservado cuenta cada compactación desde que se produjo un bloque de pensamiento, por lo que un turno que conservas a lo largo de dos compactaciones necesita que ambas se hayan ejecutado en un modelo con pensamiento preservado.
Las compactaciones anteriores a la producción de un bloque de pensamiento no cuentan en su contra. El pensamiento producido después de que un bloque está en su lugar queda vinculado a ese bloque, y sigue siendo válido a lo largo de las compactaciones posteriores que cumplan las condiciones.
Cambiar la indicación del sistema o las herramientas
Una solicitud posterior puede usar un system diferente, tools diferentes o un modelo diferente al de la solicitud de compactación, y la API sigue aceptando el bloque. Un cambio así puede invalidar el pensamiento de los turnos conservados, pero no tiene ningún otro efecto.
Para cambiar system o tools sin invalidar ningún pensamiento conservado, primero compacta toda la conversación, de modo que no se conserve ningún turno. Luego cámbialos en la siguiente solicitud.
Para agregar una instrucción o cambiar las herramientas disponibles sin tocar system ni tools, añade el cambio a messages, como se describe en Hacer cambios sin editar el prefijo.
Los mensajes del sistema a mitad de la conversación dentro de los turnos resumidos también se resumen, por lo que sus instrucciones de texto dejan de aplicarse después del intercambio. Para mantener uno vigente, vuelve a indicarlo en un mensaje role: "system" directamente después del primer turno user nuevo que sigue a los turnos conservados. Los cambios de herramientas dentro de esos turnos se mantienen por sí solos cuando la solicitud de compactación también incluye inline-tools-2026-09-15: el bloque devuelto registra su efecto neto en su campo tool_changes, así que envía el bloque de vuelta sin modificar. Si el bloque no tiene un campo tool_changes, vuelve a indicar esos cambios de herramientas de la misma manera. Un mensaje del sistema colocado entre el bloque y los turnos conservados rompe su pensamiento.
Comprobar que el pensamiento conservado se mantuvo
La respuesta de compactación no indica si el pensamiento conservado se mantiene. La primera solicitud después del intercambio sí lo hace. Para comprobarlo en tus pruebas:
- Mantén una conversación corta con el pensamiento activado. Usa un modelo en el que la API ejecute la comprobación (consulta Cuándo aplica la API la verificación), y úsalo en cada paso, porque un modelo que no puede leer un bloque de pensamiento lo descarta sin ningún error.
- Compacta los turnos más antiguos y conserva al menos un turno que contenga un bloque de pensamiento.
- Envía la siguiente solicitud, con el bloque primero, luego el turno conservado y después un nuevo mensaje
user, y conthinking.block_binding.prefix_mismatch_behaviorestablecido en"error". - Lee el resultado. Una respuesta 200 cuyo arreglo
input_transformationsestá vacío significa que ningún bloque de pensamiento falló la comprobación ni fue descartado. Un error 400 que indica que el bloque está vinculado a una conversación diferente significa que alguno sí lo hizo. El mensaje comienza con la ruta del primer bloque que falló, y Qué hace la API con un bloque no válido lo muestra completo.
El campo prefix_mismatch_behavior necesita el encabezado beta thinking-binding-controls-2026-08-01 además del encabezado beta compact-2026-09-04. Establecer el campo también incluye la solicitud en la comprobación en las cuentas donde la comprobación no está activada de forma predeterminada.
El siguiente programa ejecuta los cuatro pasos. Imprime cuántos bloques de pensamiento contiene el turno conservado y cuántas entradas tiene input_transformations; ninguna entrada significa que el pensamiento conservado se mantuvo:
from anthropic.types.beta import BetaMessageParam, BetaThinkingConfigParam
client = anthropic.Anthropic()
# Claude Fable 5.1 es el primer modelo que verifica el pensamiento reenviado contra la conversación.
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."
# Con "error", un bloque de pensamiento que no pasa la verificación hace que la solicitud falle con un 400.
THINKING: BetaThinkingConfigParam = {
"type": "adaptive",
"block_binding": {"prefix_mismatch_behavior": "error"},
}
# 1. Mantén una conversación corta con el pensamiento activado.
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. Resume el primer turno. El segundo turno queda fuera de la solicitud.
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. Coloca el bloque delante del turno conservado y haz la siguiente pregunta.
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. Un 200 sin bloques descartados significa que el pensamiento conservado se mantuvo.
print(f"Dropped thinking blocks: {len(third.input_transformations)}")Thinking blocks in the kept turn: 1
Dropped thinking blocks: 0En producción, "drop_block" hace que las solicitudes sigan teniendo éxito cuando una condición no se cumple, e informa cada bloque descartado en input_transformations con reason: "prefix_binding_mismatch". Una entrada cuyo path cae en un turno conservado significa que el pensamiento de ese turno no se mantuvo. Qué hace la API con un bloque no válido describe qué se descarta y explica cómo configurar alertas al respecto.
Compatibility
| Supported models |
|
|---|---|
| Supported platforms |
|
Was this page helpful?