- Home
- Plugins
- UI Enhancements
- feiyu-chat-companion
feiyu-chat-companion
airpineapplea/feiyu-chat-companion
Desktop companion for DeepSeek Harness: a Win32 layered window that keeps a whale-girl above other applications, speaks through a bubble, comments on its own when you stay on one window for ten seconds, and answers a single question typed into a right-click input box.
Install
dsh plugin --profile web add github:airpineapplea/feiyu-chat-companionREADME
feiyu-chat-companion · 肥鱼陪聊
一只永远待在桌面上的桌宠。她不属于任何窗口,能拖、会眨眼、头顶弹气泡说话;看见你停在某个页面十秒,会自己开口说一句。右键能问她一句话。
独立实现,不依赖 dsh-pet。
前置条件
| 项 | 要求 | 说明 |
|---|---|---|
| 系统 | Windows 10 / 11 | 用了 Win32 layered window,别的平台跑不了 |
| DSH | 0.2.x(桌面版) | 插件用 dsh.bundle.patch 挂载 |
| Python | DSH 自带的那份 | 不用另装,Host 会去 resources/runtime/primary-runtime/dependencies/python 找 |
| Python 包 | Pillow、numpy、tkinter | DSH 自带,不用管 |
| Python 包 | uiautomation | 要手动装,见下。不装也能跑,只是读不到 B站 BV 号 |
装 uiautomation(B站 特化要用)
用 DSH 自带的 Python 装,别用系统 Python:
& "C:\Users\<你>\AppData\Local\Programs\DeepSeek Harness\resources\runtime\primary-runtime\dependencies\python\python.exe" -m pip install uiautomation
不装会怎样:桌宠照常工作,但只能拿到窗口标题,读不到地址栏,也就没有 BV 号——看 B站 时它只能凭标题猜。
安装
git clone <本仓库>
dsh plugin --profile desktop add "link:D:\你的路径\feiyu-chat-companion"
装完重启 DSH。 Host 是服务端代码,启动期加载。
侧栏会多出一个「肥鱼陪聊」,排在「肥鱼日记」后面。
她会做什么
| 能力 | 说明 |
|---|---|
| 待在桌面上 | 置顶、不进任务栏、不抢焦点。全屏独占地盘盖不上去(系统限制) |
| 拖动 | 按住拖,撞到屏幕边缘贴住,不会拖丢 |
| 眨眼 | 随机 2.5~6.5 秒眨一次 |
| 说话 | 头顶气泡,宽度自适应,顶到天花板翻到脚下 |
| 自己找话说 | 你停在某个窗口 10 秒,她会说一句 |
| 戳一下 | 左键点她一下,她立刻应一声,不用等十秒,也不看冷却 |
| 问一句 | 右键 → 问她一句 → 打字回车,答案回到气泡里 |
| 念出来 | 装了语音插件时,她的话可以真的出声(见下面的联动) |
| 记住位置 | 拖到哪,下次还在哪 |
设置
侧栏「肥鱼陪聊」面板里:
| 项 | 可选 | 说明 |
|---|---|---|
| 启动 / 关掉 | — | 关掉是真退出进程,不会自己回来 |
| 显示 | 露着 / 藏着 | 藏着是隐藏窗口,进程还在 |
| 说话 | 会出声 / 已暂停 | 暂停后不弹气泡,但话不会积压 |
| 归位 | — | 挪回右下角 |
| 换一条短会话 | — | 丢掉她现在的记忆,建一条新的(见「她有自己的会话」) |
| 说话频率 | 低 / 中 / 高 | 低:15 秒一句,同页 60 秒可再说 中:2 分钟,同页 5 分钟 高:10 分钟,同页 1 小时 |
| 回话长度 | 短 / 中 / 长 | 短 ≤20 字、中 ≤45 字、长 ≤80 字 |
| 看什么 | 只看标题 / 标题 + B站内容 | 只有装了「刷B站」插件才出现这一组,没装就整组不渲染。见下面的联动 |
| 朗读 | 会念出声 / 只冒气泡 | 只有装了语音插件才出现这一行,没装就整行不渲染 |
右键点她也能开同一个菜单(问她一句 / 归位 / 暂停说话 / 退出)。
设置存在 ~/.dsh/storages/feiyu-chat/settings.json,改完即时生效(Host 每 2 秒读一次)。
戳一下,或者问她一句
左键点她一下,她先往下沉一下、再弹回原位,同时应你一声——不等「停够十秒」,也不看冷却。因为她知道是你主动叫的。三秒内连戳不会变成复读机:那几下会并进下一句,她知道「你连着戳了好几下」,而不是装没听见。(拖动和点一下会自动区分:鼠标没怎么动、按得也不久,才算点。)
右键她,菜单第一项是「问她一句」。弹一个小输入框,打字,回车。Esc 取消。
- 提交后气泡先冒一个「…」,二十秒内答不出来会说「想太久,我放弃了」。
- 答案在气泡里停 14 秒,朗读开着的话同时念出来。
- 问完就关,不留聊天记录。想再问就再点一次——这样最省。
两种都是她那条短会话多一轮,价钱和她自己说一句话一样。
她怎么知道你在看什么
桌宠(每秒) GetForegroundWindow + GetWindowText → foreground.json
标题变了才去读地址栏(UIA,0.7 秒,后台线程)
B站 视频页 → 提取 BV 号一起写进去
Host(每 2 秒)读 foreground.json
停够 10 秒?冷却过了?这窗口刚说过没?
→ 送进她自己那条短会话
她自己 用 pet_say 说一句
桌宠 读 say.json → 弹气泡
只看窗口标题,不读页面正文。唯一的例外是 B站 视频页——有了 BV 号,模型可以自己去拉字幕和评论。
不说话的窗口:DSH 自己、Program Manager、无标题、设置页。
隐私:它到底看到了什么
这一点没有藏着掖着的必要,写清楚比较好。
读什么
- 前台窗口的标题,每秒取一次(
GetForegroundWindow+GetWindowText) - 只在 B站 视频页额外读一次地址栏,目的只有一个:抠出 BV 号
不读什么
页面正文、剪贴板、键盘输入、屏幕画面、任何一个文件的内容。全是标题,就只是标题。
标题会去哪
| 去处 | 内容 |
|---|---|
~/.dsh/storages/feiyu-chat/foreground.json | 当前窗口标题(本地文件,明文) |
| 她那条短会话 | 每次开口时标题会被送进模型,模型据此决定说什么 |
~/.dsh/storages/feiyu-chat/debug.json | 标题副本,排错用 |
~/.dsh/storages/feiyu-chat/pet.log | 她说的原话;她常常会复述标题,所以日志里也会带一点 |
所以要留心
窗口标题经常不只是个名字:编辑器会写文件名和路径,终端会写当前命令,播放器会写片名,聊天工具会写对面是谁。这些都在“标题”里,都会按上面那张表走。
默认不开口的只有 DSH 自己、Program Manager、无标题和设置页。其它窗口一律会被读,包括银行页面和密码管理器——它们不在黑名单里。
- 不想被看:设置里把「看什么」关掉,她就完全不读前台窗口了,只剩「问她一句」还能用。
- 想求助:贴
debug.json或pet.log之前,自己先看一眼里面的title。
她有自己的会话
这一点最重要:她说的话不挂在你的对话上。
以前的坑是:桌宠每说一句,都要把你那条几十万 token 的会话整个重算一遍,一句三分钱。现在她第一次要开口时会自己开一条空会话(~/.dsh/feiyu-chat-voice),从零开始,只装「看着窗口说一句」这点活。
- 攒够 30 句自动换一条新的,免得它自己长回去。
- 旧的那条会被自动归档:它从侧栏挪进归档(文件还在,可以取消归档),免得用一周下来侧栏被几十条「新对话」塞满。她每说 30 句就换一条,没人收拾的话那个列表迟早没法看。
- 侧栏会多出一个
feiyu-chat-voice分组,那是她当前那条会话。点进去能看到她背着你都嘀咕了什么。 - 面板上的「换一条短会话」可以随时手动丢掉重来,那条也会被归档。
花多少钱
实测数据,模型 deepseek-flash,推理档位 off,回话长度开「长」(最贵的一档):
| 场景 | token | 花费 |
|---|---|---|
| 刚开的新会话说第一句 | 10,529 | 0.53 分(含第一次写缓存) |
| 之后每句(稳态) | 1.2 万~3.2 万 | 0.10~0.14 分 |
| 上下文 3.2 万 | 32,483 | 0.135 分 |
| 一条会话跑满 30 句 | — | 约 4 分 |
| 一天说 60 句(两条会话) | — | 约 8 分,不到一毛 |
0.53 分只能用来算第一句。 它包含第一次写缓存的钱,之后每句只有 0.1 分左右。拿首句单价乘句数会把总价高估四倍。
两个反直觉的地方:
- 上下文涨,价钱涨得很慢。 从 1.2 万涨到 3.2 万(+154%),价钱只从 0.10 分涨到 0.135 分(+35%)。因为新长出来的那段是对话历史,缓存命中后便宜得多。
- 贵不贵不看「读了多少内容」。 她去看字幕、翻评论,那点 token 只占千分之一。真正决定价格的是回话长度——输出 token 比输入贵好几倍,而且永远不缓存。
对比一下:同一句话如果挂在一条 128 万 token 的主会话上,是 3 分。差六倍,全部来自「不用背你聊过的话」。
和别的插件联动
肥鱼日记(feiyu-memory)
装了,她就有记忆和人格;不装,她就是一只没有记忆的桌宠。 就这么简单。
- 肥鱼日记监听
agent/created,给每个新会话挂一段个人设定。她那条短会话也是这么被挂上的,所以她说起话来是「那条鱼」,不是通用助手。 - 这不是依赖关系。
feiyu-chat-companion的package.json里没有feiyu-memory,两边的inject也不重叠。桌宠只用 DSH 自带的tools、webServer、connection、agents四个口子。 - 你把肥鱼日记停掉:桌宠照跑、照说话、照收钱,只是语气变成一台普通的 AI。
语音(@memef1f1y/dsh-plugin-tts)
装了,「念出来」那一节才出现。
- 探测方式:看它的客户端有没有把
window.__dshTtsSettings挂上。没有就当它不在,整行不渲染(不是灰按钮——灰色会让人以为坏了)。 - 音色、引擎、语速全部跟随语音插件自己的面板:Edge TTS / RVC / Index-TTS2 / CosyVoice / Google Cloud 都跟着走。
- 声音是在网页里放的。桌宠是独立的 Win32 窗口,没有播放器,所以—— 网页关掉,她照样在桌面冒气泡,只是没声音。
- 浏览器可能拦自动播放:第一次没声,先在页面上随便点一下。
刷B站(dsh-bili-scroll)
装了,「看什么」那一组才出现。
这件事得说清楚:本插件自己一个 B站 工具都没有。 读字幕、翻评论靠的是「刷B站」注册的 bili_subtitle / bili_comments。没有它,她只能凭窗口标题说话。
dsh plugin --profile desktop add github:c1overzz/dsh-bili-scroll
- 探测方式是问 DSH 的工具表里有没有
bili_subtitle——「能不能读到内容」本来就等于「工具在不在」,不去猜包名。 - 没装:「看什么」整组不渲染,Host 也不会再把 BV 号塞进给她的话里(省一句废话)。
- 装了:才有「标题 + B站内容」这一档。这一档会多花一点钱——她真去拉字幕和评论了。
- 想把地址栏抠出 BV 号,还要给 DSH 自带的 Python 装
uiautomation(见「前置条件」);不装就停在标题这一步。
被安全软件挡了怎么办(卡巴斯基、其他杀软)
症状很好认:侧栏面板能打开,点「启动」没反应,桌面上不出现她,而且 pet.log 里连一条新记录都没有。
原因不是我藏了什么,是桌宠靠 DSH 自带的 Python 起一个窗口进程,安全软件常把「一个后台程序去起另一个 Python 进程、还画一个置顶透明窗口」判成可疑行为,直接拦掉进程创建。
卡巴斯基(21.x 实测):
- 打开设置 → 安全设置 → 入侵防御(也叫应用程序控制)→ 管理应用程序
- 添加下面这两个文件,规则设为 受信任,子项全部允许:
默认在<DSH 安装目录>\resources\runtime\primary-runtime\dependencies\python\pythonw.exe <DSH 安装目录>\resources\runtime\primary-runtime\dependencies\python\python.exeC:\Users\<你>\AppData\Local\Programs\DeepSeek Harness\。AppData是隐藏目录,选择框里往往看不到,直接粘贴路径,别用“浏览”。 pythonw.exe是关键那个;python.exe一起加上,省得以后换个入口再犯一次。
不用去「排除项」加扫描白名单。扫描白名单管的是「别扫它」,这里被拦的是「别运行它」,那是两回事——排除项里加完照样起不来。
其它杀软同理:找「受信任的应用程序 / 白名单 / 应用控制」,把这两个 exe 加进去。
已知限制
- 只在 Windows 上跑,而且只测过 Windows 11 + DSH 0.2.1-rc.2
- 全屏独占的游戏盖不住:那种模式下任何窗口都在下面
- DSH 刚重启后需要一次会话活动:重启后第一个 agent 出现之前,攒着的话发不出去(两分钟内有效)
- 声音只在网页开着的时侯有:见上面的语音联动
- B站 特化只认
bilibili.com/video/BVxxxx,直播页没有 BV 号 - 她看窗口只看标题,不读正文。能不能读到 B站 视频的字幕和评论,取决于你有没有装「刷B站」插件
数据在哪
~/.dsh/storages/feiyu-chat/
├── state.json 窗口位置、静音状态
├── settings.json 频率档、回话长度、看什么、朗读
├── control.json Host → 桌宠的遥控指令
├── say.json Host → 桌宠的「要说的话」
├── ask.json 输入框 → Host 的「问一句」
├── poke.json 左键点一下 → Host 的「催她说一句」
├── foreground.json 桌宠 → Host 的「前台是什么」
└── debug.json 诊断留痕(卡住的时候看它)
Host → 桌宠走文件,不走 HTTP:桌宠每 60ms 看一眼 mtime,变了就播。这样两边解耦,别的插件也能往 say.json 写一句话让她开口。
HTTP 路由前缀是 /feiyu-chat(/state、/config、/voice),需要 DSH 的会话凭证,从浏览器里调用即可。
许可
MIT
Related plugins
dsh-web (dsh-task-board)
zhu1090093659/dsh-web
dsh-web (dsh-web-all)
zhu1090093659/dsh-web
dsh-web-ui (dsh-task-board)
zhu1090093659/dsh-web-ui
dsh-web-ui (dsh-web-ui-all)
zhu1090093659/dsh-web-ui