ericwyuan
|
ef56ae5662
|
feat(fam-edge): 新增 DiskGuard 磁盘空间守护,剩余空间不足自动清理旧素材
背景:Oracle 磁盘曾经被写满(gdrive_videos 持续下载新素材、旧文件迟迟没
清理),触发 rclone 的一个安全机制——同步遇到 IO 错误就整体拒绝执行删除,
形成"越满越删不掉,越删不掉越满"的死循环,最终连新视频都下载不了。这次
排查+手动清理已经解决了当次故障,但需要一道独立于 rclone 同步之外的兜底,
防止再次悄悄写满没人发现。
- oracle_db.py 新增 get_oldest_purgeable_material():只挑最旧的、已完成
分割阶段(status='done')的整段素材(非 motion_ 前缀),绝不碰运动片段
(事件时间轴/人物头像依赖它)和还在处理中的素材
- disk_guard.py 新增 DiskGuard 后台线程:5 分钟检查一次,剩余空间 <10GB
触发清理,删到 15GB 水位为止(留缓冲避免刚清完又立刻触发),复用已有的
delete_video() 完成实际删除
- app.py 启动这个后台服务;/api/oracle/activity 新增 disk 字段(实时剩余
空间 + 最近一次清理动作),供服务状态页展示
- 新增 9 个单元测试,全部通过(139/139)
已部署 Oracle 验证:DiskGuard 正常启动,配置生效。
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
2026-08-28 12:08:04 +08:00 |
|
ericwyuan
|
5caeb299a4
|
refactor(fam-edge): 问答链路抽离到独立 ai-gateway 服务,fam-edge 改为转发客户端
原本嵌在 fam-edge 里的问答模型降级链(NVIDIA 文字模型 -> Gemini 非 flash 文字
模型 -> 本地 Ollama 兜底,含 key 轮换/熔断)跟视频分析业务无关,是通用能力,
抽成独立 ai-gateway 服务(OpenAI 兼容协议),除了 fam-edge 自己,别的项目也能
直接接入。
- qa.py 重写为 HTTP 转发客户端,调 ai-gateway 的 /v1/chat/completions,翻译回
原有 run_qa/run_qa_stream 契约,api_gateway.py 和 fam-core 调用方零改动
- 删除 model_adapters/ollama_adapter.py 及其测试(问答专用,视频分析不需要本地模型)
- gemini_adapter.py / nvidia_adapter.py 移除 chat()/chat_stream() 及问答专用超时
(只保留视频分析用的 analyze_video)
- app.py 移除 Ollama 预热逻辑(现在由 ai-gateway 自己负责)
- config.yaml 移除 3 个问答专用 model 条目,新增 ai_gateway 客户端配置块
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
2026-08-23 14:12:01 +08:00 |
|
ericwyuan
|
9bba7b7e14
|
fix(chat): 流式问答中文乱码 + 问答模型链换成专用文字大模型
## 乱码修复
Gemini 流式接口 resp.iter_lines(decode_unicode=True) 没有显式设置
resp.encoding,requests 自己猜编码猜错了(Gemini 的 SSE 响应 Content-Type
不带 charset 参数),导致中文变成典型的 UTF-8 被当 Latin-1 解码的乱码。
fam-core 转发这一跳的 requests.iter_lines 调用有同样的坑,一并修了。
两处响应的 Content-Type 都补上 charset=utf-8,减少下游再犯同样错误的机会。
顺手用 latin-1/utf-8 往返把 NAS chat_history 里已经存了乱码的 3 条历史记录
恢复成正常文字。
## 问答模型链重新设计(跟视频分析完全独立)
用户要求问答不再用 flash/omni,优先用 NVIDIA 免费文字模型里上下文最大的几个,
不行再退 Gemini 非 flash 文字模型,最后本地 Ollama 兜底。
- base_adapter 新增 usage 字段(纯标记,不影响行为)
- qa.py 的 QAOrchestrator 只挑 role='text' 的适配器参与问答(按 config 出现
顺序决定降级顺序),role='vision' 的视频分析适配器(gemini-flash-latest /
nvidia omni)不再参与问答,两条链路彻底解耦
- 新增问答专用 NVIDIA 文字模型链(同一适配器内部 model_chain 降级):
nemotron-3-ultra-550b-a55b(1M上下文/561B) -> nemotron-3-super-120b-a12b
(1M上下文/124B) -> openai/gpt-oss-120b(131K上下文/117B)。三个都用真实
API 调用验证过当前账号可访问;同时验证过 llama-3.1-70b-instruct 和
nemotron-super-49b-v1.5 都收到"08/25/2026 起弃用"通知,排除;
nemotron-ultra-253b/mistral-large-2/nemotron-4-340b/kimi-k2.6 在目录里
能看到但实测调用返回 404"账号无权限",排除
- 新增问答专用 Gemini 非 flash 文字模型:gemini-pro-latest -> gemini-2.5-pro
(1M 上下文,复用视频分析同一批多 key 轮换)
- /api/edge/chat/ask(/stream) 默认 max_tokens 从 1024 提到 3072:新链路
优先用的都是"推理"模型,回答前会先吐一段思考过程,1024 经常在思考阶段
就被截断,用户永远看不到真正答案
新增 test_qa.py::test_init_only_keeps_text_role_adapters_in_config_order
验证角色过滤+顺序正确。
本地检查过 Ollama 服务本身:systemd enabled+running(8h 正常运行,
qwen2.5:7b 已加载),并非没启动——用户观察到的现象另有原因。
|
2026-08-23 07:46:48 +08:00 |
|
ericwyuan
|
22bd4d4ff9
|
fix(fam-edge): 停用旧 person_service LLM 合并 - 已被闭集识别取代且仍在持续产生错误合并
person_identifier 闭集识别(汤圆/媳妇走性别年龄规则,爷爷/爸爸走视觉大模型比对
参考图)已经稳定跑起来了,people 表里 4 个人的真实姓名行数据干净(汤圆692/
爸爸323/爷爷320/媳妇290)。但发现 person_service 的老 LLM 合并调度还在跑(每
30 分钟一次),持续把不可靠的猜测结果(如"人物E"→"人物T"这类无意义合并)写进
canonical_name,跟新系统打架,是 people 表里 392 条历史垃圾行的根源。
停用 person_service.enabled,改用新系统。順帶清理 Oracle 库里已经产生的 392
条垃圾行:10 条能对应上真实姓名的(如"幼儿"→汤圆 100 次、"人物A"→爷爷 37 次)
appearances 累加合并回真正的规范行,其余 382 条(老 LLM 合并的无意义中间结果,
canonical_name 对不上任何真实姓名)直接删除——不影响 events/videos 里已经落库
的原始分析数据,只是清理 people 表的聚合展示行。
|
2026-08-23 02:23:00 +08:00 |
|
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 |
|
ericwyuan
|
a1523b46c8
|
[重构] 运动事件驱动架构 - 整段素材按 ss_motion_events 分割运动片段再分析(不再整段送云端): oracle_db 加 motion_event_id/camera_id 列 + get_motion_events_in_range/has_unfinished_motion_in_range/get_video_by_motion_event_id; video_processor 素材→分割/片段→分析双分支(ffmpeg -c:v copy -c:a aac 保留音频); video_queue 片段入队; config 加 motion_segment 块
|
2026-08-22 12:19:17 +08:00 |
|
ericwyuan
|
2d9d96de56
|
[功能] fam-edge 运动心跳支持 - /api/ss/motion 空 events 心跳刷新, has_motion_in_range_local 按 max_heartbeat_age_sec(900s) fail-open
|
2026-08-22 12:08:00 +08:00 |
|
ericwyuan
|
38dea6ba2e
|
[重构] 运动预过滤改为本地事件(NAS推送) - 甲骨文不再反向访问NAS:新增 ss_motion_events 表/record_motion_events/has_motion_in_range_local,/api/ss/motion 接收端点,video_processor 改用本地运动事件预过滤,停用 dsm_motion_client 反向查询
|
2026-08-22 10:25:56 +08:00 |
|
ericwyuan
|
0d8e62607c
|
feat(fam-edge): DSM 运动侦测预过滤 - 空转时段跳过云端视频分析
群晖 Surveillance Station 用 SYNO.SurveillanceStation.EventCenter.Event(未公开
文档的内部接口,参数是下划线风格 camera_ids/start_time/end_time,公开文档里的
cameraIds/fromTime/toTime 是旧版 Event API 的参数名,两者不通用)记录了摄像头
真实的运动侦测事件(event_type=10=运动,start_time+duration 精确到秒),比自己
本地跑 ffmpeg 帧差分更准、不需要额外算力,之前一直在这台 NAS 上验证可行性。
新增 DsmMotionClient:process_video() 分析每段视频前,先用视频的
[event_start, event_start+duration] 时间窗查一次这个接口,窗口内一条运动事件都
没有就跳过云端分析(标记 done,compute_provider=skipped_no_motion),省掉长期
无人时段白白消耗的 Gemini/NVIDIA 配额。
安全设计:查询本身失败/未配置/账号密码没填一律 fail-open(当作"有运动",照常
分析),不会因为这层可选优化漏检真实事件——这是一个纯粹的省配额优化,不能反过来
影响监控系统的可靠性。
新增 12 个单测覆盖:禁用/缺凭证时的 fail-open、登录失败、网络异常、无事件、有
事件、按 camera_id 过滤(响应是按 ds_id 分组不是按 camera_id,容易搞混)、
最短运动时长阈值、session 过期重登录重试、env 变量解析。
账号密码走 .env 的 DSM_ACCOUNT/DSM_PASSWORD,不明文入库。
|
2026-08-22 09:46:00 +08:00 |
|
ericwyuan
|
708b6365f4
|
feat(fam-edge): Gemini key 分配改真随机 + 按项目名标注统计
用户明确要求: 每次调用应该是 1/n 概率的真随机抽取,而不是上一版的顺序轮转
(round-robin 在当前单消费者串行处理场景下已经是数学最优均匀分配,但用户想要
"数组里随机取一个,每次都是四分之一概率"这种更直观的随机语义)。_rotated_keys()
去掉持久的轮转下标,改用 random.randrange 每次调用随机选起点,仍保留"起点 key
全部模型失败就级联到下一个 key"的兜底逻辑不变。
同时新增 key_labels 配置:4 个 key 分别对应用户在 Google Cloud 上开的 4 个项目
(智能摄像头-1/2/3/4),model_calls 统计现在按项目名而不是泛化的 key1/key2
展示,ModelStats 页面的 Key 列/拆分逻辑同步改为按最后一个 "·" 分隔(原来写死
按 "·key" 前缀查找,项目名场景下不适用)。
新增/重写 7 个单测覆盖:随机起点级联顺序、randrange 调用范围正确性、大样本
随机分布均匀性、key_labels 默认值/自定义值/key 被丢弃时的对齐。
|
2026-08-22 07:37:33 +08:00 |
|
ericwyuan
|
61db82cb9b
|
refactor(fam-edge): 重构第一阶段 - 人物图片零额外调用 + 运行时稳定性 + 工程质量
人物图片功能重做: bbox 随核心视频分析那一次 Gemini 调用一并产出(prompts.py 加
person_appearances.bbox 字段, [ymin,xmin,ymax,xmax] 0-1000 归一化), frame_service
直接用存好的 bbox 裁剪头像/事件缩略图, 删除原来"展示时额外调用 Gemini 定位人物"的
整套逻辑(locate_person_bbox/VLM 校验/熔断), 从架构上消除与核心视频分析共抢配额的
问题; 用真实数据验证裁剪结果正确框住人物本体。
NVIDIA 模型修复: 实测原配置的 3 个模型均不可用(asset_id 引用 500/400, 不支持视频),
改用 nemotron-3-nano-omni 的 base64 内嵌视频方式(唯一实测打通), 加 max_base64_mb
防止对大文件做注定失败的编码。
Gemini 多 Key 轮换: 支持 extra_api_keys 配置多个独立项目的 key, 配额用尽时依次
换 key 重试(每换 key 需重新上传, Files API 按项目隔离)。
稳定性加固: CircuitBreaker HALF_OPEN 清空旧失败计数(修复探测一失败就重新 OPEN 的
bug); chat() 统一接入熔断器(原来只有视频分析路径检查); NVIDIA 适配器改用共享
json_parser(原来自己重复实现且不做 schema 校验); Gemini Files API 上传超时也尝试
清理远程孤儿文件; video_processor/video_queue 里直接操作 OracleDB._conn 的裸 SQL
改走新增的 set_event_start_time/mark_video_invalid/reset_video_to_pending 方法;
/health 加入队列线程存活状态; 密钥改用 ${ENV_VAR} 引用(.env 已支持自动加载),
不再明文写入 config.yaml。
工程质量: 新增 fam-edge/tests(32 个单元测试, 覆盖熔断器状态机/JSON 解析容错/
时间戳解析/bbox 坐标换算/多 key 解析), 新增 scripts/smoke_test.py(发版前接口
稳定性检查); 清理死代码(OllamaAdapter.analyze_frames、get_sync_delta 死分支、
未使用的 vision_timeout/max_concurrent_tasks 配置项); 修正 get_events_for_label
排序(改最近优先 + 过滤畸形历史时间戳)。
已部署 Oracle 并跑通 smoke test 全部 6 项检查。
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
2026-08-22 00:22:57 +08:00 |
|
ericwyuan
|
ff01d14c79
|
feat(v3): 人物模块重构 - 大模型结构化特征值替代 OpenCV 帧定位。prompt 增加 person_appearances(uid+7特征+action)并重写合并 prompt(稳定特征优先比对);gemini 透传特征字段;oracle_db events/people 加 person_appearances_json/features_json/display_uid + _merge_features;video_processor 去 cv2 改 ffprobe 校验、_store_result 聚合 uid 特征落 people、删缩略图/事件截图;person_service 聚合特征后基于特征文本 LLM 合并;api_gateway 删 3 个图接口;NAS 镜像+DDL 加新字段;fam-ui 特征卡替代头像、事件时间线人物特征块
|
2026-08-21 18:06:21 +08:00 |
|
ericwyuan
|
034dca92b2
|
fix(优先组): #18 密钥明文直配 config(弃 .env 依赖);#5 appearances 改 distinct 视频数覆盖校准(防 reconcile 累加膨胀);#9 oracle_sync 拉取加锁防 trigger_now 与后台并发双拉;#11 LLM 合并命名解析 target 已有 canonical(统一显示名)
|
2026-08-21 14:22:28 +08:00 |
|
ericwyuan
|
6afdda582b
|
feat(fam-edge): 队列健壮性 - ①失败重试间隔 retry_interval_sec=1h(last_fail_at 记录,配额类故障等恢复再试);②max_retries 2→10;③入队前 OpenCV 文件校验(可解码/大小/元数据,失败标 invalid 不入队)+ mtime 稳定窗口防 rclone 半成品 + 处理前二次确认
|
2026-08-21 14:09:38 +08:00 |
|
ericwyuan
|
b7b5fe6f0b
|
feat(fam-edge): NVIDIA 多模型降级链 - adapter 支持 model_chain(asset 上传一次逐个尝试)+switch_interval_sec 切换间隔+model_timeouts 每模型独立超时;实测全部候选不可用(omni 500/12b 400/其余 404),链机制保留待可用模型
|
2026-08-21 13:30:59 +08:00 |
|
ericwyuan
|
83eefc194a
|
config(fam-edge): gemini-flash-lite 超时放宽至 480s(8 分钟,用户要求;实测 22-34s 留足余量)
|
2026-08-21 13:07:42 +08:00 |
|
ericwyuan
|
b87b38b140
|
feat(fam-edge): 云端模型调用统计 - 新增 model_calls 表(provider/model/时间/耗时/成功/失败原因),gemini/nvidia 每次请求经 model_call_hook 记录并随 sync delta 下发;gemini 支持模型级 model_timeouts(lite 实测22.6s×4≈90s)
|
2026-08-21 12:21:49 +08:00 |
|
ericwyuan
|
ce27e4ab0c
|
feat(fam-edge): 视频生产-消费队列 - 新增 video_queue.py(生产者扫描新文件入队+重启恢复,独立消费者线程云端分析);模型消费超时按原配置×timeout_multiplier(2);failed 重试上限 max_retries(2);删除旧 watch_processor
|
2026-08-21 12:01:25 +08:00 |
|
ericwyuan
|
9b1cc8f93b
|
[阶段2] FAM-Edge 重构为整视频分析+同步接口+人物服务 - 移除切片/抽帧/队列,新增 oracle_db/person_service/qa/watch_processor/video_processor,api_gateway 提供 /api/oracle/sync 与 /api/oracle/people/correct
|
2026-08-21 10:38:15 +08:00 |
|
ericwyuan
|
eaf4ef3bd3
|
fix: Gemini 模型 fallback 链 — 修复全量降级 NVIDIA
根因: 免费层配额 GenerateRequestsPerDayPerProjectPerModel 每天每
模型仅 20 请求,日均 30+ 任务耗尽后持续 429,全部降级 NVIDIA
(最近40任务 35 nvidia / 4 gemini)。
- gemini_adapter 抽 _generate() 模型链调用: 429 立即切换下一模型
(flash -> flash-lite,各自独立 20/天配额),503 退避 3s 重试一次
再切换;视觉分析与问答统一走该链
- config: gemini 增 fallback_models,nvidia 恢复 nemotron-omni
(原生视频输入;此前 Oracle 线上手动改过未回传仓库,被旧配置
覆盖回 llama-3.2 逐帧模式) + timeout 30->120
- 健康检查校验整条模型链
实测 task 73: flash 429 -> lite 1s 内接管,12 帧直出,event_52
落库 provider=gemini。
|
2026-08-21 00:07:34 +08:00 |
|
ericwyuan
|
55633d3302
|
feat: NVIDIA 切换到原生视频输入 — nemotron-3-nano-omni + 集锦视频单次调用
调研结论: build.nvidia.com 免费托管 API 上 video-llama3-8b 与
qwen2.5-vl-72b 已下线(404),nvidia/nemotron-3-nano-omni-30b-a3b-reasoning
可用(200, 40RPM 免费额度内),原生支持 video_url 输入(MP4 base64)。
实现:
1. nvidia_adapter 新增 analyze_video: 按关键帧时间点截取 ±1.5s 片段
(drawtext 叠加时间戳,连字符避免冒号转义)拼集锦视频,640 宽 CRF28,
base64 后经 video_url 单次调用,输出全 schema JSON(frame_details +
global_summary + entities_json)并归一化对齐时间戳
2. analyze_frames 保留为无视频文件时的降级路径; chat max_tokens
512→2048(reasoning 模型 token 消耗大); timeout 20→120s
3. orchestrator.run_visual_analysis 增加 video_path 参数,fallback 循环
对支持 analyze_video 的适配器优先走视频模式,失败自动降级逐帧
实测(360MB 测试视频, 3 关键帧): 集锦 107KB, 全程 37s, 动态动作识别准确
(走动→坐沙发→坐餐桌),跨片段综合摘要正常 — 显著优于旧逐帧静态识别。
|
2026-08-20 17:21:33 +08:00 |
|
ericwyuan
|
02da23ef42
|
feat: 异步任务队列架构 - SQLite队列 + 速率限制 + NAS Poller
Edge端:
- 新增 SQLite 异步任务队列 (queue_manager + consumer)
- 新增 TokenBucket 速率限制器 (Gemini 1000 RPM, NVIDIA 40 RPM, burst 2x)
- 新增 /api/edge/video/enqueue + /api/edge/results 端点
- 消费者线程从队列消费任务,按速率限制调用AI模型
- orchestrator 集成 rate_limiter,Gemini优先→NVIDIA兜底
NAS端:
- Dispatcher 重构为 enqueue 模式(上传后立即返回,不等结果)
- 新增 Poller 线程(定期从Edge拉取结果写 MariaDB)
- app.py 启动 Poller,config.yaml 新增 poller 配置
- db_layer 更新 valid_stages 添加 'process'
|
2026-08-20 12:07:09 +08:00 |
|
ericwyuan
|
853cb21542
|
fix: NVIDIA single-frame JSON parsing + Gemini timeout/circuit breaker tuning
NVIDIA fix:
- Replace parse_vlm_json (requires full schema: global_summary/entities_json/
frame_details/compute_provider) with lightweight _parse_single_frame_json
that only extracts per-frame fields (person/action/clothing/etc)
- Root cause: NVIDIA adapter does per-frame analysis returning single-frame
JSON, but parse_vlm_json rejected it for missing full-schema fields
- Verified: task 297 → 6/6 frames parsed successfully, first SUCCESS
Gemini + circuit breaker tuning:
- Gemini timeout: 30s → 90s (multi-image vision analysis needs more time)
- NVIDIA timeout: 20s → 30s (per-frame API call)
- Circuit breaker threshold: 3 → 5 (less aggressive tripping)
- Circuit breaker cooldown: 600s → 300s (faster recovery)
|
2026-08-20 11:02:26 +08:00 |
|
ericwyuan
|
babf5b09a9
|
[架构重构] 移除本地Ollama融合,云端直出JSON直存DB,Q&A三模型降级
1. 视频摘要链路:云端VLM直出结构化JSON → Edge format_cloud_result格式化校验 → 直存NAS DB(移除run_text_fusion本地融合)
2. 智能问答链路:Gemini→NVIDIA→Ollama降级,新增chat()纯文本问答方法
3. 适配器重构:base/gemini/nvidia/ollama adapter新增chat();gemini多图单请求结构化JSON;nvidia逐帧调用聚合
4. 端点变更:/api/edge/chat → /api/edge/chat/ask,调orchestrator.run_qa()
5. chat_handler改经Edge Q&A编排,不再直连Ollama
6. 配置更新:ollama_url → qa_url,Ollama role注释改为Q&A兜底
7. README同步更新架构描述、拓扑图、时序图、模块表
|
2026-08-20 10:21:09 +08:00 |
|
ericwyuan
|
486eee4feb
|
fix(db): frame_timestamp ISO8601 归一化 + perf(edge): ollama num_predict 1024→512
- db_layer._dt_or_none 支持 ISO 8601(带 T/Z/时区偏移) 归一化为 MariaDB DATETIME 标准格式, 修复 1292 Incorrect datetime value
- edge config ollama num_predict 512: qwen2.5:7b 在 ARM 上 1024 token 融合需 200s, 降到 512 加速且输出足够
|
2026-08-20 09:26:42 +08:00 |
|
ericwyuan
|
d2fd01f134
|
perf(config): Gemini 视觉单帧 timeout 15→30s
实测 gemini-flash-latest 视觉推理免费层排队需 15~30s,15s 频繁超时触发熔断;
调到 30s 后单测通过(返回有效描述)。NVIDIA NIM 仍 20s 稳定可用
|
2026-08-20 09:14:53 +08:00 |
|
ericwyuan
|
a46da5db81
|
feat(orchestrator): 视觉 fallback 降级 + 文本融合角色化
- run_visual_analysis 仅 vision 角色参与, fallback 顺序降级(Gemini→NVIDIA NIM)首个成功即采用
- run_text_fusion 固定用 role=text 的 Ollama(qwen2.5:7b) 融合, 支持 num_predict
- config 改为多模型池(gemini/nvidia vision + ollama text)
|
2026-08-20 09:11:44 +08:00 |
|
ericwyuan
|
be30b5f875
|
fix(config): Ollama 超时与 num_predict 按 ARM 实测调整
- 实测 1024px 帧视觉编码 ~36s/帧 + ~5 tok/s 生成
- num_predict 500→60: 500 会单帧跑数分钟必触发 240s 超时
- vlm_visual/model timeout 240→600, vlm_fusion 120→300, overall 600→1800
|
2026-08-20 01:54:32 +08:00 |
|
ericwyuan
|
727642d38b
|
feat: adaptive keyframe count based on video duration
- Replace fixed 5-8 keyframe limit with duration-based adaptive sizing
- Candidate frames: clamp(duration_min × 2, 30, 120)
- Keyframe cap: clamp(duration / 150s, 8, 30)
- 30min video → 12 keyframes (was 8), 60min → 24, 120min → 30
- Short videos (<12min) still get floor of 8 keyframes
- Add Ollama keep-alive config doc to PROGRESS.md (OLLAMA_KEEP_ALIVE=-1)
- Update config.yaml and config.yaml.example with new video params
|
2026-08-20 01:29:14 +08:00 |
|
ericwyuan
|
47658fa068
|
[deploy] PyMySQL 替换 + Tailscale 组网 + config.yaml + 路径修复
- db_layer.py: mysql-connector-python(19MB) → PyMySQL(45KB), 去掉连接池
- config_loader.py: 修复路径解析 (2级→3级 dirname), FAM-Core + FAM-Edge 均修复
- Tailscale 组网完成: Oracle=100.74.137.126, NAS=100.70.234.39, 互通验证通过
- NAS Python 依赖: flask/gunicorn/pymysql/PyYAML 全部安装成功
- NAS 代码部署: /volume1/web/sentinel-home-ai/, FAM-Core 7 模块导入 PASS
- NAS DB 连接验证: PyMySQL → MariaDB 10.11.11, 6 张表可见, PASS
- config.yaml 创建: FAM-Core + FAM-Edge + FAM-UI (Tailscale IP + 密码)
- requirements.txt: mysql-connector-python → PyMySQL
|
2026-08-19 23:27:28 +08:00 |
|
ericwyuan
|
50d83539f6
|
[deploy] Oracle 环境部署 + 模型基准测试 + OllamaAdapter 优化
- Oracle 依赖安装: flask/gunicorn/requests/PyYAML/opencv/numpy 全部成功
- FAM-Edge 全部 8 个模块导入验证 PASS
- llava-phi3 基准测试: 冷启动 109s, 预热无限制 13.35s, 预热+num_predict=30 仅 4.34s PASS
- OllamaAdapter 新增 num_predict 可配置参数 (默认 500)
- config.yaml.example 新增 num_predict 配置项
- 创建 PROGRESS.md 进度追踪文档
|
2026-08-19 23:01:21 +08:00 |
|
ericwyuan
|
cdd1f21d4c
|
[3.1-3.5] FAM-Edge 全链路 - API-Gateway/Video-Preprocessor/AI-Orchestrator/模型适配器(基类+Ollama+Gemini)/熔断器/JSON解析容错 + 配置
|
2026-08-19 22:25:38 +08:00 |
|