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"
    }