Easy-to-manage touch screens
무료 오픈소스 터치스크린으로 USB 설정 가이드, 드래그‑드롭 편집기, 로컬 제어를 제공하며 Home Assistant용으로 제작되었습니다
dsh-pet-indesktop PC2005-cloud 프로젝트 기반, Windows/Linux/MacOS용 데스크톱 펫 이식
基于项目PC2005-cloud/dsh-pet.git,将桌宠移植到Windows、Linux和MacOS上,现在可以随时看到蓝色大肥鱼了:),本项目还额外实现了其他交互功能,欢迎体验
라이프스타일Python · KotlinGitHub @MerZlin직접 설치운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗一个基于 Python + PySide6 的独立桌面宠物。项目脱离 DSH 运行时,提供透明无边框、置顶、可拖动、角色切换、动画播放、系统托盘和可选 AI 对话能力。
发布状态
- 最近正式发布:v4.3.4(2026-10-19)。Release 永久地址:
releases/tag/v4.3.4,产物清单与校验值以该页面为准;说明文档见docs/RELEASE-v4.3.4.md。- v4.3.4 换回了「每块屏一张合成窗」:条件是多块屏且任一块屏的缩放不是 100%(并且开着「允许桌宠跨屏」)。原因是 v4.3.3 那张铺满整个虚拟桌面的合成窗只能有一个 DPR:混合缩放下 Windows 按「窗口大部分落在哪块屏」定倍率,必有一侧被按错倍率画到可见区外(#307);两块屏缩放相同但不是 100% 时,Qt 又对负原点屏报「原生原点 + 逻辑宽高」的混合坐标,单窗把这份错位当真,屏与屏之间凭空多出空洞(#310)。每张窗只落在自己那块屏上,这两个坐标问题都不再参与运算。多块屏缩放全是 100% 时仍是单窗,行为与 v4.3.3 一致。
- v4.3.4 同时修的同类缺陷(按模式收口,不是单点补丁):点击台词不朗读(三个读配置的地方都读了主配置,每宠键取不到)、换音色/语速后旧句子永不重合成(缓存键不是实际合成输入的指纹)、待办与报时提醒「气泡没送出却已盖戳」(之后不再补)、帧率采集攒满自己的 ETW 会话(
error 1450)、跨屏拖过去的位置不落盘(v4.3.3 回归)、每日待办跨午夜漏提醒、副屏右键菜单写主窗控制器等。新增:三个动作的全局快捷键(设置 → 互动 → 快捷键,默认不绑)与设置页 Ctrl+F 直接搜。- 跨屏能力已在真双屏上验证:本机主屏 2560×1440@170Hz + 左侧副屏 1920×1080@60Hz(负坐标)实测跨屏拖拽、边缘探头、设置说明均正常;混合缩放本机验到 125%(副屏改 125% 时窗口数翻转、坐标探针对得上),100% + 150% 这类组合仍未实机验证——本版按每屏一窗处理,但那条路上的另一个未结案项见下一条。
- 仍未结案:issue #286 报告的 Windows 11 + 150% DPI 下桌宠不可见、鼠标整屏失效,原因仍未定性,本版不含其修复。
- 发布形态为 onedir 目录打包,Windows 提供 Inno Setup 安装包(
.exe)与便携 zip:启动时不再像 onefile 那样解包到_MEI*临时目录;配置、日志与功能缓存仍会正常写入数据目录。- 各版本摘要与历史见 版本与变更历史。
正式发布时请以 Releases 页面实际上传的文件为准。当前推荐下载的 Windows 产物如下:
| 版本 | 安装包(setup.exe) | 绿色版(zip) | 适合场景 |
|---|---|---|---|
| Chat WebM | dsh-pet-standalone-webm-chat-setup.exe | dsh-pet-standalone-webm-chat-portable.zip | WebM 高清播放 + AI 对话,功能完整 |
| 无 Chat WebM | dsh-pet-standalone-webm-setup.exe | dsh-pet-standalone-webm-portable.zip | 只想要桌宠本体,不接入 AI |
选择建议:
两个版本使用同一套高清 WebM 素材(106 段动画),只是入口不同:Chat 版会加载聊天子系统,无 Chat 版完全不携带 AI 对话依赖。
macOS(Apple Silicon):产物为
dsh-pet-standalone-<webm-chat|webm>-macos-arm64.zip(onedir .app),随 Releases 一同发布,从该页面下载即可;首次打开步骤见下文「macOS(Apple Silicon)」。Linux(x86_64):产物为
dsh-pet-standalone-*-linux-x86_64.zip(onedir 目录,解压即用),同样随 Releases 发布,见下文「Linux(x86_64)」。GIF 变体(旧版那个约 800 MB 的超大单文件,运行时会在 C 盘临时目录解压并可能残留缓存)自 v4.0.0 起不再默认发布;确有需要可按
docs/ONEDIR_PACKAGING.md的说明自行构建。
Android 原生悬浮桌宠已提供本地测试版构建入口,支持 Android 8.0 及以上。 安装、功能边界和构建步骤见 Android 说明,实际验证范围见 Android 交付报告。测试 APK 不作为正式发布附件。
dsh-pet-standalone-webm-chat-setup.exe(或无 Chat 版)放到任意位置。%LOCALAPPDATA%\Programs\dsh-pet-standalone-webm-chat(当前用户目录,不需要管理员权限);D:\、E:\),点「浏览」自己选一个目录即可。常见问题
dsh-pet-standalone-webm-chat-portable.zip。E:\dsh-pet\),保持文件夹内结构完整。dsh-pet-standalone-webm-chat.exe 即可运行。绿色版与安装版是同一套 onedir 产物,运行行为完全一致;区别只是安装版多了快捷方式与卸载器。
dsh-pet-standalone-webm-chat-macos-arm64.zip(或无 Chat 版 dsh-pet-standalone-webm-macos-arm64.zip)。若你手上的版本没有附 macOS 产物,请到 Issues 反馈——不要自己去 Actions 页面点构建,那是维护者发布流程的一部分。dsh-pet-standalone-webm-chat.app,可拖入「应用程序」文件夹。xattr -dr com.apple.quarantine dsh-pet-standalone-webm-chat.app
~/Library/Application Support/dsh-pet-standalone-<变体>/(各变体相互独立,与 Windows 行为一致)。brew install node);启动器会自动探测 Homebrew/nvm 等路径并回退 npx @deepseek-ai/dsh。Intel Mac:当前 CI 只构建 arm64;Intel 用户请从源码运行(见下),或在 Intel 机器上自行构建。
dsh-pet-standalone-webm-chat-linux-x86_64.zip(或无 Chat 版 dsh-pet-standalone-webm-linux-x86_64.zip)。若你手上的版本没有附 Linux 产物,请到 Issues 反馈——不要自己去 Actions 页面点构建,那是维护者发布流程的一部分。dsh-pet-standalone-webm-chat/ 目录,运行其中的同名二进制:
unzip dsh-pet-standalone-webm-chat-linux-x86_64.zip
cd dsh-pet-standalone-webm-chat
chmod +x dsh-pet-standalone-webm-chat # 一般无需,zip 已保留可执行权限
./dsh-pet-standalone-webm-chat
# Debian / Ubuntu / Mint 等(其他发行版请找对应包名)
sudo apt install libxcb-cursor0 libxkbcommon-x11-0 libegl1 libgl1 \
libfontconfig1 libdbus-1-3 fonts-noto-cjk
fonts-noto-cjk 用于中文显示(缺失时气泡/聊天中文会显示为方块)。QT_QPA_PLATFORM=xcb ./dsh-pet-standalone-webm-chat。~/.config/dsh-pet-standalone-<变体>/(各变体相互独立,与 Windows/macOS 行为一致)。~/.config/autostart/ 的 .desktop 文件)。paplay(PulseAudio)或 aplay(ALSA);两者都没有时静默跳过。npx @deepseek-ai/dsh。建议在 X11 桌面(GNOME/KDE/Xfce 等)上使用;托盘图标依赖桌面环境的系统托盘支持(GNOME 需安装 AppIndicator 扩展)。
需要 Python 3.10 或更高版本(CI 使用 Python 3.11,Windows 实机开发验证覆盖 Python 3.13)。在项目根目录执行:
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -r requirements.txt
python -m pet # Windows 也可直接双击 run.bat(实际执行 pythonw -m pet)
源码入口默认包含 Chat 能力;如果只想验证桌宠核心功能,可使用无 Chat 的打包入口或在本地配置中关闭聊天。完整的环境准备、依赖清单、运行期目录与常用命令见 docs/DEV-HANDOVER.md §1.2 与附录 A。
docs/RELEASE-v4.3.0.md 的「升级说明」一节列了会改变观感的行为变更与旧配置键退役情况,其中常被问到的是——旧版右键菜单整体退役(原选旧版的用户自动切到新菜单,功能为旧版超集);「直播捕获兼容模式」改为重启级开关,勾选重启后多只桌宠会先收拢为主宠(活跃清单保留,取消勾选再重启即回来);免打扰模式期间语音也一并静音(丢弃不补播);Agent 联动与主动识屏各删掉一族旧配置键,老存档里的这些值不再被读取。逐条处置见该文档,本页不重复。config.json 迁进 config-slot-0.json,并清掉 config.json 里的这些键(迁移前留了一份 config.json.pre-slot0-migration.bak)。旧版本不读 config-slot-0.json:升上去之后直接把产物换回 v4.2.x,主宠会回到默认位置与尺寸。要在 4.3 前后来回切,先退出桌宠,再用上面那份目录备份(或 config.json.pre-slot0-migration.bak)恢复数据目录,而不是只换 exe。设置 → 应用 → 已安装的应用(或「控制面板 → 程序和功能」)→ 找到 dsh-pet-standalone (WebM Chat) → 卸载。设置与聊天会话保存在按变体独立的数据目录里(重装不会丢失;同一变体的新旧版本共用同一个目录,不是按版本隔离——升级会就地改写它,升级前请先备份):
| 系统 | 数据目录 |
|---|---|
| Windows | %APPDATA%/dsh-pet-standalone-<变体>/ |
| macOS | ~/Library/Application Support/dsh-pet-standalone-<变体>/ |
| Linux | ~/.config/dsh-pet-standalone-<变体>/ |
目录名按变体分:Chat 版 dsh-pet-standalone-webm-chat、无 Chat 版 dsh-pet-standalone-webm、源码运行为 dsh-pet-standalone。目录中主要包含:
config.json # 全局设置;v4.3.0 起主宠的每宠键迁到 config-slot-0.json
config-slot-0.json # 主宠的每宠设置(多宠时另有 config-slot-N.json)
config-slot-N.json # 其它桌宠各自的设置
config.json.pre-slot0-migration.bak # 上述迁移前的 config.json 备份(只在做过迁移的目录里)
sessions/<character_id>/<session_id>.json # 主宠会话;其它桌宠为 sessions-slot-N/
pet.log
配置格式当前为 v4(config.json 的 version 字段;每宠档案 config-slot-N.json 同版),并兼容历史平铺字段,例如 chat_api_url、chat_api_key、chat_model、chat_system_prompt 和 chat_enabled。
旧版单文件 EXE(onefile)运行时会在系统临时目录创建 _MEI数字 目录,崩溃或强制结束时可能残留;当前 onedir 发布版不会再产生该缓存。程序启动时仍会自动尝试清理超过 24 小时的遗留目录,并跳过当前进程正在使用的运行目录;权限不足或目录被占用时只记录日志,不强制修改 ACL。
也可以使用项目提供的专用脚本检查:脚本默认只预览,不会删除任何目录。确认所有桌宠进程都已退出后,才使用 --delete:
python scripts/cleanup_mei_cache.py
python scripts/cleanup_mei_cache.py --min-age-hours 0
python scripts/cleanup_mei_cache.py --delete
如果某些目录因权限异常仍无法删除,请先退出所有桌宠,再用管理员 PowerShell 运行脚本;脚本不会自动接管目录所有权,避免误操作其他临时文件。
dsh web 并自动打开浏览器(默认端口 38080,可用环境变量 DSH_PORT 覆盖)。启动命令自动适配不同安装方式(PATH 上的 dsh → node 全局包 → 官方 npx @deepseek-ai/dsh),macOS 同样可用(需装有 Node.js)。若本机已有 dsh web 在运行(含官方默认端口),直接复用并打开现有实例,不再重复拉起。npm install -g @deepseek-ai/dsh。--no-open 静默常驻之后没有可关闭的控制台窗口,这两个入口就是关掉它的正规方式——不必再去任务管理器杀进程。停止前会核验目标是 dsh web,端口被别的程序占用时只报告、不终止(避免误杀);macOS 上暂不支持反查(会如实报告「读不到持有它的进程」)。退出桌宠不会顺带停止你自己起的 dsh 服务(桌宠自拉起的那份由退出收口负责收掉)。允许桌宠跨屏 和 直播捕获兼容 要重启后生效;帧率采集权限 要注销或重启电脑后才生效。0.5x / 0.75x / 1.0x / 1.25x / 1.5x / 2.0x / 3.0x / 4.0x(默认 1.0x)。idle、turn、move、click、drag、random 等目录组织。integrations/dsh-pet-bridge)与 Claude hooks 安装器:感知 AI Agent 状态并切换动作,支持开始干活、过程汇报、任务完成三种气泡反馈,右键 Agent 联动子菜单可独立开关。interaction_id 互不覆盖。config.json 的 agent_link.custom_agents 里声明任意 Agent(key / 显示名 / 事件文件路径),桌宠即对其 JSONL 事件文件做只读监听,联动行为与内置 Agent 一致——不改代码即可接入任何能写本地文件的 Agent,协议详见 docs/AGENT_LINK_PROTOCOL.md。pnpm_bin 配置键手动指定 pnpm 入口。[看看屏幕] 前台窗口:… 记录 + 一条回复),可继续追问;聊天窗未打开时仅气泡显示、不写入。/user/balance 接口,使用当前配置的 API Key 鉴权(需使用 DeepSeek 官方端点);查询结果 30 秒内缓存复用,重复查询秒回。click.wav 放到桌宠数据目录 sounds/ 下即可替换内置音效。v4.3.4 新增:三个动作各录一个系统级组合键,在别的程序前台时也生效。
本段描述的这批改动(右键菜单补两个入口、设置页给四个播放器建行)自 v4.3.1 起提供(#285)。
…\KuGou.exe 这类程序本体,不是快捷方式)。也可以点「自动检测」让桌宠自己找一遍:每点一次都会重新搜(上次没找到的也会再找),找到就填进上面四行、覆盖那里原有的内容;检测期间你自己改过的行会保留、不会被覆盖(结果弹窗里会说明)。本次没扫完的行显示**「未完成」(可以稍后再点一次),不会说成「没找到」。搜索在后台跑,不会卡住设置页。手填的路径以它为准**:文件不存在时菜单如实提示找不到,不会偷偷回退自动搜索(避免"看起来能用、其实用的不是这个")。todo_items[-instance].json,原子写)。todo_reminder_lead_minutes,默认提前 5 分钟)、10 分钟宽限;一次性待办到期自动归档;错过宽限的提醒静默盖戳,不会一次轰炸。system_notifications_enabled 总门控,默认开);总开关与提前量在「设置 → 自动化与联动 → 待办提醒」。edge_probe_enabled,默认关):拖到屏幕左右边缘自动进入 ±45° 探头姿态(常驻露出 0.55、点击拉直 0.82、数秒自动退回);探头激活时点击不播点击音效,且移动被闸门拦住(不会被平移出屏幕边缘)。PET_RENDER_TOPOLOGY=legacy)才按半帧率呈现(24fps 素材 → 12fps 效果),任何交互立即恢复全帧率。docs/DEV-HANDOVER.md §10.2 与 docs/INDEX.md 的 PR 报告存档(PR #76、内存专项)。DecodeFanoutHub)统一解码——待机时 ffmpeg 解码进程从 N 个减到 1 个,解码 CPU 与内存显著降低;机制与平台无关。历史上那个「单进程多开(省内存)」开关已随拓扑收口退役,现在没有开关也没有多进程多宠形态(捕获模式 / PET_RENDER_TOPOLOGY=legacy 下的单窗 PetWindow 只渲染主宠)。多宠下的设置作用域(单合成窗多宠一共三档,设置页按档标注):
config-slot-N.json 里(主宠是 config-slot-0.json);主宠设置页改的也只是主宠自己那份。config.json):托盘与灵动岛、DeepSeek 余额查询与自动刷新、更新检查、待办提醒、共享解码链、Agent 联动与主动识屏(dsh 等 agent 只有一条连接,全部窗共享状态)、菜单编排与外观、开机自启、省电模式、直播捕获兼容(重启级)、首帧缓存预算。以下键暂无设置 UI,编辑数据目录下的 config.json 后重启生效:
| 键 | 默认 | 说明 |
|---|---|---|
first_frame_cache_max_mb | 8 | 首帧缓存总预算(MB,4-64)。多开时按进程共享一份预算 |
predict_prewarm_lead_ms | 350 | 预测式预热:动画播到结尾前提前多少毫秒预解码预测的下一段首帧(有效 200-600,越界自动夹到边界;没有「关闭」档,关后台预热请用省电模式) |
ffmpeg_recycle_minutes | 10 | ffmpeg 解码子进程在圈边界的定期回收间隔(分钟,2-120);0=不回收 |
| 操作 | 效果 |
|---|---|
| 左键点击桌宠 | 触发点击互动动画 |
| 按住并拖动 | 移动桌宠;松开后根据拖动方向和速度处理转向、移动或惯性。多显示器下可以拖到 / 丢到任意一块屏 |
| 按住 SHIFT + 左键拖动 | 开启了「SHIFT+左键拖动」时,这是唯一的拖动方式;未开启时 SHIFT 无特殊含义 |
| 右键桌宠 | 打开带图标的上下文菜单;可选择「生小肥鱼」启动独立的新桌宠,或在「桌宠控制」里改窗口能力 |
| 双击托盘图标 | 显示 / 隐藏桌宠 |
| 右键托盘图标 | 打开设置、AI 对话、开机自启、DeepSeek Harness(启动/重启/停止)、退出等菜单 |
| 拖拽桌宠时 | 若开启了聊天窗跟随,聊天窗口会一起移动;默认不跟随 |
在「桌宠设置 → 桌宠 → 动作与碰撞 → 拖拽与弹射」(锁定位置、SHIFT 拖动)与「桌宠设置 → 桌宠 → 显示与音乐 → 显示」(不透明度)中:
这三项在一窗多宠的单合成窗里是整窗作用域——只有一份窗旗标、一个窗口透明度,所以改了会影响这一窗里的所有桌宠(设置页会标注「对所有桌宠生效」);逐只独立的是位置、尺寸这类每宠档案项。
三者与「鼠标穿透」的区别:锁定/SHIFT 只是禁止拖动,点击互动(点头、音效、彩蛋)照常;鼠标穿透是桌宠完全不接收鼠标事件(点击会落到下层窗口),需要从托盘菜单关闭(或到「桌宠设置 → 互动」里改)。开启「鼠标穿透」时桌宠会气泡提示恢复位置。
速率对当前片段和后续片段均生效;可选 0.5x ~ 4.0x(默认 1.0x)。
「动作等待间隔」用于降低连续动作过于密集时的节奏:
0。0:保持当前连续播放行为。0:相邻的非待机、非转向动画之间等待指定时间;等待期间仍允许待机和转向动画播放。这个设置只影响动画调度,不会阻塞窗口拖动、点击、设置窗口或聊天窗口。
好女孩……
好模型……
欧鲸鲸……
气泡默认显示在角色当前可见形象边界的正上方并水平居中;屏幕上方空间不足时,会自动选择不遮挡角色的候选位置。自言自语窗口不会改变桌宠的透明 mask,也不会阻止桌宠移动。
用哔哩哔哩直播姬 / OBS 做窗口捕获时,如果窗口列表里找不到桌宠,是因为桌宠默认是"工具窗口"形态(不占任务栏,捕获软件会过滤掉这类窗口)——这就是同类软件 Bongo Cat 能被捕获而桌宠不能的原因。
解决办法:打开「桌宠设置 → 常规 → 直播捕获(高级)」(折叠组,默认收起,点开即见),勾选其中的**「直播捕获兼容」**(Windows),保存后重启桌宠生效:
已知限制(如实说明):桌宠窗口是分层透明窗口(layered window),OBS 的 「BitBlt」/「游戏捕获」模式读不到它的画面内容——会得到黑屏,这是分层窗口的 技术限制,属预期行为,不是本功能没生效。请使用 「Windows 10(1903 及更高版本)」 窗口捕获模式(OBS 里叫「Windows 10 窗口捕获」,走 Windows Graphics Capture), 或直播姬的对应窗口捕获模式。让捕获源能拿到画面内容的进一步修复在 Phase B 跟踪, 本阶段只保证窗口可被枚举、可被选中。
除内置角色外,桌宠会自动扫描外部角色目录发现新角色。目录名即角色 ID,按下面的树状结构放置即可(目录里含 webm 或 gif 即被识别):
characters/ ← 外部角色根目录(见下方两个扫描位置)
└── <新角色ID>/ ← 目录名 = 菜单里显示的角色 ID,如 mycat
├── manifest.json ← 可选:角色名 / prompt / 主题色 / 动作映射
└── videos/
├── idle/ ← 待机(可多个)
│ └── 待机呼吸.webm
├── turn/ ← 转向
│ └── 东张西望.webm
├── move/ ← 移动
│ └── 原地踏步.webm
├── click/ ← 点击回应
│ └── 点击开心.webm
├── drag/ ← 拖拽(可选)
│ └── 悬空反馈.webm
└── random/ ← 随机动作池
└── 吃零食.webm
两个扫描位置(exe 同目录优先,其次用户数据目录;用户数据目录跨安装/升级保留):
| 平台 | exe 同目录 | 用户数据目录 |
|---|---|---|
| Windows | <安装目录>\characters\ | %APPDATA%\dsh-pet-standalone\characters\ |
| macOS | .app/Contents/MacOS/characters/ | ~/Library/Application Support/dsh-pet-standalone/characters/ |
| Linux | 源码运行目录 characters/ | ~/.config/dsh-pet-standalone/characters/ |
把新角色的 videos 放进去后,右键桌宠重新打开菜单即可看到新角色,选中即热加载——不需要重新打包或重启程序。透明 WebM 素材的制作方法见 docs/ASSET-PIPELINE.md。
不想研究 API 的话,在「设置 → AI 与对话 → 模型与连接」里只需要填一样东西:API Key。其他按下面的值照抄即可:
| 设置项 | 填这个 |
|---|---|
| API 地址 | https://api.deepseek.com |
| 模型 | deepseek-v4-flash |
| API Key | 在 DeepSeek 开放平台创建(步骤见下) |
软件首次打开时,API 地址和模型默认就已经是上面这两个值(DeepSeek),不用改;只要把 API Key 粘进去就能用。
如何创建 API Key(5 分钟搞定):
sk- 开头的密钥小提示:
首期协议是 OpenAI Chat Completions 兼容协议。Gemini 等其他服务只有在提供兼容网关或兼容端点时才可使用。
AI 对话接口返回的常见 HTTP 状态码含义与处理方式(「测试连接」与聊天发送遇到 HTTP 错误时,软件内会显示状态码与原始错误信息):
| 状态码 | 含义 | 处理方式 |
|---|---|---|
| 401 / 403 | API Key 无效或无权限 | 检查「AI 与对话」页里「模型与连接」的 API Key 是否正确、是否过期,或服务商账号权限是否足够 |
| 402 | 账户余额不足(Insufficient Balance) | 到服务商开放平台充值后重试;此错误说明网络与证书均正常,请求已到达服务器 |
| 429 | 请求过于频繁(限流) | 稍等片刻后重试;也可降低对话频率或减少会话历史长度 |
| 5xx | 服务端故障 | 服务商临时问题,稍后重试 |
| 网络连接失败 / 超时 | 无法连接 API 地址 | 检查网络与代理;确认地址可达、超时值足够 |
| SSL CERTIFICATE_VERIFY_FAILED | 证书校验失败 | 开着代理/梯子(证书被拦截)或本地网关 / 自签名证书时,可在「AI 与对话 → 模型与连接」勾选「跳过 SSL 证书验证」 |
502/503/504 等 5xx 错误通常不是软件问题;若「测试连接」成功但发送失败,请把服务商返回的原始错误信息发到 Issue 便于排查。
Enter 发送,Shift+Enter 换行;生成中按钮变为「停止」。聊天窗默认为新版现代双栏工作台:左侧是会话导航(新建会话、会话列表、批量管理、跟随桌宠),右侧是消息时间线与输入区,包含:
system prompt 的优先级为:
角色用户自定义 prompt > 角色 manifest 中的 prompt > 全局默认 prompt
角色可在以下文件中声明聊天配置:
assets/characters/<character_id>/manifest.json
可选字段示例:
{
"chat": {
"system_prompt": "你是一个温柔的桌面宠物……",
"theme_color": "#79C7FF",
"chat_actions": {
"thinking": "thinking.webm",
"success": "success.webm",
"error": "error.webm"
}
}
}
非法或缺失的 theme_color 会回退为默认蓝色;缺少头像资源时,聊天窗使用角色 ID 首字母生成圆形头像。
配置与会话的存放位置(按变体分目录)见 数据目录。
assets/characters/<角色ID>/videos/(内置角色 shenshen,106 段 WebM,按 idle / turn / move / click / drag / random 分类);assets/characters_gif 只在构建 GIF 变体时生成,不随仓库维护。manifest.json;没有稳定静态头像时不强制从 WebM/GIF 截首帧,避免启动变慢与打包兼容性问题。docs/ASSET-PIPELINE.md。localhost;127.* 绕过。逐条实测与推荐设置见 docs/NETWORK-PROXY-AND-VPN-2026-09-22.md。docs/ONEDIR_PACKAGING.md 自行构建(先运行 python scripts/convert_to_gif.py --force --clean 生成素材)。fps,默认关)在未授权采集时不显示任何帧数据:普通权限下采集后端起不了会话,授权方式是在设置页一次性把当前账户加入 Performance Log Users 组(一次 UAC),需重新登录才生效;未授权时段内如实显示原因,不填假数字。docs/CHANGELOG-ARCHIVE-2026-10.md)。pet.log(位置见 数据目录),提交前请扫一眼其中不含 API Key 等隐私内容(程序本身不会把 Key 写进日志)。docs/NETWORK-PROXY-AND-VPN-2026-09-22.md:系统代理 / VPN 对不同功能的影响不一样,文档里有 30 秒排查法。docs/CHANGELOG-ARCHIVE-2026-10.md。本项目改自、源于 PC2005-cloud/dsh-pet。桌宠的基础交互思路、动画链行为模型和部分资源组织方式来自原项目,感谢原作者的开源贡献。
DeepSeek 余额显示(气泡/小部件思路)参考了 MeteorNOX/DeepSeek-Balance-Whale-Widget,本项目的实现为桌宠内置的轻量版(菜单「DeepSeek 余额」+ 可选自动刷新,通过 DeepSeek 官方 /user/balance 接口查询,详见 DeepSeek API 查询余额文档)。
当前动画素材已同步参考项目近期更新后的高清 WebM 资源。项目以 WebM 目录为动画源;assets/characters 包含 106 个 WebM 动画文件。GIF 目录仅在构建 GIF 变体时生成。后续新增或替换动画时,请更新 WebM,需要构建 GIF 变体时再生成对应 GIF。
第三方素材、组件与随包分发的第三方二进制(如 resources/presentmon/ 的帧率采集后端)的授权声明见 THIRD_PARTY_NOTICES.md。
本项目采用 MIT License(见仓库根目录 LICENSE),第三方素材与组件授权声明见 THIRD_PARTY_NOTICES.md。
特别感谢:
docs/RELEASE-v4.3.0.md 的致谢)。syf,与 GitHub 账号的对应关系未经核实,故不并入任何个人条目,记为本地修复批/贡献记录)。#271 由 Xaisx-sys 报告(含精确代码定位与主/子宠对照实验,直接锁定根因),#272 同族记录见 issue #262(另一处 legacy 鼠标缺陷另立 #275)。逐项见 docs/RELEASE-v4.3.1.md。各版本的完整发布说明按版本归档在 docs/,GitHub Releases 同步:
| 版本 | 状态 | 发布说明 |
|---|---|---|
| v4.3.1 | 已发布(2026-10-17) | docs/RELEASE-v4.3.1.md |
| v4.3.0 | 已发布(2026-10-15) | docs/RELEASE-v4.3.0.md |
| v4.2.1 | 已发布(2026-09-23) | docs/RELEASE-v4.2.1.md |
| v4.2.0 | 已发布(2026-09-10) | docs/RELEASE-v4.2.0.md |
| v4.1.0 及更早 | 已发布(2026-09-02 及以前) | GitHub Releases |
一句话摘要(细节以发布说明为准):
edge-tts >= 7.3.1 / 作者账号区 + Android 0.2.1 测试包(#287)、每屏一窗多屏与「允许桌宠跨屏」(#288,默认关、重启生效)、歌词请求直连首选 + 有界单次回退(#291)、帧序列透明底板档位 v5(#292)、语音合成后端 provider 化(#267,默认仍 edge)、零活跃宠物不再静默 + slot0 迁移源清理口径更正(#289)、输入链路两处收尾(#293)、每日一签(抽签,#290:一天一支、一轮 48 天不重不漏)。本版 config.py 相对 v4.3.0 净增 16 个配置键(1 跨屏 + 9 语音后端 + 2 节日 + 4 每日一签)、删除 0 个。v4.3.0 之后的 PR 已全部并入 main(最后一批 #294:打包修复——四个变体都随包带 keyring、LICENSE 与第三方声明随包)。0xc0000142、edge 音色被下架后自动兜底、Linux 屏幕边缘无法贴边等一批关键修复。各版本的完整亮点与实测数字以对应发布稿为准(本页只保留一句话摘要):v4.3.0 的性能与内存实测、v4.2.1 的流畅度/包体数字、v4.2.0 的多开内存实测分别见 docs/RELEASE-v4.3.0.md、docs/RELEASE-v4.2.1.md、docs/RELEASE-v4.2.0.md 的「性能」与「新内容」节。
更早的历史条目(v4.0.x / v3.1.1 及开发期逐条记录)已从本页下沉到 docs/CHANGELOG-ARCHIVE-2026-10.md;逐 PR 的技术细节(含性能实测与实机证据)见 docs/INDEX.md 的「PR 报告存档」。
改代码前先读工程纪律与文档索引,不要只照本页行事:
AGENTS.md:工程纪律的权威出处——项目结构、变更纪律、CI 成本纪律、架构红线、"Context pointers"(改哪块必须先读哪份文档)。docs/INDEX.md:全文档入口索引,每份文档一句话 + 何时必读;找文档先查它,新文档必须在此登记并互链。docs/DEV-HANDOVER.md:本地运行、改配置、加功能、跑测试、重新打包的流程,外加 §10 的 pet/ 模块一览、Harness 启动器机制、性能与内存治理口径、坑位清单(自带基线日期,其中的行数/用例数按当时实测算,改动后以实际为准)。CONTEXT.md:领域术语表(Shared UX Contract / Settings System / Menu Action Model 等)。改对应代码前的必读文档(完整触发表见 AGENTS.md 的 "Context pointers"):
docs/WINDOW_PY_SPLIT_GUIDE.md:改 pet/window.py 前必读(只许瘦不许胖)。docs/SETTINGS-CHANGE-GATES.md:新增/改动任何设置项前必读。docs/ASSET-PIPELINE.md:做/换动画素材(绿幕源视频 → 透明 WebM)与新增角色前必读。docs/ONEDIR_PACKAGING.md:打包流水线、随包资产与构建门。docs/PR-REPORT-TEMPLATE.md / docs/ACCEPTANCE_TESTS.md / docs/BUILD-CI-FAILURE-NOTES-2026-08.md:PR 报告模板 / 三条验收路径该跑哪些测试 / 三平台打包 CI 的坑与解法汇总(CI 红了先去这里找同类记录)。docs/PR-MERGE-LESSONS-2026-09-12.md:合并 PR 前必读(叠放 PR 冲突、两个 PR 合并后才越线的预算/红线、时序测试 flake 纪律)。硬要求本身不在本页重复,两处权威出处:AGENTS.md(变更纪律 / CI 成本纪律 / 架构红线 / "Context pointers")与 docs/DEV-HANDOVER.md §8(PR 流程、三份交付证据的判定标准、变更门禁清单)。
一句话版:推送前过本地三道门(ruff → 全量 pytest → 受影响时序测试族高负载复跑 3 遍);每个 PR 交三份证据(修改文件说明 + 实测性能分析 + 实机运行记录,报告写入 docs/PR-REPORT-<主题>-<YYYY-MM-DD>.md 并在 docs/INDEX.md 登记;纯文档/文案改动可只保留第 1 条,但要在 PR 描述里写明豁免理由);架构红线与行数预算由 tests/test_architecture.py 机器守卫(常量值与每次校准的日期、理由都在该文件里,改前读它,不要照抄别处的旧数字);新增配置键三处登记(默认值 dict + reload() 白名单 + tests/test_config_schema.py 快照)。
pet/ 模块一览(含各模块职责)、Harness 启动器机制、性能与内存治理口径,统一收在 docs/DEV-HANDOVER.md §10 与本页 性能与内存治理 一节。
拆代码前先读:docs/WINDOW_PY_SPLIT_GUIDE.md(window.py 处于「只许瘦不许胖」的增量拆分公约下)、docs/SETTINGS-CHANGE-GATES.md(设置项准入/准出)。
在项目根目录执行:
pip install -r requirements.txt # 运行时 + 开发依赖(含 pytest/ruff)
$env:QT_QPA_PLATFORM = "offscreen"
python -m pytest -q
python -m ruff check pet/ tests/
python -m compileall pet packaging scripts
docs/ACCEPTANCE_TESTS.md;全量套件的规模与三端 CI 状态以实际运行为准,不要照抄历史数字。AGENTS.md 与 docs/PR-MERGE-LESSONS-2026-09-12.md。offscreen 直接跑 python -m pet)时的自查清单见 docs/DEV-HANDOVER.md §10.4。发布流水线:onedir 构建 → zip 绿色版 → Inno Setup 安装包。onedir 运行期零解压、不产生 _MEI 缓存;安装包免管理员、可选安装目录。
python -m pip install pyinstaller
# WebM Chat 版 / WebM 无 Chat 版
powershell -ExecutionPolicy Bypass -File scripts\build_onedir.ps1 -Variant webm-chat
powershell -ExecutionPolicy Bypass -File scripts\build_onedir.ps1 -Variant webm
macOS / Linux 用 scripts/build_macos.sh / scripts/build_linux.sh(与 CI 共用);Chat 入口为 packaging/pet_entry.py、无 Chat 入口为 packaging/pet_entry_no_chat.py。
完整的构建门(编码自检、包体瘦身、Qt 排他、产物 TTS 自检等)、Inno Setup 各变体的编译命令、GIF 变体与三端 CI 构建方式见 docs/ONEDIR_PACKAGING.md;打包流程与冒烟要求见 docs/DEV-HANDOVER.md §7;历史 onefile 产物的大小与 SHA-256 记录见 docs/BUILD_ARTIFACTS-2026-08-22.md。