前言¶
DeepSeek Harness(命令是 dsh)把模型、工具、會話和界面都做成插件。網頁端自帶一套基於 --dsw-* 設計令牌的主題運行時,內置外觀大致是跟隨系統、淺色、深色。日常用下來,很多人還是希望再往前一步:像 Codex 那樣點一下換一套配色,或者給主畫布墊一張自己的壁紙,而不是去改 Harness 源碼。
社區裏已經出現多款主題類插件。本文只寫其中一款:dsh-skin。它由 KinGao294 維護,社區目錄歸在「主題與外觀」。覈對過社區目錄頁、GitHub 倉庫 README、package.json、LICENSE 和客戶端源碼 lib/client.js 之後,可以把它理解成:在官方主題運行時上註冊一套精選配色,並在設置頁加一行壁紙控制,主畫布和側欄半透明,消息氣泡保持不透明。
需要先說清邊界:DeepSeek Harness 官方倉庫的口號是「Everything is a Plugin」。社區插件目錄 deepseek-harness-plugin.com 是獨立站點,用來檢索帶 dsh-plugin 話題的倉庫,和 DeepSeek / 幻方沒有官方從屬關係,也不是官方應用商店。
這是什麼¶
dsh-skin 是面向 DeepSeek Harness 網頁界面 的換膚插件。GitHub 倉庫是 KinGao294/dsh-skin,許可證 MIT,作者欄寫的是 KinGao294。package.json 裏當前版本是 0.3.1,主語言是 JavaScript。截至 2026-08-17,GitHub API 顯示該倉庫有 18 顆星;社區目錄頁同一天仍顯示 11 顆星,星標以倉庫本身爲準。
它要解決的問題很具體:
- 不想只在系統淺色 / 深色之間切換,希望有幾套現成的語義配色
- 想給網頁墊一張本地圖片或遠程圖 / 視頻,並調節界面遮罩和模糊
- 換膚和壁紙刷新後還在,但不走 Host 設置裏尚未對第三方開放的命名空間
倉庫 README 把它寫成雙面插件,結構和官方自帶的 ui-* 包類似:
- Host 半邊(
lib/index.js+cordis.patch.yml):聲明dsh.bundle,往 profile 的 loader 裏插入一條id: skin、name: 'dsh-skin'的條目;apply是空操作 - 瀏覽器半邊(
lib/client.js):聲明dsh.client,由網頁在/plugins/dsh-skin/client.js加載,負責註冊皮膚、恢復上次選擇、畫壁紙層、往設置頁掛兩行控件
package.json 裏 dsh.client.platform 是 "web",並聲明對 @deepseek-ai/dsh-client-runtime、@deepseek-ai/dsh-client-ui-theme 等包 ^0.1.0-rc.6 的 peer 依賴。它走的是官方主題服務的第三方擴展點(ctx.theme.register / setTheme / overrideTokens),不是給 headless 或終端 TUI 換皮膚。
核心功能¶
裝好並重啓網頁之後,設置頁 Settings → General(通用)裏、內置「外觀」那一行下面,會多出兩行:
- 皮膚 / Skins
- 背景圖片 / Wallpaper
七套精選配色¶
皮膚不是另寫一套 CSS,而是向 DSH 自帶的 ThemeRuntime 註冊主題。每個皮膚帶一個 colorScheme(light 或 dark),用來驅動 body[data-ds-dark-theme],再覆蓋一層 --dsw-alias-*(以及少量 --dsw-specific-*)令牌。ThemePresenter 把這些值寫成 body 上的內聯自定義屬性,卡片、輸入框、氣泡仍然走原來的令牌體系。
倉庫 README 和 lib/client.js 裏的目錄一致,共 7 套,外加「默認」:
| id | 中文名 | 明暗 | README 裏的氣質 |
|---|---|---|---|
skin-ocean |
深海藍 | 暗色 | DeepSeek 藍的深海 |
skin-graphite |
石墨灰 | 暗色 | 中性單色 |
skin-forest |
森林綠 | 暗色 | 綠色偏靜 |
skin-sunset |
落日紫 | 暗色 | 暖紫 |
skin-midnight |
午夜黑 | 暗色 | 純黑,偏 OLED |
skin-paper |
紙感暖 | 淺色 | 暖紙 |
skin-sakura |
櫻花粉 | 淺色 | 粉色點綴 |
id 帶 skin- 前綴,避免和官方 @deepseek-ai/dsh-client-ui-console 裏已有的 sakura、graphite 撞名。源碼在讀取時會把舊的無前綴 id 遷到 skin-*。
選 默認 / Default 會回到內置外觀(跟隨系統),並清掉已保存的皮膚 id。
自定義壁紙:半透明畫布 + 遮罩 / 模糊¶
壁紙不是鋪滿整個窗口的一張圖。實現上是一層 z-index: -1 的固定背景;同時用 ctx.theme.overrideTokens 把主畫布(--dsw-alias-bg-base)和側欄(--dsw-specific-sidebar-fill)做成半透明,圖從這兩塊透出來。消息氣泡、卡片、輸入框仍是實底,源碼和界面提示都寫了這一點:保證字還能讀。
Settings → General → 背景圖片 裏可以做這些事(以 README 和客戶端文案爲準):
- 選擇圖片:選本地圖片,轉成 data URL 存在當前瀏覽器。README 寫軟上限約 2MB;源碼裏 data URL 長度上限是
1800000字符,超出會先壓縮再存,仍超則提示存不下。本地視頻文件不會被上傳,界面會提示改用網址。 - 網址:粘貼
http(s)或data:的圖片 / 視頻地址。視頻擴展名按源碼識別mp4/webm/ogv/mov。blob:會被拒絕,因爲刷新後失效。沒有額外的媒體服務器。 - 顯示方式:鋪滿(cover)、完整顯示(contain)、拉伸(stretch)、平鋪(tile),默認鋪滿。
- 界面遮罩 和 模糊:兩個滑塊。遮罩越高,界面越實、壁紙越弱。滑塊改動用
requestAnimationFrame合併,避免拖動時把頁面拖崩。默認遮罩0.8,默認模糊0。 - 移除:清掉壁紙。
換皮膚或切換淺色 / 深色時,半透明表面會按當前皮膚重新着色,壁紙仍在下面。
只存在當前瀏覽器裏¶
選擇存在 localStorage,鍵名是:
dsh-skin:skindsh-skin:wallpaperdsh-skin:wallpaper-opacitydsh-skin:wallpaper-blurdsh-skin:wallpaper-fit
README 解釋了原因:Host 設置通道只向瀏覽器暴露白名單裏的命名空間(WEB_SETTINGS_NAMESPACES)。第三方命名空間會得到 settings-not-exposed。視覺偏好用 localStorage 能跨刷新保留,範圍是同一個瀏覽器、同一來源,不會同步到另一臺機器或另一個瀏覽器配置。第三方皮膚在啓動時會再應用一次,因爲 DSH 本身只持久化系統 / 淺色 / 深色。
安裝與啓用¶
社區目錄頁給出的安裝命令如下,在 DeepSeek Harness 終端裏運行:
dsh plugin add github:KinGao294/dsh-skin
需要可復現安裝時,目錄頁要求固定 commit 哈希:
dsh plugin add github:KinGao294/dsh-skin#<commit>
把 <commit> 換成倉庫裏某個具體提交。不要長期跟蹤浮動的默認分支。
官方 CLI 的插件命令形態是 dsh plugin --profile <profile> add <規格>,會在對應 profile 目錄裏轉發給 pnpm。這個插件只聲明瞭 web 平臺。倉庫 README 用本地 checkout 舉例,並且強調必須加 -w:每個 profile 都帶 pnpm-workspace.yaml,pnpm 9 把 profile 目錄當成 workspace 根,裸 add 會報 ERR_PNPM_ADDING_TO_ROOT:
dsh plugin --profile web add -w /path/to/dsh-skin
官方 CLI 文檔裏從 GitHub 安裝的形態是 dsh plugin --profile <profile> add github:owner/repo。把目錄頁的規格裝進 web profile,可以寫成:
dsh plugin --profile web add github:KinGao294/dsh-skin
如果 pnpm 報 ERR_PNPM_ADDING_TO_ROOT,再按 README 的說明補上 -w。安裝會把包裝進 ~/.dsh/profiles/web,並追加到 dsh.profile.bundles。新的 bundle 層要重啓正在跑的網頁服務才生效:
# 先停掉當前實例,再啓動:
dsh web
打開網頁後進入 Settings → General,就能看到皮膚和背景圖片兩行。
目錄頁和官方文檔都提醒:插件以當前 dsh 進程的權限運行,安裝時可能執行代碼。裝之前應閱讀倉庫源碼和 MIT 許可證。Git 依賴若帶 prepare 腳本,pnpm 10 及以上可能先拒絕構建,需要按 CLI 提示把包名寫進該 profile 的 pnpm-workspace.yaml 的 allowBuilds 後再裝一次。
典型用法¶
下面步驟都來自 README 和設置頁文案,不涉及未公開的配置項。
- 確認本機已經能打開 DSH 網頁(官方文檔裏常見入口是
npx @deepseek-ai/dsh web,默認http://127.0.0.1:3080)。 - 按上一節把
dsh-skin裝進 web profile,重啓dsh web。 - 打開 設置 → 通用。在「外觀」下方找到 皮膚。
- 點一套配色,例如「深海藍」或「紙感暖」。頁面應立刻切到對應明暗和令牌色;刷新後應仍是這一套。
- 若要恢復內置外觀,選 默認。
- 在 背景圖片 一行點 選擇圖片,挑一張不太大的本地圖;或在輸入框粘貼
https://...的圖片 / 視頻地址後點應用。 - 拖 界面遮罩 和 模糊,看主畫布和側欄的透出程度。消息氣泡應保持實底。
- 顯示方式按桌面壁紙習慣選:鋪滿適合照片,完整顯示適合不想裁切的圖,平鋪適合紋理。
- 不要用
blob:地址;刷新後會失效,插件會直接拒絕。
開發者如果在改 lib/client.js:這份客戶端是按 __ModuleLoader__ 的 bundle 格式手寫的,沒有單獨構建步驟。require 只能點到模塊表裏已有的實體(例如 react、@deepseek-ai/dsh-client-ui-theme/client)。改完同樣需要重啓 web 服務,loader 會按新的內容哈希重新提供文件。
適用場景與注意事項¶
適合這些情況:
- 已經在用 DSH 網頁,只想換配色、加壁紙,不想碰 Harness 源碼
- 希望皮膚走官方
ThemeService的 alias 令牌,而不是整頁覆蓋一張大 CSS - 壁紙可以只存在當前瀏覽器,不需要多設備同步
使用前注意下面幾條,均能在目錄頁、README 或源碼裏對上:
- 只覆蓋網頁。
dsh.client.platform爲web。headless、自己做的 TUI profile 裝了也不會出現這兩行設置。 - 偏好不跨瀏覽器。 清站點數據、換瀏覽器或換設備,皮膚和壁紙都要重設。這是當前 Host 設置白名單的限制,不是漏做的雲同步。
- 本地圖片有體積上限。 過大存不進
localStorage。本地視頻請改用網址,插件不會把視頻文件上傳到本機服務。 - 可讀性優先於「全透明」。 半透明只作用在主畫布和側欄;把遮罩拖到很低,字仍應落在實底氣泡上。若和其他改全局 CSS 的外觀插件疊用,後掛載的令牌覆蓋可能互相打架,需要自己看效果。
- 和官方主題 id 刻意錯開。 本插件用
skin-sakura、skin-graphite這類帶前綴的 id。社區裏還有dsh-deep-whale、dsh-xiaoyao-skins等其它主題插件,職責不同,不要按名字混裝、混改同一套 token。 - 權限模型。 插件與當前
dsh進程同權。即使許可證是 MIT、源碼公開,安裝前仍應自己看lib/index.js、lib/client.js和cordis.patch.yml。 - API 仍在預覽期。 Harness 官方說明核心插件和 API 還會變。本包 peer 依賴寫的是
0.1.0-rc.6一帶的客戶端包,升級 DSH 後若設置行消失或換膚不生效,應對照當時的 theme / client 插件接口再查倉庫。
小結¶
dsh-skin 把「換一套配色」和「墊一張壁紙」接到 DeepSeek Harness 已有的令牌主題運行時上:七套 skin-* 精選色板,加上半透明主畫布、可調遮罩和模糊的壁紙層,選擇存在當前瀏覽器的 localStorage。它不改 Harness 源碼,安裝後重啓 dsh web,在設置頁通用一欄就能用。
目錄頁與源碼:
- 社區目錄:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-skin/
- GitHub:https://github.com/KinGao294/dsh-skin
- DeepSeek Harness 官方倉庫:https://github.com/deepseek-ai/deepseek-harness