前言¶
DSH 的理念是「一切皆插件」,外觀自然也不例外。但如果你日常在 deepseek-v4-flash 和 deepseek-v4-pro 之間切換、也會調整推理等級,界面上並沒有與擋位對應的視覺反饋,不同會話看起來是一樣的。
nineandnine-9 寫的 dsh-theme-rheostat 解決的就是這件事:把當前會話的模型 + 推理等級映射成四個擋位的外觀,強調色、光暈、輸入框上方的指示條都跟着擋位走。和常見的靜態皮膚不同,它的外觀不是寫死的一套配色,而是由會話狀態驅動;實現上它與 README 裏對照的 maid-atelier 皮膚同構,不註冊完整主題。下面按四擋外觀、實現原理、安裝與定製的順序介紹。
這是什麼¶
dsh-theme-rheostat 在社區目錄裏歸類爲「趣味換裝」,一句話定位:根據當前會話的模型 + 推理等級,把界面切成四個擋位的外觀,並在輸入框上方顯示擋位指示條。
隱喻是「滑動變阻器升溫」:flush 走冷色系(藍 → 靛),pro 走暖色系(琥珀 → 熾紅),從「強」到「超強」在各自色系內升溫並加寬光暈。
四擋外觀¶
四個擋位的對應關係如下,每擋提供淺色 + 深色兩套強調色:
| 擋位 | 模型 | 推理等級 | 強調色(淺色 / 深色) | 光暈 |
|---|---|---|---|---|
| flush-strong | deepseek-v4-flash | high(強) | #2563EB / #60A5FA |
弱 |
| flush-max | deepseek-v4-flash | max(超強) | #4F46E5 / #818CF8 |
中 |
| pro-strong | deepseek-v4-pro | high(強) | #D97706 / #FBBF24 |
中 |
| pro-max | deepseek-v4-pro | max(超強) | #DC2626 / #F87171 |
強 |
當前只映射 high(強)與 max(超強)兩擋推理等級;未知或缺失的 reasoningEffort 會回落到 high。
實現原理¶
插件整體做三件事:注入一份 CSS、給輸入框卡片加光暈、在官方插槽上掛擋位指示條。分別說明。
變色:覆蓋語義 token¶
插件注入一份 CSS,用 body[data-dsh-rheostat][data-rheostat-level="…"] 選擇器覆蓋 --dsw-alias-brand-primary、--dsw-alias-border-l2 等語義 token,深色模式用 [data-ds-dark-theme] 區分。它不註冊完整主題,所以不會在外觀設置的主題列表裏多出一項。
光暈:輸入框卡片¶
同一份 CSS 對 [data-composer-card](對話輸入框卡片的穩定 DOM 鉤子)按擋位寫入 box-shadow 光環和外發光,四個擋位的光暈強度不同。
擋位指示條:官方插槽¶
指示條佔用官方插槽 conversation.input.dock(輸入框卡片正上方的整行)。組件用 React useSyncExternalStore 訂閱當前會話的 ctx.modelDirectories.directoryFor(sessionId).store,讀取 { model, reasoningEffort },解析成擋位後把 data-rheostat-* 屬性寫到 <body>——上面的 CSS 選擇器正是靠這些屬性生效。
鯨魚滑片¶
擋位條上方有一條四段色塊分區的連續滑軌,滑塊是一隻卡通鯨魚,支持拖動、點擊、方向鍵切換模型與推理等級。四張擋位 PNG 以 base64 內嵌進 src/client/assets.generated.ts,由 scripts/embed-assets.mjs 生成。
安裝與啓用¶
README 給出的安裝方式是本地 link + profile bundles 手動配置,沒有 registry 安裝命令,所以要先在本地構建產物:
cd dsh-theme-rheostat
pnpm install # 只需 tsdown
pnpm run assets # assets/ 裏 PNG 改動後重新生成 base64 資產
pnpm build # 產出 lib/index.js + lib/client.js
構建產出 host 半的 lib/index.js 和 client 半的 lib/client.js。然後把包掛進你的 web profile:
1、在 profile 的 package.json(如 C:\Users\rzh15\.dsh\profiles\web\package.json)的 dependencies 里加一行,link 路徑按你本地倉庫的實際位置改:
"@dsh-external/dsh-theme-rheostat": "link:E:/dsh-workplace2/dsh-theme-rheostat"
2、在同一個文件的 dsh.profile.bundles 數組裏追加:
"@dsh-external/dsh-theme-rheostat"
3、安裝並重啓 web:
dsh plugin --profile web install
dsh web
dsh plugin --profile web install 等價於把參數轉發給 profile 目錄下的 pnpm。也可以一條命令加包(再手動補 bundles 行):
dsh plugin --profile web add "link:E:/dsh-workplace2/dsh-theme-rheostat"
定製擋位¶
經過上面的步驟,插件就掛進 profile 了。想調整行爲,主要動三個文件:
- 配色和光暈:編輯
src/client/levels.ts的LEVELS,每擋有accent/ring/glow/spread四組參數。 - 模型匹配:
modelMatch是對ModelSelection.model做大小寫不敏感的子串匹配,當前是v4-flush/v4-pro;如果你 catalog 裏的模型 id 不同,改這裏即可。 - 文案:指示條上的文字在
src/client/index.ts的zh/en字典裏。
改完源碼或 PNG 後,重新跑一遍 pnpm run assets 和 pnpm build,再重啓 web 生效。
適用場景與注意¶
適合的人羣:在 flash / pro 與強 / 超強之間切換、希望擋位一眼可見的人,或者單純想給界面換裝的用戶。除鯨魚滑片可以切換模型與推理等級外,插件的其餘改動都在外觀層。
使用前有幾點需要知道:
- 體積:四張擋位圖是 1024×1024 原圖,base64 內嵌後
lib/client.js約 6.3MB,一次性加載。在意體積的話,先把 PNG 壓到 ~128px,再跑pnpm run assets。 - 皮膚共存:插件只覆蓋少量語義 token 和輸入框光暈,作爲「強調層」疊加在現有皮膚上。如果與覆蓋同一批 token 的皮膚同時啓用,由 CSS 選擇器特異性決定誰生效——本插件的
body[data-dsh-rheostat][data-rheostat-level]特異性更高。 - 等級映射:只映射
high(強)與max(超強),未知 / 缺失的reasoningEffort回落到high。 - 平臺與依賴:package.json 聲明 client platform 爲
web,注入@deepseek-ai/dsh-client-ui-slots、@deepseek-ai/dsh-client-locale、@deepseek-ai/dsh-client-ui-conversation、@deepseek-ai/dsh-client-ui-model-selection四個依賴。 - 權限與許可證:插件以當前 dsh 進程的權限運行,安裝前建議先讀一遍源碼。package.json 標記
private: true且未聲明 license 字段,README 也沒有給出許可證信息,是否能在你的場景裏使用需自行確認。
結尾¶
dsh-theme-rheostat 的價值在於把「當前會話跑在哪個模型、哪一擋推理」變成可見的界面狀態:四個擋位、兩套色系、一條輸入框上方的指示條,外加一隻可以拖動的鯨魚。想試的話,從下面的入口進入:
- 社區目錄頁:https://www.skillhub.cn/plugins/nineandnine-9/dsh-theme-rheostat
- GitHub 倉庫:https://github.com/nineandnine-9/dsh-theme-rheostat