Files
EzVibe/docs/v2_design/EVOLUTION_ROADMAP.md
e2hang 96cb28fe08 feat: multi-layer eventFilter for window drag + text input fix + Qt platform xcb
- Fix window drag: install eventFilter on live2d_container, central, and
  _live2d_widget; fix super() call in dynamic class
- Fix text input: remove WA_TransparentForMouseEvents from _chat_container
- Force QT_QPA_PLATFORM=xcb on Linux (wayland has mouse event issues)
- Add HealthTracker module, update AgentBrain with health integration
- Update scheduler and memory modules
- Add v5_modify documentation

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-19 23:36:58 +08:00

208 lines
6.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# EzVibe 演进路线图 (v1.x → v2.0)
> 本文档描述 EzVibe 从当前版本到 v2.0 的演进计划。
---
## 概述
当前版本v1.x架构坚实、测试覆盖完善128 个单元测试),但在"健康监测与提醒"这一核心场景上仍有优化空间。
**演进目标**:把"健康数据采集"和"桌宠行为反馈"结合得更自然、更不招人烦。
---
## Phase 1底层重构与稳定性
**目标**:解决高危隐患,降低资源消耗
**时间线**:约 1 周
### 1.1 用 qasync 替换 QTimer 方案
**现状**
```python
# main.py:356-358
timer = QTimer(app)
timer.timeout.connect(lambda: self._loop.run_until_complete(asyncio.sleep(0)))
timer.setInterval(20)
```
**目标**:引入 qasync实现 Qt 事件循环与 asyncio 的原生融合。
**改动点**
1. `requirements.txt` 增加 `qasync`
2. `main.py` 重构 `_run_qt()``async def _run_qt()`
3. `ui/pet_window.py``_on_brain_tick()` 改为异步调用
**验收标准**
- 桌宠拖动流畅,无掉帧
- CPU 占用率空闲时 < 2%
- asyncio 与 Qt 事件循环无死锁
### 1.2 屏蔽/优化 OCR引入焦点窗口提取
**现状**`ScreenCapture` 每分钟调用 `pytesseract` 进行 OCR。
**目标**用轻量级的焦点窗口名字Window Title替代全屏 OCR。
**改动点**
1. 新增 `perception/window_monitor.py`(平台相关)
- Windows: `pywin32` / `win32gui`
- macOS: `AppKit`
- Linux: `pyatspi``xlib`
2. `KeyboardMouseMonitor` 增加 `get_active_window_title()` 方法
3. OCR 改为按需触发(仅在 `activity > 0.8` 持续 1 小时后)
**验收标准**
- 空闲时 CPU 占用降低 50%
- 焦点窗口标题能正确识别IDE/浏览器/文档)
### 1.3 新增 HealthTracker 模块
**现状**:健康数据混在 RAG 记忆系统中,无法精确时序统计。
**目标**:独立的结构化健康数据库。
**详见**`HEALTH_TRACKER_SPEC.md`
---
## Phase 2感知与决策升级
**目标**:让桌宠在健康场景下更"固执"但不招人烦
**时间线**:约 2 周
### 2.1 状态机微调 — DisplayMode 柔性降级
**现状**`annoyed` 状态下完全禁止 P0 打扰。
**目标**P0 提醒不屏蔽,但表现形式根据情绪状态柔化。
**改动点**
1. `agent/scheduler.py``Behavior` 增加 `display_mode` 属性:
```python
from enum import Enum
class DisplayMode(Enum):
NORMAL = "normal" # 正常打扰
QUIET = "quiet" # 缩角落举牌子
AGGRESSIVE = "aggressive" # 强制弹窗
```
2. `BehaviorScheduler.check_and_trigger()` 根据情绪状态选择 display_mode
3. `ui/pet_window.py` 实现对应的 UI 表现(正常/安静/强制)
### 2.2 LLM Prompt 工程升级
**目标**:将 HealthTracker 的统计数据作为固定上下文注入 System Prompt。
**改动点**
1. `agent/brain.py` 的 `DEFAULT_SYSTEM_PROMPT` 增加健康数据注入区:
```python
【用户健康状态】
- 今天喝水次数:{water_today}
- 连续静坐时间:{sedentary_minutes} 分钟
- 上次起身:{last_stand_time}
```
2. `AgentBrain.think()` 调用前从 HealthTracker 读取最新数据
### 2.3 解耦"动作触发"与"文案生成"
**现状**`decide_action()` 等待 LLM 生成文案后才执行 UI 动作。
**目标**P0 健康提醒立即执行 UI 动作LLM 文案异步加载或使用 Fallback 缓存。
**改动点**
1. `agent/brain.py` 增加 `FallbackMessageCache`
```python
FALLBACK_MESSAGES = {
"remind_water": ["记得喝水哦~", "该补充水分了!", "喝水时间到!"],
"remind_stretch": ["起来伸展一下吧!", "坐了好久啦,站起来动动!"],
}
```
2. `BehaviorScheduler` 触发时直接返回 Fallback 消息
3. LLM 文案异步加载后替换(如果来得及)
---
## Phase 3UI 与表现力强化
**目标**:让桌宠更有存在感,更能被注意到
**时间线**:约 2 周
### 3.1 番茄钟模式
**目标**:桌宠 UI 增加可视化倒计时状态。
**功能**
- 用户通过右键菜单启动番茄钟(默认 25 分钟)
- 进入番茄钟时桌宠变更为 `focused` 状态(带学霸眼镜动画)
- 期间严格执行免打扰P2/P3 完全禁止)
- 结束后主动撒花提醒休息5 分钟)
**改动点**
1. `ui/pet_window.py` 增加番茄钟 UI倒计时标签
2. `agent/emotion.py` 增加 `TOMATO` 状态
3. `agent/scheduler.py` 番茄钟期间修改活跃度限制逻辑
### 3.2 系统级通知
**现状**:仅使用 Qt 气泡通知,全屏时可能被遮挡。
**目标**:接入操作系统原生通知。
**改动点**
1. `ui/pet_window.py` 增加 `show_system_notification()` 方法
- Windows: `win10toast` / `plyer`
- macOS: `osascript` / `pync`
2. P0 提醒同时发送 Qt 气泡 + 系统通知
### 3.3 微交互确认 UI
**目标**:喝水/伸展提醒增加"已做"和"等会儿"按钮。
**改动点**
1. `ui/pet_window.py` 的 `show_reminder()` 增加按钮选项
2. 点击"已做"时:
- 触发 `user_healthy_action` 事件 → `emotion.update("happy")`
- 记录到 HealthTracker
3. 点击"等会儿"时:
- 延迟 N 分钟再次提醒(可配置,默认 5 分钟)
### 3.4 隐式确认反馈机制
**目标**:基于感知数据判断用户是否真的起身了。
**逻辑**
```
提醒起立
等待 2 分钟
ActivityDetector 监测键鼠完全无动作?
↓ 是
用户"去休息了" → emotion.update("happy") → 正向反馈
↓ 否
用户还在工位 → 再次提醒(或降低频率)
```
---
## 里程碑
| 阶段 | 目标 | 预计完成 |
|------|------|----------|
| v1.5 | Phase 1 完成qasync + HealthTracker | Week 1 |
| v1.6 | Phase 2 完成DisplayMode + Prompt 升级) | Week 3 |
| v2.0 | Phase 3 完成(番茄钟 + 系统通知 + 微交互) | Week 5 |
---
## 附录:技术债务清理
| 序号 | 技术债务 | 处理方式 |
|------|----------|----------|
| 1 | 两处 ActivityDetector感知层 + 调度器) | 统一使用感知层的实现,调度器引用其单例 |
| 2 | `brain.py` 和 `scheduler.py` 都有主动行为决策 | 明确分工brain 负责对话触发的行为scheduler 负责定时触发的行为 |
| 3 | 记忆系统每次检索都先写入 | 改为仅在 `think()` 时写入,检索时用历史数据 |