# -*- coding: utf-8 -*- from typing import List, Optional from pydantic import BaseModel, ConfigDict, Field class KeywordConfig(BaseModel): model_config = ConfigDict(populate_by_name=True) storefront: List[str] = Field(default_factory=lambda: ["到店", "到达", "门头"]) handover: List[str] = Field(default_factory=lambda: ["交付", "交货", "签收"]) class AnalyzeRequest(BaseModel): model_config = ConfigDict(populate_by_name=True) media_id: int = Field(alias="mediaId") video_url: Optional[str] = Field(default=None, alias="videoUrl") sample_fps: float = Field(default=0.5, alias="sampleFps") enable_asr: bool = Field(default=True, alias="enableAsr") keywords: Optional[KeywordConfig] = None duration_sec: Optional[float] = Field(default=None, alias="durationSec") class SnapshotHit(BaseModel): model_config = ConfigDict(populate_by_name=True) time_sec: float = Field(alias="timeSec") confidence: float source: str class AsrHit(BaseModel): model_config = ConfigDict(populate_by_name=True) keyword: str time_sec: float = Field(alias="timeSec") class AnalyzeResponse(BaseModel): model_config = ConfigDict(populate_by_name=True) success: bool = True model_version: str = Field(default="1.0.0", alias="modelVersion") duration_sec: float = Field(default=0.0, alias="durationSec") storefront: Optional[SnapshotHit] = None handover: Optional[SnapshotHit] = None asr_hits: List[AsrHit] = Field(default_factory=list, alias="asrHits") message: Optional[str] = None class HealthResponse(BaseModel): model_config = ConfigDict(populate_by_name=True) status: str model_version: str = Field(alias="modelVersion") onnx_storefront_loaded: bool = Field(default=False, alias="onnxStorefrontLoaded") onnx_handover_loaded: bool = Field(default=False, alias="onnxHandoverLoaded") asr_available: bool = Field(default=False, alias="asrAvailable")