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 字段完善
This commit is contained in:
31
.workbuddy/memory/2026-08-20.md
Normal file
31
.workbuddy/memory/2026-08-20.md
Normal file
@@ -0,0 +1,31 @@
|
||||
# 2026-08-20 工作记录
|
||||
|
||||
## NAS 瘦身 + 甲骨文同步(架构重构收尾,任务 #49/#50/#57/#59)
|
||||
|
||||
完成 NAS 端从「视频处理节点」到「纯管理后台」的改造:
|
||||
|
||||
### fam-core(NAS)改动
|
||||
- 删除: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-ui(NAS)改动
|
||||
- 改写读 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 部署验证,未做)
|
||||
- Oracle:rclone 配 Google 服务账号 JSON(orcLenas@gen-lang-client-0523399799.iam.gserviceaccount.com)→ systemd timer 定时同步到 /opt/fam-edge/gdrive_videos;设 ORACLE_SYNC_TOKEN 环境变量;重启 fam-edge
|
||||
- NAS:MariaDB 跑新 DDL 建 sync_* 表;设 ORACLE_SYNC_TOKEN;重启 fam-core + fam-ui;卸载 NAS venv 无用包(opencv/numpy 等)
|
||||
- 端到端验证:Google 硬盘新视频 → 甲骨文处理 → NAS 30 分钟同步可见
|
||||
- 服务账号私钥未入库,部署时需单独落到 Oracle 服务器本地
|
||||
Reference in New Issue
Block a user