163 lines
8.3 KiB
Markdown
163 lines
8.3 KiB
Markdown
# 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` — 会话索引(标题/消息数/时间) |
|
||
| └─ | `<session-id>/chat.jsonl` — 消息流(一行一条 JSON,仅 user/assistant/system/reminder;图片只存相对路径) |
|
||
| └─ | `<session-id>/images/<uuid>.{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 等推理模型的 `<think>…</think>` 块折叠显示,主回复独立
|
||
- **健康提醒显示为气泡** — 提醒事件实时以绿松石色气泡出现在聊天里,并自动注入 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/) — 按日期的详细变更记录
|
||
|
||
## 免责声明
|
||
|
||
本软件仅供个人学习使用,禁止商用或非法用途。
|