dsh-speed-meter:Composer 下方的實時 tok/s 速度計

前言

在 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 次調用與每模型校準狀態。

統計與校準原理

  1. 宿主半包在 llm/stream waterfall 上,逐塊統計 text-delta / reasoning-delta / tool-call-delta 的字符數,並記錄首個與最後一個增量的時間。
  2. 流結束時 API 提供 usage(含 outputTokens)。宿主用 outputTokens ÷ 已統計字符數 得到該模型每次調用的 chars→tokens 比率,並以 EMA(α=0.2)持續校準;運行中的即時速率乘以該係數,估值會逐步貼近真實 token 數。
  3. 客戶端通過 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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