如果您正在 Claude Code 中使用后台智能体(background agents),那么其侧边面板中显示的“文件修改中……”等状态栏文本,可能在后台消耗了大量 token。自 2026 年 8 月部署的 2.1.232 版本起,交互式后台智能体默认启用了 agent_summary 功能:每 30 秒将该智能体的完整对话转录(transcript)发送给模型,以生成 3–5 个词的状态文本。
根据 Flamerix AI 团队公开的分析结果,他们通过检查自身系统的 OpenTelemetry 数据发现,这些 agent_summary 请求导致的成本占其总成本的 16.4%,API 请求次数则占总数的 19.7% 1。在 GitHub Issue #86879 中,多位在重度使用子智能体(subagents)的环境中报告了各自不同指标下的显著占比。rflcrz 测量发现,在一次持续 4 小时、包含 27 个子智能体的会话中,agent_summary 占请求总数的 22.7%,按 Opus 5 单价计算的加权 token 占比达 18.0%;sylvain-artois 报告称,在 1 小时 45 分钟的会话中,缓存读取 token 占比为 26%;kcarriedo 则在 20 个以上子智能体的会话中观察到加权 token 占比为 15–22% 2。另一方面,Anthropic 的 Edwin Arbus 表示,在发送遥测数据(telemetry)的所有用户平均值基础上,该功能的成本占比约为 2% 3。换言之,这一功能在您工作负载中是否显得成本高昂,主要取决于您运行子智能体的频率以及上下文长度的大小。
本文将剖析 agent_summary 调用成本高昂的结构,说明如何识别该行为,并整理当前可用的拦截手段及其优势与局限。
每 30 秒重新读取完整转录的低效问题

Flamerix AI 公布的应用前后测量数据,仅代表其自身工作负载。 ↗
agent_summary 成本较高的原因在于输入与输出的严重不对称。该功能每 30 秒将活跃后台智能体的完整对话历史重新发送给模型,而模型仅需执行“将最后的行为总结为 3–5 个词”的指令。
根据 Flamerix 团队的测量,输入 token 与输出 token 的比例约为 9,000:1。此外,相关成本的 96% 来自价格较高的 Opus 模型 1。GitHub 用户 sylvain-artois 还报告称,一个上下文长度为 380k 的智能体每小时会消耗约 4,500 万个缓存读取 token 2。这种结构本质上是为了显示 3–5 个词的状态文本而读取数十万 token。
这种消耗独立于智能体原本的任务。该调用被配置为在转录中不记录(skipTranscript:true),完全禁用工具调用,并限制为单轮交互,从而与智能体的实际任务上下文相互隔离 2。因此,即使拦截此类请求,也不会影响智能体修改文件或执行命令的实际行为。Flamerix 团队确认,在拦截之后,OpenTelemetry 数据中 agent_summary 请求的数量降为 0,且未被其他查询来源所替代 1。
当前可用的拦截手段

原文公布的 Bun preload 运行示例。 ↗
目前尚无专门设置可以官方关闭 agent_summary。不过,Flamerix 团队与 GitHub 用户们提出了以下几种变通方法。
1. 使用 Bun preload 脚本绕过计时器
Flamerix 团队公开了一个约 70 行的脚本,利用 Bun 的 --preload 选项禁用计时器,而无需修改 Claude Code 二进制文件。该方法对全局的 setTimeout 进行封装,若在摘要计时器回调的源代码中检测到特定锚定字符串,则不实际启动计时器,仅返回一个空句柄 1。
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
export BUN_OPTIONS="${BUN_OPTIONS:+$BUN_OPTIONS} --preload=$HOME/.local/share/no-agent-summary.js"
claude该方法的主要注意事项在于其对锚定字符串的依赖。脚本采用“失败即开放(Fail-open)”的工作方式:若 Claude Code 更新后内部代码或字符串结构发生变化,脚本将悄然失效。因此,在版本更新后,应通过 OpenTelemetry 数据再次确认请求是否仍在发生 1。
2. 设置 CLAUDE_CODE_FORK_SUBAGENT 环境变量
GitHub Issue #86879 的参与者,尤其是 uwuclxdy,报告称设置 CLAUDE_CODE_FORK_SUBAGENT=0 环境变量即可停止摘要生成 2。
{
"env": {
"CLAUDE_CODE_FORK_SUBAGENT": "0"
}
}然而,该变量会同时禁用 fork 模式本身。sylvain-artois 通过代码分析确认,摘要功能的启用条件与 fork 控制逻辑相关联,只有关闭 fork 功能,摘要才会随之关闭 2。因此,如果用户并不依赖子智能体复制对话历史的 fork 模式,这是一个直观可行的替代方案;但若需要 fork 功能,则无法使用此方法。另外,对 2.1.276 版本 bundle 的分析也表明,交互式 CLI 中不存在关闭该功能的官方路径 2。
拦截后用户界面的变化

Anthropic 公布的代理列表界面示例,并非屏蔽前后的对比截图。 ↗
拦截 agent_summary 后,后台智能体状态栏中的文本将不再更新。这意味着用户将失去直观了解智能体当前正在执行何种任务的手段。
Anthropic 方面已意识到这一点。Edwin Arbus 在 Hacker News 上承认当前机制“对于状态栏而言过度”,并在 2.1.311+ 版本中修复了缓存未命中问题。此外,他表示正在开发一种“short 模式”,即不再发送完整转录,而是将简短备注发送给较小的模型 3。在 2.1.310 版本的代码中已可看到相关逻辑,但其默认状态仍为禁用 3。
评估在自身工作负载中的占比

GitHub issue 中报告的测量表,来自一次运行 4 小时、使用 27 个子代理的会话。 ↗
如果不使用后台智能体,该功能的占比接近 0%;若在较长时间内运行大量子智能体,该比例在成本评估基准下可能达到约 16%,在缓存读取 token 基准下则可能达到约 26% 1, 2。由于不同指标下的数值存在差异,建议在决定是否拦截之前,先评估其在本环境中的实际占比。
由于状态栏摘要请求不会写入转录,普通的基于 JSONL 日志的成本追踪工具无法捕捉到该部分开销。要准确评估其占比,需通过 CLAUDE_CODE_ENABLE_TELEMETRY=1 启用 OpenTelemetry 导出,并汇总 query_source = agent_summary 项下的请求数量与成本 1, 3。
在应用 Bun preload 脚本后,最可靠的验证方法是在 OpenTelemetry 数据中确认 query_source = agent_summary 条目是否已消失 1。环境变量 CLAUDE_CODE_FORK_SUBAGENT=0 会禁用整个 fork 模式,因此对于不使用 fork 功能的用户,无需采用 Flamerix 团队提供的 Bun 脚本即可获得相同效果 2。




