File size: 1,714 Bytes
57d02cb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from fastapi import APIRouter, UploadFile, File, Query
from fastapi.responses import JSONResponse
from services.embedding import get_text_embedding, get_image_embedding
from services.pinecone_service import search_similar_images
from typing import List, Dict, Any

router = APIRouter(prefix="/search", tags=["Search"])

@router.get("/text")
async def search_by_text(query: str = Query(..., description="Search query")) -> Dict[str, Any]:
    try:
        query_embedding = get_text_embedding(query)
        if not query_embedding or not isinstance(query_embedding, list):
            return JSONResponse(content={"error": "Failed to generate embedding"}, status_code=500)
            
        results = search_similar_images(query_embedding)
        if not results:
            return JSONResponse(content={"matches": []}, status_code=200)
            
        return JSONResponse(content={"matches": results}, status_code=200)
    except Exception as e:
        return JSONResponse(content={"error": str(e)}, status_code=500)

@router.post("/image")
async def search_by_image(file: UploadFile = File(...)) -> Dict[str, Any]:
    try:
        image_embedding = get_image_embedding(file)
        if not image_embedding or not isinstance(image_embedding, list):
            return JSONResponse(content={"error": "Failed to generate embedding"}, status_code=500)
            
        results = search_similar_images(image_embedding)
        if not results:
            return JSONResponse(content={"matches": []}, status_code=200)
            
        return JSONResponse(content={"matches": results}, status_code=200)
    except Exception as e:
        return JSONResponse(content={"error": str(e)}, status_code=500)