dsh-angelina-pet
DeepSeek Harness 部署级桌宠:右下角随 Agent 工作状态切换 GIF 动画,气泡实时显示 DeepSeek 余额与语音台词,可拖动、可点击互动,任务完成随机播放语音。
- Stars
- 2
- Language
- JavaScript
- Created
- Aug 17, 2026
- Updated
- Aug 17, 2026
Introduction
🐳 DSH 桌宠(dsh-pet)
DeepSeek Harness(DSH)部署级桌面宠物插件:一只住在 Web 界面右下角的小宠物, 它会盯着 Agent 干活 —— 待机时休息、思考时潜水、工作时搬砖、回答时放飞纸飞机, 任务完成时骑行庆祝并随机播报一条完成语音,气泡里实时显示 DeepSeek 账户余额 与语音台词。
参考 liyupi/dsh-kun-like-pet 的思路实现, 但为部署级插件(宿主组合层,所有会话/窗口可见),且余额查询完全独立,不依赖任何第三方插件。
✨ 特性
- 8 种状态动画(10 个 GIF):待机/输入中/思考中/工作中/回答中/等待中/完成/出错,随 Agent 工作状态自动切换
- 实时感知 Agent 状态:轮询
agents服务(running/idle)判定任务完成;直连瀑布事件 (tools/execute、approval/request、llm/stream等)细化「工作中/思考中/回答中/等待中/出错」 - 独立余额查询:宿主用
credentials取DEEPSEEK_API_KEY+curl调api.deepseek.com/user/balance(30s 缓存),经/dsh-pet/balance路由暴露,气泡每 60s 刷新、点击也刷新 - 语音台词:
assets/wav/manifest.json为语音配置的单一数据源(分组 + 台词), 播放语音时气泡显示对应台词(约 10 字/行换行);改台词无需重启(5s 生效) - 完成语音:任务完成时宿主系统级播放(PowerShell SoundPlayer,全窗口可闻,与浏览器静音无关)
- 点击互动:点击桌宠随机播放一条点击语音 + 气泡反应
- 可拖动:拖动位置用
localStorage持久化 - 素材随包携带:
assets/内置于插件包,路径默认包相对,可用配置/环境变量覆盖
🎮 状态 → 动画映射
| 桌宠状态 | 含义 | GIF |
|---|---|---|
idle | 待机(无任务) | 坐坐 |
inputting | 输入/准备中(收到消息、模型调用发起前) | 看书 |
thinking | 思考中(LLM 流进行中,无工具运行) | 潜水 / 探险(随机) |
working | 工作中(工具执行中) | 送货 / 购物(随机) |
answering | 回答中(模型流刚结束、回合收尾) | 纸飞机 |
waiting | 等待审批 | 拍照 |
celebrating | 任务完成庆祝(Agent running→idle) | 骑行 + 随机播放 finish 语音 |
failed | 请求出错 | 海边 |
DSH 无法感知用户“正在打字”的瞬间,因此
inputting定义为「消息进入 inbox / 模型调用发起前」的过渡阶段。 状态 → GIF 映射可在src/index.js顶部DEFAULTS.gifMap调整,files数组放多个文件时随机轮换。
🖼️ 动画预览
坐坐 · 待机![]() | 看书 · 输入中![]() | 潜水 · 思考中![]() | 探险 · 思考中(轮换)![]() | 送货 · 工作中![]() |
购物 · 工作中(轮换)![]() | 纸飞机 · 回答中![]() | 拍照 · 等待审批![]() | 骑行 · 完成庆祝![]() | 海边 · 出错![]() |
🚀 安装(部署级)
方式一:脚本安装(推荐)
# 在仓库根目录
npm run install:web
# 或指定 profile:node scripts/install.mjs --profile web
脚本会把插件复制到 DSH profile 的 node_modules/dsh-pet、在 cordis.patch.yml 插入行、
并在 profile package.json 声明依赖。然后重启 DSH(宿主组合在启动时装载)。
方式二:手动安装
- 把整个项目复制到
<DSH profile>/node_modules/dsh-pet/(如C:\Users\Admin\.dsh\profiles\web\node_modules\dsh-pet) - 在 profile 的
cordis.patch.yml追加:- insert: - id: dsh-pet name: 'dsh-pet' - 在 profile 的
package.jsondependencies 追加:"dsh-pet": "file:./node_modules/dsh-pet" - 重启 DSH,刷新页面。
动态插件方式(临时试用)
scripts/build-package.mjs 生成 cordis_define 一键安装载荷:
node scripts/build-package.mjs # 输出 dsh-pet-install.json(payload)
将载荷交给 cordis_define 工具即可在单会话内试用(动态插件重启后消失)。
⚙️ 配置
素材路径默认指向包内 assets/,可用以下方式覆盖(优先级:行配置 > 环境变量 > 包内默认):
| 配置项 | 环境变量 | 默认值 |
|---|---|---|
gifDir | DSH_PET_GIF_DIR | <包>/assets/gif |
manifestPath | DSH_PET_MANIFEST_PATH | <包>/assets/wav/manifest.json |
示例(cordis.patch.yml 行配置):
- id: dsh-pet
name: 'dsh-pet'
config:
gifDir: 'D:/我的素材/gif'
manifestPath: 'D:/我的素材/wav/manifest.json'
播放命令(Windows 默认 PowerShell SoundPlayer)可通过 config.playCommand(path) 覆盖
(macOS:afplay;Linux:ffplay -nodisp -autoexit)。
🎙️ 语音台词(manifest.json)
assets/wav/manifest.json 是语音配置的单一数据源:
{
"formatVersion": 1,
"entries": [
{ "role": "finish", "file": "finish/部署1.wav", "subtitle": "平稳落地~" },
{ "role": "click", "file": "click/戳一下.wav", "subtitle": "嗯哼?" }
]
}
file:相对 manifest 所在目录(assets/wav/)的路径role:finish=任务完成语音(宿主播放)/click=点击互动语音(浏览器播放)subtitle:播放时气泡显示的台词(显示台词时隐藏状态文字;与状态同字号)
宿主每 5s 重读 manifest:改台词无需重启;新增语音文件需重启(路由启动时注册)。
📁 项目结构
dsh-angelina-pet/
├── src/
│ ├── index.js # 宿主半(部署级 ESM 插件)
│ └── client.js # 客户端半(浏览器 __ModuleLoader__ 模块)
├── assets/
│ ├── gif/ # 10 个状态 GIF
│ └── wav/
│ ├── finish/ # 任务完成语音
│ ├── click/ # 点击互动语音
│ └── manifest.json # 语音台词清单(单一数据源)
├── scripts/
│ ├── build-package.mjs # 生成 cordis_define 安装载荷
│ ├── install.mjs # 一键安装到 DSH profile
│ └── publish.mjs # 发布到 GitHub(建仓 + 推送)
├── demo/index.html # 独立动画/语音预览页
├── package.json # 插件包清单(dsh.client 声明)
├── README.md
└── LICENSE
🖼️ 预览
无需 DSH,直接打开 demo/index.html(或 npm run preview)即可预览全部动画与语音。
⚠️ 素材版权声明
assets/下的 GIF/WAV 为网络公开的二创/游戏语音素材,版权归原作者及游戏厂商所有, 仅供个人学习交流,请勿用于商业用途;如需商用请自行替换为无版权素材。- 若您是权利人且不希望相关内容被展示,请联系删除。
📄 License
代码以 MIT 开源;素材遵循上一条版权声明。









