Hacker News Best

Claude Code regularly sends each background agent’s transcript to its model

8.5内容质量

TL;DR · AI 摘要

Claude Code 每30秒向模型发送代理状态信息消耗15-20%算力,通过Bun预加载脚本可永久禁用此功能。

核心要点

  • 使用no-agent-summary.js脚本可减少15-20%的token消耗
  • 定时器钩子技术通过修改Bun预加载模块实现无侵入式修复
  • OpenTelemetry数据显示agent_summary占总消耗的16.4%

结构提纲

按章节快速跳转。

  1. 通过OpenTelemetry数据发现agent_summary消耗异常算力

  2. 16.4%的总消耗来自agent_summary请求,输入输出比达9000:1

  3. 使用Bun预加载脚本拦截定时器实现无侵入式修复

  4. 通过MIT License开源脚本和四组独立测量数据验证效果

  5. 需设置BUN_OPTIONS全局变量实现永久生效

思维导图

用一张图看清主题之间的关系。

查看大纲文本(无障碍 / 无 JS 友好)
  • Claude Code资源优化
    • 问题定位
      • OpenTelemetry异常数据
      • 16.4%资源消耗
    • 解决方案
      • Bun预加载脚本
      • 定时器钩子技术
    • 验证方法
      • MIT License开源
      • 四组独立测量

金句 / Highlights

值得收藏与分享的关键句。

#Claude Code#Bun#OpenTelemetry#资源优化#AI工具
打开原文

Claude Code 在 3 字状态行上消耗掉约 15-20% 的令牌:一个关闭 agent_summary 的 Bun 预加载模块 · Flamerix AI, flamerix.ai · MIT · GitHub

Claude Code 在 3 字状态行上消耗掉约 15–20% 的令牌。以下是关闭方法

by Flamerix AI · MIT 许可证

在 Linux 上测试过,适用于 Claude Code 2.1.257–2.1.312(见已测试版本)。二进制文件未修改(BUN_OPTIONS=--preload)。更新可能会静默地覆盖此设置,因此请参见验证部分。

TL;DR

code
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

要使所有 Claude Code 进程永久生效,请参见安装说明。

问题描述

大约每 30 秒,每个后台代理都会将整个对话记录发送给该代理自身的模型(通常是 Opus),并要求其用 3-5 个词描述最近的操作。这个回答只会更新代理面板中的状态行,永远不会到达模型或你的对话中。没有设置可以关闭此功能,自 2.1.232 版本(2026 年 8 月)以来该功能默认是开启的。

该异常通过 Claude Code 的 OpenTelemetry 导出被 DRIM 检测到:按 query_source 分组 claude_code.api_request 事件显示 agent_summary 的消耗量超过了主对话本身。

code
query_source = agent_summary

钩子设置前一周

钩子设置后两天

Claude Code 总消耗占比

16.4 %

(主对话:15.7 %)

0 %

所有 API 请求占比

19.7 %

,约 1/5

其中用于 Opus 的占比

96 %

—

输入令牌与输出令牌比例

≈ 9,000 : 1

此处的消耗指的是 Claude Code 的单次请求预估费用(cost_usd),而非发票金额:在订阅模式下,你失去的是速率限制的缓冲空间。我们并非唯一测量过该问题的人:#86879 收集了四个独立测量结果,显示消耗比例为 18–26%。

解决方案(工作原理)

no-agent-summary.js 是一个 Bun 预加载模块(约 80 行代码)。它包装了 setTimeout / setInterval;当回调的源代码包含摘要锚点(例如 [AgentSummary] Timer fired 日志行)时,它会返回一个无效的定时器句柄而非激活定时器。所有其他定时器都会正常通过。在 OpenTelemetry 导出中,被抑制的请求是 query_source = agent_summary 的 claude_code.api_request 事件。

为何使用定时器钩子而非更简单的方案:该模块以预编译的 Bun 字节码形式分发,因此修改二进制文件中的 JS 文本不会产生任何效果,且 API 客户端不会经过包装后的 globalThis.fetch。但即使从字节码运行,Function.prototype.toString 仍会返回回调的源代码,因此可以通过字符串识别定时器。无效定时器使用精确的 2³¹−1 毫秒:Node 和 Bun 会将更长的延迟视为 1 毫秒,因此“无限”延迟会立即触发。

  • 全局设置 BUN_OPTIONS 以确保每个 Claude Code 进程都能获取该配置。以下为不同 Shell 的配置方式:

~/.profile, ~/.bashrc, ~/.zshrc

export BUN_OPTIONS=" ${BUN_OPTIONS:+$BUN_OPTIONS } --preload /abs/path/no-agent-summary.js "

