# EzVibeR+ A Tauri + Vue desktop pet that lives on your screen: a Live2D mascot you can chat with, take screenshots through, and have remember your conversations. --- ## 核心能力 - **Live2D 桌宠** — 透明置顶窗口上的可交互模型,点头/身子有不同反应 - **多会话聊天** — 每个对话独立存档,刷新不丢,支持重命名/删除/搜索/导出 - **日期分割线** — 仿微信风格,跨日自动插入分割线(今天/昨天/具体日期) - **截图 → AI** — 点击模型即可全屏截图,预览、附文、发送给 LLM 分析 - **自动标题** — 聊满 5 条消息后,AI 自动给当前对话起个短标题 - **全局搜索** — 当前会话高亮 + 跨会话关键词检索 - **导出** — Markdown / JSON 两种格式,保留全部消息 - **提醒中心** — 独立的伪对话,自动汇聚所有健康提醒(喝水/伸展/早安等) - **LLM 对话** — 兼容 OpenAI(含各类自部署网关)与 Anthropic,配置中心填 key 即可 - **情绪引擎** — 模型在闲置时会随情绪变化切换微表情 - **后台调度** — 60s 心跳驱动情绪、提醒、行为编排 - **系统托盘** — 显示/隐藏/配置/健康提醒/退出 ## 架构(高层) | 层 | 作用 | |---|---| | **Vue 3 + Vite 前端** | 桌宠窗口(Live2D + 聊天面板)、配置窗口、健康提醒管理窗口 | | **PixiJS / pixi-live2d-display** | Live2D 模型渲染与点击命中 | | **Tauri 2 IPC** | 前端 ↔ Rust 命令与事件通道 | | **Rust 后端** | LLM 接入、情绪引擎、调度器、会话持久化、截图、系统通知 | | **SQLite (rusqlite)** | 记忆与向量检索 | | **Axum 本地服务** | 给 webview 提供本地 Live2D 模型文件 | 两个长驻子系统: - **情绪引擎**:维护 idle / happy / focused / annoyed / sleepy 等状态 - **60s 调度器**:触发健康提醒、推进情绪、生成主动消息 ## 数据存储 | 数据 | 位置 | |---|---| | 主配置 | `~/.live2D/live2d.conf.json` | | 会话数据 | `<系统 app-data 目录>/com.ezviber.plus/sessions/` | | ├─ | `_index.json` — 会话索引(标题/消息数/时间) | | └─ | `/chat.jsonl` — 消息流(一行一条 JSON,仅 user/assistant/system/reminder;图片只存相对路径) | | └─ | `/images/.{png,jpg}` — 截图原图(PNG,给 LLM 多模态用)+ 压缩预览(JPEG,给聊天气泡用) | | 数据库 | `ezvibe_memory.db` — 向量记忆 | > 启动时自动 GC:扫描每个 session 的 `images/` 目录,删除没被任何消息引用的孤儿图片。 ## 配置项 主配置里的关键字段: | 字段 | 含义 | |---|---| | `model_dir` | Live2D 模型目录 | | `width` / `height` / `x` / `y` | 窗口几何 | | `llm_provider` | `openai`(含兼容服务)/ `anthropic` | | `llm_model` | 模型名 | | `llm_base_url` | API 端点 | | `llm_api_key` | API key | | `behaviors` | 健康提醒规则(可在托盘菜单里 CRUD) | ## 构建与运行 ```bash # 一次性安装 npm install # 开发模式(前端 + 后端热重载) npm run tauri:dev # 生产构建 npm run build # 前端 cd src-tauri && cargo build --release ./src-tauri/target/release/live2d ``` 环境要求:Node 18+、Rust 1.65+。 --- ## 更新日志 ### 2026-06-19 — reload 修复 / 截图流程收尾 / 日期分割线 / 启动 GC - **reload 后历史截图正常显示** — 修正了 Rust `PersistedMessage` 的字段命名(snake_case → camelCase 显式标注 + 旧数据 alias 兼容),消息里的图片路径在重启后能被前端正确读回 - **截图后整面板可点** — 截图 hide→show 后补齐 `set_focus()`,X11 透明窗口不再卡死 - **截图预览气泡生命周期干净** — 点"取消"或"发送给AI"立刻从内存移除;screenshot 消息被三层防御彻底排除出聊天记录(前端清 debounce timer + 后端拒绝写入 + reload 跳过读出) - **截图后窗口属性保留** — hide→show 后自动恢复 `always_on_top` 与 `visible_on_all_workspaces`,不再需要去托盘点"显示桌宠" - **搜索 / 导出改为弹出工具栏** — 顶部 🔍 按钮折叠展开,主聊天区更清爽 - **日期分割线** — 仿微信风格,自动按本地时区分组消息,跨日插入「今天 / 昨天 / YYYY-MM-DD」灰底圆角标签 - **启动时图片 GC** — 应用启动异步扫描 `images/` 目录,清理不被任何消息引用的孤儿 PNG / JPEG,释放磁盘 ### 2026-06-15 — 重建窗口保持置顶 + 全工作区可见 - **关闭后再开,置顶属性不丢** — 关闭桌宠窗口后,从托盘"显示桌宠"重建,新窗口仍是「始终在最前」 - **切换工作区桌宠跟着走** — 重建后的窗口在所有工作区都可见,切桌面不会丢 ### 2026-06-14 — 多会话 / 截图存档 / 提醒中心 / UI 收尾 - **多会话聊天持久化** — 每个对话独立存档到磁盘,刷新 / 重启不丢;顶部下拉切换,新建 / 重命名 / 删除 - **截图存档** — 截图自动保存为图片文件(PNG + JPEG 预览),消息里只存路径,气泡内直接预览 - **截图发送给 AI** — 在聊天里就能把截图 + 文字发给 LLM 分析 - **自动标题** — 5 条消息后异步调 LLM 生成 ≤20 字短标题 - **当前会话搜索** — 顶部输入框即时过滤 + 黄色高亮命中 - **全局搜索** — 跨会话搜索弹窗,命中后一键跳转 - **导出** — 当前会话一键导出为 Markdown 或 JSON - **提醒中心伪 session** — 所有健康提醒自动汇聚到独立的「🔔 提醒中心」对话,触发时自动跳转 - **模型位置 / 大小** — 模型水平居中,高度贴近聊天面板,宽度不超窗格 - **浮动工具栏** — 9 个按钮(聊天切换 / 配置 / 背景 / 换模型 / 位置 / 大小 / 复制 URL / 穿透 / 关闭)常驻可见 - **LLM 多模态兼容性** — 适配严格 OpenAI 兼容服务(去除冗余 detail 字段),多模态请求延长超时 - **右侧滚动条修复** — 页面不再因窗口边缘滚动而抖动 - **帮助横幅移除** — 不再每次启动弹出「?」说明 ### 2026-06-12 — 动作标签 / Idle 表情 / 截图 AI - **AI 动作标签** — LLM 回复末尾附带 `[MOTION: xxx]`,自动驱动 Live2D 动作与表情 - **Idle 微表情** — 长时间无交互时,模型随当前情绪切换微表情 - **截图 + AI 分析** — 点击模型身体 → 截图 → 气泡预览 → 可附文字 → 发给 AI - **配置中心展示模型能力** — 显示当前模型的动作组、表情列表、情绪映射表 - **透明窗口下 ChatPanel 点击修复** — 解决了 Linux + Tauri 透明窗口里 WebGL 画布拦截鼠标事件的问题 ### 2026-06-11 — Tauri v2 升级 / 健康提醒 / 窗口交互 - **升级到 Tauri v2** - **健康提醒 CRUD 面板** — 托盘「健康提醒」菜单进入,实时增删改查、变更立刻同步到调度器 - **禁双击全屏** — 透明窗口不再被双击意外最大化 - **情绪 → 表情 / 动作映射** — 自动根据模型实际可用的 expression / motion 匹配 - **前景遮罩修复** — 模型始终显示在最上层 ### 2026-06-01 ~ 2026-06-02 — LLM 对话能力 - **LLM 对话上线** — 桌宠从「能显示」进化为「能对话」 - 兼容 OpenAI(含自部署网关)与 Anthropic Claude - 配置中心填 key / model / base_url 即可启用 - 聊天面板常驻在桌宠窗口右侧 - 聊天面板可一键收起,模型自动占满整个窗口 - **思考气泡** — DeepSeek / QwQ / o1 等推理模型的 `` 块折叠显示,主回复独立 - **健康提醒显示为气泡** — 提醒事件实时以绿松石色气泡出现在聊天里,并自动注入 LLM system prompt 引导健康小贴士 - **窗口默认尺寸调整** — 600×480,可缩放 - **删除本地 llama.cpp 路径** — 不再支持内嵌本地推理,仅保留云端 API ### 2026-05-31 — 基础修复 - 「选择本地模型」按钮恢复响应 - 工具栏按钮全部正常显示 - 模型显示比例修复 - 切换 workspace 后模型尺寸不再重置 - 窗口置顶可配置 --- ## 相关链接 - [Live2D Cubism Core](https://www.live2d.com/) - [pixi-live2d-display](https://github.com/guansss/pixi-live2d-display) - [实施记录](docs/impl/) — 按日期的详细变更记录 ## 免责声明 本软件仅供个人学习使用,禁止商用或非法用途。