🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

绝区零 H.D.D 皮肤 SkyWingDN/dsh-fairy-zzz

DeepSeek Harness
SkyWingDN3 天前有提交已提供中文文档扫描:含敏感能力

把对话界面换成绝区零 H.D.D 终端皮肤

30.7/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/11/2 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add SkyWingDN/dsh-fairy-zzz
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · ui
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
暂无时间戳·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 3 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 38 处,展示前 22 条)
  • 读取本地文件
    index.js:47
    const hint = readFileSync(VOICE_HINT, 'utf8').trim()
  • 读取本地文件
    index.js:52
    if (existsSync(join(beside, 'fairy_server.py'))) return resolve(beside)
  • 读取本地文件
    index.js:59
    if (readFileSync(VOICE_HINT, 'utf8').trim()) return 'settings'
  • 读取本地文件
    index.js:62
    if (existsSync(join(HERE, '..', 'voice', 'fairy_server.py'))) return 'portable'
  • 读取本地文件
    index.js:83
    if (!existsSync(dir)) return { ...empty, home: dir, reason: '目录不存在:' + dir }
  • 读取本地文件
    index.js:85
    if (!existsSync(server)) return { ...empty, home: dir, reason: '目录里没有 fairy_server.py' }
  • 写入本地文件
    index.js:105
    writeFileSync(VOICE_HINT, clean + '\n', 'utf8')
  • 发起网络请求
    index.js:387
    const res = await fetch(`http://127.0.0.1:${TTS_PORT}/health`, { signal: AbortSignal.timeout(1500) })
  • 执行外部命令固定命令
    index.js:422
    spawn('taskkill', ['/pid', String(stale.pid), '/t', '/f'], { stdio: 'ignore', windowsHide: true })
  • 执行外部命令来自配置/变量
    index.js:435
    const child = spawn(TTS_PY, [TTS_SERVER, '--port', String(TTS_PORT)], {
  • 执行外部命令固定命令
    index.js:481
    spawn('taskkill', ['/pid', String(child.pid), '/t', '/f'], { stdio: 'ignore', windowsHide: true })
  • 发起网络请求
    index.js:513
    res = await fetch(`http://127.0.0.1:${TTS_PORT}/tts`, {
  • 写入本地文件
    index.js:969
    mkdirSync(CACHE, { recursive: true })
  • 写入本地文件
    index.js:972
    appendFileSync(logFile, `${JSON.stringify({ t: new Date().toISOString(), ...entry })}\n`)
  • 删除本地文件
    index.js:1299
    rmSync(VOICE_HINT, { force: true })
  • 写入本地文件
    index.js:1377
    await mkdir(CACHE, { recursive: true })
  • 发起网络请求
    client.js:221
    const res = await fetch('/fairy-zzz/tts', {
  • 发起网络请求
    client.js:323
    const res = await fetch('/fairy-zzz/usage', { cache: 'no-store' })
  • 发起网络请求
    client.js:1753
    fetch('/fairy-zzz/health', { cache: 'no-store', signal: controller ? controller.signal : undefined })
  • 发起网络请求
    client.js:1793
    fetch('/fairy-zzz/voice-home', { cache: 'no-store' })
  • 发起网络请求
    client.js:1814
    fetch('/fairy-zzz/voice-home', {
  • 发起网络请求
    client.js:1839
    fetch('/fairy-zzz/engine?action=' + action, { cache: 'no-store' })
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
展开完整介绍(187 字)↓

第三方修改版(非官方),基于 AssassinVIX/fairy-zzz-plugin(MIT)与 Chengzhibense/Fairy-DSH(Apache-2.0)修改。Fairy Ⅲ / 绝区零 H.D.D 皮肤 for DeepSeek Harness:性能优化 + 用量气泡 / 拖拽眼徽 / 外观三档 / 欢迎页文案 + 可选本地 GPT-SoVITS 语音。

README

由 DeepSeek 最新模型翻译生成
⚠️ 第三方修改版(非官方)· 本仓库基于他人作品修改 本仓库不是原创项目,是在下面这些开源作品的基础上修改而来;除特别声明外,修改部分由 SkyWingDN 完成。 | 来源项目 / 作者 | 许可 | 本仓库的使用方式 | | AssassinVIX/fairy-zzz-plugin · AssassinVIX(B 站「黑塔小蛋糕」,BV1d4HK6eE3g) | MIT | 原始插件:代码基础、H.D.D 皮肤概念、开机视频与问候语资源 | | Chengzhibense/Fairy-DSH · Chengzhibense(B 站「橙汁本色」,BV1SD4C63EZz) | Apache-2.0 | 眼标 SVG,以及眼睑 / 呼吸 / 故障动效的几何与时长 | | 素材:开机视频、Fairy 角色形象 | 版权归 miHoYo / HoYoverse | 仅用于个人桌面改造,请勿商用或二次分发素材 |
展开完整文档(README 剩余 1 节)
⚠️ 第三方修改版(非官方)· 本仓库基于他人作品修改

本仓库不是原创项目,是在下面这些开源作品的基础上修改而来;除特别声明外,修改部分由 SkyWingDN 完成。

| 来源项目 / 作者 | 许可 | 本仓库的使用方式 |
| AssassinVIX/fairy-zzz-plugin · AssassinVIX(B 站「黑塔小蛋糕」,BV1d4HK6eE3g) | MIT | 原始插件:代码基础、H.D.D 皮肤概念、开机视频与问候语资源 |
| Chengzhibense/Fairy-DSH · Chengzhibense(B 站「橙汁本色」,BV1SD4C63EZz) | Apache-2.0 | 眼标 SVG,以及眼睑 / 呼吸 / 故障动效的几何与时长 |
| 素材:开机视频、Fairy 角色形象 | 版权归 miHoYo / HoYoverse | 仅用于个人桌面改造,请勿商用或二次分发素材 |

本修改版新增的内容:性能优化(常驻 rAF 归零、全屏动画静态化、资源压缩约 −68%)、v1.3.0 的「电费余额 / 今日电费 / 五倍·十倍电费」气泡、眼徽拖拽与显隐、外观三档、欢迎页文案改写、宿主 GET /fairy-zzz/usage 路由,以及一批稳定性 bug 修复;1.3.1 再把拖拽改为 transform-only + 四边吸附、用量改预取(点开即显)、气泡支持点外 / Esc 关闭;1.3.2 把拖拽与吸附范围收进会话内容区;1.3.3 把气泡文案统一成「电费」口径(谷时「五倍电费」、峰时「十倍电费」)。完整署名与许可条款见文末「致谢与许可」、NOTICE-fairy-dsh.md 与 licenses/。

Fairy Ⅲ · 绝区零 H.D.D 皮肤(性能优化修改版)

中文 · English · v1.3.3

第三方修改版,非官方。 本仓库由 SkyWingDN 基于 AssassinVIX/fairy-zzz-plugin(MIT)修改:主要工作是性能优化与资源压缩(待机主线程开销约 -94%,首屏资源约 -68%,待机 GPU 占用约 -88%),并附带少量必要的行为调整(思考态眼睑由动态呼吸改为静态半闭)。原作者与素材来源见文末「致谢与许可」,性能细节见 docs/PERFORMANCE.md。本仓库不包含 GPT-SoVITS 模型或推理引擎。

把 DeepSeek Harness 的 Web 界面换成《绝区零》Fairy 的 H.D.D 终端:满屏开机动画 → 居中问好 → 收成会话区左侧的常驻眼徽,并可用本地 GPT-SoVITS 的 Fairy 音色把回复念出来。1.3.0 起眼徽还是交互入口:点一下看电费余额 / 今日电费与电费倍率倒计时,按住可拖动,设置里可隐藏,外观支持跟随 / 深色 / 浅色。1.3.1 把拖拽改成只写元素自身 transform(165 Hz 下不再掉帧);1.3.2 再把拖拽与吸附限制在会话内容区内(左不越过侧栏、上不越过标题栏),松手吸附到该区域四边(角落两轴同时吸),点气泡外任意位置或按 Esc 即可关闭;1.3.3 把气泡文案统一成「电费」口径。

开机动画居中问好

| 眼徽状态 | 设置面板 |
| 眼徽 | 设置 |

特性

- 开机动画:整屏播放 H.D.D 启动片(带片源自带的 H.D.D 启动音效;桌面壳通常直接出声,浏览器若拦截带声音的自动播放,会先静音播放并提示点击一次开启声音),视频按 object-fit: contain 完整显示,多余区域由同帧的模糊铺底填充,任何窗口比例都不会出现硬黑边。
- 居中问好:动画结束后淡入 H.D.D 眼徽(深蓝环 / 白盘 / 蓝瞳 / 高光点),背后是蓝光晕图,HOLLOW DEEP DIVE SYSTEM 标题带镜面倒影,下方按当前时段(凌晨/上午/中午/下午/傍晚/深夜)播一句问候并同步播放预录音频。
- 收成眼徽:问候结束约 1.9s 后眼徽飞到会话区左缘的中线(侧栏右侧的蓝色圈内)常驻,光晕图淡出;眼徽本身是状态指示,点击会弹出电费气泡(见下),按住可拖动。
- 状态动效(纯 CSS 时间线驱动,无常驻 JS 主循环;几何与时长移植自 Fairy-DSH):
- idle 四层眼球呼吸(1440ms 主时钟,层间 45/90/180ms 相位差,cubic-bezier(.72,0,.28,1))+ 睫毛 15s 匀速旋转(与参考文档 / Fairy-DSH 实现一致;官方实拍更快,如需可改 FZ3_LASH_PERIOD_S 与 CSS 的 animation-duration)+ 5 圈睫毛脉冲光环(4s 一轮)+ 静态外圈光晕(参考实现里光晕不参与呼吸,避免重绘);
- 随机「眼闪」:待机每 1.75–3.6s 轻轻亮一下,单次 155–255ms;
- 任意表情状态下都可能随机出现「信号故障」,参数按参考文档:每 2.3–4.6s 一次,threads(feTurbulence 水平拉丝,4 拍、拍间 30–42ms、收尾 34–76ms、位移 17–29px)与 blocks(5 条横切片,2 或 4 拍、拍间 56–104ms、收尾 48–96ms、切片位移 1.4–3px)交替,视觉变量 x ±0.9px / skew ±0.24° / brightness 1.02–1.14 / contrast 1.02–1.16;表情切换时播放两段式强转场(2 拍 threads → 28ms → 6 拍,其中前 2 拍 blocks,40ms/拍,最后 28ms 清理,位移/亮度按转场增强档);故障切片只克隆眼体(不再复制外圈光晕,避免错位重影),切块故障锁定的睫毛角度在故障结束后按当前角度连续接回、不会跳帧;视觉总时长硬上限 900ms 兜底;
- thinking/working 期间保持半闭:用 clipPath 裁切整只眼球,眼睑形状固定在原呼吸的「张开」相位(静态半闭,不再随 1440ms 相位开合——这是本次唯一有意简化的动效,原因见 docs/PERFORMANCE.md);只有非运行状态才完全睁眼;表情切换瞬间播放两段故障转场;
- 外圈辉光 / 氛围光 / 眼闪改为静态多层渐变(不再使用实时 drop-shadow / blur() 逐帧重栅格化),大眼阶段稳定接近 60fps;
- 页面隐藏时自动暂停故障与装饰动画;系统「减少动态效果」(含 Windows 关闭动画效果)不再降级——插件固定保持完整动效。
- 性能:待机 / 思考时主线程约 1–2.5%(原版约 31–41%),常驻 rAF 归零;页面隐藏时暂停轮询与动画;首屏资源约 2.9 MB(原约 9.0 MB);GPU 待机约 5%(原版约 43%,同机 165 Hz headless 实测)——真正的开销是两处全屏动画层,已把背景漂移静态化、氛围光呼吸改为 500ms 环境时钟。v1.2.1 清理死代码 / 死样式后 client.js 从 109 KB 降到 94 KB(约 −14%,无行为变化)。详见 docs/PERFORMANCE.md。v1.3.0 的气泡 / 拖拽 / 主题三档都是按需、静态或交互期路径,没有新增常驻动画或定时器;v1.3.1 把拖拽从「每帧改 :root 变量」改成「只写元素自身 transform + rAF 合并」(24 次 pointermove 合计 146–201ms、零长任务),并给气泡加了用量预取缓存。代码体积 client.js 151,180 B / 3,119 行、index.js 47,855 B / 1,391 行(零构建、运行期零依赖)。
- 品牌位替换:隐藏官方 SVG 字标,在原位置叠上 Fairy 眼徽 + 斜体 Fairy 字标,位置由量测官方元素得到,随窗口自适应。
- 欢迎页品牌位(1.1.1 新增):接管 conversation.hero.brand.mark 槽位,把新会话欢迎页「探索未至之境」标题左侧的 DeepSeek 鲸鱼 logo 换成同一个 Fairy 眼标;复用静态 SVG,不增加动画开销,悬停时跟随官方 fish 类一起轻微摆动。见 docs/TECHNICAL.md。
- 主题:深蓝玻璃 + 青蓝霓虹 token、网格与扫描线壁纸、H.D.D 风滚动条与焦点光。
- 语音:开场问候是预录 mp3(不依赖引擎);后续回复可自动朗读或点按钮朗读,走本地 GPT-SoVITS(CPU 推理)。本仓库不含模型与引擎,需按下方说明自行部署。
- 设置面板:DSH 的「设置 → Fairy」里集中管理朗读开关、引擎状态、引擎目录、试听/重播/测试、眼徽拖动 / 显隐 / 复位与外观三档。
- 电费气泡(1.3.0 新增,1.3.3 改文案):点一下眼徽弹出「电费余额 / 今日电费 / 电费倍率倒计时」气泡(谷时显示「五倍电费」、峰时显示「十倍电费」,每轮回答结束还会自动弹一次本轮结算,18s 自动关);数据由宿主 /fairy-zzz/usage 增量解析会话日志得到;dock 后 700ms 空闲预取,点开即显(实测 65–166ms);点气泡外任意位置或按 Esc 关闭。
- 拖拽与外观(1.3.0 新增,1.3.1 重写):按住眼徽可拖到任意位置(重启后保持),松手时距会话内容区边缘 64px 内会吸附到四边(角落两轴同时吸);拖拽与停靠都被限制在会话内容区里(左边界 = 侧栏右缘、上边界 = 标题栏底缘,右 / 下 = 窗口边缘),不会盖住侧栏或标题栏;拖动只写眼徽自身的 transform、用 requestAnimationFrame 合并,165 Hz 下无长任务(旧实现每个 pointermove 都改 :root 变量,整页样式重算);落点若被 z-index 更高的悬浮组件(如 dsh-whale-widget 鲸鱼挂件)盖住,会自动沿吸附边让位;设置里能关闭拖动、隐藏眼徽或复位;外观支持「跟随宿主 / 强制深色 / 强制浅色」三档;欢迎页标题与「预览版」徽章文案也已改写。

| 电费气泡 | 浅色外观 |
| 电费气泡 | 浅色外观 |

性能(本修改版重点)

原版插件用常驻 requestAnimationFrame 主循环逐帧驱动机体动效;本版改为纯 CSS 时间线,并把思考态眼睑的逐帧 SVG 裁切改为静态形状。同机 headless Chrome 10 秒稳态实测:

| 场景 | 原版主线程 | 本版主线程 |
| 侧栏待机 | 31.2% | 1.8% |
| 模型思考中 | 30.9% | 1.6% |
| 问候页待机 | 41.1% | 2.5% |

首屏运行时下载从约 9.0 MB 降到约 2.9 MB;静态资源改为 ETag/304 协商缓存,刷新不再重传多 MB。测量方法、取舍与复测思路见 docs/PERFORMANCE.md。

GPU 占用(v1.2.0)

用户实测:核显下开着插件 GPU 平均 80–90%,关掉插件约 10%。测量条件:headless Chrome 156 真实加载插件页面,165 Hz 显示器,视口 1610×883 @ dpr 1.5,20 秒采样窗口(丢弃前 2 个样本),同一轮内做相对比较。
| 场景 | 修改前 v1.1.1 | 本版 v1.2.0 |
| dock 待机 GPU 引擎平均占用 | 43.1% | 5.1%(约 −88%) |
| boot 开机阶段 | — | 9.9%(主要是视频解码) |

结论:真正的开销是两处全屏动画层(背景 40s 漂移、氛围光 14s 呼吸),不是眼徽本身;小面积动画(128px 眼徽、384px 脉冲环)几乎免费。165 Hz 高刷屏上,任何全屏层只要每帧变化,整个屏幕就要重新合成,代价随刷新率翻倍。

GPU 归因:两处全屏动画层占了大头 dock 待机 GPU 前后对比(BEFORE 43% / AFTER 5%)

图注:上图为 dock 待机时逐项关闭各层的 GPU 归因;下图为整页截图的前后对比。完整数据、失败方案与复测方法见 docs/PERFORMANCE.md 第 9 节。

安装

需要 DeepSeek Harness(插件只在运行时调用宿主提供的槽位与 webServer,不直接 import @deepseek-ai/)。

本仓库是性能优化修改版;原始插件与素材来自 AssassinVIX/fairy-zzz-plugin,只想用原生版本请去上游。

方式一:让智能体装(推荐)

git clone https://github.com/SkyWingDN/dsh-fairy-zzz.git

然后在 DSH 会话里:

plugin_manager install_bundle target=<克隆下来的目录>

方式二:手动合并补丁

把本仓库根目录 cordis.patch.yml 里的 insert 段合并进你的配置档补丁(Windows 一般是 %USERPROFILE%\.dsh\profiles\<profile>\cordis.patch.yml):

- insert:
- id: fairy-zzz-skin
name: 'dsh-fairy-zzz'

装好后整页刷新一次。皮肤只做「插入一行 + 宿主注册若干本地 HTTP 路由」,不修改宿主的任何文件。

方式三:Windows 一键脚本

powershell -ExecutionPolicy Bypass -File .\install-windows.ps1 # 装 powershell -ExecutionPolicy Bypass -File .\install-windows.ps1 -Uninstall # 卸

脚本会自己找配置档、把插件放进 node_modules\dsh-fairy-zzz、补补丁、把浅色主题改成深色。不放心脚本改文件的话用方式一/二。

从旧版升级:1.0.0 起包名从 @local/dsh-fairy-zzz 改成 dsh-fairy-zzz(为了能被收录与 npm 安装)。
老安装请把配置档补丁里的 name: '@local/dsh-fairy-zzz' 改成 name: 'dsh-fairy-zzz',并把插件目录从 node_modules\@local\dsh-fairy-zzz 换到 node_modules\dsh-fairy-zzz。

从 1.1.0 起本仓库为性能优化修改版(仓库地址改为 SkyWingDN/dsh-fairy-zzz),包名与路由不变;升级时直接覆盖 client.js、index.js、assets/ 后重启 DSH 即可。

1.1.1 只改 client.js(新增欢迎页品牌位,无新资源),从 1.1.0 升级只需覆盖这一个文件并重启 DSH。

1.2.0 只改 client.js(GPU:背景漂移静态化 + 氛围光呼吸改为 JS 环境时钟;无新资源)——覆盖 client.js 后整页刷新即可。

1.2.1 只改 client.js 与 index.js(删除死代码与死样式,无行为变化;无新资源)——覆盖这两个文件后整页刷新即可;client.js 从 109 KB 降到 94 KB(约 −14%)。

1.3.0 改 client.js、index.js 与 package.json(新增用量 / 花费气泡、眼徽拖拽与显隐、外观三档、欢迎页文案,宿主新增 /usage 路由;package.json 版本号 1.3.0;无新资源,新增两张文档图见 docs/img/usage-bubble.jpg、theme-light.jpg)——覆盖后重启 DSH(host 路由变了)并整页刷新。

1.3.1 只改 client.js 与 package.json(拖拽重写为 transform-only + 四边吸附 + 遮挡让位、用量预取缓存、气泡点外 / Esc 关闭、设置页删掉「(本地 CPU 推理)」后缀;无新资源)——覆盖 client.js 后整页刷新即可。

1.3.2 只改 client.js 与 package.json(拖拽 / 吸附范围限制在会话内容区,边界在指针按下时实时测量,打开会话导致标题栏变高也会自动适配;无新资源)——覆盖 client.js 后整页刷新即可。

1.3.3 改 client.js、index.js 与 package.json(气泡文案统一为「电费」口径:用量→电费、余额→电费余额、今日花费→今日电费、峰谷→五倍电费 / 十倍电费;无新资源)——覆盖后重启 DSH(host 的 peak 文案变了)并整页刷新;只覆盖 client.js 也能看到新文案(客户端会兜底改写旧宿主的「高峰 / 空闲」字样)。

presets/fairy-mode.patch.yml 是可选的「Fairy 模式」智能体预设(毒舌 AI 腔、称你为「主人」)。
它依赖较多 @deepseek-ai/dsh- 插件,不同 DSH 版本的工具集不一样,所以默认不在补丁里启用;想用就按文件开头的说明把它追加到 profile patch,并确认列出的插件在你的版本里都存在。

设置(设置 → Fairy)

| 控件 | 说明 |
| 自动朗读回复 | 助手回答完成后自动念出来;关掉也可以单独点消息旁的朗读按钮 |
| 语音引擎 | 引擎状态灯:绿=就绪,黄=启动中,灰=未运行 |
| 语音引擎目录 | 输入引擎目录 → 保存(写入 <插件目录>/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 环境变量(兼容)。

都没找到时皮肤照常工作,设置面板会提示去指定目录。

本仓库不含 GPT-SoVITS 模型、参考音频与推理引擎——请自行部署;插件只自带预录问候 mp3。

其它环境变量:

| 变量 | 默认 | 说明 |
| FAIRY_TTS_PORT | 9800 | 引擎监听端口 |
| FAIRY_CACHE_DIR | <插件目录>/cache | 合成语音与磁盘缓存位置 |

引擎日志写在引擎目录下的 server.log。CPU 加载约 20s,加载完成前设置面板显示「启动中」。

路由

宿主半边只注册这些只读/本地路由(前缀 /fairy-zzz):

| 方法 | 路径 | 说明 |
| GET | /fairy-zzz/assets/<file> | boot-opt.mp4 / poster.jpg / hero.webp / icon-180.png / voice/greet-.mp3(支持 ETag/304、HEAD、Range/If-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(以宿主 agents 注册表的权威快照驱动眼徽;加 ?diag=1 返回诊断) |
| GET | /fairy-zzz/voice-home | 当前引擎目录与来源 |
| POST | /fairy-zzz/voice-home | 保存 / 校验引擎目录 |
| GET | /fairy-zzz/engine | 引擎进程状态 |
| POST | /fairy-zzz/engine | { action: "start" \| "stop" } |
| GET | /fairy-zzz/usage | { ok, now, peak, today, turn }:电费余额 / 今日电费(北京时区,含五倍·十倍电费计价)/ 电费倍率倒计时;增量解析会话日志,3s 记忆化(?diag=1 附诊断) |

静态资源带强 ETag / Last-Modified 与 304 协商缓存,cache/ 下的合成音频为一年 immutable;/mood、/engine、/voice-home、/usage 有 300–3000ms 记忆化(?diag=1 绕过)。

截图是怎么来的

screenshots/ 里的图不是外链:开机帧取自 assets/boot-opt.mp4,其余是离线渲染(把 client.js 里的 CSS 与眼徽 SVG 抽出来,用同一套样式渲染)。仓库里没有运行期依赖,也没有构建产物。

已知限制

- 官方字标是内联 SVG,没有可替换的文本节点;sidebar.brand.mark/name 又是 single 槽位、宿主先注册者常驻,所以皮肤用「隐藏官方字标 + 在同一位置叠自己的字标」来实现,不是真正的槽位替换。官方的 DOM 结构一改就可能要跟着调选择器。
- 桌面壳的窗口标题、菜单、侧栏条目文案属于应用本身,插件改不了。
- 与其它抢占左下/右下角落的插件(鲸鱼挂件、桌宠)同时开时,v1.3.1 起会自动沿吸附边让位到不被遮挡的位置;若对方覆盖面积过大仍可能找不到空位。
- 语音引擎是可选外部依赖,本仓库不含模型 / 引擎 / 参考音频,需自行部署(不提供模型下载)。
- 强制浅色会覆盖插件与宿主大部分外壳,但宿主少数内部组件(如输入框)仍沿用自身深色样式。

排错

| 现象 | 处理 |
| 设置里引擎一直「未运行」 | 检查引擎目录是否含 fairy_server.py、GPT-SoVITS/、models/;看 <引擎目录>/server.log |
| 保存目录后仍显示旧路径 | 旧的宿主进程没有 voice-home 路由,重启一次 DSH |
| 回复不朗读但问候能播 | 问候是预录 mp3,不走引擎;引擎没起来时只有朗读会静默失败 |
| 眼徽/字标没出现 | 确认 profile patch 里有 fairy-zzz-skin 这一行,并整页刷新 |
| 空闲时眼徽一直半闭眼(thinking) | 1.0.18 起以宿主 Agent 注册表为准,没有运行中的 Agent 就是 idle;若仍出现,完全重启 DSH 并查看 <插件目录>/cache/mood.log |
| 气泡里电费余额 / 电费倍率一直显示「—」 | 宿主还在跑旧版 index.js(没有 /usage 路由);完全重启 DSH 后刷新页面。首次冷启动解析会话日志约 0.5–0.6s 属正常。 |

目录结构

cordis.patch.yml # 一行 insert(皮肤本体) client.js # 客户端:主题、开机/问好/眼徽、设置面板、语音动作(纯 CSS 动效) index.js # 宿主:静态资源(ETag/304/Range)、TTS 队列与缓存、心情、引擎托管 assets/ # boot-opt.mp4 / poster.jpg / hero.webp / icon-180.png / voice/.mp3 presets/ # 可选的「Fairy 模式」agent 预设 screenshots/ # 列表用截图 docs/ # 原理说明(TECHNICAL.md)、性能报告(PERFORMANCE.md,含第 9 节 GPU 归因与前后对比) docs/img/ # 文档配图:before-after-dock-eye.png、hero-brand-mark.png、gpu-attribution.png、gpu-before-after-dock.jpg、theme-light.jpg、usage-bubble.jpg licenses/ # 第三方许可全文(Apache-2.0 / Fairy-DSH NOTICE) install-windows.ps1 # Windows 安装/卸载脚本

致谢与许可

- 本仓库(SkyWingDN 的修改部分)以 MIT 发布,见 LICENSE;原始插件版权归 dsh-fairy-zzz contributors / AssassinVIX(MIT),其署名与素材版权见 NOTICE-fairy-dsh.md。
- 眼徽 SVG、动画几何与时长、眼闪 / 故障参数参考了 Chengzhibense/Fairy-DSH(Apache-2.0,Copyright 2026 Chengzhibense,commit d639887a386b0de6fef2e61c97dc268631854591;见 NOTICE-fairy-dsh.md,Apache-2.0 全文在 licenses/Apache-2.0.txt);对照视频为 BV1SD4C63EZz「可能是全网最还原的Fairy」。
- UI 皮肤创意与原始插件来自 B 站 BV1d4HK6eE3g「我把Fairy接入了DeepseekHarness?」作者 黑塔小蛋糕,及其开源仓库 AssassinVIX/fairy-zzz-plugin;感谢 @_天才小宇 的教程、橙汁本色与梁子的 Fairy 动画项目。
- 开机视频素材与角色形象版权归 miHoYo / HoYoverse 所有;Fairy 与《绝区零》为米哈游商标。这里只做个人桌面的视觉改造,请勿用于商业用途。
- 语音:本仓库不含 GPT-SoVITS 模型权重、参考音频或推理引擎,需自行部署(见上文「语音引擎」)。

非官方修改版。 本仓库由 SkyWingDN 维护,基于 AssassinVIX/fairy-zzz-plugin(MIT)。这里的主要工作是性能优化与素材压缩(空闲主线程开销约 -94%,首屏载荷约 -68%,空闲 GPU 占用约 -88%),另外有意简化了一处动效(thinking 眼睑改为静态半闭形状,不再逐帧做 SVG clip 动画)。具体数字与归因见 docs/PERFORMANCE.md。本仓库不含 GPT-SoVITS 模型或推理引擎。

⚠️ 第三方修改(非官方)· 本仓库建立在他人成果之上

这不是原创项目。 它是下列开源作品的修改版;除特别说明外,修改均由 SkyWingDN 完成。

| 上游项目 / 作者 | 许可 | 本仓库如何使用 |
| AssassinVIX/fairy-zzz-plugin · AssassinVIX(Bilibili:黑塔小蛋糕,BV1d4HK6eE3g) | MIT | 原始插件:代码库、H.D.D 皮肤概念、开机视频和问候素材 |
| Chengzhibense/Fairy-DSH · Chengzhibense(Bilibili:橙汁本色,BV1SD4C63EZz) | Apache-2.0 | 眼部徽章 SVG,以及眼睑、呼吸和故障动画的几何与时间参数 |
| 素材:开机视频、Fairy 角色 | 版权归 miHoYo / HoYoverse | 仅限个人桌面使用——不得再分发素材,也不得用于商业用途 |

本版新增:性能优化(不再常驻 rAF、全屏图层改为静态、首屏素材体积缩小约 68%)、1.3.0 的费用气泡(费用余额 / 今日费用 / 5×·10× 费用倒计时)、可拖动可隐藏的眼部徽章、三种外观模式、重写的欢迎页文案、宿主侧 GET /fairy-zzz/usage 路由,以及一批稳定性修复;1.3.1 又把拖动改为只写 transform,并支持四边吸附,预取用量数据(气泡秒开),点击气泡外部任意位置或按 Esc 即可关闭;1.3.2 再把拖动和吸附限制在对话内容区(不会盖住侧边栏或页头);1.3.3 把气泡文案改为「使用费」口径(费用余额 / 今日费用 / 5× 低谷 · 10× 高峰倒计时)。完整署名与许可条款见文末「署名与许可」、NOTICE-fairy-dsh.md 和 licenses/。

· English · v1.3.3

这是 DeepSeek Harness 的 Fairy Ⅲ · 绝区零 H.D.D 皮肤的非官方性能优化版。

它把 DSH 网页界面变成 Fairy 的 H.D.D 终端:先播放全屏开机动画,再显示居中的问候语,然后徽章收进对话区左边缘,变成常驻的眼部徽章——回复还能用本地 GPT-SoVITS Fairy 音色朗读。从 1.3.0 起,徽章也是交互入口:点一下看费用余额 / 今日费用 / 费用倍率倒计时,按住可以拖到任意位置,在设置里能隐藏,外观可选跟随宿主 / 深色 / 浅色。从 1.3.1 起,拖动只写徽章自身的 transform(165 Hz 屏幕上不掉帧),松手后徽章吸附到边缘;从 1.3.2 起,拖动和吸附都限制在对话内容区内(不会盖住侧边栏或页头),并且每次按下指针都会重新测量区域,所以打开对话后页头变高也能自动适配。点击气泡外部任意位置或按 Esc 即可关闭。从 1.3.3 起,气泡文案改为使用费计量:低谷 5× 费用,高峰时段 10× 费用。

开机动画居中问候

| 眼部徽章状态 | 设置面板 |
| Eye badge | Settings |

功能

- 启动动画 —— H.D.D 启动短片铺满屏幕,并带上内置的 H.D.D 启动音效(桌面外壳通常会立刻播放;如果浏览器拦截了带声音的自动播放,短片会静音开始,显示一条简短提示,首次点击时开启声音)。视频使用 object-fit: contain,剩余区域用同一帧的模糊副本填充,所以无论窗口比例如何,都不会出现生硬的黑边。
- 居中问候 —— 短片结束后,H.D.D 眼睛徽章(深蓝圆环 / 白色圆盘 / 蓝色虹膜 / 高光点)在蓝色光晕上淡入,同时出现镜像的 HOLLOW DEEP DIVE SYSTEM 标题和按时段变化的问候语(凌晨 / 早上 / 中午 / 下午 / 傍晚 / 深夜),并播放对应的预录音频片段。
- 徽章交接 —— 问候出现约 1.9 s 后,徽章飞到对话区左边缘的中间位置(侧边栏旁的蓝色圆环内)并停在那里,光晕随之淡出。徽章是状态指示器,也是交互点:点击打开费用气泡(见下文),按住并拖动可以移动它。
- 状态动画(仅由 CSS keyframes 驱动 —— 没有常驻 JS 循环;几何参数与时长移植自 Fairy-DSH):
- idle —— 四层眼球呼吸(1440 ms 主时钟,45/90/180 ms 层偏移,cubic-bezier(.72,0,.28,1)),15 s 睫毛旋转(与参考文档 / Fairy-DSH 实现一致;官方过场动画更快 —— 如果你更喜欢,可以同时调整 FZ3_LASH_PERIOD_S 和 CSS 的 animation-duration),五个同心睫毛脉冲环(4 s 周期),以及静态外圈光晕(参考实现的光晕不呼吸,这样也避免了重绘);
- 每 1.75–3.6 s 随机眨眼一次,每次 155–255 ms;
- 性能:空闲 / 思考时约占单核 CPU 的 1–2.5%(上游:约 31–41%),常驻 rAF 请求为零;页面隐藏时轮询和动画暂停;初始载荷约 2.9 MB(上游约 9.0 MB);空闲 GPU 约 5%(v1.1.1:同一块 165 Hz 显示器上约 43%,无头测量)—— 真正的开销来自两个全屏动画层,所以背景漂移现在改为静态,氛围呼吸改由 500 ms 的 JS 环境时钟驱动。v1.2.1 清理死代码后,client.js 从 109 KB 降到 94 KB(约 −14%,行为不变)。从 1.3.0 起,气泡 / 拖动 / 主题相关新增都走按需、静态或交互时路径,没有常驻动画或定时器;v1.3.1 把拖动从「每帧重写 :root 变量」改为「写入徽章自身的 transform,并用 requestAnimationFrame 合并」(24 次 pointermove 事件:总计 146–201 ms,零长任务),还为气泡加了用量预取缓存;client.js 现在为 151,180 B / 3,119 行,index.js 为 47,855 B / 1,391 行(零构建,零运行时依赖)。详情见 docs/PERFORMANCE.md。
- 任意表达式状态下都可能出现随机信号故障,参数以参考文档为准:每 2.3–4.6 s 出现一次,交替使用 threads(feTurbulence 水平撕裂,4 个脉冲,间隔 30–42 ms,淡出 34–76 ms,位移 17–29 px)和 blocks(五条水平切片,2 或 4 个脉冲,间隔 56–104 ms,淡出 48–96 ms,切片偏移 1.4–3 px);视觉变量为 x ±0.9 px、skew ±0.24°、brightness 1.02–1.14、contrast 1.02–1.16。表达式切换时播放两段式强过渡故障(2 个 threads 脉冲 → 28 ms → 6 个脉冲,前 2 个为 blocks,每脉冲 40 ms,清理 28 ms,并使用提高后的过渡强度范围);故障切片只克隆眼体(外圈光晕不再复制,因此没有偏移重影),blocks 故障期间锁定的睫毛角度会在故障结束时持续重新锚定;故障视觉效果在 900 ms 硬上限后强制清除;
- thinking / working — 智能体运行期间,眼睛保持半闭:参考实现中的裁剪机制会裁剪整个眼睛组,但眼睑形状现在是静态的(冻结在旧呼吸动画的睁开阶段),不再按 1440 ms 周期呼吸;没有任务运行时完全睁开;表达式切换时播放两段式故障过渡。这是唯一一处刻意简化的动效(见 docs/PERFORMANCE.md);
- 外圈光晕、氛围辉光和闪光改为静态分层渐变,不再使用实时 drop-shadow / blur()(不会逐帧重新栅格化),因此 330 px 的大舞台能稳定在约 60 fps;
- 页面隐藏时,故障和装饰动效暂停;插件刻意忽略系统的「减少动态效果」设置(包括 Windows 的动画效果开关),始终保留完整动效。
- 品牌位替换 — 隐藏官方 SVG 字标,在同一位置叠加 Fairy 眼睛徽标和斜体 Fairy 字标,位置根据官方元素的测量值确定,因此能保持响应式。
- 欢迎页主视觉品牌标记(1.1.1 新增) — 插件接管 conversation.hero.brand.mark 槽位,新会话欢迎页「探索未至之境」标题左侧的 DeepSeek 鲸鱼 logo 会变成同一个 Fairy 眼睛徽标。它复用静态 SVG(不增加动画开销),并继承官方 fish 的悬停摆动效果。见 docs/TECHNICAL.md。
- 费用气泡(1.3.0 新增,1.3.3 更名) — 点击徽标打开气泡,显示费用余额、今日费用(按北京时间计算,非高峰 5 折 / 高峰 10 折计价)和费用倍率倒计时;每轮对话结束后,插件还会弹出一次性的「本轮」汇总(18 s 后自动关闭)。数据来自宿主的 GET /fairy-zzz/usage,该接口增量解析会话日志;对接后 700 ms 预取,因此打开气泡耗时 65–166 ms;点击气泡外任意位置或按 Esc 关闭。
- 拖拽与外观(1.3.0 新增,1.3.1 重写) — 按住徽标就能拖到任意位置(位置在重启后保留);松手时,只要距对话内容区边缘 64 px 以内(两个轴都算,角落也算),徽标就吸附到该边缘;拖拽区域和吸附边缘都限制在这个区域内(左 = 侧边栏右缘,上 = 页头下缘,右/下 = 窗口边缘),并在 pointerdown 时重新测量;拖拽只写徽标自己的 transform,并用 requestAnimationFrame 合并更新(165 Hz 屏幕上不会产生长任务——旧代码每次 pointermove 都重写 :root 变量,逼得整页重算样式);如果落点被 z-index 更高的浮动组件盖住(比如 dsh-whale-widget 吉祥物),徽标会沿吸附边缘向内滑动,直到露出来;设置里可以关闭拖拽、隐藏徽标或重置位置;外观支持跟随宿主 / 强制深色 / 强制浅色;欢迎页标题和「preview」徽标文案已重写。

| 费用气泡 | 浅色外观 |
| Fee bubble | Light appearance |

性能(本版)

上游插件用常驻的 requestAnimationFrame 循环驱动全部眼部动作;本版改用 CSS keyframes,并把思考时的眼皮改成静态裁剪形状。无头 Chrome,10 秒稳态窗口,同一台机器:

| 场景 | 上游主线程 | 本版 |
| 侧边栏空闲 | 31.2% | 1.8% |
| 智能体思考中 | 30.9% | 1.6% |
| 问候页空闲 | 41.1% | 2.5% |

首次下载体积从约 9.0 MB 降到约 2.9 MB,静态资源改用 ETag/304 重新校验,刷新时不再重传几 MB。测量方法、取舍和复测步骤见 docs/PERFORMANCE.md。

- 主题 — 深蓝玻璃质感,配青色霓虹 token、网格与扫描线壁纸、H.D.D 风格滚动条和焦点光晕。
- 语音 — 开场问候是预录 MP3,不需要引擎;后续回复可以自动朗读,也可以点每条消息上的按钮朗读,走本地 GPT-SoVITS(CPU 推理)。本仓库既不带模型也不带引擎;按下面的说明自行部署。
- 设置面板 — DSH 的 Settings → Fairy 管理朗读开关、引擎状态、引擎目录、采样、重放和测试,还有徽标拖拽 / 显示 / 重置和外观模式。

GPU 占用(v1.2.0)

在用户机器上:插件开启时,核显平均占用 80–90% GPU;关闭时约 10%。测量环境:无头 Chrome 156 加载真实插件,165 Hz 显示器,1610×883 视口,dpr 1.5,采样窗口 20 秒(丢弃前 2 个样本),同一次运行内做相对比较。

| 场景 | 之前(v1.1.1) | 本版 v1.2.0 |
| Dock 空闲,GPU 引擎平均 | 43.1% | 5.1%(约 −88%) |
| 启动阶段 | — | 9.9%(主要是视频解码) |

结论:真正的开销来自两个全屏动画层——40 秒的背景漂移和 14 秒的氛围光呼吸——而不是眼睛徽章本身;小动画(128 px 的眼睛和 384 px 的脉冲环)几乎不花什么代价。在 165 Hz 面板上,任何逐帧变化的全屏层都会迫使整屏重新合成,开销随刷新率线性增长。

GPU 归因:两个全屏动画层占了大头 Dock 空闲 GPU 前后对比(BEFORE 43% / AFTER 5%)

图注:第一张图在停靠状态下逐个关闭图层,以此归因 GPU 开销;第二张是整页前后对比。完整数据、失败的尝试以及如何重新测量:docs/PERFORMANCE.md 第 9 节。

交互性能(v1.3.1)

同一台机器,headless Chrome,1602×944,dpr 1.5,165 Hz:

| 指标 | v1.3.0 | v1.3.1 |
| 拖动过程中的 24 个 pointermove 事件 | 每个事件都重写 :root 变量 → 整页样式重算 | 146–201 ms(rAF 合并,无长任务) |
| 点击徽章 → 气泡数据 | 每次打开都请求 /usage 和余额(约 0.5 s+) | 65–166 ms(停靠后 700 ms 预取) |
| 松开 → 最终位置 | — | 60 ms 内吸附到位(transform 补间 170 ms,没有 1.35 s 滑行) |

这是性能优化修改版。原插件与美术素材来自 AssassinVIX/fairy-zzz-plugin;想要未修改的版本,请用上游仓库。

安装

需要 DeepSeek Harness。插件只使用运行时传入的宿主插槽和 webServer,从不 import @deepseek-ai/。

方式一 — 让智能体安装(推荐)

git clone https://github.com/SkyWingDN/dsh-fairy-zzz.git

然后在 DSH 会话里执行:

plugin_manager install_bundle target=<path to the cloned folder>

方式二 — 手动合并补丁

把 cordis.patch.yml 里的 insert 块合并进你的配置档补丁(Windows 上通常是 %USERPROFILE%\.dsh\profiles\<profile>\cordis.patch.yml):

- insert:
- id: fairy-zzz-skin
name: 'dsh-fairy-zzz'

安装完成后整页刷新一次。皮肤只插入一行,并在宿主上注册几个本地 HTTP 路由;不会改动 DSH 自带的任何文件。

方式三 — Windows 一键脚本

powershell -ExecutionPolicy Bypass -File .\install-windows.ps1 # install
powershell -ExecutionPolicy Bypass -File .\install-windows.ps1 -Uninstall # uninstall

从 1.1.0 起本仓库是性能优化版(现位于 SkyWingDN/dsh-fairy-zzz)。包名和路由都没变;升级时覆盖 client.js、index.js 和 assets/,然后重启 DSH。
1.1.1 只改动 client.js(新增欢迎页主视觉品牌标识,没有新增资源),所以从 1.1.0 升级只需替换这一个文件,然后重启 DSH。

1.2.0 只改动 client.js(GPU:静态背景漂移 + JS 驱动的大气呼吸效果;没有新增资源)——替换 client.js,刷新页面即可。

1.2.1 只改动 client.js 和 index.js(清理死代码和死 CSS,行为不变;没有新增资源)——替换这两个文件,刷新页面即可。client.js 从 109 KB 降到 94 KB(约 −14%)。

1.3.0 touches client.js, index.js and package.json (usage / cost bubble, draggable & hideable eye badge, three appearance modes, rewritten welcome copy, new host /usage route; version bumped to 1.3.0; no new assets — the two new doc images are docs/img/usage-bubble.jpg and docs/img/theme-light.jpg) — replace them, restart DSH (the host routes changed) and reload the page.

1.3.1 only touches client.js and package.json (dragging rewritten as transform-only with four-edge snapping and occlusion avoidance, usage prefetch cache, outside-click / Esc to close the bubble, the "(本地 CPU 推理)" suffix removed from Settings; no new assets) — replace client.js and reload the page.

1.3.2 only touches client.js and package.json (dragging and snapping confined to the conversation content area, with the region re-measured on pointer-down so a taller header in an open conversation adapts; no new assets) — replace client.js and reload the page.

1.3.3 touches client.js, index.js and package.json (bubble wording unified under "utility fee": usage → fee, balance → fee balance, today's cost → today's fee, peak / off-peak → 5× / 10× fee; no new assets) — replace them, restart DSH (the host peak strings changed) and reload the page; replacing client.js alone already shows the new wording because it remaps the host's old "peak / idle" text.

The script finds your profile, copies the plugin into node_modules\dsh-fairy-zzz, adds the patch and switches a light theme to dark. If you would rather not let a script edit files, use option 1 or 2.

Upgrading from older versions: from 1.0.0 the package name changed from @local/dsh-fairy-zzz to dsh-fairy-zzz (so it can be listed and installed from npm). Change name: '@local/dsh-fairy-zzz' to name: 'dsh-fairy-zzz' in your profile patch, and move the plugin directory from node_modules\@local\dsh-fairy-zzz to node_modules\dsh-fairy-zzz.

presets/fairy-mode.patch.yml is an optional "Fairy mode" agent preset (snarky AI tone, addresses you as "Master"). It depends on a lot of @deepseek-ai/dsh- plugins whose tool sets differ between DSH versions, so it is not enabled by default; to use it, append it to your profile patch as described at the top of the file and make sure every plugin it lists exists in your version.

Settings (Settings → Fairy)

| Control | What it does |
| Read replies aloud | Speaks each assistant answer when it finishes; with it off you can still use the speaker button next to a message |
| Voice engine | Engine status light: green = ready, yellow = starting, grey = not running |
| Engine directory | Type a directory → Save (writes <plugin dir>/voice-home.txt), Detect (validate without saving), Clear (back to auto-detection) |
| Start / Stop engine | Host-managed engine start and stop |
| Refresh status | Re-probe immediately |
| Play greeting / Replay boot | Replay the latest greeting audio / run the boot → greeting → badge sequence again |
| Test voice / Stop | Synthesize a test line / stop current playback |
| Drag badge | On: hold and drag the badge anywhere; Off: it stays fixed |
| Show badge | Hiding removes the badge and its bubble (turn it back on here) |
| Reset position | Restore the badge to the default spot (middle of the conversation's left edge) |
| Appearance | Follow host / Force dark / Force light |

Voice engine (optional)

The skin, the boot animation and the pre-recorded greeting need no engine — only "read replies aloud" does.

The engine directory must contain:

<engine dir>/
fairy_server.py # entry point (--port)
GPT-SoVITS/ # the engine itself
models/ # Fairy's .pth / .ckpt and reference audio
py311/ # optional: portable Python

Lookup order (a user-specified directory always wins):

1. <plugin dir>/voice-home.txt — the directory saved in the settings panel;
2. the FAIRY_VOICE_HOME environment variable;
3. voice/ next to the plugin (portable bundle);
4. the legacy FAIRY_TTS_DIR environment variable (compatibility).

This repository contains no GPT-SoVITS model, reference audio or inference engine — deploy your own; the only audio shipped is the pre-recorded greeting MP3s.

If none of them is found the skin still works, and the settings panel points you to the directory field.

Other environment variables:

| Variable | Default | Description |
| FAIRY_TTS_PORT | 9800 | Port the engine listens on |
| FAIRY_CACHE_DIR | <plugin dir>/cache | Where synthesized audio and the disk cache go |

Engine logs are written to server.log in the engine directory. Loading on CPU takes about 20 s; until it finishes the settings panel shows "starting".

HTTP routes

The host side only registers these read-only/local routes (prefix /fairy-zzz):

| Method | Path | Description |
| GET | /fairy-zzz/assets/<file> | boot-opt.mp4 / poster.jpg / hero.webp / icon-180.png / voice/greet-.mp3 (strong ETag/304, HEAD, Range/If-Range) |
| GET | /fairy-zzz/audio/<hash>.wav | Synthesized-audio cache (Range supported) |
| POST | /fairy-zzz/tts | { text } → { url, cached, seconds }; strips markdown/code blocks and truncates to 500 characters |
| GET | /fairy-zzz/health | { ok, engine, voice, speed, home } |
| GET | /fairy-zzz/mood | idle / thinking / working / done (drives the badge; reads the host agents registry as the authoritative snapshot, add ?diag=1 for diagnostics) |
| GET | /fairy-zzz/voice-home | Current engine directory and where it came from |
| POST | /fairy-zzz/voice-home | Save / validate the engine directory |
| GET | /fairy-zzz/engine | Engine process state |
| POST | /fairy-zzz/engine | { action: "start" \| "stop" } |
| GET | /fairy-zzz/usage | { ok, now, peak, today, turn }: balance / today's cost (Beijing-time day, peak / off-peak pricing) / peak-hour countdown; incremental session-log parsing, 3 s memo (?diag=1 for diagnostics) |

Static assets are served with strong ETag / Last-Modified and 304 revalidation; synthesized audio under cache/ is immutable for one year; /mood, /engine, /voice-home and /usage are briefly memoised (300–3000 ms, ?diag=1 bypasses).

How the screenshots were made

The images in screenshots/ are not remote links: the boot frame is taken from assets/boot-opt.mp4, and the rest are rendered offline by extracting the CSS and the eye-badge SVG from client.js and rendering them with the same styles. The repository has no runtime dependencies and no build output.

Known limitations

- The official wordmark is inline SVG with no replaceable text node, and sidebar.brand.mark/name are single slots that the first registrant keeps, so the skin hides the official wordmark and overlays its own at the same position instead of doing a real slot replacement. If the official DOM changes, the selectors may need updating.
- The desktop shell's window title, menus and sidebar labels belong to the app itself; a plugin cannot change them.
- Other plugins that claim the bottom-left/right corners (whale widget, desktop pet) may look cluttered when enabled together.
- The voice engine is an optional external dependency; this repository ships no weights, engine or reference audio — deploy your own.
- Forced light mode restyles the plugin and most of the host shell, but a few host-internal components (e.g. the composer) keep their own dark styling.

Troubleshooting

| Symptom | Fix |
| The engine stays "not running" in Settings | Check that the engine directory has fairy_server.py, GPT-SoVITS/ and models/; read <engine dir>/server.log |
| The old path is still shown after saving | The old host process has no voice-home route; restart DSH once |
| Replies are not spoken but the greeting plays | The greeting is a pre-recorded MP3 and does not use the engine; with no engine running only read-aloud fails silently |
| No badge or wordmark appears | Check that fairy-zzz-skin is in your profile patch and reload the whole page |
| The badge stays half-closed (thinking) while idle | Since 1.0.18 the mood follows the host agent registry, so no running agent means idle; if it persists, fully restart DSH and read <plugin dir>/cache/mood.log |
| Fee balance / fee multiplier in the bubble stay at "—" | The host is still running the old index.js (no /usage route); fully restart DSH and reload the page. The first cold parse of the session logs takes ~0.5–0.6 s, which is normal. |

Repository layout

cordis.patch.yml # one insert line (the skin itself)
client.js # client: theme, boot/greeting/badge, settings panel, voice actions (CSS-only motion)
index.js # host: static assets (ETag/304/Range), TTS queue and cache, mood, engine supervision
assets/ # boot-opt.mp4 / poster.jpg / hero.webp / icon-180.png / voice/.mp3
presets/ # optional Fairy mode agent preset
screenshots/ # screenshots used above
docs/ # technical guide (TECHNICAL.md), performance report (PERFORMANCE.md, incl. the v1.2.0 GPU section)
docs/img/ # doc images: before-after-dock-eye.png, hero-brand-mark.png, gpu-attribution.png, gpu-before-after-dock.jpg, theme-light.jpg, usage-bubble.jpg
licenses/ # third-party license texts (Apache-2.0 / Fairy-DSH NOTICE)
install-windows.ps1 # Windows install/uninstall script

Credits & license

- The modifications in this repository are released under the MIT license (see LICENSE); the original plugin copyright belongs to dsh-fairy-zzz contributors / AssassinVIX (MIT), with attribution and asset credits in NOTICE-fairy-dsh.md.
- The eye-badge SVG, the animation geometry and timings, the flicker/glitch parameters reference Chengzhibense/Fairy-DSH (Apache-2.0, Copyright 2026 Chengzhibense, commit d639887a386b0de6fef2e61c97dc268631854591; see NOTICE-fairy-dsh.md and licenses/Apache-2.0.txt); the comparison video is BV1SD4C63EZz by 橙汁本色.
- The UI concept and the original plugin come from Bilibili video BV1d4HK6eE3g by 黑塔小蛋糕 and the AssassinVIX/fairy-zzz-plugin repository; thanks to @_天才小宇 for the tutorial and to 橙汁本色 / 梁子 for the Fairy animation project.
- The boot video assets and the character likeness belong to miHoYo / HoYoverse; Fairy and Zenless Zone Zero are miHoYo trademarks. This is a personal desktop visual reskin only — do not use it commercially.
- Voice: this repository does not contain GPT-SoVITS weights, reference audio or the inference engine — deploy your own.

↑ 返回中文 / Back to Chinese
预览分享卡片长什么样 ↓SkyWingDN/dsh-fairy-zzz
分享 · DeepSeek Harness Hub
SkyWingDN/dsh-fairy-zzz

把对话界面换成绝区零 H.D.D 终端皮肤

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部