dsh-plugin-usage-budget:按峯谷價目換算 token 費用並守住預算

前言

DSH 裏的用量到這一層通常只是一個 token 數字:能讀到本輪用了多少 token,但很難直接回答“這條消息花了多少錢”。價格是分模型、分時段的——DeepSeek 在部分時段對推理價打折,同一段對話裏早高峯和深夜產生的用量單價並不相同,緩存命中與未命中又是兩套價。要把這些攤到每一輪,就得自己讀官方用量投影、做時段判定和金額換算,還要自己維護“所有會話累計”那一層。

下面介紹 dsh-plugin-usage-budget。它把 token 用量按可配置的價目換算成人民幣金額,提供會話費用讀數、逐輪價格、賬戶餘額與每日/每週/每月預算守衛。它本身不參與推理,只管覈算花費。

這是什麼

一句話定位:DSH 的用量費用與預算插件,負責“token → 金額 → 預算提醒”這條鏈路。

  • 倉庫:dddfuxi/dsh-plugin-usage-budget
  • 維護者:dddfuxi(GitHub);包 author 字段爲 fuxi
  • 分類:模型推理(用量計費側,非推理本體)
  • 許可證:MIT
  • 版本:0.1.0(package.json)
  • 運行要求:Node >=20,對 @deepseek-ai/cordis ~4.0.5

插件由早期的兩個自用小插件合併而來:dsh-plugin-usage-cost(費用讀數)與 dsh-plugin-account-balance(賬戶餘額),並新增了預算守衛與逐輪價格。

運行機制

Host 側在 lib/index.js 註冊兩個 session projection:

  • usageCost:對每條已結算的 assistant/message 用量事件,用事件自身的時間判斷峯谷時段,按 tokens / 1e6 × 單價 × 時段折扣 計價並累加,同時按輪累計,保留最近 120 輪。
  • usageBudget:把每筆用量折成金額寫入按本地自然日聚合的賬本,輸出今日 / 本週 / 本月、預算等級與下一條預估所需的單價表。

兩個文件承擔核心邏輯:

  • lib/pricing.js:價目核心,無任何依賴,時段判定用 Intl 處理 Asia/Shanghai 與 DST。
  • lib/budget.js:賬本核心,純函數,48 個單測,瀏覽器與 Node 都能跑。

賬本落在 $DSH_HOME/usage-budget/ledger.json。首次運行(或賬本版本變化)時會做一次全局回填:讀取所有已落盤的會話日誌,按每條用量事件自己的時間與價目重建賬本,之後只做增量;fork 會話的繼承前綴(session/end-seed 之前)會被跳過,避免重複計費。

界面與功能

插件不改動官方 DOM,而是走擴展點:

界面 位置 數據來源
本會話用量費用 輸入框狀態欄(用量圖標) Host usageCost 投影,按每輪實際時段計價
預算 / 剩餘 / 下一條預估 輸入框狀態欄(盾牌圖標) Host usageBudget 投影 + 全局賬本
賬戶餘額 會話頂部預設欄 + 預算彈窗 remote.account.getBalance(與“設置 → 賬號與餘額”同源)
逐輪價格 / 緩存節省 每條消息的“本輪用量”彈窗 用該輪 token 桶匹配 usageCost.turns
每條消息用量行 每條助手消息底部 usageCost.turns 裏該輪的 tokens + 金額

輸入框控件通過 conversation.composer.dock 槽位註冊,與內置用量控件同 id、更低 priority,從而原位替換;消息底部用量行走官方擴展點 conversation.chat.turnTail。預算彈窗與逐輪價格彈窗分別覆蓋“今日 / 滾動 7 天 / 自然月”的累計與單價拆解。

峯谷價目

內置默認價目爲人民幣元 / 100 萬 token(2026-11 取自 DeepSeek 官方價格頁):

模型 緩存命中 緩存未命中 輸出
deepseek-flash 0.04 2 8
deepseek-v4-pro 0.30 9 27

峯時爲北京時間週一至週五 09:00–12:00、14:00–18:00,其餘時間(含週末)一律 5 折;DeepSeek 不單列緩存寫入價格,故 cacheWrite: 0。pricing 配置項可整張覆蓋:

pricing:
  currency: CNY
  timezone: Asia/Shanghai
  models:
    deepseek-flash: { cacheRead: 0.04, cacheWrite: 0, input: 2, output: 8 }
    deepseek-v4-pro: { cacheRead: 0.30, cacheWrite: 0, input: 9, output: 27 }
  fallback: { cacheRead: 0.04, cacheWrite: 0, input: 2, output: 8 }
  windows:
    - { id: offpeak, label: { zh: 優惠時段, en: Off-peak }, start: "00:00", end: "09:00", days: [1,2,3,4,5], factor: 0.5 }
    - { id: offpeak, label: { zh: 優惠時段, en: Off-peak }, start: "12:00", end: "14:00", days: [1,2,3,4,5], factor: 0.5 }
    - { id: offpeak, label: { zh: 優惠時段, en: Off-peak }, start: "18:00", end: "24:00", days: [1,2,3,4,5], factor: 0.5 }
    - { id: offpeak, label: { zh: 優惠時段, en: Off-peak }, start: "00:00", end: "24:00", days: [6,7], factor: 0.5 }

