用 freestyle-dsh-theme 給 DeepSeek Harness 網頁界面自己調一套主題

前言

DeepSeek Harness(簡稱 dsh)把模型、工具、會話和界面都做成插件。網頁界面要換外觀,社區裏已經有不少「整套皮膚」:換一套資源,界面就換成另一種風格。如果你不想套現成皮膚,只想自己定主色、副色和背景,再讓整套界面跟着走,目錄裏對應的是另一類插件——主題設計器。

freestyle-dsh-theme 就屬於這一類。它掛在 DeepSeek Harness 的 Web GUI 上,用 OKLCH 色彩模型做「主題提案」和「主題設計器」,點卡片或拖滑桿就能換膚,重啓後還能把上次的配色讀回來。本文按社區插件目錄頁、GitHub 倉庫 README / package.json / 源碼,以及 DeepSeek Harness 官方倉庫交叉覈對後整理:它是什麼、能調哪些東西、怎麼裝、怎麼用。

需要先說清來源:DeepSeek Harness 由 DeepSeek AI 開源,架構口號是「一切皆插件」。插件目錄站點 deepseek-harness-plugin.com 是社區收錄,和 DeepSeek / 幻方沒有官方從屬關係,不能當成官方應用商店。

這是什麼

freestyle-dsh-theme 是一款 主題與外觀 插件,維護者是 GitHub 用戶 suzike,倉庫在 suzike/freestyle-dsh-theme。npm 包名是 @linxin666/freestyle-dsh-theme(和 GitHub 用戶名不是同一套命名),當前 package.json 版本爲 0.1.0,許可證爲 BSD-3-Clause,主要語言是 TypeScript。目錄頁把它歸在「主題與外觀」;撰寫本文時(2026-08-17),GitHub API 顯示 12 星,目錄頁當時顯示 10 星。

它要解決的問題很具體:DSH 網頁界面的顏色來自一整套 CSS 設計令牌(--dsw-alias-* / --dsw-specific-*)。直接改令牌門檻高;裝一套皮膚又往往是整包替換。這個插件把令牌收成三個 OKLCH 通道——主色、副色、面板——再映射到明暗兩套完整令牌,用設置頁裏的卡片和滑桿來改。

結構上它是「雙面」Web 插件:

  • Host 半:跑在 dsh 進程裏,註冊 POST /api/freestyle-dsh-theme/name,用當前默認模型給配色起中文名。
  • Client 半:加載到瀏覽器,把「主題提案」和「主題設計器」掛進 設置 → 通用 → 主題

package.jsondsh.client.platformweb,面向網頁界面,不是 headless 會話。

核心功能

OKLCH 三通道,而不是隻挑一個強調色

README 和客戶端源碼把一套主題拆成幾個通道,再映射到界面角色:

