Dans mon exploration des skills (avec DeepAgent et ADK), je me suis posé une question : comment est-ce que je peux réduire mon contexte pendant une longue conversation ?
Réponse : la contextual summarization.
Le concept est assez simple : à des checkpoints spécifiés, l’agent lance automatiquement un call demandant au LLM de faire un résumé de la discussion jusqu’à ce point. C’est un call assez classique avec un prompt qui fait simplement cette demande.
Voici ce qu’on peut faire avec ADK.
import litellm
from google.adk.agents import LlmAgent
from google.adk.apps.app import App, EventsCompactionConfig
from google.adk.apps.llm_event_summarizer import LlmEventSummarizer
from google.adk.models.lite_llm import LiteLlm
MODEL = LiteLlm(model="openai/qwen/qwen3.5-9b")
root_agent = LlmAgent(
model=MODEL,
name="context_compaction",
instruction="""You are a helpful assistant.""",
tools=[]
)
my_summarizer = LlmEventSummarizer(llm=MODEL)
app = App(
name="context_compaction",
root_agent=root_agent,
events_compaction_config=EventsCompactionConfig(
compaction_interval=2,
overlap_size=1,
summarizer=my_summarizer,
),
)
Toute la magie s’opere à ce niveau
events_compaction_config=EventsCompactionConfig(
compaction_interval=2,
overlap_size=1,
summarizer=my_summarizer,
)
Avec compaction_interval = 2 et overlap_size = 1, le système compresse les événements tous les 2 événements, mais il garde toujours le dernier événement du résumé précédent pour le réutiliser dans le suivant afin de conserver le contexte. Le paramètre overlap sert juste à garder un petit chevauchement entre les résumés, pour éviter que le contexte se coupe brutalement entre deux compressions. C’est un peu comme répéter la dernière phrase d’un paragraphe pour que le suivant reste compréhensible.
Le prompt de compression
Avec ADK, vous verrez une activité apparaître dans l’interface web, mais il n’est pas vraiment possible de savoir exactement ce qui se passe derrière (info valable au 13 mars 2026).
Quand la compression se déclenche, ADK envoie tous les éléments à compresser dans un long message au LLM, accompagné d’une instruction lui demandant de produire un résumé. Rien de très exotique : c’est simplement un prompt qui demande de résumer la conversation.
Si vous ne définissez pas de prompt personnalisé, ADK utilise celui-ci par défaut :
_DEFAULT_PROMPT_TEMPLATE = (
'The following is a conversation history between a user and an AI'
' agent. Please summarize the conversation, focusing on key'
' information and decisions made, as well as any unresolved'
' questions or tasks. The summary should be concise and capture the'
' essence of the interaction.\n\n {conversation_history}'
)
La variable conversation_history correspond simplement à l’ensemble des messages qui doivent être compressés.
Si besoin, vous pouvez aussi fournir votre propre prompt à LlmEventSummarizer. Petite chose importante à ne pas oublier : gardez {conversation_history} dans votre prompt, sinon l’historique de la conversation ne sera pas inclus dans la requête envoyée au LLM.
Exemple
my_summarizer = LlmEventSummarizer(
llm=MODEL,
prompt_template=(
"You are a precision summarizer for an ongoing conversation between a user and an AI agent.\n"
"Your summary will REPLACE the original conversation history, so accuracy and completeness are critical.\n\n"
"Analyze the conversation below and produce a structured summary with these sections:\n\n"
"## Active Context\n"
"- Current topic or task the user is working on\n"
"- The user's latest intent or request\n\n"
"## Key Facts & Decisions\n"
"- Established facts, preferences, names, values, configurations, or constraints stated by the user\n"
"- Decisions made and their rationale\n\n"
"## Actions Taken\n"
"- What the agent already did (files edited, commands run, answers given)\n"
"- Outcomes and results of those actions\n\n"
"## Open Items\n"
"- Unresolved questions, pending tasks, or next steps\n"
"- Any errors or blockers encountered\n\n"
"Rules:\n"
"- Preserve ALL specific values: names, paths, code snippets, URLs, numbers, and exact user quotes that carry intent.\n"
"- Omit pleasantries, filler, and redundant back-and-forth.\n"
"- If a fact was corrected later in the conversation, keep only the corrected version.\n"
"- Be concise but never drop information that would be needed to continue the conversation seamlessly.\n\n"
"Conversation:\n{conversation_history}"
),
)