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'
102 lines
3.3 KiB
YAML
102 lines
3.3 KiB
YAML
# FAM-Edge 配置文件 (Oracle 端) - 多模型池配置
|
||
# Tailscale: Oracle=100.74.137.126, NAS=100.70.234.39
|
||
#
|
||
# 异步队列模式:
|
||
# NAS 上传视频 → /api/edge/video/enqueue 入 SQLite 队列 → 消费者线程异步处理
|
||
# → NAS Poller 从 /api/edge/results 拉取结果
|
||
# 速率限制: Gemini 1000RPM x2 burst, NVIDIA 40RPM x2 burst
|
||
|
||
# NAS 端回调地址(旧 webhook 模式保留,异步模式不使用)
|
||
nas:
|
||
webhook_url: "http://100.70.234.39:8000/api/core/callback/event"
|
||
media_base_url: "http://100.70.234.39:8000/media"
|
||
media_token: "sentinel-media-2026"
|
||
|
||
# Oracle 端服务
|
||
server:
|
||
host: "0.0.0.0"
|
||
port: 5000
|
||
max_concurrent_tasks: 1
|
||
|
||
# 异步任务队列
|
||
queue:
|
||
db_path: "/opt/fam-edge/data/fam_queue.db"
|
||
upload_dir: "/tmp/fam_uploads"
|
||
poll_interval: 10 # 消费者轮询间隔(秒)
|
||
# API 速率限制 (RPM),burst_factor=2 表示突发容量为 2 倍 RPM
|
||
rate_limit:
|
||
gemini_rpm: 1000
|
||
nvidia_rpm: 40
|
||
burst_factor: 2
|
||
|
||
# 编排调度模式: fallback(顺序降级, 默认) | ensemble(并行交叉验证)
|
||
orchestrator:
|
||
mode: "fallback"
|
||
overall_timeout: 600
|
||
|
||
# 关键帧筛选参数(自适应:帧数随视频时长动态计算)
|
||
video:
|
||
candidate_per_minute: 2 # 每分钟粗抽候选帧数
|
||
candidate_min: 30 # 候选帧下限(短视频保底)
|
||
candidate_max: 120 # 候选帧上限(超长视频截断)
|
||
key_frame_interval_sec: 150 # 关键帧间隔(秒),每2.5分钟1张
|
||
min_key_frames: 5 # 关键帧下限(帧差不足时补足到此数)
|
||
max_key_frames_floor: 8 # 关键帧上限的下限(短视频保底)
|
||
max_key_frames_cap: 30 # 关键帧上限(超长视频截断)
|
||
mse_threshold: 500
|
||
jpeg_quality: 80
|
||
max_long_edge: 1024
|
||
|
||
# 超时(秒)
|
||
timeout:
|
||
download: 60
|
||
vlm_visual: 600
|
||
vlm_fusion: 300
|
||
callback: 30
|
||
overall: 1800
|
||
|
||
# 多模型池配置(新框架:本地大模型不参与视频分析,仅智能问答兜底)
|
||
#
|
||
# 视频分析链路(推送模式):
|
||
# 云端 VLM 直接产出结构化 JSON (global_summary / entities_json / frame_details)
|
||
# -> Edge 仅做格式化/校验 (format_cloud_result) -> 直接回写 NAS,无本地融合步骤
|
||
# 视觉角色: Gemini(主) -> NVIDIA NIM(备) 顺序降级; 两云端全失败 -> 任务 FAILED 走重试
|
||
#
|
||
# 智能问答链路:
|
||
# Gemini -> NVIDIA -> 本地 Ollama (仅当两云端都失败才启用本地兜底)
|
||
models:
|
||
- provider: "gemini"
|
||
role: "vision"
|
||
enabled: true
|
||
model_name: "gemini-flash-latest" # v1beta 下 gemini-1.5-flash 会 404
|
||
api_key: "${GEMINI_API_KEY}"
|
||
timeout: 90
|
||
circuit_breaker:
|
||
enabled: true
|
||
threshold: 5
|
||
cooldown: 300
|
||
|
||
- provider: "nvidia"
|
||
role: "vision"
|
||
enabled: true
|
||
model_name: "meta/llama-3.2-11b-vision-instruct"
|
||
base_url: "https://integrate.api.nvidia.com/v1"
|
||
api_key: "${NVIDIA_API_KEY}"
|
||
timeout: 30
|
||
circuit_breaker:
|
||
enabled: true
|
||
threshold: 5
|
||
cooldown: 300
|
||
|
||
# 本地模型:纯文本 qwen2.5:7b,仅参与智能问答,作为 Gemini/NVIDIA 都失败时的兜底
|
||
- provider: "ollama"
|
||
role: "text"
|
||
usage: "qa_fallback"
|
||
enabled: true
|
||
model_name: "qwen2.5:7b"
|
||
base_url: "http://localhost:11434"
|
||
timeout: 120
|
||
num_predict: 512
|
||
circuit_breaker:
|
||
enabled: false
|