跳到主要內容

【2026 最新】Claude Code agent_summary 怎麼查?六步分清背景摘要、快取與額度

最後更新: ·
Claude Code agent_summary 背景摘要成本歸因教學

你把三件小事交給 Claude Code 的背景子代理,畫面只多出幾行進度,方案用量卻一直往上走。agent_summary 是這次要查的一個請求來源:先找出它占了多少次請求、多少估算費用,再問背景分工是否值得。

這篇寫給剛開始用 Claude Code、還看不懂遙測名詞的讀者。你會用六步建立一份本機工作表,分清主對話、背景摘要、快取與訂閱額度。準備已有的 Claude Code 使用權限、Python 3,以及不含機密的練習資料;不用先架雲端儀表板。

本文按 2026 年 10 月 31 日查閱的官方文件與原始公開量測整理。下方記帳程式以合成事件檢查接收與加總;成本案例是算術練習,沒有填入 AlphaLab 的真實摘要費用量測。

先說結論:先分來源,再分價格,最後才看額度

成本歸因=請求來源 × 各類用量 × 對應價格;訂閱額度另記。把它想成餐廳收據:主菜、送餐和包裝分別記帳,才知道該調整哪一項。看到很多包裝次數,不能直接推算餐費占比。

  • 用 claude_code.api_request 事件查看細分的 query_source;別拿只分大類的成本 metric 代替。
  • 把一般輸入、輸出、快取讀取、快取寫入分欄,保留事件自己的估算美元值。
  • 先比較同一任務的完成品質、整段等待與總估算費用,再決定減少哪些背景派工。

一、agent_summary 是什麼?先拆開三種「摘要」

背景子代理是主對話另外派出的工作者;背景進度摘要,則是描述工作者正在做什麼的短句。整理整段對話以便接著工作的 context compaction,又是另一個用途。三者都可能碰到「摘要」二字,記帳時卻應依實際請求來源拆開。

Flamerix AI 的 原始量測紀錄把背景進度摘要標為 agent_summary,在其一週工作負載中占 16.4% 的估算支出。公開紀錄列出 Linux、Claude Code 2.1.257–2.1.312 等測試範圍;這個比例是該環境的觀察,不能直接套到你的任務。

同一討論裡,自述參與 Claude Code 開發的 edwinarbus 回覆將約 30 秒的摘要請求限於正在工作的背景代理,並報告不同母體下較低的費用占比;他也說 2.1.311+ 已處理摘要漏用快取的昂貴情況。這是具名留言的說法,不能據此推論所有版本、帳號與摘要開銷都已消失。你的版本與事件,仍要自己記。

還有一個同名陷阱:status line 官方文件說明的是終端底部、由本機腳本呈現的狀態列。它與本文要辨認的模型摘要請求應分開。不要因底部有幾個字,就把每次模型呼叫都算成畫面顯示成本。

二、六步完成 agent_summary 成本歸因

①「先固定考卷」:版本、任務和完成條件寫在前面

第一輪要解決的痛點,是兩次工作根本不同。先執行 claude --version、python3 --version,記下日期、登入計費方式、實際模型與 effort。用乾淨練習目錄放三份短文字,事先寫好必須找出的事實;兩輪都要求交回相同答案與出處,不改檔、不裝套件。

A 輪請主對話自己完成,不派子代理;B 輪請一個背景子代理讀取同樣資料。檢查介面或子代理事件,確認真的有派工;提示詞寫了「背景」不算啟動證據。每輪新開 session、記下開始與完成時間,並在前後確認版本沒有變動。自動更新、不同模型或不同資料,都另開一組比較。

請只讀這個練習目錄的三份文字,列出五項指定事實與各自出處。
不要修改檔案、安裝套件或讀取其他目錄。
A 輪:由主對話完成,不使用子代理。
B 輪:改由一個背景子代理整理,主對話核對同樣五項事實。

最後兩行是兩輪各自選用的要求,不要一起提交。任務太短時,可能看不到摘要事件;照實保留結果,不要故意延長等待來製造開銷。較長的例行任務,等小範圍接線確認後再測。子代理本身的行為可先看 Claude Code 子代理與委派契約。

②「收據留本機」:先啟動只保存指定欄位的小程式

