# api/extract.py from fastapi import APIRouter, File, UploadFile, Form, HTTPException, Header from services.face_service import get_face_service import config import logging import numpy as np router = APIRouter() face_service = get_face_service() logger = logging.getLogger(__name__) @router.post("/extract") async def extract_embedding( x_api_key: str = Header(...), files: list[UploadFile] = File(...) ): if x_api_key != config.Config.API_KEY: raise HTTPException(status_code=401, detail="Invalid API key") try: if len(files) == 0: raise HTTPException(status_code=400, detail="Please provide at least 1 image") if len(files) > 10: raise HTTPException(status_code=400, detail="Maximum 10 images allowed") embeddings = [] for file in files: contents = await file.read() if len(contents) == 0: continue face_data, error = face_service.extract_face(contents) if face_data: embeddings.append(face_data['embedding']) if len(embeddings) == 0: return { "success": False, "message": "No valid faces detected", "embedding": None, "quality": 0 } avg_embedding = np.mean(embeddings, axis=0) avg_embedding = avg_embedding / np.linalg.norm(avg_embedding) return { "success": True, "message": f"Embedding extracted from {len(embeddings)} faces", "embedding": avg_embedding.tolist(), "quality": 0.95, "faces_detected": len(embeddings) } except HTTPException: raise except Exception as e: logger.error(f"Extract embedding error: {e}") raise HTTPException(status_code=500, detail=f"Extract failed: {str(e)}")