Compactación de Contexto
A medida que un ADK agent se ejecuta, acumula context — mensajes de usuario, tool responses, contenido generado. A medida que este context crece, los tiempos de procesamiento de LLM aumentan porque se envían más datos con cada solicitud. La compactación de context aborda esto resumiendo eventos más antiguos utilizando un enfoque de sliding window.
Cómo Funciona
La compactación de context utiliza un sliding window para resumir periódicamente eventos de conversación más antiguos dentro de una session. Cuando el número de invocations completadas alcanza el intervalo configurado, el summarizer comprime los eventos más antiguos en un único summary event.
Invocations 1-3: [event1, event2, event3] → Summarized into "Summary A"
Invocations 4-6: [Summary A, event3, event4, event5, event6] → Summarized into "Summary B"
El parámetro overlap_size controla cuántos eventos de la ventana anterior se transfieren al siguiente summary, preservando la continuidad.
Configuración
Agregue compaction a su runner configuration:
use adk_agent::LlmEventSummarizer;
use adk_runner::{Runner, RunnerConfig, EventsCompactionConfig};
use std::sync::Arc;
// Use any LLM for summarization (a fast, cheap model works well)
let summarizer_llm = Arc::new(my_model);
let summarizer = Arc::new(LlmEventSummarizer::new(summarizer_llm));
let runner = Runner::new(RunnerConfig {
app_name: "my_app".to_string(),
agent: root_agent,
session_service: sessions,
artifact_service: None,
memory_service: None,
plugin_manager: None,
run_config: None,
compaction_config: Some(EventsCompactionConfig {
compaction_interval: 3, // Compact every 3 invocations
overlap_size: 1, // Keep 1 prior invocation for context
summarizer,
}),
})?;
Parámetros de Configuración
| Parámetro | Tipo | Descripción |
|---|---|---|
compaction_interval | u32 | Número de invocaciones completadas que activan la compactación |
overlap_size | u32 | Eventos de la ventana anterior incluidos en el siguiente resumen |
summarizer | Arc<dyn BaseEventsSummarizer> | La estrategia de resumen |
Resumidor Personalizado
Puedes personalizar el prompt de resumen:
let summarizer = LlmEventSummarizer::new(llm)
.with_prompt_template(
"Summarize this conversation focusing on action items \
and decisions:\n\n{conversation_history}"
);
O implementar BaseEventsSummarizer para un control total:
use adk_core::{BaseEventsSummarizer, Event, Result};
use async_trait::async_trait;
struct MySummarizer;
#[async_trait]
impl BaseEventsSummarizer for MySummarizer {
async fn summarize_events(&self, events: &[Event]) -> Result<Option<Event>> {
// Custom summarization logic
// Return None to skip compaction for this window
todo!()
}
}
Cómo la Compactación Afecta el Historial
Cuando se llama a conversation_history() en una sesión con eventos de compactación:
- Se encuentra el evento de compactación más reciente
- Su resumen reemplaza todos los eventos hasta el límite de compactación
- Solo los eventos posteriores al límite se incluyen individualmente
Esto es transparente para los agents — reciben un historial de conversación coherente que incluye el resumen seguido de los eventos recientes.
Cronología de Ejemplo
Con compaction_interval: 3 y overlap_size: 1:
| Invocación | Eventos | Acción |
|---|---|---|
| 1 | user→agent | — |
| 2 | user→agent | — |
| 3 | user→agent | Compactar eventos 1-3 en Resumen A |
| 4 | user→agent | — |
| 5 | usuario→agente | — |
| 6 | user→agent | Compactar eventos 3-6 (overlap=1) en Summary B |
Después de la invocación 6, el Agent ve: [Summary B, event 6 overlap events, event 7+]
Notas
- La falla de compactación no es fatal — el Runner registra una advertencia y continúa
- La compactación se ejecuta después de que el flujo de invocación se completa, no durante
- El evento de compactación se conserva en el servicio de sesiones para garantizar su durabilidad
- Utilice un modelo rápido y económico para el resumen (p. ej.,
gemini-2.5-flash)