dsh-fairy-zzz
H.D.D skin for the DSH Web UI: a voiced full-screen boot animation, an animated eye core (idle / thinking / done) you can drag or hide, a brand swap on the new-chat hero, a time-of-day greeting, a usage bubble with balance, today spend and the peak/off-peak countdown, the Fairy-mode agent preset, an
Install
dsh plugin --profile web add dsh-fairy-zzz
Sandbox test results
| Stage | Result |
|---|---|
| 1 install | ✓ |
| 2 list | ✓ |
| 3 mount | ✓ |
| 4 boot | — |
Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).
README
Fairy Ⅲ · 绝区零 H.D.D 皮肤
中文 · [English](#english)
把 DeepSeek Harness 的 Web 界面换成《绝区零》Fairy 的 H.D.D 终端:满屏开机动画 → 居中问好 → 收成会话区左侧的常驻眼徽,并可用本地 GPT-SoVITS 的 Fairy 音色把回复念出来。
眼徽状态 · 设置面板
 · 
特性
- 开机动画:整屏播放 H.D.D 启动片,视频按
object-fit: contain完整显示,多余区域由同帧的模糊铺底填充,任何窗口比例都不会出现硬黑边。启动片自带音轨:页面允许自动播放时直接带声音放,被浏览器拦下就先静音播放,等你第一次点按/敲键再把声音打开。 - 居中问好:动画结束后淡入 H.D.D 眼徽(深蓝环 / 白盘 / 蓝瞳 / 高光点),背后是蓝光晕图,
HOLLOW DEEP DIVE SYSTEM标题带镜面倒影,下方按当前时段(凌晨/上午/中午/下午/傍晚/深夜)播一句问候并同步播放预录音频。 - 收成眼徽:问候结束约 1.9s 后眼徽飞到会话区左缘的中线(侧栏右侧的蓝色圈内)常驻,光晕图淡出。默认可以按住拖到屏幕任意位置,坐标写进
localStorage,刷新后仍在原位;不想要拖动就去设置 → Fairy关掉「拖动眼徽」,或用「眼标复位」回到会话区左缘。 - 用量气泡:单击眼徽弹出一个小气泡,显示 DeepSeek 账户余额、今天的花费(按百万 token 折算,含缓存命中/未命中/输出三段拆分)和当前是高峰还是空闲时段(带倒计时,直接告诉你还有多久换价);再点一下收起。每轮对话跑完会自动弹一次,这时只报「本轮花费 + 峰谷」,不显示余额与今日合计,18 秒后自己消失。拖动眼徽时气泡跟着走,靠到窗口右缘会自动翻到眼徽左侧。峰谷按官方现行规则算:北京时间周一至周五 09:00–12:00、14:00–18:00 为高峰,其余时间(含周末与法定节假日全天)为空闲、价格减半;倒计时归零时气泡会自动重新拉一次数据。价格表在
index.js的PRICES,时段与节假日表在peakState()/HOLIDAY_RANGES,跨年记得补一行假期。花费按每笔请求发生那一刻的价档结算,白天的高峰用量不会被夜里的半价「折算」掉。 - 状态动效(复刻参考实现 Fairy-DSH 的几何与时长):
idle呼吸 + 缓慢自转 + 扫描光带;thinking/working上眼睑压到半闭并轻微呼吸;- 待机随机眨眼(3.4–8.6s 一次,约 24% 概率连眨,眨眼后可能瞟一眼);
- 待机随机「花屏」:把整只眼切成 2–4 条横带横向错位;
done眼睑轻扫一下;- 切进
thinking/working的瞬间如果正眨到一半,会立刻收回眨眼回到睁眼,保证思考态的眼睑一定在。 - 品牌位替换:隐藏官方 SVG 字标,在原位置叠上 Fairy 眼徽 + 斜体
Fairy字标,位置由量测官方元素得到,随窗口自适应。 - 新建对话页换标:官方 hero 的鱼标走
conversation.hero.brand.mark插槽,整只换成 Fairy 眼徽;标题与「预览版」徽章没有插槽,皮肤按界面语言在 DOM 上改写成空洞深潜系统/HOLLOW DEEP DIVE SYSTEM与H.D.D Ⅲ徽章。 - 主题:深蓝玻璃 + 青蓝霓虹 token、网格与扫描线壁纸、H.D.D 风滚动条与焦点光;跟随 DSH 的外观设置(设置 → 通用 → 外观),切到浅色时自动换成浅底深字的同一套配色。
- 语音:开场问候是预录 wav(不依赖引擎);后续回复可自动朗读或点按钮朗读,走本地 GPT-SoVITS(CPU 推理)。
- 设置面板:DSH 的「设置 → Fairy」里集中管理朗读开关、引擎状态、引擎目录、试听/重播/测试。
安装
需要 DeepSeek Harness(插件只在运行时调用宿主提供的槽位与 webServer,不直接 import @deepseek-ai/*)。
方式一:让 agent 装(推荐)
git clone https://github.com/AssassinVIX/fairy-zzz-plugin.git
然后在 DSH 会话里:
plugin_manager install_bundle target=<克隆下来的目录>
方式二:手动合并 patch
把本仓库根目录 cordis.patch.yml 里的两个 insert 段一起合并进你的 profile patch(Windows 一般是 %USERPROFILE%\.dsh\profiles\<profile>\cordis.patch.yml):
- insert:
- id: fairy-zzz-skin
name: 'dsh-fairy-zzz'
- insert:
- id: preset-fairy
name: '@deepseek-ai/dsh-agent-preset'
config: { ... } # 完整内容见仓库里的 cordis.patch.yml
装好后整页刷新一次。皮肤只做「插入一行 + 宿主注册两条 HTTP 路由」,不修改宿主的任何文件。
方式三:Windows 一键脚本
powershell -ExecutionPolicy Bypass -File .\install-windows.ps1 # 装 powershell -ExecutionPolicy Bypass -File .\install-windows.ps1 -Uninstall # 卸
脚本会自己找 profile、把插件放进 node_modules\dsh-fairy-zzz、补 patch、把浅色主题改成深色。不放心脚本改文件的话用方式一/二。
从旧版升级:1.0.0 起包名从@local/dsh-fairy-zzz改成dsh-fairy-zzz(为了能被收录与 npm 安装)。
老安装请把 profile patch 里的name: '@local/dsh-fairy-zzz'改成name: 'dsh-fairy-zzz',
并把插件目录从node_modules\@local\dsh-fairy-zzz换到node_modules\dsh-fairy-zzz。
「Fairy 模式」预设(随插件安装)
插件自带的 cordis.patch.yml 里除了皮肤本体,还插入了 preset-fairy——只装人设的 agent 预设:
预设里只有 @deepseek-ai/dsh-persona 一项,不带任何工具、上下文或其它插件,工具集沿用你当前 DSH 的配置,
预设只负责 Fairy 的语气与身份。装好插件、重启 DSH 后,新建会话的模式选择器里就会多出「Fairy 模式」。
presets/fairy-mode.patch.yml 是同一份内容的独立版,留给「只想用人设、不装皮肤」的人单独合并进 profile patch。
如果你以前手动往 profile patch 里追加过 preset-fairy,请把旧的那段删掉,否则会出现两份同名预设。
皮肤本体与这个预设互不依赖:不装预设也有皮肤,不装皮肤也能用预设。
设置(设置 → Fairy)
控件 · 说明
自动朗读回复 · 助手回答完成后自动念出来;关掉也可以单独点消息旁的朗读按钮
拖动眼徽 · 默认开启:眼标停在会话区左缘,按住可以拖到屏幕任意位置,位置记在浏览器里;关掉则锁回会话区左缘
显示眼徽 · 关掉后眼徽与用量气泡一起消失,屏幕上不再有任何浮层;随时可以在这一行重新打开
外观 · 跟随 DSH 的浅色 / 深色;也可以强制 深色 或 浅色,用来避开某个外观下看不清的字
语音引擎 · 引擎状态灯:绿=就绪,黄=启动中,灰=未运行
语音引擎目录 · 输入引擎目录 → 保存(写入 <插件目录>/voice-home.txt)、检测(只校验不保存)、清除(回到自动探测)
启动引擎 / 停止引擎 · 由宿主进程托管引擎的启停
刷新状态 · 立即重新探测一次
试听问候 / 重播开机动画 · 重放最新问候音频 / 重新走一遍开机 → 问好 → 收成眼徽
眼标复位 · 忘掉拖动记下的坐标,把眼标放回会话区左缘的默认锚点
测试语音 / 停止 · 合成一句测试语音 / 停止当前播放
语音引擎(可选)
皮肤、开机动画、预录问候都不需要引擎;只有「把回复念出来」需要。
引擎目录里需要有:
<引擎目录>/ fairy_server.py # 引擎入口(--port 指定端口) GPT-SoVITS/ # 引擎本体 models/ # Fairy 的 .pth / .ckpt 与参考音频 py311/ # 可选:便携 Python
目录的查找顺序(用户指定的永远优先):
1. <插件目录>/voice-home.txt —— 在设置面板里保存的那个目录;
2. FAIRY_VOICE_HOME 环境变量;
3. 插件同级 voice/(免安装便携包);
4. 旧版 FAIRY_TTS_DIR 环境变量(兼容)。
都没找到时皮肤照常工作,设置面板会提示去指定目录。
其它环境变量:
变量 · 默认 · 说明
FAIRY_TTS_PORT · 9800 · 引擎监听端口
FAIRY_CACHE_DIR · <插件目录>/cache · 合成语音与磁盘缓存位置
引擎日志写在引擎目录下的 server.log。CPU 加载约 20s,加载完成前设置面板显示「启动中」。
路由
宿主半边只注册这些只读/本地路由(前缀 /fairy-zzz):
方法 · 路径 · 说明
GET · /fairy-zzz/assets/<file> · boot.mp4 / poster.jpg / hero.png / voice/greet-*.wav(支持 Range)
GET · /fairy-zzz/audio/<hash>.wav · 合成语音缓存(支持 Range)
POST · /fairy-zzz/tts · { text } → { url, cached, seconds },清 markdown/代码块后截 500 字
GET · /fairy-zzz/health · { ok, engine, voice, speed, home }
GET · /fairy-zzz/mood · idle / thinking / working / done(驱动眼徽状态)
GET · /fairy-zzz/usage · { peak, today, turn }:今日与本轮的 token 用量、折算花费、当前峰谷时段(聚合本机会话日志)
GET · /fairy-zzz/voice-home · 当前引擎目录与来源
POST · /fairy-zzz/voice-home · 保存 / 校验引擎目录
GET · /fairy-zzz/engine · 引擎进程状态
POST · /fairy-zzz/engine · { action: "start" \ · "stop" }
截图是怎么来的
screenshots/ 里的图不是外链:开机帧取自 assets/boot.mp4,其余是离线渲染(把 client.js 里的 CSS 与眼徽 SVG 抽出来,用同一套样式渲染)。仓库里没有运行期依赖,也没有构建产物。
已知限制
- 官方字标是内联 SVG,没有可替换的文本节点;
sidebar.brand.mark/name又是single槽位、宿主先注册者常驻,所以皮肤用「隐藏官方字标 + 在同一位置叠自己的字标」来实现,不是真正的槽位替换。官方的 DOM 结构一改就可能要跟着调选择器。 - 桌面壳的窗口标题、菜单、侧栏条目文案属于应用本身,插件改不了。
- 新建对话页的标题与徽章没有插槽可换,皮肤直接改写 DOM 文本,并用 900ms 的低频定时器兜底重刷;官方若把它们改成多节点或富文本结构,选择器要跟着调。
- 与其它抢占左下/右下角落的插件(鲸鱼挂件、桌宠)同时开时观感会打架。
- 语音只有仓库自带的一条问候;逐句朗读要自备 Fairy 语音包(见上面语音章节),引擎和权重都不在仓库里。
- 语音引擎是可选外部依赖,仓库不含权重与引
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::5,最后更新 2026-10-29