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站 视频会额外拿 BV 号去翻字幕和评论 |
| 朗读 | 会念出声 / 只冒气泡 | 只有装了语音插件才出现这一行,没装就整行不渲染 |
右键点她也能开同一个菜单(问她一句 / 归位 / 暂停说话 / 退出)。
设置存在 ~/.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、无标题、设置页。
她有自己的会话
这一点最重要:她说的话不挂在你的对话上。
以前的坑是:桌宠每说一句,都要把你那条几十万 token 的会话整个重算一遍,一句三分钱。现在她第一次要开口时会自己开一条空会话(~/.dsh/feiyu-chat-voice),从零开始,只装「看着窗口说一句」这点活。
- 攒够 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 窗口,没有播放器,所以—— 网页关掉,她照样在桌面冒气泡,只是没声音。
- 浏览器可能拦自动播放:第一次没声,先在页面上随便点一下。
已知限制
- 只在 Windows 上跑,而且只测过 Windows 11 + DSH 0.2.1-rc.2
- 全屏独占的游戏盖不住:那种模式下任何窗口都在下面
- DSH 刚重启后需要一次会话活动:重启后第一个 agent 出现之前,攒着的话发不出去(两分钟内有效)
- 声音只在网页开着的时侯有:见上面的语音联动
- B站 特化只认
bilibili.com/video/BVxxxx,直播页没有 BV 号 - 她看窗口只看标题,不读正文(B站 视频页除外,读的是公开的字幕和评论)
数据在哪
~/.dsh/storages/feiyu-chat/
├── state.json 窗口位置、静音状态
├── settings.json 频率档、回话长度、看什么、朗读
├── control.json Host → 桌宠的遥控指令
├── say.json Host → 桌宠的「要说的话」
├── ask.json 输入框 → Host 的「问一句」
├── foreground.json 桌宠 → Host 的「前台是什么」
└── debug.json 诊断留痕(卡住的时候看它)
Host → 桌宠走文件,不走 HTTP:桌宠每 60ms 看一眼 mtime,变了就播。这样两边解耦,别的插件也能往 say.json 写一句话让她开口。
HTTP 路由前缀是 /feiyu-chat(/state、/config、/voice),需要 DSH 的会话凭证,从浏览器里调用即可。
许可
MIT
No comments yet. Be the first to write one.