OpenTelemetry(簡稱 OTel,開放的觀測框架)像統一格式的收據管道。這裡只用 logs/events,不啟用 beta tracing。先建立一個新的私人練習目錄,把下列程式存為 collect.py;A、B 輪各用不同目錄,避免把舊帳混進來。

import json
from http.server import BaseHTTPRequestHandler, HTTPServer

FIELDS = ('session.id', 'request_id', 'client_request_id', 'event.timestamp',
          'query_source', 'model', 'cost_usd', 'input_tokens', 'output_tokens',
          'cache_read_tokens', 'cache_creation_tokens',
          'cache_creation_5m_tokens', 'cache_creation_1h_tokens')

def attrs(items):
    return {a['key']: next(iter(a.get('value', {}).values()), None)
            for a in items}

class Receiver(BaseHTTPRequestHandler):
    def do_POST(self):
        if self.path != '/v1/logs':
            self.send_error(404)
            return
        size = int(self.headers.get('Content-Length', '0'))
        if not 0 < size <= 4_000_000:
            self.send_error(413)
            return
        try:
            payload = json.loads(self.rfile.read(size))
            rows = []
            for resource in payload.get('resourceLogs', []):
                base = attrs(resource.get('resource', {}).get('attributes', []))
                for scope in resource.get('scopeLogs', []):
                    for record in scope.get('logRecords', []):
                        a = {**base, **attrs(record.get('attributes', []))}
                        if a.get('event.name') == 'api_request':
                            rows.append({k: a[k] for k in FIELDS if k in a})
            with open('api-events.jsonl', 'a', encoding='utf-8') as out:
                for row in rows:
                    out.write(json.dumps(row, ensure_ascii=False) + '\n')
        except (ValueError, KeyError, TypeError):
            self.send_error(400)
            return
        self.send_response(200)
        self.send_header('Content-Type', 'application/json')
        self.end_headers()
        self.wfile.write(b'{}')

    def log_message(self, *_):
        pass

print('Listening on 127.0.0.1:4318; Ctrl+C to stop', flush=True)
HTTPServer(('127.0.0.1', 4318), Receiver).serve_forever()

在第一個終端機執行 python3 collect.py,看到 Listening on 127.0.0.1:4318 就保留視窗。程式只接受本機 /v1/logs,從 API 請求事件挑出列明欄位,再寫入 api-events.jsonl;JSONL 就是「一行一張收據」。檔案只會在收到資料後出現。

這個接收器把一般帳號與提示文字欄位丟掉,但 session ID、模型及活動時間仍是工作資料;別把原檔公開。它沒有身分驗證、磁碟輪替或跨程序去重,適合自己的短時間練習,團隊長期收集請改接受管理的 Collector。

③「接上水管」:在第二個終端機啟動 Claude Code

依 官方 exporter 設定,以下選擇 HTTP/JSON 並明確指定 logs endpoint。請在同一個練習目錄執行;變數只套用到這次 Claude 程序。公司裝置若已有 managed settings 限制遙測目的地,先由管理者核對有效設定,不要繞過它。

CLAUDE_CODE_ENABLE_TELEMETRY=1 \
OTEL_LOGS_EXPORTER=otlp \
OTEL_EXPORTER_OTLP_LOGS_PROTOCOL=http/json \
OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=http://127.0.0.1:4318/v1/logs \
OTEL_METRICS_EXPORTER=none \
OTEL_TRACES_EXPORTER=none \
OTEL_LOG_USER_PROMPTS=0 OTEL_LOG_ASSISTANT_RESPONSES=0 \
OTEL_LOG_TOOL_DETAILS=0 OTEL_LOG_TOOL_CONTENT=0 \
OTEL_LOG_RAW_API_BODIES=0 \
claude

完成 A 輪的小任務後,在 Claude 內查看 /usage,記錄方案用量與 session 資訊,再正常離開 Claude;讓接收器多留一個傳送週期後才按 Ctrl+C。接著檢查檔案是否有本輪的 request_id、query_source 和 cost_usd。檔案空白先查接線,不要填成零成本。B 輪在另一個新目錄重做。

關閉內容記錄不等於 exporter 完全不含識別資訊;本篇接收器在收到後再做欄位白名單。若收不到資料,按 官方排錯方法,把上方區塊最後一行換成 claude --debug-file ./otel-debug.log,保留前面的全部變數再啟動,以檢查 exporter 錯誤。Debug log 另外保留在私人目錄,不要整份貼上網。

