Claude Code 每 30 秒將背景代理對話傳送至模型
Claude Code regularly sends each background agent’s transcript to its model
Claude Code 每約 30 秒將背景代理對話傳送至模型,導致 15–20% token 消耗。
- 問題:Claude Code 每約 30 秒會將背景代理的整段對話傳送給 Opus,佔用 15–20% token。
本文提供一段可直接部署的 Bun preload,能有效減少 Claude Code 每 30 秒向 Opus 傳送的 agent_summary 呼叫,降低 15–20% token 消耗,對節省成本與提升效能皆有實際幫助。
Claude Code 在 3 個字的狀態列上會消耗約 15-20% 的 token:一個 Bun preload 可以關閉 agent_summary · 由 Flamerix AI, flamerix.ai · MIT
by Flamerix AI · MIT License
已於 Linux 上測試,Claude Code 2.1.257–2.1.312(見測試版本)。二進位檔未被修改 (
BUN_OPTIONS=--preload)。更新可能會悄悄還原,請參考 Verify。
TL;DR
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 程序永久生效,請參閱 Install。
問題
每約 30 秒,對於每個背景代理,Claude Code 會將該代理的 完整 記錄 傳送給該代理自己的模型(通常是 Opus),並要求它「用 3-5 個字描述你最近的 行動」。答案僅更新代理面板中的狀態列;它從未到達模型或你的對話。沒有設定可以關閉此功能,且自 2.1.232(2026 年 8 月)起已預設開啟。
此異常由 DRIM 在 Claude Code 的 OpenTelemetry 匯出中偵測到:
按 claude_code.api_request 事件按 query_source 分組,顯示 agent_summary 的成本 超過主對話本身。
query_source = agent_summary |
在掛鉤前一週 | 兩天後 |
|---|---|---|
| Claude Code 所有支出比例 | 16.4 %(主對話:15.7 %) | 0 % |
| 所有 API 請求比例 | 19.7 %,約 1/5 | 0 % |
| 其中一部分支出用於 Opus | 96 % | — |
| 輸入 token 與輸出 token 的比率 | ≈ 9,000 : 1 | — |
此處的支出指的是 Claude Code 自身的每次請求估算(cost_usd),非發票:在訂閱模式下,你損失的是速率限制餘量。我們不是唯一測量此資料的人:
#86879 收集了四項獨立測量,範圍為 18–26 %。
修正方案(工作原理)
no-agent-summary.js 是一個 Bun preload(約 80 行程式碼)。它包裝 setTimeout/setInterval;
當回呼的原始文字包含 summarizer anchor(例如 [AgentSummary] Timer fired
日誌行)時,它會返回一個惰性處理程序,而非啟動計時器。其他所有計時器均保持不變。在 OpenTelemetry 匯出中,被抑制的請求為
claude_code.api_request 事件,帶有 query_source = agent_summary。
為什麼使用計時器掛鉤而不是更簡單的方式:模組以預編譯的 Bun 位元組碼釋出,
在二進位中編輯其 JS 文字不會改變任何東西,API 客戶端也不會經過包裝的 globalThis.fetch。但 Function.prototype.toString 仍會返回回呼的原始文字,
即使它從位元組碼執行,這樣計時器也能透過內部字串辨識。惰性計時器使用精確的 2³¹−1 毫秒:Node 與 Bun 將更長的延遲視為 1 毫秒,
因此「無限」延遲會立即觸發。
安裝
-
將
no-agent-summary.js放在一個穩定的位置;注意其 絕對 路徑。 -
將
BUN_OPTIONS設為 全域,以便每個 Claude Code 程序都能使用。選項之一:# ~/.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 user env; also reaches # user services and timers; applies when the user manager next starts, usually next login) BUN_OPTIONS=--preload /abs/path/no-agent-summary.js
或者在
PATH之前使用名為claude的封裝器(case使其在一個 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(預設),pass |
off 會抑制摘要計時器。pass 是 A/B 控制:載入並記錄,保持每個計時器不變。任何其他值會在 stderr 上警告,並作為 off。 |
CC_AGENT_SUMMARY_LOG |
檔案路徑,選填 | 載入時追加 preload active mode=… bun=… hooked=…,每個匹配的計時器一行(前 20 行),以及退出計數。 |
CC_AGENT_SUMMARY_MARKER |
檔案路徑,選填 | 載入時覆寫為 preload active … 行。 |
細節
- 安裝後請重新啟動守護程式。守護程式、pty 主機以及預熱的
bg-spare會話 繼承啟動守護程式的客戶端環境,因此在BUN_OPTIONS設定之前啟動的守護程式會繼續產生未掛鉤的會話。因而claude daemon stop --any。 - 無頭執行也需要它:
claude -p、cron、CI、編輯器整合。 - 平臺: Linux 已測試,macOS 與 Windows 未測試。在 Windows 上,
/$bunfs/門很可能從未安裝鉤子。 - A/B:
CC_AGENT_SUMMARY_MODE=pass載入鉤子但啟動每個計時器;摘要回傳,顯示off結果是鉤子造成的。 - 背景程序: daemon、pty host 與
bg-spare必須在其環境中攜帶--preload(Linux 上為/proc/<pid>/environ);若無,請重新啟動 daemon。
驗證(每次更新後)
-
Preload 載入:
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,執行一段背景子代理一兩分鐘。日誌顯示summary timer #1 suppressed (setTimeout, delay=30000)並且代理面板狀態停止更新。若你匯出 OpenTelemetry,query_source = agent_summary應保持為零;這是唯一能捕捉到所有失敗模式的檢查。
Fail-open
匹配方式為 source text:錨點必須位於傳遞給計時器的回呼函式內部。如果更新破壞了此規則,鉤子將不匹配任何內容,摘要會靜默回傳。可能發生的方式:
- 日誌行或查詢來源 ID 被重新命名;
- 回呼函式透過
fn.bind(...)傳遞(toString中沒有來源)或其他包裝器; - 字串移至回呼函式外的共享常數;
- 計時器移至未包裝的 API(
timers/promises、排程器迴圈)。
因此每次更新後重新執行 Verify。
效果
- 我們在機器上於每個 Claude Code 程序(2.1.301)下執行它。自此以後,
agent_summary請求已為零,且沒有其他側面查詢取代其位置。 - 子代理、背景代理、分叉技能與背景會話正常執行;僅跳過摘要分叉。
- 可見變化:每個代理面板狀態停止更新;SDK
task_progress沒有summary。 - 開銷:每個獨立計時器回呼一個
Function.prototype.toString,快取於WeakMap。claude --version:~10 ms → ~17 ms(一次測量)。
已測試版本
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] Forking 在 --debug-file。
| 版本 | 發布 | sha256 | 靜態 | 摘要分叉在約 2.5 分鐘的代理執行中:無鉤子 / 鉤子 pass / 鉤子 off |
備註 |
|---|---|---|---|---|---|
| 2.1.312 | 2026-10-27 | 4f4178ce41d8 |
OK | 5 / 5 / 0 | latest 於 2026-10-28;互動式:6 無掛鉤,0 off |
| 2.1.310 | 2026-10-23 | b73676430af1 |
OK | 5 / 5 / 0 | |
| 2.1.308 | 2026-10-22 | 356733f185fa |
OK | 5 / 6 / 0 | stable 於 2026-10-28;pass 執行的代理程式用了 9 步而不是 8 步 |
| 2.1.301 | 2026-10-15 | bc1aad9982c7 |
OK | 5 / 5 / 0 | 同樣適用於早期掛鉤建置;互動式 off 也為 0;自 2026-10-26 以來在日常使用中,telemetry 中有 0 agent_summary 請求 |
| 2.1.280 | 2026-09-22 | 1e08503dbdf3 |
OK | 1 / 1 / 0 (計時器觸發 11 / 11 / 0) | 互動式:-p 無法在此版本啟用摘要。代理程式停在許可權提示,因而後續計時器跳過未變更的文字稿 |
| 2.1.257 | 2026-09-01 | 9a64bda9d872 |
OK | 1 / 1 / 0 (計時器觸發 11 / 11 / 0) | 與 2.1.280 相同 |
5 / 5 / 0 = 在此版本發生分叉,僅載入掛鉤不會改變任何事,且 off 移除它。
為何沒有此設定
- 檔案化的開關僅能啟用它。 SDK 選項
agentProgressSummaries預設為false,但在 bundle 中它是 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會停止它,但僅能透過 fork 子代理程式或 背景代理程式來達成。 - 提示快取讓它更便宜,而不是廉價。 大約 98% 的這些呼叫從快取中重新讀取轉錄;大約 2% 的冷快取命中則承擔其成本的三分之一。
- 成本工具閱讀錄音稿時不會看到它。 這些請求並未寫入磁碟上的 會話紀錄(#104358);只有 OpenTelemetry 匯出會顯示它們。關於背景 token 使用的檔案章節也未列出 它,而 Agent View 的行摘要則被記錄為 Haiku 型別模型,每隔幾分鐘重新整理一次。
- 已有更便宜的變體,已關閉。 2.1.310 發行了
short模式:約 2k 令牌的筆記代替完整轉錄,可由更小的模型可選生成。預設仍為完整轉錄,只有伺服器旗標可以更改。
時間表 (2026)
| 版本 (已釋出) | 變更內容 |
|---|---|
| 2.1.32 (Feb 5) | 程式碼首次出現;在公開版本中已失效 |
| 2.1.72 (Mar 9) | 可作為 SDK 選擇加入 |
| 2.1.117 (Apr 21) | 可在互動 CLI 的分支閘道或伺服器發布後使用 |
| ≤ 2.1.220 (Jul 24) | 分支技能始終被摘要 |
| 2.1.232 (Aug 13) | 預設開啟 供互動背景代理使用 |
| 2.1.300 (Oct 14) | 間隔可由伺服器調整,30–240 秒 |
| 2.1.310 (Oct 23) | 更便宜的 short 模式上線,已關閉 |
在我們的遙測中,其每週支出份額從七月的 3.5–7%(分支閘道已為我們開啟)升至 7.3%,隨後在我們升級至 2.1.233 的那一週升至 11.8%,至十月中旬約為 16%。
授權與免責宣告
MIT © 2026 Flamerix AI. 提供 按原樣,不提供任何擔保; 您自行承擔使用風險。 Flamerix AI 對因使用而產生的任何損害、資料遺失或帳戶 操作不負責。改變客戶端執行時行為可能違反您使用的服務條款;確認這點由您負責。
\"Claude\" 和 \"Claude Code\" 是 Anthropic, PBC 的商標。本專案獨立,與 Anthropic 無關聯、贊助或背書。