Spaces:
Sleeping
Sleeping
| """ | |
| 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() | |
| 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 | |
| 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 | |
| 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" | |
| } | |