~/.config/fish/config.fish

set -gx BUN_OPTIONS " --preload /abs/path/no-agent-summary.js "

~/.config/environment.d/50-no-agent-summary.conf

(systemd 用户环境配置;同样适用于用户服务和定时器;在用户管理器下次启动时生效,通常是下次登录时) BUN_OPTIONS=--preload /abs/path/no-agent-summary.js

或者在 PATH 中早于 Claude 的包装器(保留大小写可确保多个 Claude Code 进程启动时幂等): #! /bin/sh HOOK=/abs/path/no-agent-summary.js case " ${BUN_OPTIONS-} " in

  • "--preload $HOOK" * ) ;;
  • ) export BUN_OPTIONS=" ${BUN_OPTIONS:+$BUN_OPTIONS } --preload $HOOK" ;;

esac : " ${CC_AGENT_SUMMARY_LOG:=${XDG_RUNTIME_DIR:-/tmp}/no-agent-summary.log} " export CC_AGENT_SUMMARY_LOG exec /path/to/the/real/claude "$@"

  • 重启守护进程和所有正在运行的会话,然后从已设置 BUN_OPTIONS 的环境中启动 Claude Code:

claude daemon stop --any

环境变量

| 变量 | 值 | 效果 | |------|----|------| | CC_AGENT_SUMMARY_MODE | off(默认)<br>pass | 禁用摘要计时器<br>加载并记录,但保留所有计时器<br>其他值会在 stderr 输出警告并按 off 处理 | | CC_AGENT_SUMMARY_LOG | 文件路径(可选) | 加载时追加<br>preload active mode=… bun=… hooked=…<br>每匹配到一个计时器(前20个)输出一行,以及退出次数 | | CC_AGENT_SUMMARY_MARKER | 被覆盖为<br>preload active …<br>这一行 |

细节

  • 安装后需重启守护进程:守护进程、pty 主机和预热的后台备用会话会继承启动守护进程的客户端环境,因此在设置 BUN_OPTIONS 之前启动的守护进程会持续生成未挂钩的会话。因此需要执行 claude daemon stop --any。
  • 无头运行同样需要:claude -p、cron、CI、编辑器集成。
  • 平台:已测试 Linux,macOS 和 Windows 未测试。在 Windows 上,/$bunfs/ 网关很可能不会安装钩子。
  • A/B 测试:CC_AGENT_SUMMARY_MODE=pass 会加载钩子但保留所有计时器;摘要会重新出现,这表明 off 模式是钩子的作用。
  • 后台进程:守护进程、pty 主机和后台备用进程的环境必须包含 --preload(Linux 上查看 /proc/<pid>/environ);如果没有,请重启守护进程。

验证(每次更新后)

  • 预加载生效:

BUN_OPTIONS=" --preload $HOME/.local/share/no-agent-summary.js " CC_AGENT_SUMMARY_LOG=/tmp/nas.log claude --version && cat /tmp/nas.log 预期输出:preload active mode=off … 如果没有该行,说明 BUN_OPTIONS 未传递到进程或路径不是绝对路径。

  • 计时器被抑制:使用相同的 BUN_OPTIONS 和 CC_AGENT_SUMMARY_LOG=/tmp/nas.log,运行一个后台子代理一两分钟。日志应显示摘要计时器 #1 被抑制(setTimeout, delay=30000),代理面板状态停止更新。如果导出 OpenTelemetry,query_source = agent_summary 应保持为零;这是唯一能检测所有故障模式的检查。

故障开放模式

匹配依据源文本:锚点必须位于传递给计时器的回调内部。如果更新破坏了这一点,钩子将无法匹配任何内容,摘要会静默恢复。可能原因包括:

  • 日志行或 query-source ID 被重命名;
  • 回调通过 fn.bind(...)(toString 中无源代码)或其他包装器传递;
  • 字符串被移动到回调外部的共享常量中;
  • 计时器被转移到未包装的 API(timers/promises,调度器循环)。

因此,每次更新后都需要重新运行 Verify。

效果

  • 我们在机器上的每个 Claude Code 进程(版本 2.1.301)中运行它。从那时起,agent_summary 请求数量为零,也没有其他侧边查询取而代之。
  • 子代理、后台代理、派生技能和后台会话正常运行;仅跳过摘要派生。
  • 可见变化:每个代理的面板状态停止更新;SDK 的 task_progress 没有摘要。
  • 开销:每个不同的计时器回调生成一个 Function.prototype.toString,缓存在 WeakMap 中。claude --version:约 10 毫秒 → 约 17 毫秒(一次测量)。

测试版本