金額是估算,不是賬單:按可配置價目換算,峯谷按事件結算時刻判定;中國法定節假日未建模(窗口只支持星期),需要精確數額時以實際賬單爲準。

安裝與啓用

方式一是插件管理頁(README 推薦):

git clone https://github.com/dddfuxi/dsh-plugin-usage-budget.git

然後在 DSH 側欄打開 插件 → 添加插件 → 安裝第三方插件,把上面的倉庫地址粘貼到“包名/Git 地址”,或在“本地目錄”裏填 clone 下來的絕對路徑。安裝完成後啓用它,側欄“插件”裏會出現名爲 用量費用 的卡片(自帶圖標與中文描述)。

方式二是手動 bundle 安裝:

1. 複製本目錄到 %USERPROFILE%\.dsh\profiles\<profile>\node_modules\dsh-plugin-usage-budget
2. profile 的 package.json:
   - dependencies 加 "dsh-plugin-usage-budget": "link:<本目錄絕對路徑>"
   - dsh.profile.bundles 追加 "dsh-plugin-usage-budget"
3. HMR 會自動重組;頁面未更新時刷新一次;沒有 HMR 的 profile 需要重啓。

注意:README 未提供 dsh plugin add ... 這類一行式命令,安裝入口就是插件管理頁或手動 bundle,不要憑名稱自行拼接。

配置

預算數字寫在 profile 的 cordis.patch.yml 裏,只放 override(即預算數值),不要手寫 insert 行:

- id: usage-budget
  name: dsh-plugin-usage-budget
  config:
    dailyBudget: 30
    weeklyBudget: 100
    monthlyBudget: 200
    warnAt: 0.75

完整配置項如下:

鍵 默認 說明
dailyBudget 20 日預算(元);0 關閉
weeklyBudget 0 滾動最近 7 天預算(元);0 關閉
monthlyBudget 0 自然月預算(元);0 關閉
warnAt 0.8 花費/預算 ≥ 該比例時進入告警色(0–1)
assumedOutputTokens 600 發送前預估使用的輸出 token 數
assumedCacheReadRatio null null = 用會話實測緩存命中率;0..1 可強制
pricing — 可選:覆蓋價目(結構見上一節);省略則用內置默認價目
timezone Asia/Shanghai 賬本與時段判定所用時區

預算數字也可以在 設置 → 通用設置 → 用量預算 裏直接改,回車或失焦即保存、立即生效。

計量口徑與測試

插件只統計已結算的 assistant/message 用量,被中斷、重試後未落盤的流式請求可能少算;累計範圍按所有會話共享,被攔的預算只是“守衛 + 提醒”,不攔截髮送。

測試:

npm test
# 等價於 node --test test/budget.test.mjs test/pricing.test.mjs

覆蓋時段邊界、跨午夜、時區與 DST、逐桶金額、緩存節省、未知模型回退、賬本滾動與髒數據容錯。

已知限制:

  • 只統計已結算的 assistant/message;被中斷、重試後未落盤的流式請求可能少算。
  • 全局回填只發生一次、範圍約最近 130 天;之後導入更早的會話日誌需要刪除賬本讓它重新回填。
  • 預算只是守衛與提醒,不攔截髮送(DSH 的發送路徑沒有對外攔截槽位)。
  • 發送前預估是啓發式:輸入 token 取上下文壓力投影,輸出長度取配置假定值。

適用場景與注意

適合已經在用 DSH、想要按金額而非 token 數看開銷的人:做長會話成本復盤、跨會話預算控制、確認緩存命中帶來的實際節省,或者給團隊一個統一的費用口徑。

兩點提醒:一是插件以當前 dsh 進程的權限運行,安裝前應檢查源碼與許可證;二是 DSH 生態的社區目錄是獨立站點,與 DeepSeek / 幻方無官方從屬關係,本插件並非官方應用商店裏的條目。如需覈對,可對照倉庫 README 與目錄頁 skillhub.cn/plugins/dddfuxi/dsh-plugin-usage-budget。

小結

它的價值在於把分散的 token 數字變成可讀的金額和可執行的預算門檻:費用按事件時刻的時段計價,預算跨會話累計並落地到本地賬本,逐輪價格和消息用量行讓每次改動都能對上賬。預算是用“提醒”而非“攔截”來落地,精確金額仍以賬戶賬單爲準。許可證爲 MIT,可自行審計後啓用。

羽毛球分组比赛记分
小程序二维码

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

小夜