通道 令牌字段 映射到
主色 th / c1 / l1 品牌強調色、按鈕、交互態
副色 th2 / c2 / l2 側邊欄選中態
面板 ths / sc / bg 各級背景
文字 tx 正文墨色(如 label-primary
側邊欄 sb 左側欄底色(默認與主區一體)

OKLCH 把顏色拆成色相、彩度、明度三條軸,滑桿可以分開拖。源碼裏還會按配色關係從主色派生副色和麪板色:鄰近、互補、分裂互補、三角色,以及隨機。

生成結果會寫成 DSH 的 --dsw-alias-* / --dsw-specific-* 令牌。README 寫的是約 85 個、明暗各一套,覆蓋背景層級、文字層級、邊框、按鈕、交互態、狀態色、側邊欄等。應用方式走官方縫:theme.overrideTokens,不是去改廠商靜態資源。

主題提案:六套預設加一批智能卡片

打開設置頁後,第一個頁籤是「主題提案」。源碼裏寫死了 6 套風格預設,名稱是:

  • 極光青
  • 暖金沙
  • 暮光紫
  • 櫻粉
  • 深海藍
  • 熔岩橙

下面還有「智能提案」:按當前選中的配色關係隨機生成 8 張卡片。點卡片即應用;「換一批」重新抽 8 張;「恢復默認」清掉覆蓋。卡片上有一份縮小的界面預覽,可以在淺色 / 深色之間切換預覽模式。README 的說明和這段源碼一致。

主題設計器:滑桿、鎖定、變體、JSON

第二個頁籤是「主題設計器」。可以切換主色 / 副色 / 面板,拖色相、彩度、明度滑桿,或點色相色塊。源碼裏還能單獨調文字明度和側邊欄明度。

設計器還帶幾組輔助操作(均來自 README 與客戶端實現):

  • 通道鎖定:鎖住某一通道後,隨機和配色關係會跳過它。
  • 快速變體:柔和、鮮明、提亮、壓暗、主副互換。
  • 即時預覽:勾選後,拖滑桿就會立刻 overrideTokens
  • AI 命名:把當前 OKLCH 令牌 POST 到 Host 路由,用默認模型生成中文主題名、標籤和介紹。環境裏沒有 LLM、或還沒配默認模型時,接口會返回明確錯誤,不會假裝成功。
  • JSON 導入導出:主題令牌可以複製、粘貼、遷移。導出時會嘗試寫入剪貼板。

設置彈框會被插件加寬到 1120px(高度上限約 840px),方便把提案卡片和設計器並排看完。

跨重啓持久化

這裏其實是兩件事,源碼裏分得很清楚:

  1. 插件本身作爲常駐 Web 插件裝進 profile,重啓 dsh 後仍然加載。
  2. 當前配色寫在瀏覽器 localStorage,鍵名是 freestyle-dsh-theme:last。下次打開網頁時,客戶端會讀出來再調用 overrideTokens

也就是說:配色跟着這臺機器上的這個瀏覽器走,不是寫進服務器上的全局配置。換瀏覽器或清站點數據,上次的主題不會自動跟過來;這時可以用設計器裏的 JSON 導出再導入。

安裝與啓用

社區目錄頁給出的安裝命令原文如下,在 DeepSeek Harness 終端裏運行:

dsh plugin add github:suzike/freestyle-dsh-theme

需要可復現安裝時,目錄頁建議固定 commit 哈希:

dsh plugin add github:suzike/freestyle-dsh-theme#<commit>

<commit> 換成倉庫裏某個具體提交。官方 CLI 文檔裏常見寫法會帶 --profile(例如 web);目錄頁收錄的是上面這條不加 profile 參數的命令,以頁面原文爲準。

目錄頁同時提醒:插件以當前 dsh 進程的權限運行,安裝時可能執行代碼。安裝前應檢查源代碼倉庫和許可證。

倉庫 README 另外寫了一條「克隆後本地構建再掛到 profile」的路徑。當前倉庫 沒有提交 lib/.gitignore 忽略了該目錄),package.json 裏也 沒有 prepare 腳本。DeepSeek Harness 官方文檔說明:從 GitHub 安裝拿到的是源碼而不是構建產物,沒有 prepare 時 TypeScript 包可能沒有 lib/ 入口。若目錄頁那條 dsh plugin add 沒有生成可加載的構建結果,可以按 README 自己構建:

git clone https://github.com/suzike/freestyle-dsh-theme.git
cd freestyle-dsh-theme
pnpm install
pnpm build

構建產物是 lib/index.js(Host 半)和 lib/client.js(瀏覽器半)。然後在 ~/.dsh/profiles/<profile>/package.jsondependencies 里加入:

{
  "dependencies": {
    "@linxin666/freestyle-dsh-theme": "link:../path/to/freestyle-dsh-theme"
  }
}

../path/to/freestyle-dsh-theme 換成你本機上的倉庫路徑。再在該 profile 的 cordis.patch.yml 末尾追加:

- insert:
    - id: theme
      name: '@linxin666/freestyle-dsh-theme'

接着:

cd ~/.dsh/profiles/<profile>
pnpm install

