feat(fam-edge): 云端模型调用统计 - 新增 model_calls 表(provider/model/时间/耗时/成功/失败原因),gemini/nvidia 每次请求经 model_call_hook 记录并随 sync delta 下发;gemini 支持模型级 model_timeouts(lite 实测22.6s×4≈90s)

This commit is contained in:
ericwyuan
2026-08-21 12:21:49 +08:00
parent 1b0f62e5e9
commit b87b38b140
6 changed files with 90 additions and 3 deletions

View File

@@ -11,7 +11,9 @@ SDK: openai (NIM 兼容 OpenAI API 规范)
import os
import json
import re
import time
import requests
from datetime import datetime
from typing import Dict, List, Optional
from .base_adapter import BaseModelAdapter
@@ -144,6 +146,8 @@ class NvidiaVisionAdapter(BaseModelAdapter):
return None
prompt = self._build_video_prompt(known_members_context, event_start_time)
started = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
t0 = time.time()
try:
resp = self._client.chat.completions.create(
model=self.model_name,
@@ -158,16 +162,20 @@ class NvidiaVisionAdapter(BaseModelAdapter):
extra_body={"media_io_kwargs": {"video": {"num_frames": 128}}},
timeout=self.timeout
)
duration = time.time() - t0
content = resp.choices[0].message.content
if not content:
self._emit_model_call(self.model_name, started, duration, False, "empty_content")
logger.warning("NVIDIA 视频分析返回空 content")
self._cb.record_failure()
return None
data = self._parse_json(content)
if not data or 'events' not in data:
self._emit_model_call(self.model_name, started, duration, False, "json_parse_failed")
logger.warning(f"NVIDIA 视频 JSON 解析失败: {content[:150]}")
self._cb.record_failure()
return None
self._emit_model_call(self.model_name, started, duration, True)
self._cb.record_success()
logger.info(f"NVIDIA 整视频分析完成events={len(data.get('events', []))}")
return {
@@ -177,6 +185,8 @@ class NvidiaVisionAdapter(BaseModelAdapter):
"compute_provider": "nvidia",
}
except Exception as e:
duration = time.time() - t0
self._emit_model_call(self.model_name, started, duration, False, str(e))
self._cb.record_failure()
logger.warning(f"NVIDIA 视频分析异常: {e}")
return None