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

2.6 KiB
Raw Blame History

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_cursorpush_name_correct 回推命名校正
  • db_layer.py 重写:移除 process_tasks/event_details/monitor_events/family_members 旧逻辑,新增 sync_videos/sync_events/sync_people/sync_cursor 的 upsert/查询、get_sync_statsquery_sync_events_for_person_dateget_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_synctoken 用 ${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 服务器本地