前言¶
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.json 里 dsh.client.platform 为 web,面向网页界面,不是 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),方便把提案卡片和设计器并排看完。
跨重启持久化¶
这里其实是两件事,源码里分得很清楚:
- 插件本身作为常驻 Web 插件装进 profile,重启 dsh 后仍然加载。
- 当前配色写在浏览器
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.json 的 dependencies 里加入:
{
"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「使用」一节,装好并刷新网页后:
- 打开 设置 → 通用 → 主题,点 「自定义…」。
- 在 主题提案 页签:点预设或智能提案卡片一键应用;「换一批」重新生成;「恢复默认」还原。
- 在 主题设计器 页签:切换主色 / 副色 / 面板,拖色相 / 彩度 / 明度(或点色相色块),可开实时预览;需要时再用通道锁定、配色关系、快速变体、AI 命名、JSON 导入导出。
- 点 「应用主题」 提交;「恢复默认」会清掉
localStorage里保存的令牌并撤销覆盖。
如果要用 AI 命名,先保证当前 profile 已经配置了默认模型。Host 路由在找不到 llm / agentDefaultModel、或默认模型未选 provider/model 时,会分别返回「当前运行环境没有可用的 LLM 服务」和「尚未配置默认模型」。命名本身不是换肤的前置条件,只是给当前配色起名字。
分享主题时,在设计器里点「导出 JSON」,把文本发给对方;对方粘贴后点「导入并应用」。JSON 字段包括 th、th2、ths、c1、c2、sc、l1、l2、bg、tx、sb、mode 等,版本字段为 version: 4。导入侧会做数值钳制,格式不对会提示「不是有效的主题 JSON」。
适用场景与注意事项¶
比较适合:
- 已经在用
dsh web,想自己定配色,而不是换一整套皮肤资源。 - 需要明暗两套令牌一起生成,避免只改亮色、暗色还是默认。
- 想把配色以 JSON 备份、在多台机器之间迁移。
不太适合:
- 只跑 headless / 非 web profile:这个插件声明的是 web 客户端。
- 想要 QQ 皮肤、桌宠、整包插画皮肤:那是目录里其它「主题与外观」插件的方向,例如目录相关条目里的
dsh-deep-whale、whale-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