你把三件小事交給 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,細度卻不同。這次工作表以事件為準,保留原始來源名稱,再按「來源+模型」分組。

把下列程式存為 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% 的估算費用。這是不同分母的算術,不是模型實測,也不是省額度比例。

最後再開兩欄: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 文章專區選下一個元件。
