跳到正文
Hacker News (official RSS)(gist.github.com)·· 5 小時前精選AI 評分73

Claude Code 每 30 秒將背景代理對話傳送至模型

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

AI 導讀

Claude Code 每約 30 秒將背景代理對話傳送至模型,導致 15–20% token 消耗。

  • 問題:Claude Code 每約 30 秒會將背景代理的整段對話傳送給 Opus,佔用 15–20% token。
推薦理由

本文提供一段可直接部署的 Bun preload,能有效減少 Claude Code 每 30 秒向 Opus 傳送的 agent_summary 呼叫,降低 15–20% token 消耗,對節省成本與提升效能皆有實際幫助。

正文 · AI 翻譯

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 毫秒, 因此「無限」延遲會立即觸發。

安裝

  1. 將 no-agent-summary.js 放在一個穩定的位置;注意其 絕對 路徑。

  2. 將 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 "$@"
  3. 重新啟動守護程式以及所有已執行的會話,然後從具有 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。

驗證(每次更新後)

  1. 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 未到達程序,或路徑不是絕對路徑。

  2. 計時器被抑制: 使用相同的 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 無關聯、贊助或背書。

來源: Hacker News (official RSS) (gist.github.com)
開啟原文