| from enum import Enum |
| from typing import List, Optional |
|
|
| from pydantic import BaseModel |
|
|
|
|
| class ModelType(str, Enum): |
| """模型类型枚举""" |
|
|
| HOWCUTEAMI = "howcuteami" |
| DEEPFACE = "deepface" |
| HYBRID = "hybrid" |
|
|
|
|
| class ImageScoreItem(BaseModel): |
| file_path: str |
| score: float |
| is_cropped_face: bool = False |
| size_bytes: int |
| size_str: str |
| last_modified: str |
| nickname: Optional[str] = None |
|
|
|
|
| class SearchRequest(BaseModel): |
| keyword: Optional[str] = "" |
| searchType: Optional[str] = "face" |
| top_k: Optional[int] = 5 |
| score_threshold: float = 0.0 |
| nickname: Optional[str] = None |
|
|
|
|
| class ImageSearchRequest(BaseModel): |
| image: Optional[str] = None |
| searchType: Optional[str] = "face" |
| top_k: Optional[int] = 5 |
| score_threshold: float = 0.0 |
| nickname: Optional[str] = None |
|
|
|
|
| class ImageFileList(BaseModel): |
| results: List[ImageScoreItem] |
| count: int |
|
|
| class PagedImageFileList(BaseModel): |
| results: List[ImageScoreItem] |
| count: int |
| page: int |
| page_size: int |
| total_pages: int |
|
|
| class CelebrityMatchResponse(BaseModel): |
| filename: str |
| display_name: Optional[str] = None |
| distance: float |
| similarity: float |
| confidence: float |
| face_filename: Optional[str] = None |
|
|
|
|
| class CategoryStatItem(BaseModel): |
| category: str |
| display_name: str |
| count: int |
|
|
|
|
| class CategoryStatsResponse(BaseModel): |
| stats: List[CategoryStatItem] |
| total: int |
|
|