Linux x64 二进制文件来自 npm @anthropic-ai/claude-code-linux-x64(其 sha256 等于原生安装程序的 manifest.json 校验和)。静态:提取的捆绑包摘要计时器回调携带钩子锚点。实时:claude -p --model haiku 启用 CLAUDE_CODE_AGENT_PROGRESS_SUMMARIES=1,一个子代理执行 8 步约 20 秒,计数 [AgentSummary] 在 --debug-file 中派生。

版本

发布时间

sha256

静态

摘要派生在 ~2.5 分钟代理运行中:无钩子 / 钩子

/ 钩子

备注

2.1.312

2026-10-27

code
4f4178ce41d8

OK

5 / 5 / 0

code
latest

2026-10-28;交互式:6 无钩子,0

2.1.310

2026-10-23

code
b73676430af1

2.1.308

2026-10-22

code
356733f185fa

5 / 6 / 0

code
stable

2026-10-28;该

运行的代理执行了 9 步而不是 8 步

2.1.301

2026-10-15

code
bc1aad9982c7

与早期钩子构建相同;交互式

也 0;自 2026-10-26 日常使用以来,0

code
agent_summary

遥测中的请求

2.1.280

2026-09-22

code
1e08503dbdf3

1 / 1 / 0(计时器触发 11 / 11 / 0)

交互式:

code
-p

此版本无法启用摘要。代理停留在权限提示,因此后续计时器跳过了未更改的转录本

2.1.257

2026-09-01

code
9a64bda9d872

与 2.1.280 相同

5 / 5 / 0 = 此版本上发生派生,仅加载钩子更改无效,关闭会移除它。

为什么没有相关设置

  • 文档中提到的开关仅用于启用功能。SDK 选项 agentProgressSummaries 默认为 false,但在捆绑包中它是 OR 表达式中的一个项,所有写入它的代码路径都设置为 true。因此,将 false 改为其他值不会产生任何变化,而未记录的 CLAUDE_CODE_AGENT_PROGRESS_SUMMARIES 也只能启用摘要。
  • 间隔属于服务器。它来自每个模型族的服务器标志,并被限制在 30–240 秒之间。默认值已经是最低值,没有值可以禁用计时器。
  • 明显的环境变量缺失。某些打包工具设置的 DISABLE_NON_ESSENTIAL_MODEL_CALLS 在二进制文件中根本不存在。CLAUDE_CODE_FORK_SUBAGENT=0 和 CLAUDE_CODE_DISABLE_BACKGROUND_TASKS=1 虽然可以停止它,但会同时停止派生子代理或后台代理。
  • 提示缓存使其成本降低不多。大约 98% 的这些调用会从缓存中重新读取转录本;约 2% 命中冷缓存的调用会带来其成本的三分之一。
  • 读取转录本的成本工具无法看到它。这些请求不会写入磁盘上的会话日志(#104358);只有 OpenTelemetry 导出显示它们。背景令牌使用情况的文档部分也没有列出它,而 Agent View 的行摘要被记录为 Haiku 类模型每隔几分钟刷新一次。
  • 已经存在一个更便宜的变体,但目前处于关闭状态。2.1.310版本引入了简略模式:笔记内容约为2000个标记,而非完整转录文本,且可选择由小型模型生成。默认仍为完整转录文本,仅服务器标志位可更改此设置。

时间线(2026)

版本(发布日期)

变更内容

2.1.32(2月5日)

代码首次出现;在公开构建中已失效

2.1.72(3月9日)

作为SDK可选加入功能上线

2.1.117(4月21日)

通过分支门禁或服务器部署,在交互式CLI中可访问

≤ 2.1.220(7月24日)

分支技能始终以摘要形式呈现

2.1.232(8月13日)

对交互式后台代理默认启用

2.1.300(10月14日)

间隔时间变为服务器可调节参数,范围30–240秒

2.1.310(10月23日)

code
short

模式上线,初始状态为关闭

根据我们的遥测数据,该功能的使用成本占比从7月(分支门禁对我们已开放)的3.5–7%上升至启用2.1.233版本当周的7.3%,随后升至11.8%,到10月中旬已达到约16%。

许可证与免责声明

MIT © 2026 Flamerix AI。按原样提供,不提供任何形式的保证;您使用该软件需自行承担风险。Flamerix AI不对因使用该软件导致的任何损害、数据丢失或账号操作负责。修改客户端运行时行为可能与您使用的服务条款产生冲突;确认兼容性由您自行负责。

"Claude"和"Claude Code"是Anthropic, PBC的商标。本项目独立开发,与Anthropic无任何关联、赞助或官方支持关系。