④「先分來源」:事件與 metric 的 query_source 不同

官方 API request event 欄位把 query_source 定義為發出請求的子系統;你可能看到 repl_main_thread、compact 或子代理名稱。本文要尋找的是實際匯出中是否出現 agent_summary,不把每個 auxiliary 都猜成它。

同頁的 cost/token metric 使用較粗的 main、subagent、auxiliary 分類。白話說,一個是逐張收據的品項,另一個是部門總表;字都叫 query_source,細度卻不同。這次工作表以事件為準,保留原始來源名稱,再按「來源+模型」分組。

agent_summary 歸因流程:API 請求事件按來源與模型分組,再分開費用與額度
先保留細分的 query_source,再加總估算費用;方案用量另外記錄,避免混成同一個百分比。

把下列程式存為 summarize.py,放在對應輪次的目錄,執行 python3 summarize.py。它以 session 與 request ID 去掉重複收據;缺少識別碼、來源或估算值就停止計算,提醒你補查,避免把未知當零。

import json
from collections import defaultdict
from decimal import Decimal

seen, groups = set(), defaultdict(lambda: [0, Decimal('0')])
for line in open('api-events.jsonl', encoding='utf-8'):
    row = json.loads(line)
    if not all(row.get(k) for k in ('session.id', 'request_id', 'query_source')) or row.get('cost_usd') is None:
        raise SystemExit('Incomplete row: do not calculate a cost share')
    key = (row.get('session.id'), row['request_id'])
    if key in seen:
        continue
    seen.add(key)
    group = groups[(row['query_source'], row.get('model', 'unknown'))]
    group[0] += 1
    group[1] += Decimal(str(row['cost_usd']))
for key, (count, cost) in sorted(groups.items()):
    print(*key, 'requests=', count, 'estimated_usd=', cost)

這份結果是接收到且有完整欄位的請求事件,不是供應商帳單上的全部活動。資料可能受程序退出、網路或 exporter 狀態影響。先核對起訖時間與 session,再比較;出現 exporter 錯誤或缺資料,該輪標成資料不完整。這份 api_request 收據不代表任務成功,也不包含所有重試嘗試;錯誤與拒答需另查相應事件。

⑤「再分價格」:快取命中,仍要分開四種 token

工作表每個來源保留四個用量欄:input_tokens、output_tokens、cache_read_tokens、cache_creation_tokens。官方事件定義中,一般 input 已排除快取讀與寫,因此這四欄是不同類別。保留原始欄位,不把「所有輸入」總數再與快取重複相加。

快取像已整理好的教材,再借閱通常比重新整理便宜,但借閱仍有成本。要估算金額,依 官方 API 價目對照當輪模型、快取期限與計費條件;若寫入拆成不同期限,保留對應明細。新手先加總事件的 cost_usd,不要拿一個統一單價乘所有 token。

做一個假設案例:三張完成請求收據,主對話一張估算 US$0.90,摘要兩張各 US$0.05。摘要占 2÷3=66.7% 的請求數,卻只占 0.10÷1.00=10% 的估算費用。這是不同分母的算術,不是模型實測,也不是省額度比例。

agent_summary 假設算術案例:摘要請求占66.7%,估算費用占10%,帳單與訂閱額度另查
教學假設資料:主對話 US$0.90,兩次摘要各 US$0.05;不同帳本的百分比不能互換。

最後再開兩欄:API 使用者把同期間、同帳號範圍的實際帳務另記;訂閱使用者記 /usage 的方案用量與觀察時間。官方成本說明明確區分本機美元估算與權威帳務,訂閱內含用量也不是這個美元值的直接帳單。跨裝置活動與滾動視窗都會妨礙單輪歸因。

⑥「重跑才下結論」:總成本、完成品質與等待一起看

抄好 A、B 輪的版本、模型、來源請求數、四類 token、估算美元、起訖時間、五項事實是否全對、是否需要返工。快取冷暖狀態也記下;同樣新開 session,不代表服務端快取條件必然一致。交換 A、B 順序再做幾組,別只挑最好的一輪。

接著只改一件事,例如把三個零碎派工合成一個完整子任務,或把無須平行的工作交回主對話。保持題目與驗收線相同,重新量測。如果摘要費變低,主對話卻因反覆補問變貴,就比較整件合格成果的總額;等待變長、漏答案或返工,也一起留下。

