# Resume el historial antiguo y conserva los turnos recientes

Reduce el historial de la aplicación sin convertir el resumen en una instrucción.

## Decide qué debe conservarse

Las conversaciones largas pueden superar el contexto del modelo o resultar costosas al reenviarlas. La aplicación puede resumir turnos antiguos y mantener intacta una ventana reciente. Conserva por separado identificadores, decisiones, preguntas abiertas y valores exactos cuando sean importantes.

Todo resumen pierde información. Guarda el historial original en tu propio almacenamiento si tu política de conservación lo permite. Este patrón utiliza un modelo de chat elegido por la aplicación; no requiere ScaleDown ni un endpoint especial de resumen de MandAPI.

## Utiliza una función de compactación

Pasa únicamente turnos de usuario y asistente. Mantén separadas las instrucciones de sistema fiables. Más adelante el callback puede llamar a MandAPI con `MANDAPI_API_KEY`, `MANDAPI_MODEL_ID` y `https://api.mandapi.com/v1`. Esta demostración usa un callback local y no hace solicitudes a la API.

```python
import json

def compact_history(turns, summarize, identifiers, keep=4):
    if keep < 1:
        raise ValueError("keep debe ser positivo")
    if len(turns) <= keep:
        return list(turns)
    older, recent = turns[:-keep], turns[-keep:]
    summary = summarize(older)
    if not isinstance(summary, str) or not summary.strip():
        raise ValueError("Resumen vacio o invalido")
    summary_data = {
        "kind": "untrusted_conversation_summary",
        "summary": summary,
        "identifiers": identifiers,
    }
    return [
        {"role": "user", "content": json.dumps(summary_data)},
        *recent,
    ]

turns = [
    {"role": "user" if i % 2 == 0 else "assistant", "content": f"Turno {i}"}
    for i in range(8)
]
result = compact_history(
    turns, lambda older: "Resumen de demostracion del historial antiguo.",
    identifiers={"request_id": "demo-001"}, keep=4,
)
assert result[-4:] == turns[-4:]
print(result[0]["role"], len(result))
```

## Trata el resumen como datos

No insertes un resumen generado como una nueva instrucción de sistema. Etiquétalo como datos de una conversación anterior e indica al modelo principal que no siga instrucciones citadas dentro de él. Los identificadores importantes deben proceder del estado fiable de la aplicación, no de una reconstrucción del modelo.

## Comprueba el resultado

Verifica que los turnos recientes y los identificadores se conservan. Prueba contradicciones, instrucciones citadas y resúmenes vacíos. Mide el tamaño de las solicitudes y la calidad de las respuestas antes de elegir la ventana; contar caracteres no equivale a contar tokens.

## Referencias

- [https://openrouter.ai/docs/cookbook/building-agents/compact-agent-sessions-with-scaledown](https://openrouter.ai/docs/cookbook/building-agents/compact-agent-sessions-with-scaledown)
