DeepSeek Harness(DSH)的桌宠与挂件套件 ·
v0.7.7
小鲸鱼余额挂件 + 桌宠(106 段透明动画)+ QQ 消息卡,QQ / B站 / 双向脱敏记忆由包内自带的 SurfCore 提供。
English: an all-in-one DeepSeek Harness (DSH) plugin — balance whale widget, transparent desktop pet, QQ chat through AstrBot (plugins) with every conversation mirrored into its own DSH session, Bilibili dynamics/comments, and local redacted memory. One plugin for the DSH web GUI; data stays on this machine.
在 DSH「添加插件」里怎么填:粘贴
github:louke6572/dsh-Dfy(或完整地址https://github.com/louke6572/dsh-Dfy)。不要输入dsh-Dfy—— 那是显示名,不是包名; 而 npm 上的dsh-dfy是别人的包(同名不同项目),输入它只会装错。
只有一个插件 dsh-Dfy。以前分开安装的 surfcore、surfcore-next、whale-widget 已经合并进这一个包,
不需要也不应该再单独安装它们。
命名:界面、文档、仓库名统一写 dsh-Dfy;包名与目录名是全小写
dsh-dfy(npm / Node 的硬性要求), 所以命令里出现dsh-dfy(安装、卸载)是正常的。
| 你想要什么 | 选哪个 | 需要额外准备 |
|---|---|---|
| 余额挂件 / 桌宠,不接 QQ | 只装 dsh-Dfy | DSH + Node.js |
| QQ 聊天,越简单越好 | 内置版(默认) | 自己准备 SnowLuma 安装包 |
| 必须用 AstrBot 的插件(表情包 / 认主等) | AstrBot 版 | 独立 Python 环境 + AstrBot 本体 |
拿不准就选内置版;AstrBot 版是可选的重型方案,装不上不影响挂件和桌宠。
- DSH → 插件页 → 添加插件,填
github:louke6572/dsh-Dfy,安装并启用; - 完全退出 DSH(托盘图标也要退出)再打开;
- 浏览器
Ctrl+F5,右下角出现小鲸鱼就完成。QQ、SnowLuma、AstrBot 都不用管。
装完 DSH 打不开了?先别重装、别删
~/.dsh,直接看下面的「装崩了 / DSH 打不开:照着救」。
- 只让 DSH / Agent 装 dsh-Dfy;不要让它装 AstrBot、Python、SnowLuma 或系统依赖。
- 不要把任何东西装进
~/.dsh/profiles、~/.dsh/plugins、~/.dsh/surfcore(会锁坏正在运行的 DSH)。 - SnowLuma 仓库已转私有,没有公开下载链接;没有安装包就先只用挂件 / 桌宠。
- 内置版和 AstrBot 版只能二选一,不能同时接同一个 QQ。
- 改人格 / 配置后要**完全退出 DSH(托盘也退)**再打开,否则不生效。
违反上面任何一条,最常见的后果就是DSH 打不开——不用重装系统,按下面的「装崩了」救回来。
| 你要找的东西 | 具体位置 |
|---|---|
| DSH 数据目录(配置 / 记忆 / 日志) | %USERPROFILE%\.dsh;按 Win+R 输入这串后回车直接打开 |
| 插件管理页(安装 / 启用 / 卸载) | 打开 DSH → 设置 → 插件 |
| 本插件的设置页 | 打开 DSH → 设置 → 左侧列表里的 dsh-Dfy |
看不懂下面的词就先查这里,不用去搜:
| 名词 | 一句话解释 |
|---|---|
| DSH | 你正在用的这个软件;插件都装在它里面 |
| dsh-Dfy | 本插件:余额挂件 + 桌宠 + QQ 聊天 + 记忆 |
| profile | DSH 的「用户配置文件夹」,在 %USERPROFILE%\.dsh\profiles\ 下,常见 desktop / web |
| 桥接 | 插件里负责「把 QQ 消息转给 DSH、再把回复发回 QQ」的那部分 |
| SnowLuma | 第三方 QQ 登录程序;接 QQ 才需要,仓库已转私有,安装包自备 |
| AstrBot | 第三方 QQ 机器人框架(Python 服务);只有想要它的插件(表情包等)才装 |
| OneBot / NapCat | 另一种 QQ 接入方式,切「直连」时用,不用 SnowLuma |
| 诊断体检 | 设置页里的一键自检;红色项就是下一步要修的东西 |
关掉窗口不算退出,插件和桥接还在后台跑,改了配置也不会生效:
- 看屏幕右下角托盘(图标可能被收进
^里),找到 DSH 图标 → 右键 → 退出; - 按
Ctrl+Shift+Esc打开任务管理器 → 搜索DSH→ 如果还有进程,右键 → 结束任务; - 重新打开 DSH。
| 能力 | 说明 |
|---|---|
| 余额与用量 | 60 秒刷新;今日已用按余额差 + 会话事件记账;每轮真实 usage 换算金额;近 7 天与按日明细 |
| 峰谷 | 状态与倒计时常驻角色左下角;节假日按谷价 |
| 小鲸鱼 | 5 套表情(133 张)、情绪 / 眨眼 / 卖萌、泡泡编辑器、音效 |
| 桌宠 | 106 段动画、13 个动作分类;Q 弹、弹簧拖拽、甩抛、屏幕漫游、分身、双击弹弓 |
| 形态 | 小鲸鱼 / 桌宠 / 共存 三种互斥;共存 = 两只同时显示,各自独立位置与大小 |
| 接入二选一:内置版(默认,SnowLuma → dsh-Dfy 内置桥 → DSH)/ AstrBot 版(SnowLuma → AstrBot 插件层 → dsh_bridge → DSH);每段对话在 DSH 里独立成会话(可切模型 / 看思考 / 看上下文);信封角标 + 消息 / 记录 / 写消息三视图 | |
| B站 | 扫码登录、动态 / 评论互动、鱼群保护、昼夜作息 |
| 贴吧 | 手机扫码 / BDUSS 登录:逛吧、发帖 / 评论 / 点赞 / 签到,跟 B站 共用作息与额度 |
| AstrBot | QQ 接入与插件生态(认主 / 表情包 / 拟人…);dsh_bridge 插件随包自动安装,按 QQ 会话把消息转给 DSH |
| 记忆 | 插件内置:默认只记重要的事(不记聊天流水);每次对话按当前问题召回相关几条注入;数据只存本机 |
| 活人感 | 内置版:回复清洗、攒一攒(等说完再回)、群聊接话打分、按花费降低意愿、分段刹车、撤回/又说话作废旧回复;档位(安静/默认/话多/自定义)。AstrBot 版由 astrbot_plugin_fatfish_alive 提供 |
| 表情包 | 成熟 DSH 插件 dsh-nekowhale-stickers(大肥鱼 322 张 + 贴字模板,sticker_search/sticker_send 工具);桥接把图片行转成 QQ 图片 |
| 看图懂梗 | 内置版:回话前先把群友发的图交给视觉模型,按「字 / 画面 / 梗 / 跟你 / 坑」写清;谐音词表(夺笋=多损)、认不出的梗查 cnmeme.wiki、按图片哈希缓存。移植自 MIT 插件 astrbot_plugin_fatfish_seememe v0.4.0 |
| 梗百科 | 内置 6792 条梗 / 黑话词库(data/memewiki/memes.db,源自 MIT 插件 dsh-memewiki):QQ / 抖音里有人问「XX 是什么梗」或只甩一个生词时,回话前先把那一条词条查好塞进这一轮提示,让模型直接接梗;闲聊不注入、不联网 |
QQ → SnowLuma(登录层,扫码 / 注入 QQ 进程)→ AstrBot(接入 + 插件层)
→ dsh_bridge 插件 → DSH(每段对话一个会话)→ 回复回 QQ
- SnowLuma 只负责 QQ 登录;AstrBot 负责消息接入和插件;DSH 负责「想和说」。
- DSH 侧每段 QQ 对话一个会话(侧栏
agents工作区可见),可切模型、看思考、看上下文。 - 首次安装后 dsh-Dfy 会自动完成:识别 / 拉起 SnowLuma、写接入配置、把
dsh_bridge装进 AstrBot、校正 provider 指向。 - QQ 运行方式二选一(概览 → QQ 运行方式),默认是内置版:
- 内置版(默认):QQ → SnowLuma → dsh-Dfy 内置桥 → DSH,少一跳、回复更快;AstrBot 不接 QQ。
- AstrBot 版:QQ → SnowLuma → AstrBot(插件层)→ dsh_bridge → DSH,可用 AstrBot 的插件效果(表情包等),回复会多一跳。
- 回退方案(provider 直连,所有对话挤在一个固定会话)只在 AstrBot 版且
dsh_bridge未安装时使用,日常不需要。 切换会自动改配置、停/起对应进程并重启 SnowLuma 让连接生效;设置页导航也会整套切换: 内置版用 0.7.4/0.7.5 的原版界面(平台/角色/对话/系统,含 QQ 旧桥页),AstrBot 版只留精简的「我的鱼」界面(概览 / 我的鱼 / 桌宠 / 维护), 两边互不出现对方专属页面。
AstrBot 不是 DSH 插件,也不是 npm 包,是独立的 Python 服务。 dsh-Dfy 只负责把
dsh_bridge装进 AstrBot、校正 provider;不负责装 Python、不负责装 AstrBot 本体。
正确顺序:
- 单独装 AstrBot:独立目录 + 独立 Python 环境(例如
%USERPROFILE%\astrbot),按 astrbot.app 官方说明装;不要放进~/.dsh/profiles、~/.dsh/plugins或~/.dsh/surfcore。 - 在该目录跑一次
astrbot init,再启动 AstrBot;浏览器打开它的 WebUI(默认127.0.0.1:6185)确认能登录。 - 回到 DSH → dsh-Dfy → 维护 → AstrBot:填/识别 AstrBot 目录、WebUI 端口(6185)和可执行文件;点「初始化/启动」。
- 让 dsh-Dfy 自动安装
dsh_bridge(或手动在 AstrBot 插件页安装并启用),把 provider 指向 DSH。 - 概览 → QQ 运行方式 → 切到 AstrBot 版;重启 SnowLuma,让 QQ 走 6199 反向 WS 接进 AstrBot。
- 跑一遍「诊断体检」:AstrBot 运行、6199 接入、dsh_bridge、SnowLuma、内置桥应停止,五项都要绿。
不要做:
- 不要让 DSH Agent 在
~/.dsh或插件目录里pip install/npm install装 AstrBot:DSH 正在运行,Windows 会锁node_modules,装到一半 DSH 可能直接起不来。 - 不要把 AstrBot 目录设到
~/.dsh/profiles、~/.dsh/plugins、~/.dsh/surfcore里面;插件会拒绝从这些目录拉起 AstrBot。 - 不要同时让内置桥和 AstrBot 接同一个 QQ:会双回复/抢消息。二选一。
- 不要把 6185(WebUI)和 6199(OneBot 反向 WS)搞混:前者是 AstrBot 面板,后者才是 QQ 接入。
| 现象 | 先查什么 |
|---|---|
| AstrBot 面板打不开 | 目录是否初始化(astrbot init)、6185 是否被别的程序占用、Python 依赖是否装完 |
| AstrBot 在跑但 QQ 没反应 | 6199 有没有 OneBot 连入;SnowLuma 是否重启过;AstrBot 版是否已切换 |
| 有 QQ 消息但不经过 DSH | dsh_bridge 没装/没启用,或 provider 还在直连模型 |
| 一条消息回两遍 | 内置桥没停,和 AstrBot 同时接 QQ |
| DSH 起不来 / 依赖报错 | 是否有人把 AstrBot 或 Python 依赖装进了 DSH profile;换独立目录重装 |
如果不需要 AstrBot 的插件生态(表情包、拟人插件等),直接用默认的内置版,少一层 Python、少一半故障点。
| 项 | 要求 |
|---|---|
| 系统 | Windows 10 / 11 |
| Node.js | ≥ 22.13 |
| DSH | ≥ 0.2.1-rc.2(桌面端或 dsh web);已在 0.2.2-rc.1 实测 |
| SnowLuma | 只有接 QQ 需要;仓库已转私有,不再提供公开下载;安装包需自行准备,再用设置页「手动选择」指定目录 |
| AstrBot | 只有 AstrBot 版需要;独立 Python 环境(3.10+)+ 独立目录,不要装进 DSH profile/插件目录 |
| 余额 | DEEPSEEK_API_KEY 或 DSH「账号与余额」登录,二选一 |
不接 QQ / B站也能用:小鲸鱼与桌宠不依赖 SnowLuma。
- 插件在
package.json的engines.dsh声明>=0.2.1-rc.2:DSH 的插件市场与安装器会按这个范围在安装前拒绝过旧的 DSH,不会出现"装完才发现打不开"。 - 已在 DSH 0.2.2-rc.1(桌面版,Electron 44 / Node 24.21)实测通过;
dsh web与桌面端共用同一套宿主代码。 - 低于最低版本:先升级 DSH 再安装,不要用旧版强行解包。
- 插件加载是 fail-open 的:缺少可选服务或可选 API 时只关闭对应功能(如桌宠、B站、抖音),不会让 DSH 启动失败。
四种方式选一种,不要都做。配置与会话状态统一写在数据目录 $DSH_HOME/surfcore/qq/,不写插件包目录。
DSH「插件」页 → 发现(插件市场)搜索 dsh-Dfy,点安装;或在命令行装包:
dsh plugin --profile <profile> add github:louke6572/dsh-Dfy发现页搜不到? 那是市场索引还没收录。本仓库自带一份索引,可以直接添加: 插件 → 发现 → 添加索引源,粘贴
https://cdn.jsdelivr.net/gh/louke6572/dsh-Dfy@main/market/dsh-index.json之后搜索 dsh-Dfy 即可安装(来源是 GitHub 仓库 + 固定 commit)。 也可以不添加索引,直接在「添加插件」输入github:louke6572/dsh-Dfy。
命令行装包后还要在 DSH「插件」页把 dsh-Dfy 启用:命令行只装包,不会登记到 profile 的
dsh.profile.bundles;插件页安装会自动登记。若页面提示「构建脚本待批准」,点允许即可 (Git 安装要跑一次postinstall,修@snowluma/sdk的 ESM 打包 bug)。命令行若报
ERR_PNPM_IGNORED_BUILDS:在 profile 目录运行pnpm approve-builds,或在<profile>/pnpm-workspace.yaml的allowBuilds里加dsh-dfy: true,然后重跑安装。
装好启用后完全退出 DSH(托盘图标也要退出)再打开。首次启动会自动:
- 建数据目录
$DSH_HOME/surfcore/qq/(config.json/state//roles//pet/); - 从包内
config.example.json生成初始配置、补齐roles/模板; - 如果检测到旧版 clone 安装在仓库根留下的
config.json/state//roles//pet/, 只复制、不删除到数据目录(升级不丢配置)。
QQ 功能仍需要 SnowLuma,但它的仓库已经转私有,插件不再自动下载:需要你自己准备安装包,解压后在设置页「维护 → SnowLuma → 手动选择已安装的 SnowLuma」指定目录。没有 SnowLuma 也可以先用内置版挂件 / 桌宠。
powershell -ExecutionPolicy Bypass -c "irm https://raw.githubusercontent.com/louke6572/dsh-Dfy/main/scripts/bootstrap.ps1 | iex"这一条会依次完成:下载到 %USERPROFILE%\dsh-Dfy → npm install(失败自动换国内镜像)→ 写入 DSH profile
→ 检测本机有没有 SnowLuma → 生成 config.json。
SnowLuma 仓库已转私有,脚本不会也不能再下载它。没装 SnowLuma 时这一步会提示你手动准备, 不影响挂件 / 桌宠;要接 QQ 再按下面「SnowLuma 安装包」处理。
跑完只剩两步,都需你亲手做:
- 完全退出 DSH(托盘图标也要退出),再打开;
- 设置 → dsh-Dfy → 一键开始;第一次用 QQ 时在 SnowLuma 窗口扫码登录。
SnowLuma 是第三方专有 QQ 运行时,仓库已转私有,不再有公开 Releases 可自动下载。接 QQ 时需要:
- 从你原来的渠道 / 作者那里拿到 SnowLuma 安装包(zip 或已解压目录);
- 解压到独立目录(例如
%USERPROFILE%\SnowLuma2,里面有app); - DSH → dsh-Dfy → 维护 → SnowLuma → 手动选择已安装的 SnowLuma,选
SnowLuma.exe、app\launcher.bat或根目录; - 启动 SnowLuma,用手机 QQ 扫码登录。
没有安装包时:直接用内置版挂件 / 桌宠;或者切到「直连」模式,用你自己的 OneBot 实现(NapCat 等)接 6199。
可选环境变量(写在命令前面):
| 变量 | 作用 |
|---|---|
$env:DSHDFY_SKIP_SNOWLUMA='1' |
只装挂件 / 桌宠,不接 QQ |
$env:DSHDFY_DIR='D:\dsh-Dfy' |
装到别的目录 |
$env:DSHDFY_CHECK='1' |
只检查环境,不安装 |
帮我安装 https://github.com/louke6572/dsh-Dfy ,按仓库里的 AGENT.md 执行,需要我做的事直接说。
Agent 会跑同一套流程并自己处理报错;你仍然只做「重启 + 扫码」。重启必须由你做: Agent 通常就跑在 DSH 里,它自己重启会中断当前任务。
只让 Agent 装 dsh-Dfy 插件。不要让它安装 AstrBot / Python 依赖,也不要在
~/.dsh/profiles、~/.dsh/plugins、~/.dsh/surfcore里跑pip/npm/pnpm—— 那会把正在运行的 DSH 依赖装坏。AstrBot 请按上面的「AstrBot 版」自己装到独立目录。
git clone --depth 1 https://github.com/louke6572/dsh-Dfy.git
cd dsh-Dfy
npm install
node scripts/setup-dsh.mjs
node scripts/install-snowluma.mjs # 接 QQ 才需要;只检测,不再下载clone 安装与方式一使用同一个数据目录($DSH_HOME/surfcore/qq/),所以两种安装可以互相切换,
配置不会分叉。
curl -s -o NUL -w "%{http_code}" http://127.0.0.1:3080/dsh-whale/widget.js200/401:插件已加载(401 是路由要求会话凭据,正常)。挂件侧共 38 个/dsh-whale/*路由。- 连不上:DSH 没起来或插件没挂上,看下面的「常见问题」。
浏览器 Ctrl+F5 后,右下角出现小鲸鱼即成功。
- 市场 /
dsh plugin安装:重新执行一次dsh plugin --profile <profile> add github:louke6572/dsh-Dfy; - 一行命令安装:重跑方式二那条命令(自动
git pull+ 依赖 + 重写 profile)。
然后重启 DSH。数据在数据目录,升级不会覆盖。
dsh plugin --profile <profile> remove dsh-dfy # 推荐
node scripts/uninstall.mjs # 或脚本:默认只演练
node scripts/uninstall.mjs --yes # 真删(保留 ~/.dsh/surfcore 里的配置 / 记忆)
node scripts/uninstall.mjs --yes --purge-state # 连配置、记忆、日志一起删按顺序看,停在哪一步就修哪一步,不要一次改很多地方:
- DSH 插件页:能看到 dsh-Dfy,且状态是「已启用」。看不到 → 回安装步骤,装完重启。
- 浏览器 Ctrl+F5:右下角出现小鲸鱼。没有 → 插件没加载,先看插件页和 DSH 是否重启。
- 设置 → dsh-Dfy → 维护 → 诊断体检:点「重新体检」,红色项就是下一步要修的。
- 只要挂件 / 桌宠:到这里就完成了,不需要 SnowLuma、不需要 AstrBot。
- 要接 QQ(内置版):维护 → SnowLuma,安装目录不能是「未设置」,并且能看到已登录的 QQ 号;没有 → 手动选择 SnowLuma 目录,再扫码。
- 要 AstrBot 版:再加三项都绿——AstrBot 在线、6199 已接入、
dsh_bridge已启用。
- 余额:配
DEEPSEEK_API_KEY,或在 DSH「设置 → 账号与余额」登录;鲸鱼旁出现数字即成功。 - QQ(可选):自行准备 SnowLuma 安装包并在设置页手动指定,扫码登录后,打开 DSH 会自动拉起对应接入层(内置版直接连内置桥;AstrBot 版会拉起 AstrBot 并装好
dsh_bridge);在 QQ 私聊发一句即可,回复会进 DSH 侧栏agents工作区的独立会话。设置页「维护 → 安装与维护」可看状态与体检。 - B站(可选):设置 → dsh-Dfy → 平台 → 养鱼(B站)→ 扫码;设互动频率与鱼群保护。不接就不会请求 B站接口。
- 记忆(可选):设置 → dsh-Dfy → 角色 → 记忆同步(记忆卡内置,不需要装第三方记忆插件);模板在
roles/、examples/。
QQ 消息先经过 AstrBot、再交给 DSH,所以 AstrBot 的插件照常生效:
- 管理:设置 → 我的鱼 → 能力与插件(搜索官方插件市场,一键安装 / 启停 / 卸载)。
- dsh_bridge:把 QQ 消息按会话转给 DSH 的桥接插件,随 dsh-Dfy 自动安装 / 更新;临时没装时会退回 provider 路线(所有对话挤在固定会话)。
- 能生效 / 不能生效:改「结果或发送」的插件(表情包、延时、收尾)照常生效;改「AstrBot 发给模型的 prompt」的插件(如认主注入)在插件桥接下不生效——LLM 由 DSH 调,人格与上下文在 DSH 会话里。
- 贴吧:内置平台(BDUSS 登录 + 手机扫码),不依赖外部插件;旧插件
dsh-tieba-dive如仍安装可自行卸载。 - 抖音:内置模块(默认启用),在「平台 → 抖音」配置观看时段/额度与 IM。
- 打开菜单:点小鲸鱼;按钮被隐藏时,电脑端右键角色、手机端长按 1.5 秒。
- 切换形态:菜单或控制台顶部的
小鲸鱼/桌宠/共存,三者互斥(共存 = 两只同时显示)。 - QQ 消息卡:点信封角标 → 最新消息 / 记录 / 写消息;Enter 发送,Shift + Enter 换行。
- 余额:点鲸鱼立即刷新;气泡里看今日已用、每轮消耗、近 7 天、按日明细。
- 心情与音效:卡片头像旁循环切换;音量在控制台「音效与提示」按四路调。
- 保存:挂件控制台的改动即时生效;「保存配置」只是关闭面板,「恢复默认」是恢复出厂默认(不可撤销)。DSH 设置页底部的「保存」会写配置,QQ 相关参数需再点 QQ 页「保存并热重载」(或重启 DSH)才对桥接生效。
DSH「设置 → dsh-Dfy」与挂件内控制台是同一插件的两个入口:设置页管平台/角色/记忆/对话/系统;挂件控制台只管外观、音效、桌宠动作与呈现(少量外观键是重叠的)。
| 区块 | 内容 |
|---|---|
| 状态 / 诊断 | 桥接与账号、SnowLuma 检测、一键开始、自检 |
| 呈现与位置 | 大小、吸附翻转、屏幕漫游、避让滚动条、提示气泡、峰谷显示 |
| 动作与待机(桌宠) | 13 类动作、分身数量 / 动作 / 大小 |
| 表情与台词(小鲸鱼) | 表情包、情绪映射、眨眼、台词 |
| 提示与音效 | 主音量、四路音效、消耗提示与自动关闭 |
| 角色与资源 | 导入角色、按压泡泡、图片 / 音频管理 |
| 厂商额度(选装) | 模型、凭据、火山 coding plan |
| 碎碎念与对话(桌宠) | 人设、自动碎碎念、对话与清空记忆 |
| 我的鱼 / 桌宠 / 维护 | 启动与连接(AstrBot / QQ 接入 / DSH 会话)、人格与语气、能力与插件;桌宠与朗读音色;SnowLuma / AstrBot 安装运行、高级回退、诊断体检 |
「设置 → 语音 → 音源」六选一,语音条、卡片朗读、试听共用同一路:
| 音源 | 需要什么 | 免费情况 |
|---|---|---|
| 微软 Edge | 无 | 完全免费,免 Key |
| 豆包语音(火山引擎) | 新版:API Key;旧版:AppID + Access Token + voice_type | 21 款免费音色 + 开通送试用字符额度 |
| 阿里百炼 Qwen-TTS | API Key + 音色 + 语种 | 新人免费额度 |
| 在线免费模型(Qwen3-TTS) | 只用一句中文「声音描述」 | 完全免费、无 Key,每句约 10~30 秒 |
| 本地 voxd(8765) | 自己起 GPT-SoVITS 等 voxd 服务 | 本地免费,插件不捆绑模型 |
| 火山云端复刻(8767) | 自己起声音复刻代理 | 本地免费,插件不捆绑模型 |
设置页导航随「QQ 运行方式」整套切换(概览 → QQ 运行方式):
- 内置版(默认):运行(概览)/ 平台(养鱼 B站、贴吧、抖音、QQ)/ 角色(角色与记忆卡、记忆同步)/ 对话(桌宠、模型)/ 系统(额度、语音设置、安装与维护、模块与能力)。
- AstrBot 版:运行(概览)/ 我的鱼(启动与连接、人格与语气、能力与插件)/ 桌宠(桌宠、朗读与语音)/ 维护(安装与维护)。 插件不会下载任何 TTS 模型;要 Key 的两条填自己的凭证,回读时按掩码处理。 「在线免费模型」会把待合成文字发往 HuggingFace 的公开 Space。
三个平台(QQ / B站 / 抖音)共用一张记忆卡:
- 全平台可见:初次相遇、被钉住的锚点、和主人相关的身份记忆。
- 只在该通道可见:QQ 私聊流水(受
includeQqInBili控制)、桌宠私下对话(scope='pet'永不进公开平台)。 - 抖音群聊按「公开场合」口径注入,只带身份记忆,避免把私聊细节带进群里。
| 位置 | 用途 |
|---|---|
$DSH_HOME/surfcore/qq/config.json |
QQ / 桥接配置(含凭据,仅本机) |
$DSH_HOME/surfcore/qq/state/ |
桥接会话、记账、日志等运行状态 |
$DSH_HOME/surfcore/qq/roles/ |
角色卡(人格文件) |
$DSH_HOME/surfcore/qq/pet/ |
桌宠 host.json、QQ 消息镜像、语音数据 |
$DSH_HOME/surfcore/config.json |
B站 / 合体层配置(含凭据,仅本机) |
$DSH_HOME/surfcore/memory/ |
记忆卡与注入块(已脱敏) |
$DSH_HOME/.dshw-usage.json |
记账账本与用量 |
$DSH_HOME/.dshw-bubble.json |
泡泡序列与模块库 |
旧 clone 的仓库根 config.json / state/ / pet/ |
旧布局数据(迁移后只读保留,不再写入) |
泡泡配置文件(
$DSH_HOME/.dshw-bubble.json)是「全量替换」语义:文件里的items就是整条泡泡序列, 出厂快照只在读不到文件时兜底。照源码手写一份「最小配置」会把出厂序列整体替换掉(峰谷状态、谷价倒计时、 choice 步骤都会一起消失,而且不报错)。想恢复默认泡泡:删掉该文件后刷新页面即可。
安全边界:
- 所有接口只允许回环来源,跨站请求拒绝;写请求必须来自本机。
- 凭据只发往内置端点;自定义地址需在本机面板逐个放行。
- 不下发通配 CORS,响应带
nosniff;仓库不含真实账号数据。 - 记忆在写入前做双向脱敏(QQ 号、手机号、证件号、长令牌等),不把原始聊天写进记忆卡。
先别做:不要重装 DSH、不要删整个 %USERPROFILE%\.dsh、不要在打不开的情况下再装第二遍。
配置、记忆、聊天记录都在 %USERPROFILE%\.dsh\surfcore\,下面的操作都不会动它。
第 1 步:彻底退干净
按上面「什么叫完全退出 DSH」做一遍,确认任务管理器里没有 DSH 进程。
第 2 步:看是哪个 profile 坏了
打开 %USERPROFILE%\.dsh\profiles\,里面通常有一到两个文件夹(如 desktop、web)。
你平时用桌面版就是 desktop,用命令行 dsh web 就是 web。
第 3 步:把 dsh-Dfy 从 profile 里摘掉
用记事本打开 %USERPROFILE%\.dsh\profiles\<profile>\package.json,找到下面这两处,删掉 dsh-dfy 这一项(只删这一项,其它字段保持原样,别删错逗号):
{
"dependencies": { "dsh-dfy": "..." },
"dsh": { "profile": { "bundles": ["dsh-dfy"] } }
}上面只是示意片段。你的文件里还有
name、version等别的字段,都不用动;只把dsh-dfy这个键 / 这一项删掉。
保存后重新打开 DSH。能起来 → 就是插件装坏了,按「方式一」重装一次即可(配置和记忆都还在)。
不想手改,也可以在 PowerShell 里跑(只会移除 dsh-Dfy,不碰配置和记忆):
dsh plugin --profile <profile> remove dsh-dfy第 4 步:还打不开,就换一个干净 profile
说明被改坏的不只 dsh-Dfy(通常是有人往 profile 里装过 AstrBot / Python / 别的包):
- 把
%USERPROFILE%\.dsh\profiles\<profile>整个文件夹改名,例如desktop-bak; - 重新打开 DSH,它会自己建一个新的
desktop(少数版本可能要重新登录一次账号); - 插件页里把 dsh-Dfy 重新装回来。此 profile 里的其它插件需要重新启用,但
surfcore里的配置、记忆、聊天记录一条没丢; - 旧文件夹先别删,确认没事了再删。
第 5 步:提醒自己
这次为什么崩:多半是让 Agent 在 DSH 目录里跑了 npm / pip / pnpm。下次只让它装 dsh-Dfy,AstrBot 和 Python 一律装到独立目录。
不要一上来就说「装不上」,先按顺序回答:
- 右下角有小鲸鱼吗? 没有 → 插件没装好或没重启,先别管 QQ。
- 设置页有 dsh-Dfy 吗? 没有 → 插件没启用,去插件页启用后完全退出 DSH 再打开。
- 你选的是内置版还是 AstrBot 版? 不知道 → 默认内置版就够了。
- SnowLuma 检测到了吗? 没有 → 自己准备安装包后「手动选择」;没有包就先不接 QQ。
- 诊断体检哪一项是红的? 只修那一项,改完再体检一次。
把这 5 个答案一起发出来,基本能直接定位问题。
求助模板(直接复制填空)
1. 右下角有小鲸鱼吗:
2. 设置页有 dsh-Dfy 且已启用吗:
3. 内置版还是 AstrBot 版:
4. SnowLuma 检测到了吗 / 有没有安装包:
5. 诊断体检哪一项是红的:
6. 报错原文(截图或文字):
先看报错里最像英文错误码的那一段,对上下表直接处理;对不上再看下一张表。
| 报错原文(关键词) | 原因 | 怎么办 |
|---|---|---|
ERR_PNPM_IGNORED_BUILDS |
安装时要跑构建脚本,被 pnpm 拦了 | 在报错给的 profile 目录跑 pnpm approve-builds;或在 <profile>\pnpm-workspace.yaml 的 allowBuilds 加 dsh-dfy: true,再装一次 |
Cannot find module '@deepseek-ai/schemastery' |
只装了包,没装依赖 | 进插件目录跑 npm install,或重跑方式二 |
Cannot find module ...(其它) |
同上,依赖不全 | 同上;还不行就删掉插件目录重装 |
EPERM / EBUSY / resource busy or locked |
DSH 还开着,Windows 锁住了 node_modules |
按「完全退出 DSH」退干净,再装 |
EADDRINUSE / :3080 被占用 |
DSH 开了两个,或别的程序占了 3080 | 关掉多余的 DSH 实例;确认只有一个在跑 |
icon exceeds 256 KiB |
装的是旧包 | 更新到最新 main 再装 |
'git' 不是内部或外部命令 / git: command not found |
电脑没装 Git | 装 Git for Windows 后重开 DSH 再装 |
'dsh' 不是内部或外部命令 |
命令行找不到 DSH | 别用命令行,直接在 DSH 插件页安装;或到 DSH 安装目录里执行 |
spawn ... ENOENT 且提到 python |
想启动 AstrBot 但没装 Python | AstrBot 版才需要;改用内置版,或按「AstrBot 版」先自己装 Python |
访问 GitHub 超时 / ECONNRESET |
网络问题 | 方式二脚本会自动换国内镜像;仍失败就挂代理后重试 |
Repository not found 且提到 SnowLuma |
正常:SnowLuma 仓库已转私有 | 停止尝试下载,自行准备安装包后「手动选择」 |
| 现象 | 处理 |
|---|---|
| 右下角没有小鲸鱼 | ①插件页确认 dsh-Dfy 是「已启用」;②完全退出 DSH 再打开;③浏览器 Ctrl+F5 |
| 设置页没有 dsh-Dfy | 插件只是装了、没启用;去插件页启用后完全退出 DSH 再打开 |
| 插件页搜不到 dsh-Dfy | 市场索引没收录;在「添加插件」里直接填 github:louke6572/dsh-Dfy,或添加本仓库的索引源 |
余额显示 -- / 提示未配置 |
配 DEEPSEEK_API_KEY,或登录 DSH 账号 |
今日已用显示 -- |
正常:需要至少一次成功的余额读取才开始统计 |
| 保存报 403 | 必须用 127.0.0.1 / localhost 打开 DSH,别用局域网 IP |
| 找不到 SnowLuma | 仓库已转私有,无法自动下载;自行获取安装包后,在设置页「维护 → SnowLuma」手动指定目录;或切直连模式(自备 OneBot) |
| 信封不出现 | 桥接未运行或 SnowLuma 未登录;扫码后点「重新检测」 |
| 一条消息回两遍 | 内置版和 AstrBot 版同时接了 QQ;只留一个 |
| QQ 卡片没声音 | 查卡片 🔊/🔇、全局音量、系统静音 |
| 改了人格 / 配置不生效 | 完全退出 DSH(含托盘)再打开 |
| 出现两个「Agent 预设定义」 | QQ 聊天与二代仿真两条预设,正常 |
| 改了前端不生效 | widget/assets/* 硬刷新;改 lib/、backend/、src/ 需重启 DSH |
不用描述,直接复制下面几样,别人一眼就能定位:
- 上面的「5 个问题」答案;
- 报错原文(截图或复制文字,不要只写「报错了」);
- 日志文件
%USERPROFILE%\.dsh\surfcore\qq\state\bridge.log(最后 50 行就够); - 你的 DSH 是桌面版还是
dsh web,以及%USERPROFILE%\.dsh\profiles\下有哪几个文件夹。
发之前先删掉里面的 QQ 号、手机号、API Key。
node build.mjs # lib/ui/*.js → lib/client.js(产物入库,必须重建)
node build.mjs --check # 只校验产物与源一致(不一致 exit 1)
node scripts/build-agent-preset-patches.mjs # dsh/agent-presets/* → presets/*.patch.yml
# 若存在 dsh/agent-presets/persona.system.md(插件自动生成的
# 人格快照,不入库),会把它烘进三个预设的 system prompt;
# 这两个产物都是运行期文件,不进 git(postinstall 会自动生成,
# 所以 git 安装/干净 clone 也不会缺)
node scripts/build-agent-preset-patches.mjs --check
node scripts/version.mjs check # 版本一致性(package.json / README / AGENT / CHANGELOG / tag)
node scripts/privacy-scan.mjs --strict # 隐私闸门(本机路径 / 账号 / 令牌 / 私钥)
node scripts/publish-guard.mjs # 发布守卫:本地人设生成物不许被 npm pack 带走(prepublishOnly 自动跑)
node widget/tools/ci-audit.mjs --no-pack # 路由安全 / 接口对等 / 注入面 / CI
node widget/tools/ci-audit-selftest.mjs # 审计脚本自检(防止断言空转)
node widget/tools/bubble-config-audit.mjs # 泡泡配置「全量替换」语义回归
node widget/tools/choice-options-audit.mjs # 并列步骤候选不被静默裁掉
node widget/tools/check-dead-settings.mjs # 「控件有值、没有消费方」初筛
node widget/tools/expr-smoke.mjs # 表情包清单 / 图片路由 / 配置键冒烟
node widget/tools/z-layer-audit.mjs # 浮层层级(z-index)登记检查
node widget/tools/outbound-safety-audit.mjs # 出站安全:发送收口 / 群聊路径脱敏 / 图片行剥离 / 表情引用 / 工具白名单对账
node widget/tools/outbound-pipeline-audit.mjs # 出站管道回归:真实报过的每个问题各一条用例(换模型前后必跑)
node widget/tools/divergence-audit.mjs # 跨模块口径:数据目录 / 「今天」/ 出站清洗 / 配置路径只能有一个实现
node widget/tools/module-audit.mjs # 功能模块:状态原子写 / 网络超时 / 循环出口 / 记忆可见性 / 模块清单 / B站 Cookie 头
node widget/tools/config-fuzz-audit.mjs # 配置 normalize 模糊测试:毒值组合不抛错且幂等
node widget/tools/token-guard-audit.mjs # Token 防爆破守卫的边界与竞态不变式
node widget/tools/live-endpoint-sweep.mjs # 对运行中的服务做全端点真实巡检(需 DSH 在跑)除 ci-audit.mjs 完整版(会跑一次 npm pack)外,以上都是 0 依赖脚本,npm install 之前也能跑。
CI(.github/workflows/ci.yml)跑的就是这一组,外加全量 node --check。
目录:
lib/ 宿主与设置界面(lib/ui/* 是源码,lib/client.js 是构建产物)
backend/ SurfCore 后端:配置 / 调度 / 记账 / 更新 / 宠物 API
widget/ 小鲸鱼与桌宠:lib/ 是宿主路由,assets/ 是前端单文件
src/ QQ 桥接、B站、记忆、语音、MCP
presets/ Agent 预设(由 dsh/agent-presets/* 生成)
shims/ qq-mode 转发垫片
scripts/ 安装、更新、自检、发布
改动生效范围:
| 改了什么 | 怎样生效 |
|---|---|
widget/assets/* |
浏览器硬刷新(Ctrl+F5) |
lib/ui/* |
先 node build.mjs,再重启 DSH |
lib/、backend/、src/、shims/、presets/ |
重启 DSH(完全退出,含托盘) |
版本号只有一个来源:仓库根 package.json(README / AGENT / CHANGELOG / tag 由 scripts/version.mjs check 校验)。
- 月匠 MeteorNOX:官方挂件
DeepSeek-Balance-Whale-Widget, 余额 / 记账 / 峰谷 / 泡泡 / 音效与安全边界源自该项目。 - PC2005-cloud:
dsh-pet(MIT),106 段动画、动作链与桌宠物理交互源自该项目。 - SurfCore(Mieksido/surfcore):QQ / B站桥接、双向脱敏记忆、身份对齐。
- SnowLuma:第三方 QQ 运行时,负责 QQ 登录与收发消息;专有软件,不随本仓库分发。仓库已转私有,插件不再提供自动下载,安装包需自行准备。
- DSH:插件宿主,提供 bundle / patch / client / MCP。
- 社区贡献:Yang-huai406(Codex 迁移)、1llysviel(macOS)、0Sakura721、yybai25、Jy-EggRoll、 VaeKaras、MengLs1620、ELFsay、ztzpro、under-the-ocean、21253soursweetlemon、fangbm、xiaolinnnnnnn。
代码基于 MIT License,见 LICENSE。widget/assets/ 与 assets/ 下的美术素材不在 MIT 覆盖范围内,
按「原样」分发,来源与权利主张见 PROVENANCE.md。
