- Home
- Documentation
- Sessioni
- Compattazione e riepiloghi dei rami
Compattazione e riepiloghi dei rami
La compattazione e i riepiloghi dei rami sono i due meccanismi che mantengono utilizzabili le sessioni lunghe senza perdere il contesto del lavoro precedente.
- La compattazione riscrive la cronologia precedente in un riepilogo sul ramo corrente.
- Il riepilogo del ramo cattura il contesto dei rami abbandonati durante la navigazione con
/tree.
Entrambi vengono persistiti come voci di sessione e riconvertiti in messaggi di contesto utente durante la ricostruzione dell’input per l’LLM.
File di implementazione principali
Sezione intitolata “File di implementazione principali”src/session/compaction/compaction.tssrc/session/compaction/branch-summarization.tssrc/session/compaction/pruning.tssrc/session/compaction/utils.tssrc/session/session-manager.tssrc/session/agent-session.tssrc/session/messages.tssrc/extensibility/hooks/types.tssrc/config/settings-schema.ts
Modello delle voci di sessione
Sezione intitolata “Modello delle voci di sessione”La compattazione e i riepiloghi dei rami sono voci di sessione di prima classe, non semplici messaggi assistant/user.
CompactionEntrytype: "compaction"summary, opzionaleshortSummaryfirstKeptEntryId(confine di compattazione)tokensBefore- opzionali
details,preserveData,fromExtension
BranchSummaryEntrytype: "branch_summary"fromId,summary- opzionali
details,fromExtension
Quando il contesto viene ricostruito (buildSessionContext):
- L’ultima compattazione sul percorso attivo viene convertita in un messaggio
compactionSummary. - Le voci mantenute da
firstKeptEntryIdal punto di compattazione vengono re-incluse. - Le voci successive sul percorso vengono aggiunte in coda.
- Le voci
branch_summaryvengono convertite in messaggibranchSummary. - Le voci
custom_messagevengono convertite in messaggicustom.
Quei ruoli personalizzati vengono poi trasformati in messaggi utente destinati all’LLM in convertToLlm() utilizzando i template statici:
prompts/compaction/compaction-summary-context.mdprompts/compaction/branch-summary-context.md
Pipeline di compattazione
Sezione intitolata “Pipeline di compattazione”Attivazioni
Sezione intitolata “Attivazioni”La compattazione può essere eseguita in tre modi:
- Manuale:
/compact [istruzioni]chiamaAgentSession.compact(...). - Recupero automatico da overflow: dopo un errore dell’assistente che corrisponde a un overflow del contesto.
- Compattazione automatica a soglia: dopo un turno riuscito quando il contesto supera la soglia.
Forma della compattazione (visuale)
Sezione intitolata “Forma della compattazione (visuale)”Before compaction:
entry: 0 1 2 3 4 5 6 7 8 9 ┌─────┬─────┬─────┬──────┬─────┬─────┬──────┬──────┬─────┬──────┐ │ hdr │ usr │ ass │ tool │ usr │ ass │ tool │ tool │ ass │ tool │ └─────┴─────┴─────┴──────┴─────┴─────┴──────┴──────┴─────┴──────┘ └────────┬───────┘ └──────────────┬──────────────┘ messagesToSummarize kept messages ↑ firstKeptEntryId (entry 4)
After compaction (new entry appended):
entry: 0 1 2 3 4 5 6 7 8 9 10 ┌─────┬─────┬─────┬──────┬─────┬─────┬──────┬──────┬─────┬──────┬─────┐ │ hdr │ usr │ ass │ tool │ usr │ ass │ tool │ tool │ ass │ tool │ cmp │ └─────┴─────┴─────┴──────┴─────┴─────┴──────┴──────┴─────┴──────┴─────┘ └──────────┬──────┘ └──────────────────────┬───────────────────┘ not sent to LLM sent to LLM ↑ starts from firstKeptEntryId
What the LLM sees:
┌────────┬─────────┬─────┬─────┬──────┬──────┬─────┬──────┐ │ system │ summary │ usr │ ass │ tool │ tool │ ass │ tool │ └────────┴─────────┴─────┴─────┴──────┴──────┴─────┴──────┘ ↑ ↑ └─────────────────┬────────────────┘ prompt from cmp messages from firstKeptEntryIdCompattazione da overflow-retry vs compattazione a soglia
Sezione intitolata “Compattazione da overflow-retry vs compattazione a soglia”I due percorsi automatici sono intenzionalmente diversi:
-
Compattazione da overflow-retry
- Attivazione: l’errore dell’assistente del modello corrente viene rilevato come overflow del contesto.
- Il messaggio di errore dell’assistente fallito viene rimosso dallo stato attivo dell’agente prima del retry.
- La compattazione automatica viene eseguita con
reason: "overflow"ewillRetry: true. - In caso di successo, l’agente prosegue automaticamente (
agent.continue()) dopo la compattazione.
-
Compattazione a soglia
- Attivazione:
contextTokens > contextWindow - compaction.reserveTokens. - Viene eseguita con
reason: "threshold"ewillRetry: false. - In caso di successo, se
compaction.autoContinue !== false, inietta un prompt sintetico:"Continue if you have next steps."
- Attivazione:
Potatura pre-compattazione
Sezione intitolata “Potatura pre-compattazione”Prima dei controlli di compattazione, può essere eseguita la potatura dei risultati degli strumenti (pruneToolOutputs).
Politica di potatura predefinita:
- Proteggere i più recenti
40_000token di output degli strumenti. - Richiedere almeno
20_000token di risparmio stimato totale. - Non potare mai i risultati degli strumenti da
skilloread.
I risultati degli strumenti potati vengono sostituiti con:
[Output truncated - N tokens]
Se la potatura modifica le voci, lo storage della sessione viene riscritto e lo stato dei messaggi dell’agente viene aggiornato prima delle decisioni di compattazione.
Logica del confine e del punto di taglio
Sezione intitolata “Logica del confine e del punto di taglio”prepareCompaction() considera solo le voci successive all’ultima voce di compattazione (se presente).
- Trova l’indice della compattazione precedente.
- Calcola
boundaryStart = prevCompactionIndex + 1. - Adatta
keepRecentTokensusando il rapporto di utilizzo misurato quando disponibile. - Esegue
findCutPoint()sulla finestra di confine.
I punti di taglio validi includono:
- voci messaggio con ruoli:
user,assistant,bashExecution,hookMessage,branchSummary,compactionSummary - voci
custom_message - voci
branch_summary
Regola ferrea: non tagliare mai su toolResult.
Se ci sono voci di metadati non-messaggio immediatamente prima del punto di taglio (model_change, thinking_level_change, etichette, ecc.), queste vengono spostate nella regione mantenuta arretrando l’indice di taglio fino a raggiungere un messaggio o un confine di compattazione.
Gestione dei turni divisi
Sezione intitolata “Gestione dei turni divisi”Se il punto di taglio non si trova all’inizio di un turno utente, la compattazione lo tratta come un turno diviso.
Il rilevamento dell’inizio del turno considera questi come confini di turno utente:
message.role === "user"message.role === "bashExecution"- voce
custom_message - voce
branch_summary
La compattazione di un turno diviso genera due riepiloghi:
- Riepilogo della cronologia (
messagesToSummarize) - Riepilogo del prefisso del turno (
turnPrefixMessages)
Il riepilogo finale memorizzato viene unito come:
<history summary>
---
**Turn Context (split turn):**
<turn prefix summary>Generazione del riepilogo
Sezione intitolata “Generazione del riepilogo”compact(...) costruisce i riepiloghi dal testo serializzato della conversazione:
- Converte i messaggi tramite
convertToLlm(). - Serializza con
serializeConversation(). - Racchiude in
<conversation>...</conversation>. - Include opzionalmente
<previous-summary>...</previous-summary>. - Inietta opzionalmente il contesto dell’hook come lista
<additional-context>. - Esegue il prompt di riepilogazione con
SUMMARIZATION_SYSTEM_PROMPT.
Selezione del prompt:
- prima compattazione:
compaction-summary.md - compattazione iterativa con riepilogo precedente:
compaction-update-summary.md - secondo passaggio del turno diviso:
compaction-turn-prefix.md - riepilogo breve per l’interfaccia:
compaction-short-summary.md
Modalità di riepilogazione remota:
- Se
compaction.remoteEndpointè impostato, la compattazione invia una richiesta POST con:{ systemPrompt, prompt }
- Si aspetta un JSON contenente almeno
{ summary }.
Contesto delle operazioni sui file nei riepiloghi
Sezione intitolata “Contesto delle operazioni sui file nei riepiloghi”La compattazione traccia l’attività cumulativa sui file utilizzando le chiamate agli strumenti dell’assistente:
read(path)→ insieme dei file lettiwrite(path)→ insieme dei file modificatiedit(path)→ insieme dei file modificati
Comportamento cumulativo:
- Include i dettagli della compattazione precedente solo quando la voce precedente è generata internamente (
fromExtension !== true). - Nei turni divisi, include anche le operazioni sui file del prefisso del turno.
readFilesesclude i file che sono stati anche modificati.
Al testo del riepilogo vengono aggiunti i tag delle operazioni sui file tramite il template del prompt:
<read-files>...</read-files><modified-files>...</modified-files>Persistenza e ricaricamento
Sezione intitolata “Persistenza e ricaricamento”Dopo la generazione del riepilogo (o il riepilogo fornito dall’hook), la sessione dell’agente:
- Aggiunge una
CompactionEntryconappendCompaction(...). - Ricostruisce il contesto tramite
buildSessionContext(). - Sostituisce i messaggi live dell’agente con il contesto ricostruito.
- Emette l’evento hook
session_compact.
Pipeline di riepilogazione dei rami
Sezione intitolata “Pipeline di riepilogazione dei rami”La riepilogazione dei rami è legata alla navigazione dell’albero, non all’overflow dei token.
Attivazione
Sezione intitolata “Attivazione”Durante navigateTree(...):
- Calcola le voci abbandonate dalla vecchia foglia all’antenato comune usando
collectEntriesForBranchSummary(...). - Se il chiamante ha richiesto il riepilogo (
options.summarize), genera il riepilogo prima di cambiare foglia. - Se il riepilogo esiste, lo allega al target della navigazione usando
branchWithSummary(...).
Operativamente questo è comunemente guidato dal flusso /tree quando branchSummary.enabled è abilitato.
Forma del cambio di ramo (visuale)
Sezione intitolata “Forma del cambio di ramo (visuale)”Tree before navigation:
┌─ B ─ C ─ D (old leaf, being abandoned) A ───┤ └─ E ─ F (target)
Common ancestor: AEntries to summarize: B, C, D
After navigation with summary:
┌─ B ─ C ─ D ─ [summary of B,C,D] A ───┤ └─ E ─ F (new leaf)Preparazione e budget di token
Sezione intitolata “Preparazione e budget di token”generateBranchSummary(...) calcola il budget come:
tokenBudget = model.contextWindow - branchSummary.reserveTokens
prepareBranchEntries(...) quindi:
- Primo passaggio: raccoglie le operazioni sui file cumulative da tutte le voci riepilogate, inclusi i dettagli dei
branch_summaryprecedenti generati internamente. - Secondo passaggio: percorre dalla più recente alla più vecchia, aggiungendo messaggi fino al raggiungimento del budget di token.
- Preferisce preservare il contesto recente.
- Può comunque includere voci di riepilogo di grandi dimensioni vicine al limite del budget per continuità.
Le voci di compattazione vengono incluse come messaggi (compactionSummary) durante l’input della riepilogazione dei rami.
Generazione del riepilogo e persistenza
Sezione intitolata “Generazione del riepilogo e persistenza”La riepilogazione dei rami:
- Converte e serializza i messaggi selezionati.
- Racchiude in
<conversation>. - Utilizza istruzioni personalizzate se fornite, altrimenti
branch-summary.md. - Chiama il modello di riepilogazione con
SUMMARIZATION_SYSTEM_PROMPT. - Antepone
branch-summary-preamble.md. - Aggiunge i tag delle operazioni sui file.
Il risultato viene memorizzato come BranchSummaryEntry con dettagli opzionali (readFiles, modifiedFiles).
Punti di contatto per estensioni e hook
Sezione intitolata “Punti di contatto per estensioni e hook”session_before_compact
Sezione intitolata “session_before_compact”Hook pre-compattazione.
Può:
- annullare la compattazione (
{ cancel: true }) - fornire un payload di compattazione personalizzato completo (
{ compaction: CompactionResult })
session.compacting
Sezione intitolata “session.compacting”Hook di personalizzazione del prompt/contesto per la compattazione predefinita.
Può restituire:
prompt(sovrascrive il prompt di riepilogo base)context(righe di contesto aggiuntive iniettate in<additional-context>)preserveData(memorizzato nella voce di compattazione)
session_compact
Sezione intitolata “session_compact”Notifica post-compattazione con la compactionEntry salvata e il flag fromExtension.
session_before_tree
Sezione intitolata “session_before_tree”Viene eseguito durante la navigazione dell’albero prima della generazione predefinita del riepilogo del ramo.
Può:
- annullare la navigazione
- fornire un
{ summary: { summary, details } }personalizzato utilizzato quando l’utente ha richiesto la riepilogazione
session_tree
Sezione intitolata “session_tree”Evento post-navigazione che espone la foglia nuova/vecchia e la voce di riepilogo opzionale.
Comportamento a runtime e semantica dei fallimenti
Sezione intitolata “Comportamento a runtime e semantica dei fallimenti”- La compattazione manuale interrompe prima l’operazione corrente dell’agente.
abortCompaction()annulla i controller sia della compattazione manuale che automatica.- La compattazione automatica emette eventi di sessione start/end per aggiornamenti dell’interfaccia/stato.
- La compattazione automatica può provare più modelli candidati e riprovare in caso di fallimenti transitori.
- Gli errori di overflow sono esclusi dal percorso di retry generico perché vengono gestiti dalla compattazione.
- Se la compattazione automatica fallisce:
- il percorso overflow emette
Context overflow recovery failed: ... - il percorso a soglia emette
Auto-compaction failed: ...
- il percorso overflow emette
- La riepilogazione dei rami può essere annullata tramite segnale di abort (ad es. Escape), restituendo un risultato di navigazione cancellata/interrotta.
Impostazioni e valori predefiniti
Sezione intitolata “Impostazioni e valori predefiniti”Da settings-schema.ts:
compaction.enabled=truecompaction.reserveTokens=16384compaction.keepRecentTokens=20000compaction.autoContinue=truecompaction.remoteEndpoint=undefinedbranchSummary.enabled=falsebranchSummary.reserveTokens=16384
Questi valori vengono consumati a runtime da AgentSession e dai moduli di compattazione/riepilogazione dei rami.