""" API router for embedding endpoints. """ from fastapi import APIRouter, Depends, HTTPException, status from typing import Any, Dict from ..models.request_models import SingleRequest, BatchRequest from ..services.async_embeddings_service import AsyncEmbeddingsService from ..auth import api_key_guard from ..logger import logger router = APIRouter(prefix="/embed", tags=["embed"]) # service is a module-level singleton service = AsyncEmbeddingsService() @router.post("/single") async def embed_single(req: SingleRequest, _: Any = Depends(api_key_guard)): """Generate embedding for one text.""" try: emb = await service.generate_single_embedding(req.text) return {"embedding": emb} except ValueError as ve: # Warning since it's a client usage error (400) logger.warning(f"Validation Error: {ve}") raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(ve)) except Exception as e: # Error level since it's a server failure (500) logger.error(f"Failed /embed/single request") # Traceback will be handled by global exception handler raise @router.post("/batch") async def embed_batch(req: BatchRequest, _: Any = Depends(api_key_guard)): """Efficient batch embedding endpoint.""" try: embeddings = await service.generate_batch_embeddings(req.texts) return {"embeddings": embeddings} except Exception as e: logger.error(f"Failed /embed/batch request for {len(req.texts)} items") raise @router.get("/health") async def health_check() -> Dict[str, Any]: """Verify server status and model readiness.""" return { "status": "healthy", "model_loaded": service.is_ready, "device": str(service.device) if service.is_ready else "not_loaded" }