Spaces:
Sleeping
Sleeping
File size: 1,882 Bytes
ec855e6 04c779b ec855e6 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | """
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"
}
|