Files
sentinel-home-ai/.workbuddy/memory/2026-08-20.md
ericwyuan 2c5bf950c5 feat: 事件时间轴缩略帧 + 人物管理头像 + 人物合并硬规则校验
## 新架构:Oracle 集中计算 + NAS 代理展示

### Oracle 端 (fam-edge)
- 新增 frame_service: ffmpeg 视频抽帧 + VLM 人物定位裁剪头像(磁盘缓存)
- 新增 /api/oracle/frame: 按 video_id+ts 抽帧返回 jpeg(带 token)
- 新增 /api/oracle/avatar: 按 label 生成人物头像(VLM 定位人物 + 兜底整帧居中)
- 新增 person_identifier: 人物身份识别模块
- Gemini 适配器支持 flash/flash-lite 双模型切换,429 自动降级
- frame_service VLM 全模型 429 时进入 10 分钟熔断,避免每次请求白打配额
- 兜底头像不落缓存,配额恢复后自动重试 VLM 精确定位

### 人物合并硬规则校验(框架级修复)
- person_service: LLM 合并结果落库前加硬冲突检测
  - 性别冲突 → 绝不合并
  - 年龄档跨未成年/成年 → 绝不合并(防止把爷爷/宝宝并进同一人)
- oracle_db: upsert_person 入口剥离括号后缀(人物A(别名:人物B) → 人物A),消灭垃圾人物行
- 修复 set_canonical 丢弃 source 参数的 bug(旧代码硬编码 'manual' 导致错误合并被永久固化)
- get_events_for_label: 只提取该身份组的特征文本,头像定位更精准

### NAS 端 (fam-core)
- 新增 img_proxy: /api/proxy/frame 和 /api/proxy/avatar 代理 Oracle 图片
- app.py 注册 img_bp 蓝图
- oracle_sync / db_layer / member_manager 同步人物表

### UI 端 (fam-ui)
- 事件时间轴: 每条事件卡片加时间点缩略帧
- 人物管理: 每人卡片加头像(150x150 圆角)
- parse_persons: 剥离括号备注,与 Oracle 归一化一致
- 新增 EventItem 组件、Timeline 页改造
- Chat / ServiceStatus 页相应调整

### 数据库
- scripts/ddl.sql: 同步表结构更新
- Oracle people 表: features_json / display_uid / source 字段完善
2026-08-23 00:13:56 +08:00

32 lines
2.6 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.
# 2026-08-20 工作记录
## NAS 瘦身 + 甲骨文同步(架构重构收尾,任务 #49/#50/#57/#59
完成 NAS 端从「视频处理节点」到「纯管理后台」的改造:
### fam-coreNAS改动
- 删除scheduler / dispatcher / poller / event_receiver / video_server 五个模块 + tools/ 下 backfill 脚本(不再切片/抽帧/上传/提供视频下载)
- 新增 `oracle_sync.py`:唯一后台线程,每 30 分钟 `GET /api/oracle/sync?since=<cursor>&token=` 拉增量 → upsert 到本地 MariaDB `sync_*` 镜像表 → 推进 `sync_cursor``push_name_correct` 回推命名校正
- `db_layer.py` 重写:移除 process_tasks/event_details/monitor_events/family_members 旧逻辑,新增 sync_videos/sync_events/sync_people/sync_cursor 的 upsert/查询、`get_sync_stats``query_sync_events_for_person_date``get_sync_known_members_context`
- `member_manager.py`:命名/合并改回推 Oracle `/api/oracle/people/correct` + 即时 trigger_now 拉回
- `chat_handler.py`:上下文改查 sync_events按 person_list_json + 视频日期过滤),仍走 Oracle `/api/edge/chat/ask`
- `app.py`:仅启动 OracleSync 线程,移除看门狗
- config删除 scheduler/dispatcher/poller/video_server/storage新增 `oracle_sync`token 用 `${ORACLE_SYNC_TOKEN}` 环境变量)
### fam-uiNAS改动
- 改写读 sync_videos/sync_events/sync_people事件时间轴改为「视频会话列表 + 事件时间线」(无帧图);人物管理移除照片逻辑(仅标签/规范名/命名/合并);统计改自 sync 表;侧边栏任务队列状态改为同步状态
### DDL / 文档
- `scripts/ddl.sql` 新增 sync_videos / sync_events / sync_people / sync_cursor 四张镜像表(时间字段用 VARCHAR 规避 MariaDB 严格模式)
- README §1.1/§2.2/§3.1/§3.2/§3.3/§4/§5/§8.3 全面更新到新数据流Google 硬盘→rclone→甲骨文→同步→NAS 镜像)
### 提交
- `[阶段2]` fam-edge 重构(整视频分析+同步接口+人物服务)已 commit+push
- `[阶段3]` fam-core 瘦身+Oracle-Sync+UI 改读 已 commit+push
### 待办(#51 部署验证,未做)
- Oraclerclone 配 Google 服务账号 JSONorcLenas@gen-lang-client-0523399799.iam.gserviceaccount.com→ systemd timer 定时同步到 /opt/fam-edge/gdrive_videos设 ORACLE_SYNC_TOKEN 环境变量;重启 fam-edge
- NASMariaDB 跑新 DDL 建 sync_* 表;设 ORACLE_SYNC_TOKEN重启 fam-core + fam-ui卸载 NAS venv 无用包opencv/numpy 等)
- 端到端验证Google 硬盘新视频 → 甲骨文处理 → NAS 30 分钟同步可见
- 服务账号私钥未入库,部署时需单独落到 Oracle 服务器本地