Claude Code envía en segundo plano una petición llamada agent_summary que, según la telemetría de un desarrollador independiente, se llevó el 16,4 por ciento de todo el gasto en tokens y casi 1 de cada 5 peticiones a la API, solo para actualizar una línea de estado de tres a cinco palabras por cada agente en segundo plano. Cada ~30 segundos, por cada agente activo, Claude Code reenvía la transcripción completa de ese agente a su propio modelo (normalmente Opus) y le pide que describa su última acción. Puedes medirlo en tu propia máquina con OpenTelemetry, y un script de precarga para Bun con licencia MIT, no-agent-summary.js, lo desactiva.
Fuente: README y script de no-agent-summary.js en GitHub Gist
yoDEV Tested · 29 de octubre de 2026
Probamosno-agent-summary.jscon Claude Code 2.1.312 en macOS 27.0.1 (Apple Silicon), una plataforma que su autor no ha probado, revisamos los binarios Linux x64 de 2.1.312 y 2.1.308 en un sandbox y reprodujimos dos fallos de instalación en Bun 1.4.4. Los resultados que reportamos como nuestros salen de esa prueba.
¿Qué es Claude Code y qué son los agentes en segundo plano?
Claude Code es el agente de programación de Anthropic que trabaja desde la terminal: lee tu repositorio, ejecuta comandos y edita archivos. Puede delegar trabajo en subagentes y dejar algunos corriendo en segundo plano (background agents) mientras tú sigues con otra cosa. El panel de agentes muestra, junto a cada uno, una línea corta que resume qué está haciendo. Esa línea es la que cuesta.
¿Qué es agent_summary en Claude Code?
agent_summary es el query_source que Claude Code asigna a la petición que escribe ese texto de estado junto a cada agente en segundo plano. La respuesta nunca llega al modelo ni a tu conversación: solo actualiza esa etiqueta.
Según el autor del script, Flamerix AI:
- Está activado por defecto para los agentes en segundo plano en modo interactivo desde la 2.1.232 (agosto de 2026).
- El intervalo viene de un flag del servidor, limitado a entre 30 y 240 segundos, y el valor por defecto ya es el mínimo de 30.
- No hay ningún ajuste para apagarlo. La opción del SDK
agentProgressSummariespuede encenderlo pero no apagarlo, y la variable no documentadaCLAUDE_CODE_AGENT_PROGRESS_SUMMARIEStambién solo sirve para activarlo. - En la 2.1.310 llegó un modo “short” más barato, unos 2.000 tokens de notas en lugar de la transcripción entera, pero viene apagado y solo los flags del servidor pueden cambiarlo.
Todo esto es la lectura que hace el autor del código empaquetado, no documentación de Anthropic.
¿Cuánto suma agent_summary al precio de Claude Code?
En una semana de uso del autor, agent_summary costó más que la conversación principal. Las cifras son autorreportadas, salen de su propia exportación de OpenTelemetry y no publicó los datos en bruto:
query_source = agent_summary |
Semana antes del hook | 2 días después |
|---|---|---|
| Parte del gasto de Claude Code | 16,4% (conversación principal: 15,7%) | 0% |
| Parte de las peticiones a la API | 19,7% | 0% |
| De ese gasto, en Opus | 96% | — |
| Tokens de entrada por token de salida | ≈ 9.000 : 1 | — |
“Gasto” aquí es la estimación que hace el propio Claude Code por petición (cost_usd), no una factura. Si usas un plan de suscripción, lo que pierdes es margen frente a los límites de uso.
El autor no es el único. El issue #86879 es una petición abierta para tener una forma oficial de desactivar el temporizador, y reúne mediciones de entre el 18 y el 26 por ciento en sesiones distintas, incluida una donde agent_summary fue el 22,7 por ciento de las peticiones. El coste crece con cuántos agentes en segundo plano tienes y durante cuánto tiempo, no con el trabajo útil, porque cada ciclo reenvía el contexto actual del agente. Un comentarista en la 2.1.276 calculó que un agente con ~380.000 tokens de contexto paga unos 45 millones de tokens leídos de caché por hora solo por su línea de estado.
La caché de prompts lo suaviza, pero no lo elimina: según el autor, casi todas estas llamadas aciertan en la caché, y la pequeña fracción que falla carga con más de un tercio del coste.
Al momento de publicar esta nota, el 29 de octubre de 2026, ninguno de los dos issues tenía respuesta de Anthropic, y Anthropic no había confirmado públicamente este comportamiento.
¿Por qué Claude Code consume tokens en segundo plano sin que lo veas?
Porque estas peticiones no se escriben en las transcripciones de sesión que se guardan en disco. El issue #104358 documenta que las peticiones de fondo (agent_summary, compact, las llamadas del clasificador de auto_mode y otras) se cobran pero no dejan ninguna fila en esos archivos, así que cualquier herramienta que sume transcripciones se queda corta. Quien lo reportó encontró totales entre 1,35 y 2,13 veces por debajo del estado de costes del propio Claude Code, en 14 sesiones con muchos subagentes.
La exportación de OpenTelemetry es el único lugar donde aparecen.
¿Cómo ver el consumo de tokens en Claude Code por tipo de petición?
Activa la exportación de logs de OpenTelemetry de Claude Code y agrupa los eventos claude_code.api_request por query_source. Según la documentación oficial de Monitoring, el valor detallado de query_source (como repl_main_thread, compact o el nombre de un subagente) vive en el evento api_request. Las métricas claude_code.cost.usage y claude_code.token.usage solo llevan una categoría gruesa (main, subagent o auxiliary), así que con métricas solas no puedes aislar agent_summary.
La configuración mínima, según la documentación:
export CLAUDE_CODE_ENABLE_TELEMETRY=1
export OTEL_LOGS_EXPORTER=otlp
export OTEL_EXPORTER_OTLP_PROTOCOL=grpc
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
claude
Apunta el endpoint al colector OTLP que ya uses y suma cost_usd (o los atributos de tokens) por query_source. Si no llega nada, la documentación recomienda arrancar Claude Code con claude --debug-file <ruta> y buscar errores [3P telemetry] en ese log.
Una comprobación rápida sin colector: el método del propio autor cuenta las líneas [AgentSummary] Forking de un log de --debug-file mientras corre un subagente en segundo plano. Si esa línea aparece cada ~30 segundos por agente, estás pagando por ella.
Si también usas Codex, tenemos la guía equivalente: Cómo ver el consumo de tokens en Codex CLI.
¿Cómo desactivar agent_summary en Claude Code?
Con no-agent-summary.js, una precarga para Bun de unas 80 líneas. El binario nativo de Claude Code es un programa de Bun compilado, y Bun lee opciones extra de la variable de entorno BUN_OPTIONS, así que el script se carga antes que Claude Code sin modificar el binario.
El script envuelve setTimeout y setInterval. Cuando el código del callback de un temporizador contiene una de sus dos anclas, la línea de log [AgentSummary] Timer fired o el id agent_summary, devuelve un temporizador inerte en lugar de armarlo. Todos los demás temporizadores pasan sin cambios.
⚠️ Dos reglas que el README no dice. Escribe
--preload=/ruta, no--preload /ruta: con un espacio, ponerBUN_OPTIONSde forma global rompe todos los subcomandos debun. Y guarda el hook en una ruta sin espacios, porqueBUN_OPTIONSno puede llevarlos, la entrecomilles como la entrecomilles. Reprodujimos los dos fallos (ver “¿Qué se rompe al instalarlo?”, más abajo). Todos los comandos de aquí usan la forma con=y la ubicación que propone el README,~/.local/share/.
Para una sola sesión (adaptado del resumen del README):
curl -fsSL https://gist.githubusercontent.com/flamerix-ai/c3905705cc4205e5de3011fa2e74efce/raw/no-agent-summary.js -o ~/.local/share/no-agent-summary.js
claude daemon stop --any
BUN_OPTIONS="${BUN_OPTIONS:+$BUN_OPTIONS }--preload=$HOME/.local/share/no-agent-summary.js" claude
De forma permanente, añade esto a ~/.profile, ~/.bashrc o ~/.zshrc, con la ruta absoluta:
export BUN_OPTIONS="${BUN_OPTIONS:+$BUN_OPTIONS }--preload=/ruta/absoluta/no-agent-summary.js"
Después reinicia el daemon para que los procesos en segundo plano lo tomen:
claude daemon stop --any
Ese reinicio importa. El daemon, el pty host y las sesiones bg-spare precalentadas heredan el entorno de lo que arrancó el daemon, así que un daemon iniciado antes de definir BUN_OPTIONS sigue creando sesiones sin el hook. Las ejecuciones sin interfaz (claude -p, cron, CI, integraciones con editores) también necesitan la variable.
Qué cambia: la línea de estado de cada agente en el panel deja de actualizarse. Los subagentes, los agentes en segundo plano, los skills bifurcados y las sesiones en segundo plano siguen funcionando con normalidad.
¿Se puede sin parche?
En parte. El README indica que CLAUDE_CODE_FORK_SUBAGENT=0 y CLAUDE_CODE_DISABLE_BACKGROUND_TASKS=1 también detienen los resúmenes, pero solo porque apagan por completo los subagentes bifurcados o los agentes en segundo plano. La variable que se suele sugerir, DISABLE_NON_ESSENTIAL_MODEL_CALLS, ni siquiera existe en el binario: la buscamos en las dos versiones que probamos y no aparece ni una vez.
¿Qué se rompe al instalarlo?
Hay tres maneras distintas de que salga mal. Las dos primeras las reprodujimos nosotros.
1. Un BUN_OPTIONS global con espacio rompe Bun
Un comentario en el gist reportó que BUN_OPTIONS="--preload /ruta" hace fallar bun install, add, test, build y x con Script not found "install" (y similares) en Bun 1.4.3. La causa es el analizador de argumentos de Bun: cualquier flag con valor colocado antes del subcomando lo provoca; bun --define x:1 install falla igual.
Lo reprodujimos en Bun 1.4.4:
BUN_OPTIONS |
bun install |
bun test |
bun build |
bun x |
|---|---|---|---|---|
--preload /ruta |
Script not found "install" |
|||
--preload=/ruta |
||||
| sin definir |
Con --preload=/ruta, el hook sigue cargando en Claude Code 2.1.312 y 2.1.308. El arreglo no cuesta nada del lado de Claude Code. En macOS vimos lo mismo con el Bun independiente 1.3.13.
El mismo comentarista también restringió la comprobación de instalación del script para que solo actúe dentro del binario de Claude Code, y así otros binarios de Bun compilados en la máquina no vean sus temporizadores envueltos. Tal como está publicado, el script solo verifica que corre dentro de algún binario de Bun compilado. Esa modificación no la probamos.
2. Un espacio en la ruta del hook impide que Claude Code arranque
Bun separa BUN_OPTIONS por espacios, así que una ruta como ~/mis pruebas/no-agent-summary.js se parte en dos. Nos pasó en nuestra primera prueba en macOS, desde una carpeta cuyo nombre tenía un espacio. Bun leyó la segunda mitad como un flag suelto (error: Invalid Argument '-s'), y todos los comandos que definían BUN_OPTIONS, claude incluido, imprimieron la ayuda de Bun y terminaron.
Entrecomillar no sirve. En el sandbox probamos la ruta tal cual, entre comillas dobles, entre comillas simples y con los espacios escapados con barra invertida. Las cuatro fallaron con preload not found, con la ruta cortada en el primer espacio. El archivo del hook tiene que estar en una ruta sin espacios.
Al menos este fallo es visible: Claude Code se niega a arrancar, en lugar de correr sin el hook.
3. Cualquier actualización de Claude Code puede deshacerlo en silencio
El hook reconoce el temporizador del resumen por texto dentro de su callback. Si una actualización renombra la línea de log o el id, saca esos textos fuera del callback, pasa el callback por .bind() o mueve el temporizador a una API que el script no envuelve, el hook no detecta nada y los resúmenes vuelven sin avisar. El autor lo llama “fail-open”.
Por eso conviene volver a verificarlo después de cada actualización:
BUN_OPTIONS="--preload=$HOME/.local/share/no-agent-summary.js" CC_AGENT_SUMMARY_LOG=/tmp/nas.log claude --version && cat /tmp/nas.log
Deberías ver preload active mode=off …. Después, con las mismas variables, deja correr un subagente en segundo plano un minuto o dos: el log debería mostrar summary timer #1 suppressed. Si exportas OpenTelemetry, que query_source = agent_summary se mantenga en cero es la única comprobación que detecta todos los modos de fallo.
Para una prueba A/B, CC_AGENT_SUMMARY_MODE=pass carga el hook pero deja armados todos los temporizadores. Los resúmenes vuelven, lo que demuestra que es el modo off el que los elimina.
Ten en cuenta también:
- Plataforma: el autor solo lo probó en Linux. Nuestra prueba, más abajo, muestra que funciona en macOS (Apple Silicon) con la 2.1.312. En Windows, según el autor, lo más probable es que el hook nunca se instale.
- Términos de servicio: el README advierte que cambiar el comportamiento de un cliente en ejecución puede entrar en conflicto con los términos del servicio con el que lo usas, y deja esa comprobación en tus manos.
¿Qué probamos en yoDEV?
Hicimos dos pruebas el 29 de octubre de 2026.
En macOS: ¿el hook realmente detiene agent_summary?
Entorno: Claude Code 2.1.312, el binario nativo arm64 con Bun 1.4.4 integrado, en macOS 27.0.1 sobre Apple Silicon. El hook se descargó desde la URL del propio README; su sha256 es dc6699da…59f7.
Seguimos el método del autor: tres sesiones sin interfaz (claude -p --model haiku, con los resúmenes forzados mediante CLAUDE_CODE_AGENT_PROGRESS_SUMMARIES=1). En cada una, un subagente ejecutó ocho pasos de 20 segundos, y contamos las líneas [AgentSummary] Forking en el log de --debug-file.
| Ejecución | Disparos del temporizador | Bifurcaciones de resumen | Duración | Tarea completada |
|---|---|---|---|---|
| Sin hook | 5 | 5 | 181 s | |
Hook en modo pass (control) |
5 | 5 | 220 s | |
Hook en modo off
|
0 | 0 | 212 s |
El resultado coincide con el del autor en Linux para la 2.1.312: la bifurcación ocurre, cargar el hook por sí solo no cambia nada, y el modo off la elimina. El subagente completó los ocho pasos en todas las ejecuciones.
El log del hook en modo off muestra el mecanismo: un temporizador suprimido, unos 26 segundos después de empezar. Un temporizador suprimido nunca se dispara, así que nunca se vuelve a armar, y el log de depuración no muestra ninguna línea Timer fired ni Forking.
El log sin hook también muestra qué se paga en cada una de esas llamadas. Cada bifurcación reenvió el contexto completo del subagente (23 mensajes en el primer ciclo) para producir un resumen como “Running sleep 20, call 1 of 8”.
En un sandbox Linux x64: ¿encaja con las versiones actuales?
Con el paquete de npm @anthropic-ai/claude-code-linux-x64:
| Comprobación | 2.1.312 (latest) | 2.1.308 (stable) |
|---|---|---|
| El prefijo sha256 coincide con la tabla del README | 4f4178ce41d8 |
356733f185fa |
| Anclas del hook presentes en el binario | ||
| La precarga carga y envuelve los temporizadores | ||
Existe claude daemon stop --any
|
||
DISABLE_NON_ESSENTIAL_MODEL_CALLS en el binario |
0 apariciones | 0 apariciones |
Lo que no medimos: la parte del gasto. Nuestras ejecuciones demuestran que la llamada desaparece, pero no verifican la cifra del 16,4 por ciento del autor, que depende de cuántos agentes en segundo plano uses y durante cuánto tiempo. Por eso la sección de medición va primero.
¿Vale la pena instalarlo?
Si dejas agentes en segundo plano corriendo durante mucho tiempo, sobre todo sin supervisión o en CI, donde nadie mira la línea de estado, mide primero. Si agent_summary aparece como una parte grande de tus eventos api_request, el hook es un script pequeño y legible, con un interruptor de control (modo pass) y una forma clara de verificarlo. Instálalo con --preload= en una ruta sin espacios, reinicia el daemon y vuelve a comprobarlo después de cada actualización de Claude Code.
Si trabajas sobre todo en una sola sesión en primer plano, sin agentes en segundo plano, puede que no estés pagando nada de esto, y eso es justo lo que la medición te va a decir.
Si quieres entender mejor qué estás pagando en cada petición, empieza por qué son los tokens en la IA y por qué te cobran por ellos.
¿Y tú? ¿Qué parte de tu consumo de tokens en Claude Code te sorprendió más cuando lo mediste?
Top comments (0)