fix(server): 视频检测接口补充 LLM 管道结果传递
This commit is contained in:
@@ -14,6 +14,36 @@ router = APIRouter()
|
|||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# DetectionService 单例 (MVP-3 / D33)
|
||||||
|
#
|
||||||
|
# 之前每次请求都 new 一个 DetectionService,会导致 rule_engine / aggregator 状态
|
||||||
|
# 不共享,规则配置 API 修改后无法同步生效。改造为按 model_service 缓存的单例。
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
_detection_service = None
|
||||||
|
|
||||||
|
|
||||||
|
def get_detection_service(model_service=None):
|
||||||
|
"""获取共享的 DetectionService 单例。
|
||||||
|
|
||||||
|
若尚未初始化且未传入 ``model_service``,将抛出 RuntimeError。
|
||||||
|
"""
|
||||||
|
|
||||||
|
global _detection_service
|
||||||
|
if _detection_service is None:
|
||||||
|
if model_service is None:
|
||||||
|
raise RuntimeError(
|
||||||
|
"DetectionService 尚未初始化,请先在 main.lifespan 中调用 "
|
||||||
|
"get_detection_service(model_service)"
|
||||||
|
)
|
||||||
|
from services.detection_service import DetectionService
|
||||||
|
_detection_service = DetectionService(model_service)
|
||||||
|
logger.info("DetectionService 单例已初始化")
|
||||||
|
return _detection_service
|
||||||
|
|
||||||
|
|
||||||
@router.post("/detect/image", response_model=ImageDetectionResult)
|
@router.post("/detect/image", response_model=ImageDetectionResult)
|
||||||
async def detect_image(
|
async def detect_image(
|
||||||
file: UploadFile = File(...),
|
file: UploadFile = File(...),
|
||||||
@@ -42,7 +72,7 @@ async def detect_image(
|
|||||||
from main import model_service
|
from main import model_service
|
||||||
from services.detection_service import DetectionService
|
from services.detection_service import DetectionService
|
||||||
|
|
||||||
detection_service = DetectionService(model_service)
|
detection_service = get_detection_service(model_service)
|
||||||
|
|
||||||
# 解析算法配置
|
# 解析算法配置
|
||||||
algo_config = None
|
algo_config = None
|
||||||
@@ -309,7 +339,10 @@ async def detect_video(
|
|||||||
'frame_index': frame_index,
|
'frame_index': frame_index,
|
||||||
'timestamp': round(frame_index / fps, 2) if fps > 0 else 0,
|
'timestamp': round(frame_index / fps, 2) if fps > 0 else 0,
|
||||||
'detections': result_data['detections'],
|
'detections': result_data['detections'],
|
||||||
'detection_count': len(result_data['detections'])
|
'detection_count': len(result_data['detections']),
|
||||||
|
# MVP-3: 携带 LLM 管道结果供前端展示
|
||||||
|
'llm_results': result_data.get('llm_results', []),
|
||||||
|
'alert_events': result_data.get('alert_events', []),
|
||||||
})
|
})
|
||||||
|
|
||||||
# 提取关键帧截图(最多保留 20 张,防止响应过大)
|
# 提取关键帧截图(最多保留 20 张,防止响应过大)
|
||||||
|
|||||||
Reference in New Issue
Block a user