前言¶
DSH 桌面版在輸入框下方有一行官方用量行:輪次、步數、採樣速度、Token 用量、緩存命中、上下文佔用,都在。唯獨賬戶裏有多少錢,界面上看不到。要確認餘額得另外打開 DeepSeek 的網頁賬戶頁,切窗口、看數字、再切回來,和當前會話的消耗對不上。
dxxo77 維護的插件 dsh-plugin-quota-balance 解決的就是這件事:把餘額放到用量行最左側,和官方那幾組數字同一行、同一字號、同一灰度,不額外佔位;點一下原地展開明細,能看到普通餘額和贈送額度分項。下面是它的功能、安裝方式和實現要點。
這是什麼¶
一句話定位:DSH 的 Host + Client 雙半邊插件,新增一個 HTTP 接口把 deepseekAccount 的餘額讀出來,再往客戶端輸入框的用量行裏塞一個單元格。
- 維護者:dxxo77
- 許可證:MIT
- 倉庫:https://github.com/dxxo77/dsh-plugin-quota-balance
- 目錄頁:https://www.skillhub.cn/plugins/dxxo77/dsh-plugin-quota-balance
- 目錄頁上的分類是「客戶端」,星標 1(以目錄頁爲準)
- README 裏提交給 awesome-dsh-plugin 的市場條目分類是
usage
前提是宿主要具備 deepseekAccount 服務,也就是需要 DSH 桌面版,並且當前已登錄 DeepSeek 賬號。只裝瀏覽器插件環境跑不了。
核心功能¶
從 README 的功能描述看,覆蓋這幾件事:
- 用量行最左側顯示當前賬戶餘額(¥),和官方數字同一行、同一字號、同一灰度。
- 點擊徽標原地展開明細浮層:賬戶餘額、普通餘額、贈送額度、更新時間,以及「刷新」和「去充值」。
- 未登錄或讀取失敗時整塊隱藏,不佔位。
- 徽標與浮層全部讀取宿主暴露的表面 token,不做自己的一套配色,因此自動跟隨
dsh-plugin-wallpaper-engine的玻璃參數、明暗主題和壁紙切換;沒裝壁紙引擎時它是普通的深色浮層。
顯示規則細節:
- 同幣種的多個錢包(普通餘額 + 贈送額度)合併求和,例如
¥10.47;多幣種時用·連接。 - 徽標爲
order: -10,排在conversation.composer.dock的最左側。 - 浮層底邊對齊徽標上方 6px,直接蓋在輸入框上,窗口縮放時重新貼靠。
- 收起方式:
Esc、點擊卡片外部、再點一次徽標。 - 字體與顏色跟隨用量行:
font: inherit、12px、--dsw-alias-label-tertiary。 - 懸停有淺色圓角底、按下更深、
focus-visible有強調色描邊;底襯用「內邊距 + 等量負外邊距」實現,懸停文字不位移。 - 卡片掛在
document.body上並用獨立樣式表,原因是輸入框卡片自帶裁剪與層疊上下文,放在插槽裏的懸浮層會被它蓋住。
安裝與啓用¶
README 給的安裝方式不是命令行一條命令,而是先拿到代碼,再在插件管理裏掛載目錄:
git clone https://github.com/dxxo77/dsh-plugin-quota-balance
然後在 DSH 的插件管理裏安裝該目錄,install_bundle 指向倉庫路徑。安裝後即時生效,輸入框下方用量行最左側出現餘額,點它展開明細。
卸載:在插件管理裏移除 dsh-plugin-quota-balance 即可。
倉庫自帶的文件分工:
| 文件 | 作用 |
|---|---|
index.js |
Host 半邊:註冊 GET /plugin/quota-balance/status,通過 deepseekAccount.getBalance() 讀取餘額並做 30s(失敗 5s)緩存 |
client.js |
Client 半邊:往 conversation.composer.dock 註冊一個 order: -10 的單元格,每 60s、以及窗口重新可見時刷新 |
cordis.patch.yml |
安裝時插入 quota-balance 這一行 |
locale/*.json |
插件在「插件」列表裏的標題與描述 |
icon.svg |
插件圖標,由 package.json 的 dsh.client.exports 導出 |
package.json 裏跟安裝相關的字段:
"dsh": {
"bundle": { "patch": "./cordis.patch.yml" },
"client": {
"platform": "web",
"immediately": true,
"inject": ["@deepseek-ai/dsh-client-ui-conversation"]
}
}
inject 聲明瞭客戶端依賴的宿主模塊,immediately 爲 true 意味着隨客戶端一起加載。
接口與本地數據¶
插件內部接口:
GET /plugin/quota-balance/status
{"ok":true,"wallets":[{"currency":"CNY","balance":"5.40"},...],"normal":[...],"bonus":[...],"links":{"usageUrl":"...","topUpUrl":"..."},"fetchedAt":1793627086526}
{"ok":false,"reason":"unavailable"|"signed-out"|"failed"}
餘額只在本地迴環地址上暴露,且響應不帶 CORS 頭,網頁無法跨源讀取。這條限制可以放心:餘額不會因爲你裝了這個插件而傳到別的站點。
典型用法:改代碼後怎麼生效¶
- 改
client.js:保存後頁面會熱更新,README 註明本插件實測即時生效。 - 改
index.js:在插件管理裏把本插件禁用再啓用即可重載 Host 模塊,不必重啓應用(已實測);之後點卡片裏的「刷新」取一次新數據。
與壁紙引擎的關係¶
這裏的做法值得單獨說:壁紙引擎不是給插件一套「浮層樣式」,而是把宿主自己的表面 token 就地改寫成玻璃配方,--dsw-alias-bg-layer-*、--dsw-alias-bg-overlay、--dsw-alias-border-* 全部被重映射。官方那些浮層(Token 用量、會話統計)讀的就是這些 token,所以這個插件直接讀同一個宿主 token,而不是抄壁紙插件的參數:
| 用途 | 取值 |
|---|---|
| 面板底色 | var(--dsw-alias-bg-overlay, #26272b) |
| 毛玻璃 | backdrop-filter: blur(var(--we-blur, 13px)) saturate(var(--we-saturate, 1.3)) |
| 邊框 | --dsw-alias-border-l2 |
| 文字 | --dsw-alias-label-primary/secondary/tertiary |
| 強調色(去充值) | var(--we-accent, var(--dsw-alias-brand-primary, #7db3ff)) |
README 裏記了兩個坑值:--dsw-alias-bg-base 在壁紙引擎下是 transparent,--dsw-alias-border-l1 的 alpha 是 0,拿這兩個去鋪底不會得到預期效果;--we-panel-color 這類實色會變成不透明板子。
另有一條值得抄的思路:樣式注入到 <style id="quota-balance-css">,熱更新時舊節點還在頁面上,injectPanelCss() 必須覆蓋 textContent,不能發現節點就 return;樣式表原先只在浮層首次展開時注入,導致刷新頁面後徽標沒有樣式,現在改爲在 ctx.slots.inject(...) 裏先調一次 injectPanelCss()。
適用場景與注意¶
適合這幾類人:
- 常駐桌面版跑會話、需要邊看邊算消耗的開發者;
- 賬戶裏有贈送額度,想看普通餘額和贈送額度分項的人;
- 已經在用
dsh-plugin-wallpaper-engine,希望浮層樣式自動跟上主題和壁紙的人。
注意幾點:
- 插件以當前 DSH 進程的權限運行,能讀到宿主已登錄賬戶的餘額。裝之前建議先打開
index.js和client.js看清楚,認同之後再啓用。許可證是 MIT,作者是 dxxo77。 - 餘額數據只在本地迴環暴露、無 CORS 頭,本地腳本或瀏覽器控制台理論上可讀,頁面外無法跨源取。如果在意,裝之前要確認這個邊界符合你的預期。
- 依賴兩個宿主條件:DSH 桌面版(Host 有
deepseekAccount服務)和已登錄 DeepSeek 賬號。只裝客戶端半邊、不滿足這兩個條件時插件不會顯示任何東西(未登錄或讀取失敗整體隱藏,不報錯也不佔位)。 - 這個插件不是官方出品,README 中列出的市場條目也投放在社區維護的 awesome-dsh-plugin 倉庫,站點與市場會自動讀入,和 DeepSeek / 幻方沒有官方從屬關係。
最後回顧:它做的事很窄,就是把餘額從網頁賬戶頁挪到用量行裏,順帶複用宿主表面 token 讓浮層跟着壁紙引擎走。如果你已經在桌面版上長期使用,這是一條低成本的信息補全。