前言¶
在 DSH(DeepSeek Harness)裏跑智能體時,流式輸出是否在「正常速度」往往只能靠體感:等到整輪結束,也很難立刻知道這一次模型調用真實的 token 吞吐。社區裏已有 @feiyang666/dsh-usage-plugin 一類插件,側重調用結束後的 token 與費用臺賬,並不在生成過程中給出 tok/s。維護者 deepseekv41flash 的 dsh-speed-meter 補的是「流式過程中 + 單次調用精確速率」這一空位:在輸入框下方的 composer dock 常駐一枚膠囊,只綁定當前會話,自校準每模型的 chars→tokens 係數。
下面介紹它是什麼、怎麼裝、界面上會看到什麼,以及使用時需要知道的邊界。
這是什麼¶
dsh-speed-meter 是 DSH 生態下的模型推理類插件,由 dsh.bundle 裝配(宿主半 + Web 客戶端半在同一 npm 包內)。當前 package 版本爲 0.2.0,許可證 MIT,源碼與說明見 GitHub 倉庫,目錄頁爲 SkillHub 插件頁。
一句話:宿主掛在 llm/stream 上統計每次流式調用的增量字符與時間,流結束時用 API 的 outputTokens 反推精確 tok/s 並校準係數;客戶端通過 HTTP/SSE 拉快照,在 composer dock 渲染膠囊。
核心功能¶
會話作用域¶
膠囊只顯示當前會話。請求帶 ?session=<sessionId>,宿主按會話維護 last/recent,並對 running 做歸屬過濾。其他窗口在生成時,本會話不會顯示別人的速率;tooltip 會提示「其他會話正在生成(不顯示)」。
膠囊上顯示什麼¶
| 狀態 | 含義 |
|---|---|
| 流式生成中 | 最近約 1.2 秒滑動窗口的瞬時速率(tok/s,經自校準係數換算) |
| 等待首字 | 請求已發出、尚未收到第一個增量 |
| 一輪結束 | 該輪會話的平均速率與累計用量:總 outputTokens ÷ 本輪淨生成耗時;一輪內多步/工具回合全部累加 |
| 無本輪數據 | 退回顯示上一次調用的精確速率 |
| 短突發調用 | 不顯示速率,只顯示 token 數與耗時(見可靠性判據) |
「輪」的邊界對應智能體 running → idle。流式過程中膠囊仍顯示瞬時速率;tooltip 裏另有「本輪累計」。懸停可見 sessionId、model、purpose、累計字符數、ratio、耗時等;點擊可展開最近 12 次調用與每模型校準狀態。
統計與校準原理¶
- 宿主半包在
llm/streamwaterfall 上,逐塊統計text-delta/reasoning-delta/tool-call-delta的字符數,並記錄首個與最後一個增量的時間。 - 流結束時 API 提供
usage(含outputTokens)。宿主用outputTokens ÷ 已統計字符數得到該模型每次調用的 chars→tokens 比率,並以 EMA(α=0.2)持續校準;運行中的即時速率乘以該係數,估值會逐步貼近真實 token 數。 - 客戶端通過 SSE(
/speed-meter/api/stream,宿主約每 400ms 推送完整快照)更新 UI;SSE 不可用時退回約 900ms 輪詢。
可靠性判據:短於 500ms 且 token 少於 40 的調用(例如會話標題、緩存回放、單塊 tool-call 參數)時間分母更接近傳輸突發而非生成耗時,會算出失真極高的 tok/s。這類調用標記 reliable=false、tokSec=null,界面只顯示 token 數與耗時,不顯示速率。
安裝與啓用¶
插件通過 DSH 的 bundle 機制安裝,官方命令爲:
dsh plugin --profile <profile> add dsh-speed-meter
將 <profile> 換成你實際使用的 profile 名。本地開發可將包 link 進 profile 後重啓 DSH NEXT;客戶端半的改動需要刷新頁面或重啓應用纔會重新加載。
安裝前建議自行查看倉庫源碼與 MIT 許可證:插件以當前 DSH 進程權限運行,會攔截並統計流式模型調用相關的宿主數據。
典型用法¶
安裝並重啓/刷新 DSH NEXT 後,無需額外配置文件:在對話 composer 下方應出現速度膠囊。正常對話、工具調用觸發的流式生成都會進入統計。
若需對接或調試數據,可使用 README 中描述的 HTTP 接口(均需帶會話時加 session 參數):
GET /speed-meter/api?session=<id>:該會話快照 JSON(不帶session則爲進程級最新一次調用),含turn(本輪彙總)。GET /speed-meter/api/stream:SSE,數據變化時推送與上面同結構的 JSON;空閒時發註釋行保活。
宿主內調試可發事件同步取快照(桌面宿主對普通瀏覽器關閉 HTTP 時適用):
ctx.emit('speed-meter/snapshot', reply => ...)
快照中的 debug 字段(如 apiHits、sseHits、generation 等)可用於判斷客戶端是否連上、以及 Cordis 熱重載後路由是否仍由上一代 handler 佔用。
適用場景與注意¶
適合:需要在同一會話裏實時觀察模型輸出吞吐、對比不同模型或不同 prompt 下體感速度;需要單次調用精確 tok/s 與最近 12 次歷史,而不必另開外部監控。
注意:
- 狀態保存在進程級全局單例(
globalThis[Symbol.for('dsh-speed-meter/state-v1')]),是爲 Cordis 熱重載後錶盤不凍結;DSH 重啓後數據歸零。持久化臺賬請用dsh-usage-plugin。 - 流被中斷或超時時可能拿不到精確
usage,只能按校準係數估算並標exact=false。 - 多會話並行時,錶盤可能顯示「最近活躍的那一次調用」;快照裏的
sessionId可區分。 - EventSource 連接不會跨 fiber 遷移;Cordis 熱重載或插件升級後,最穩妥的做法是刷新頁面(Ctrl+R)讓客戶端重新連 SSE。
結尾¶
dsh-speed-meter 把 tok/s 從「事後猜」變成 composer 旁的常駐讀數:流式看滑動窗口瞬時速率,結束看精確 tok/s 與本輪累計,並按模型自校準 chars→tokens。若你在 DSH 裏做智能體開發與調優,可以把它當作會話內的輕量速度錶盤。
- 目錄頁:https://www.skillhub.cn/plugins/deepseekv41flash/dsh-speed-meter
- GitHub:https://github.com/deepseekv41flash/dsh-speed-meter