若某輪沒有 agent_summary,只寫「本輪完整接收到的事件未見這個來源」,並記版本、時間與任務長度。別推論功能已永久關閉,也別拿空白 logs 宣告零成本。這個觀察習慣能接到 Agent Observability 入門,把嫌疑點變成可以追查的證據。

三、三個常見坑:不要為省費用破壞歸因

  • 把主對話快取當成全體:Prompt cache (main)只涵蓋主對話。它很好用,但不能替背景子代理的快取填數字。
  • 把 transcript 當成全量帳:Tare 的 Session Log 稽核適合回看已保存的紀錄;本篇另接即時請求事件,是為了核對資料覆蓋。兩邊對不上先查範圍與去重,不先宣布某個工具錯。
  • 第一步就改客戶端:原作者的 Bun preload 會依內部計時器特徵攔截摘要;更新可能使匹配失效。本篇先改派工與量測,不提供全域注入安裝流程。需要研究修補時,先在隔離環境審查固定版本、恢復方式與前後事件,別拿生產工作當第一組測試。

常見問題:八個直接答案

1. agent_summary 占 16.4%,我就能省 16.4% 額度嗎?

不能這樣換算。那是原作者一組負載的估算支出占比;你要分開記自己的請求、費用與方案視窗。

2. 快取命中很高,為什麼還有費用?

因為快取讀取有自己的計價,輸出與快取寫入也另計。命中率回答重用了多少輸入,不直接回答總花費。

3. /usage 已經有歸因,還需要 OTel 嗎?

看目的。內建資訊先看;若要逐個請求辨認 agent_summary,這篇再用事件保存來源與估算值,補上自己的比對依據。

4. 沒看到 agent_summary,就證明已修好了嗎?

證據還不夠。先確認接線、匯出完整性、實際背景派工與版本,再把結果限於這一輪。

5. 關掉終端底部 status line 會一起省掉摘要嗎?

兩者應分開查。底部本機腳本和背景代理的模型摘要是不同機制;用來源事件確認變更效果。

6. A 輪比較便宜,就該全面停用背景代理?

不一定。若 B 輪更快完成同樣合格成果,這份額外費用可能有價值;先看你的等待與品質要求。

7. 現在要先升級,還是先做比較?

先記目前版本與基線,再依既有更新政策處理版本。更新前後另開一組,避免把版本差異誤算成派工效果。

8. 可以把原始遙測貼到公開討論求助嗎?

先做摘要與去識別檢查。公開分享來源別的加總、版本和測試條件即可;session ID、帳號欄位與 debug log 留在私人目錄。

給新手的三個重點

  • 先確認真的在量同一件工作,包含派工是否發生與答案是否合格。
  • 事件來源、四種 token、估算美元、實際帳務與方案額度,各有自己的欄位。
  • 只改一個派工因素,重跑並保留失敗與缺資料的輪次。

接著閱讀

左右滑動查看更多推薦

下一步:今天先留下一輪完整收據

先做 A 輪,確認五項答案正確、接收器有完整請求,再做 B 輪。記住:先分來源,再分價格,最後才看額度。當你能指出「這筆是摘要估算、這筆是主工作、這欄還沒量到」,才有依據調整派工。想把這張工作表接成日常流程,可接著到 AlphaLab 課程練習,或從 AI 文章專區選下一個元件。

ALPHALAB 社群

有問題?來 Telegram 聊

和 Terry、編輯、其他網友一起討論這篇文章。提問、分享觀點,回覆更即時。

加入 Telegram 討論

📩 訂閱 AlphaLab 電子報

週日 Weekly 週報+週二、週四 Alpha Signal,每週最多三封。

我們不會 spam,隨時可退訂。已訂閱?管理訂閱偏好(會寄登入連結到你的信箱)

主題篩選與退訂說明

寄送日期以台灣時間為準。主題偏好會篩選每期精選,並非每篇新文章的即時通知;當期符合主題的文章不足時會略過寄送。

未勾選任何主題會收到所有主題的精選,並不會停止寄信。

取消勾選 Alpha Signal 可停止週二、週四短報,仍保留週日週報。若要停止所有電子報,請使用信件底部的「取消訂閱」。