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ámetroTipoDescripción
compaction_intervalu32Número de invocaciones completadas que activan la compactación
overlap_sizeu32Eventos de la ventana anterior incluidos en el siguiente resumen
summarizerArc<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:

  1. Se encuentra el evento de compactación más reciente
  2. Su resumen reemplaza todos los eventos hasta el límite de compactación
  3. 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ónEventosAcción
1user→agent
2user→agent
3user→agentCompactar eventos 1-3 en Resumen A
4user→agent
5usuario→agente
6user→agentCompactar 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)