最後重啓 DeepSeek Harness(或 dsh web 進程),刷新瀏覽器。package.json 聲明的 Node 引擎是 ^22.19.0 || >=24.0.0,並對 @deepseek-ai/dsh-client-* 等包聲明瞭 ^0.1.0-rc.6 的 peer 依賴。dsh 目前處於開發者預覽,接口仍可能不兼容變更。

典型用法

按 README「使用」一節,裝好並刷新網頁後:

  1. 打開 設置 → 通用 → 主題,點 「自定義…」
  2. 主題提案 頁籤:點預設或智能提案卡片一鍵應用;「換一批」重新生成;「恢復默認」還原。
  3. 主題設計器 頁籤:切換主色 / 副色 / 面板,拖色相 / 彩度 / 明度(或點色相色塊),可開即時預覽;需要時再用通道鎖定、配色關係、快速變體、AI 命名、JSON 導入導出。
  4. 「應用主題」 提交;「恢復默認」會清掉 localStorage 裏保存的令牌並撤銷覆蓋。

如果要用 AI 命名,先保證當前 profile 已經配置了默認模型。Host 路由在找不到 llm / agentDefaultModel、或默認模型未選 provider/model 時,會分別返回「當前運行環境沒有可用的 LLM 服務」和「尚未配置默認模型」。命名本身不是換膚的前置條件,只是給當前配色起名字。

分享主題時,在設計器裏點「導出 JSON」,把文本發給對方;對方粘貼後點「導入並應用」。JSON 字段包括 thth2thsc1c2scl1l2bgtxsbmode 等,版本字段爲 version: 4。導入側會做數值鉗制,格式不對會提示「不是有效的主題 JSON」。

適用場景與注意事項

比較適合:

  • 已經在用 dsh web,想自己定配色,而不是換一整套皮膚資源。
  • 需要明暗兩套令牌一起生成,避免只改亮色、暗色還是默認。
  • 想把配色以 JSON 備份、在多臺機器之間遷移。

不太適合:

  • 只跑 headless / 非 web profile:這個插件聲明的是 web 客戶端。
  • 想要 QQ 皮膚、桌寵、整包插畫皮膚:那是目錄裏其它「主題與外觀」插件的方向,例如目錄相關條目裏的 dsh-deep-whalewhale-girl 等,和本插件不是同一類能力。

使用前建議記住這幾條邊界:

  • 插件以 當前 dsh 進程的權限 運行,Host 半會在本機註冊 HTTP 路由並調用默認模型。安裝前應閱讀倉庫源碼和 BSD-3-Clause 許可證。
  • 主題持久化依賴瀏覽器 localStorage,不是賬號級雲同步。
  • AI 命名會把當前令牌發給本機 dsh 進程裏的默認模型;沒有可用模型時,這條功能不可用,其它調色功能仍可手工使用。
  • 從 git 安裝時,若構建失敗,優先對照官方文檔檢查 prepare / allowBuilds,或改走 README 的本地 pnpm build + link
  • dsh 仍是開發者預覽,peer 依賴釘在 0.1.0-rc.6 一帶。升級 dsh 後如果設置頁不出現「主題」項,先覈對 profile 是否加載了 @linxin666/freestyle-dsh-theme,以及 cordis.patch.yml 裏是否還有 id: theme 那一行。

小結

freestyle-dsh-theme 把 DSH 網頁界面的換膚收成兩步:先用提案卡片選一個起點,再用 OKLCH 三通道把主色、副色、面板調到能看。令牌走 theme.overrideTokens,配色存在瀏覽器本地,插件本身作爲常駐 Web 插件跟着 profile 重啓。它不是官方皮膚商店裏的「官方主題」,而是 suzike 維護的社區開源插件。

目錄頁:https://deepseek-harness-plugin.com/zh-CN/plugins/freestyle-dsh-theme/

GitHub:https://github.com/suzike/freestyle-dsh-theme

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

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

小夜