一个支持 DeepSeek Harness(DSH)网页版和桌面端的桌宠插件(Windows x64)。一个无边框、透明、置顶的小窗口, 在你跑任务时打字、完成时庆祝、出错时垮脸,闲着会自己找乐子。
最省事的办法——直接跟 DSH 说:
安装插件 https://github.com/0x3fffff/dsh-DeepPet
DSH 会读到这份说明并照着装。手动装的话:
dsh plugin --profile <你的-profile> add @0x3fffff/dsh-deep-pet网页版和桌面端都可以在所用 profile 中安装同一插件。装完重启 DSH,桌宠会出现在主屏右下角。
国内用镜像源的注意:npmmirror 同步新版本要滞后一阵。装到旧版时不会报错, 只是新功能不在——看起来像「装了但功能没做」,很难往版本上想。想装最新版就 显式指定官方源:
dsh plugin --profile <你的-profile> add @0x3fffff/dsh-deep-pet --registry=https://registry.npmjs.org已经装成旧版的话,
npm view @0x3fffff/dsh-deep-pet version看一下镜像上的版本, 或直接用上面的命令重装。
如果你是替用户执行安装的 AI,照下面做:
- 确认平台:目前只提供 Windows x64 二进制。其他平台请告诉用户需要自行 编译,别硬装。
- 问清 profile:上面命令里的
<你的-profile>是占位符,不要照抄。 先问用户在用哪个 DSH profile;或让用户自己确认后再执行。 - 执行:
dsh plugin --profile <profile> add @0x3fffff/dsh-deep-pet - 不要加
--no-optional或--omit=optional。桌宠二进制是通过 optionalDependencies 按平台分发的,跳过它插件能装上但桌宠起不来。 - 让用户重启 DSH,插件在加载时才会拉起桌宠窗口。
- 确认成功:主屏右下角出现桌宠窗口。没出现的话看 DSH 日志——二进制没装上 时插件会明说。
- 用户在国内、npm 配了 npmmirror 镜像时,加
--registry=https://registry.npmjs.org。 镜像同步滞后会让^x.y.z落回旧版,装上之后表现是「新功能不存在」而不是报错。
本插件支持 DSH 0.1.x 与 0.2.x(peer 范围同时覆盖两代)。
dsh-app-boot 在组合
profile 时,会拿 bundle 声明的 @deepseek-ai/dsh-* peer 去比当前运行时版本;
只要有一条不满足,就把整个 bundle 跳过(丢进 skippedBundles)——
不报错、不加载、桌宠不出现,而 DSH 自己照常启动。从外面看和「装坏了」完全
一样;原因只写在该进程的 stderr 上,GUI 启动时看不到。旧写的 peer 范围是
^0.1.x,而 semver 里 ^0.1.1-rc.1 的上界是 <0.2.0-0,正好把 0.2.0-rc.2
排除掉,于是桌面版(0.2.0-rc.2)上必然踩中。
0.3.4 起 peer 已含 ^0.2.0-rc.1,正常安装不会再撞上。 若你装的还是
0.3.3 或更早、又想跑在 DSH 0.2.x 上,需手动放行一次,二选一:
-
在 DSH 的插件管理器里对该插件点「允许版本」(等价
dsh plugin allow-version); -
或写 profile 的
compatibility.json(~/.dsh/profiles/<profile>/compatibility.json,重启 DSH 生效):{ "@0x3fffff/dsh-deep-pet@0.3.3": ["0.2.0-rc.2"], "@0x3fffff/dsh-deep-pet-client@0.3.3": ["0.2.0-rc.2"] }两边都要写:host 包是 profile 直接加载的 bundle,网页端那半由 bundle 的 patch 插进来,各自独立判定。键和值都必须是精确版本,不支持范围。
- 拖动:按下并左右拖动时播放 8 帧跑步动画,水平方向决定朝向(左=原帧朝左,右=水平镜像朝右;纯垂直拖动按朝左),松手停在原地并记住位置。
- 空闲:默认
平常.webp静态图,每隔 25~70 秒随机播一段待机动作(不连播同一个),播完回静态。 - 工作中:DSH 开始跑任务时先播「开始打字」入场,播完接「持续打字」循环。进入有 800ms 防抖——半秒就结束的任务不该闪一下入场再跳走。
- 任务进度:间歇式气泡,取自真实数据(
todo/write的in_progress优先,tool/call兜底),显示 3 秒后消失、静默 1.5 秒,不常驻占屏。不播音效。 - 长时间无操作:系统级空闲超过 5 分钟后播「打瞌睡 / 玩手机」并循环,60~120 秒换一个;一有输入立刻醒。
- 屏幕边缘:拖到左/右边缘 24 逻辑像素内松手会吸附贴边,播「靠屏幕」入场后定格常驻;贴边期间不播待机一族的动作。
- 任务完成:DSH 一次顶层 agent 运行结束时,播一段完成动画 + 气泡「{对话名称}」完成 + 播放
任务完成.mp3,随后回到空闲。会话还没生成标题时气泡退化成「任务完成」。 - 任务出错:该轮出过错时,中断完成动画、改摆
晕.webp+ 气泡「{对话名称}」出错了,不播音效(只有一个「任务完成」音效,失败时放它是错的)。 - 任务终止:你点了「终止对话」时,摆
坐下.webp+ 气泡「{对话名称}」已终止,同样不播音效。既不庆祝也不当成错误——是你自己按的。 - 双击:气泡显示当前 DeepSeek API 余额(
余额 ¥X.XX),失败时显示原因。 - 余额提醒:默认开启,阈值 5。任务结束后和每 10 分钟各查一次余额,跌破阈值时播一段专门的动画 +
余额快用光了.mp3+ 气泡台词。提醒过一次就安静下来,直到你充值回阈值的 1.2 倍以上才会再提醒(中途继续烧到阈值的 40% 时允许再提醒最后一次)。工作中只出气泡不打断打字动画。开关和阈值在设置里。 - 右键:弹出菜单。「打开 DSH」用默认浏览器打开 DSH 网页——地址取自 DSH 自己的 web 服务,所以 DSH 还在跑、网页被你关掉时正好用它找回来。(只有当前仍连接的 DSH 网页服务可用时显示;仅启动桌面端、未启动网页版时隐藏。)「设置」打开设置窗口(大小 / 气泡样式 / 气泡时长 / 台词 / 音效 / 余额提醒 / 重置位置 / 退出桌宠 / 退出 DSH)。其中「退出 DSH」会关掉整棵 DSH 进程树(连同正在跑的任务和桌宠自己),要点两次确认,正在跑任务时确认文案会提示。开发用的「测试面板」只在
DSH_PET_DEBUG下露出。 - 单击:无操作。
- 网页端:DSH 网页侧栏底部有一个「启动桌宠」按钮——桌宠没在跑就拉起它,已经在跑就把它叫回主屏右下角(拖丢了、或跑到已拔掉的显示器上时很有用)。
- 断连:与 DSH 断开时空闲态换成
寻找.webp并每 1.5 秒重连一次;DSH 重启能在 30 秒内回来就继续陪你,超过 30 秒则自行关窗(见下)。 - 穿透:只有立绘本身吃鼠标事件,窗口其余部分(气泡留白区)的点击直接穿到背后的窗口(见下)。
- 尺寸:立绘高度 = 屏幕短边(宽高中较小者)的 1/10 × 倍率,宽度按 3:4 等比;桌宠与气泡各有一个 50%~200% 的倍率,在设置里调;初启位于主屏右下角。
写在 profile 的 cordis.patch.yml 里:
- id: deep-pet
config:
label: web| 键 | 默认 | 说明 |
|---|---|---|
enabled |
true |
是否启用 |
label |
"" |
本 profile 的标识,非空时气泡前缀 [label]。一只桌宠服务多个 profile 时用来区分来源 |
apiKeyEnv |
DEEPSEEK_API_KEY |
查余额时用的 key 环境变量名(双击手动查和余额提醒都走它) |
balanceBaseUrl |
https://api.deepseek.com |
余额接口 base URL |
petBinary |
"" |
桌宠二进制路径。留空即可——只有自行编译时才需要指过去 |
logEvents |
false |
把收到的 agent 事件打进 DSH 日志,排查用 |
大小倍率、气泡样式、气泡时长、音效、台词开关、余额提醒不在这里——那些是 桌宠自己的显示行为,右键「设置」里调,改完立刻生效。余额提醒的阈值不带货币 单位:余额接口可能返回人民币也可能返回美元,桌宠只跟它返回的数字比。
MIT


