MUST · 手搓你的 AI Agent · 組件 03

自有流量檢視器

把你工作台匯出的會話記錄拖進來:逐回合看每次請求送出了多少詞元、整段歷史重發了幾次。你在工作台的一段對話,就是組件 02 那個迴圈跑了 N 次——N 就是下面「模型請求」那個數字。

先看整體:你看到的對話,不是送出去的流量

組件 02 用預先編寫的任務走迴圈;這一頁用你自己的記錄走一次同樣的迴圈。

你在工作台裡看到的是一段對話:你一句、它一句。但模型沒有記憶(組件 05),所以 Harness(工作台的外殼程式)每一次請求(request)都把整段歷史重新送出去——第 20 次請求送出的,是前 19 次的全部內容加上新的一句。而且一個「回合」(turn,即你說一句)裡面,Agent 每叫一次工具就要再請求一次模型。所以一段看起來 10 句的對話,背後可能是 30 次請求、幾十萬個詞元(token)。工作台會把這些寫進會話記錄(session log);本頁把它讀出來給你看。

載入你的會話記錄

支援三種格式:dsh(DeepSeek Harness)會話記錄(session.jsonl.zstd,可直接拖入,頁內解壓;或已解壓的 .jsonl)、Claude Code 會話記錄(~/.claude/projects/…/*.jsonl)、一般 messages 陣列(.json)。沒有檔案就先按「用範例記錄」。

全部在瀏覽器本機解析:本頁沒有任何網絡請求,檔案不會離開你的裝置。記錄裡若有個人資料,仍請先自行檢視;記錄檔本身不要傳給同學或老師,要分享成果,只截第 2 節的數字。注意:Agent 讀過的檔案(例如整份筆記或網頁)會原文寫進記錄,第 3 節會顯示這些內容——投影或截圖時請先摺疊第 3 節。

重點一

對話很短,流量很長

累計送出的詞元遠大於對話本身的大小,倍數就是「歷史平均被重發了幾次」。對話愈長,後面每一句愈貴——與組件 01 的曲線一致,只是這次是你自己的數字。

載入記錄後顯示。
重點二

一句話不等於一次請求

Agent 每用一次工具,就要把工具結果送回模型再請求一次。你說一句、它跑五步,就是五次請求、五次重發歷史。這就是組件 02 的迴圈——現在有實證。

載入記錄後顯示。
重點三

快取命中能省下大半費用

重發的歷史若與上一次開頭完全相同,供應商可以按「快取命中」另計價格——以 DeepSeek 為例約為未命中價的三十分之一(見頁尾 2;其他供應商折扣不同)。所以不要改動前面的內容、把長文件放在對話開頭,都是省錢的習慣(組件 05 的另一面)。

載入記錄後顯示。

想一想

  1. 找出記錄裡最貴的一次請求。它為甚麼最貴——是你貼了長文件、工具回傳了很多內容、還是純粹因為它排在最後?
  2. 如果在第 N 個回合前開一個新對話、只帶一段摘要,後面的請求會便宜多少?用組件 05 的壓縮想一想。
  3. 你的記錄裡有沒有一個回合跑了很多步卻沒有結果?那幾步的錢花在哪裡?人在哪一步應該叫停?
  4. 記錄裡哪些內容是你不想送出去的(個人資料、別人的檔案)?它們被重發了多少次?
教師提示(討論後展開)

第 1 題:通常是「最後一次」,因為歷史最長;若不是,看那一步的新內容——大多是一次工具結果(讀了整份 PDF 或整個網頁)。第 2 題:新對話的第一次請求只有系統提示+摘要+新問題,通常是原來的一成以下;代價是細節遺失。第 3 題:繞圈的回合是組件 02 任務 4 的真實版;一個實用的叫停判準是「同一個工具、同樣參數、出現第二次」。第 4 題:一旦進了上下文,每一次請求都重發,直到你開新會話(Claude Code 是 /clear;dsh 是另起一個 session)——這是私隱界線(第 8 堂)的伏筆。

問你的 Agent(動手時間開頭 10 分鐘):匯出前先確認那段對話沒有貼過別人的檔案或個人資料(見想一想第 4 題)。然後請它「把我們這段對話的記錄匯出成檔案」(dsh:介面右上「Session 日志 ⬇」,或 $DSH_HOME/sessions/<工作區>/session-<id>/session.jsonl.zstd;Claude Code:~/.claude/projects/),拖進本頁;再問它「你剛才為我這個任務請求了模型幾次?每次送了多少?」把它的答案與本頁的數字核對。

同一概念、不同名字

概念dsh(DeepSeek Harness)Claude Code本頁
會話記錄append-only session log(session.jsonl.zstd,zstd 壓縮的 JSONL;每行 type/seq/time/data,首行 type: "session"~/.claude/projects/<專案>/<session>.jsonl(每行 type/message記錄
你說一句turn/startuser/messagedata.content[] 文字區塊)type: "user"(不含 tool_result)回合
一次模型請求step/startassistant/messagedata.message.content[]texttool-call 區塊;data.usagetype: "assistant"message.usage請求
工具往返tool/calltool/resulttool-result 區塊,帶 isErrortool_usetool_result 內容塊工具呼叫/工具結果
詞元帳目usage.inputTokens/outputTokens/totalTokens,快取為 cacheReadTokens/cacheWriteTokens(源碼;PoC 假端點未回報快取欄)input_tokens/output_tokens/cache_read_input_tokens/cache_creation_input_tokens輸入/輸出/快取命中
壓縮compaction/summary(log-only)/compact—(本頁不重算,只作標記)
權限狀態permission/presetsandbox/modeapproval/policyapproval/asked—(不寫入記錄)第 2 節的「權限」一行