Python 桌面应用 · Live2D 集成 · AI 角色交互
把桌宠里能复用的部分,一个个拆成独立开源库
从桌宠项目里剥出来的通用件。每个都能单独用,不依赖桌宠本体。
| 组件 | 解决什么问题 | 许可 |
|---|---|---|
| agent-gate | 给 LLM Agent 的工具调用装一道 fail-closed 权限闸门 | AGPL-3.0 |
| window-locator | Windows 显示器几何与前台窗口查询,全部用物理像素 | AGPL-3.0 |
| netease-cdp | 用 CDP 驱动网易云桌面客户端(不碰 API、不需登录) | AGPL-3.0 |
| context-budget | 把对话历史裁到 token 预算内,保留人设丢掉最旧的轮次 | AGPL-3.0 |
| pyqt-live2d-bridge | 在 PyQt5 里渲染 Live2D Cubism,只给引擎不给窗口部件 | MIT |
🛡️ agent-gate · 零依赖 · 73 项测试
多数 Agent 框架的工具注册表里 risk 字段早就定义了,却没有任何一处读它——
工具一旦注册就会被无条件执行。对一个能读你屏幕、还要碰你文件的常驻进程来说,
"无条件执行"是最危险的默认值。
这个包把那道缺失的闸门补上,默认值全部保守:未知风险归为 confirm、
allowed_roots 为空即全部拒绝、无确认通道时 confirm 一律不执行、
被拒的调用不占配额。附带路径沙箱(拦 .. 穿越与符号链接逃逸)与 JSONL 审计。
🖥️ window-locator · 零依赖 · 90 项测试
显示器几何改用 GetMonitorInfoW 的原生物理矩形,不再用
QScreen.geometry() 乘本屏 dpr——后者在混合 DPI 多屏环境下位置会偏,
而尺寸恰好是对的,所以特别难查。取窗口矩形时默认包一层 per-monitor-v2
DPI 上下文。
顺手修掉一个真实 bug:原来那段"临时切 DPI 感知"的代码写成
try: return fn() finally: restore() except: return fn(),回调抛异常时会被
执行两次(对截图就是失败时抓两次屏)。
🎵 netease-cdp · 1 个依赖 · 124 项测试
不碰 HTTP API、不需要登录、不读 cookie——驱动的是你已经登录好的那个客户端 窗口,所以 VIP 与私人推荐天然可用。打开调试端口后即可读当前曲目、点播、 播放每日推荐与私人雷达。
测试不需要真的开客户端:tests/conftest.py 里是一个真的 HTTP + WebSocket
假 CDP 服务器,所以 JSON 组包、id 匹配、事件插播跳过、超时都真的被执行到。
🧠 context-budget · 零依赖 · 52 项测试
对话历史只增不减,而上下文窗口有限。朴素的 history[-20:] 会把一问一答拆散,
让模型看到"助手回答了但用户没问过"。这个包按轮裁、按预算裁,并明确保证:
常驻 system 永不丢弃、临时时间播报只留最新一条、对话成对丢弃、最后一轮永远保留。
不绑定 tokenizer——它的职责是"决定丢哪些消息",不是"精确算 token";
需要精确时用 counter= 注入。
🌉 pyqt-live2d-bridge · MIT · 53 项自检
把 Live2D Cubism 在 PyQt5 里的渲染、动作与表情绑定,从桌宠主程序里剥出来。
做法很朴素:只提供渲染引擎,不提供窗口部件——宿主可以是任何
QOpenGLWidget,这样它能嵌进任意 Qt 应用,而不是绑死在某个项目上。模型路径
也不写死(显式参数 > 环境变量 > 约定布局兜底),动作目录 / 表情合成 / 情绪映射
这些纯数据部分不依赖 GL 上下文,可以单独使用。
这是五个包里唯一以 MIT 发布的:上游 AIpet-Murasame 用的是 2D 立绘, 不含任何 Live2D 相关代码,这部分属于完全原创。其余四个既然来自 AGPL 项目, 就继续沿用 AGPL,不做改许可。
一个基于 Live2D 与 GPT-SoVITS 的 AI 桌面伴侣。PyQt5 承载无边框透明窗口与托盘, Live2D Cubism 负责立绘、动作与表情,Python 侧用 FastAPI 提供对话 / 语音 / 识屏能力, 另有一套 Vue 3 + Pinia + naive-ui 的 Web 管理后台(70+ 路由)用于调试与配置。
覆盖的能力包括:多动作组与表情绑定、情绪驱动表情、点击部位互动、语音合成与口型同步、 屏幕感知主动发言、长期记忆,以及番剧 / 天气 / 美食 / 音乐等本地路由。
上面那五个开源组件就是从这个项目里陆续拆出来的。
来源说明:本项目以 kuxiaowo/AIpet-Murasame(AGPL-3.0)为起点继续开发, 上游原始著作权归其作者所有;相对上游的主要修改见项目
CHANGELOG.md。 依据 AGPL-3.0,本项目同样以 AGPL-3.0 发布。
仓库暂为私有,整理完成后再考虑开源。
Minecraft 1.12.2 的女仆模组补丁。
我是 canyueY(胃疾癣)。主要做 Python 桌面应用。
这个桌宠的起点很普通:我在网上刷到上游项目 AIpet-Murasame 的演示视频, 觉得挺有意思,但用起来不少地方不合自己的习惯——于是干脆在它的基础上做衍生, 让它更贴合我自己的需求和使用方式。改着改着,就成了现在这个样子。
我的开发方式是公开借助 AI 开发:以 AI Agent 为主要实现工具,我负责定方向、拆问题、 判断交互手感、写测试验收,以及把不满意的地方打回去重做;具体的代码实现大量交给 Agent。 这样做的代价是要把验收标准讲清楚,好处是能把精力放在「到底要什么」上。
拆包这件事也是同一套打法:我把"哪些模块能独立出去"交给 Agent 做依赖分析, 自己判断该不该拆、许可能不能用、边界划在哪,再用测试把行为钉死—— 所以每个包都带着一份能独立跑的测试。
为什么不用
github-readme-stats那类现成卡片:它们的域名(*.vercel.app) 在国内被 DNS 污染,换台机器打开就是裂图;而且它们默认展示 total stars 与 连续提交天数——对这里要么是空白,要么会把 fork 上游的历史算成本人贡献。 上面这张图是仓库里的 SVG,不依赖任何第三方服务。数字口径:392 = 五个包
tests/下可独立运行的测试函数总数 (pyqt-live2d-bridge是自跑的自检脚本,按check()项计)。
- GitHub: @canyueY