fix: summarize context window preemptively before dispatch
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 35/100
- Tipo de issue
- Error
- Claridad
- Bastante claro
- Estado de actividad
- Activo
- Stack tecnológico
- javascript, nodejs
Línea de trabajo
Start with the trigger derivation in src/agent/deepAgents.js around lines 458-472, then read createSummarizationMiddlewareFromConfig in src/provider/summarizationMiddleware.js and estimateCost in src/provider/tokenBudgetMiddleware.js (lines 69-80) to see how input and output budgets are counted. Done means a test in tests/unit/provider/summarizationMiddleware.test.js shows a request whose input plus maxTokens exceeds the window being compacted before dispatch. Expect to work through the deepagents library's trigger logic, which needs more context than the issue gives.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Summary
The summarization middleware does not compact the context window preemptively. In long-running sessions it fails to compress before the model's context window is exceeded, causing repeated 400 context-window errors.
Environment
- OS: Linux 7.0.14-19-pve
- Node.js: v25.8.1
- madz version: 1.113.1
- LLM provider: OpenAI gpt-4o
Reproduction
Steps to reproduce the behavior:
- Start a long-running madz session with a large system prompt and many registered tools.
- Continue the conversation until the input approaches the model's context window.
- Observe the model return 400 context-window errors instead of the middleware compacting preemptively.
Expected Behavior
The summarization middleware should estimate the current context window usage (input + expected output) before dispatching, and compact the conversation when the total would exceed the model's context window — the same way the token-budget middleware estimates cost before sending.
Actual Behavior
The middleware only fires when the input token count (estimated via countTokensApproximately, chars/4) exceeds a fixed trigger (80% of context length). It does not account for expected output tokens, so a long response can push input + output over the window, causing 400 context-window errors that are handled reactively (compact + re-send) rather than preemptively.
Additional Context
The trigger is derived at init as Math.floor(contextLength * 0.8). For gpt-4o (128000), that is 102400. The trigger uses countTokensApproximately (chars/4), which differs from the real tokenizer used by the token-budget middleware (model.getNumTokensFromMessages). The token-budget middleware already estimates cost as input + output budget and reserves against a rolling window — the summarization middleware should apply the same preemptive estimate against the context window.
Audit Findings (for Issue #1399)
- src/agent/deepAgents.js:458 — The summarization trigger is derived at init as
Math.floor(contextLength * 0.8). For gpt-4o (128000) that is 102400. This is a fixed fraction of the context window with no output-token allowance. - src/agent/deepAgents.js:463 — The derived trigger is written to
config.summarization.triggeras{ type: "tokens", value: triggerTokens }, then passed tocreateSummarizationMiddlewareFromConfig. - src/agent/deepAgents.js:472 —
createSummarizationMiddlewareFromConfigbuilds the deepagentsSummarizationMiddleware, which fires only when the input token count exceeds the trigger. It does not account for expected output tokens. - src/provider/tokenBudgetMiddleware.js:69-80 — The token-budget middleware already estimates cost preemptively:
inputTokens(viamodel.getNumTokensFromMessages) +toolTokens+outputBudget(fromoptions.maxTokens). This is the pattern the summarization middleware should mirror. - src/provider/summarizationMiddleware.js:44-60 —
createSummarizationMiddlewareFromConfigpasses onlytriggerandkeeptocreateSummarizationMiddleware. The deepagents library computes the trigger fromcountTokensApproximately(chars/4), which diverges from the real tokenizer used by the token-budget middleware. - node_modules/deepagents/dist/langsmith--RbtjNdQ.js:3602 —
shouldSummarize()comparesadjustedTokensagainst the trigger.adjustedTokenscomes fromcountTotalTokens→countTokensApproximately, which is a character-based approximation, not the model tokenizer.
Fix Steps
- Add a preemptive context-window check — In
src/provider/summarizationMiddleware.js, before dispatching, estimate the total cost (input + expected output) using the model tokenizer, mirroringestimateCost()insrc/provider/tokenBudgetMiddleware.js:69. - Account for expected output — Add the configured
maxTokens(output budget) to the estimate so a long response is accounted for, not just the input. - Compact when total exceeds the window — When
input + output > contextWindow, trigger summarization (or the existing compaction path) before the request is sent, rather than waiting for a 400. - Use the real tokenizer — Prefer
model.getNumTokensFromMessagesovercountTokensApproximatelyfor the trigger estimate, so the threshold matches the model's actual tokenization. - Add a test — Add
tests/unit/provider/summarizationMiddleware.test.jscoverage for the preemptive path: a request whose input + output would exceed the window compacts before dispatch. - Verify — Run
npm run test,npm run lint, andnpm run coverageto confirm no regressions.
- Lenguaje dominante
- JavaScript
- Estrellas
- 2
- Forks
- 0
- Merge medio
- 1 h 34 min
- PR fusionados (30 d)
- 231
Preparar el entorno
- Incluye un Dockerfile o un archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de avoidwork/madz
-
fix: show file picker empty message below the input linePosiblemente ocupada @avoidwork la tomó hoy. Abiertoapproved bug in progress
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
avoidwork/madz#1412 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
feature
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
Los mantenedores suelen responder en 1 día
Todos los issues de avoidwork/madz
Issues similares
-
Four problem loader browser tests fail on WindowsPosiblemente ocupada @Patriciaath999 la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
Los mantenedores suelen responder en 1 día
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
juice-shop/juice-shop#3686 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 72/100
TheOdinProject/curriculum#31465 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 88/100
TurboDocx/html-to-docx#254 ·
-
enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día