Skip to content

Commit a9a5882

Browse files
committed
Add embedding API
1 parent 057b8d4 commit a9a5882

File tree

2 files changed

+69
-1
lines changed

2 files changed

+69
-1
lines changed

backend/main.py

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@
2020
DirectoryModel, DirectoryDetailResponse, RemoveDirectoryResponse, RemoveDirectoryRequest, CreateQueryRequest, \
2121
CreateQueryResponse, GeneratorInfo, SearchLogsResponse, QueryLogEntry, \
2222
ServiceStatusResponse, ServiceLogResponse, SearchResponse, SearchRequest, UpdateDirectoryResponse, \
23-
UpdateDirectoryRequest, GeneratePoolRequest, GeneratePoolResponse, GuideImageData, EmbeddingData
23+
UpdateDirectoryRequest, GeneratePoolRequest, GeneratePoolResponse, GuideImageData, EmbeddingData, \
24+
ComputeEmbeddingsRequest, ComputeEmbeddingsResponse, ImageEmbeddingsResponse
2425
from indexing import image_indexing_service
2526
from utils import aggregate_rankings, pil_image_to_base64, Timer
2627
from version import VERSION as BACKEND_VERSION
@@ -365,6 +366,58 @@ async def generate_pool(request: GeneratePoolRequest):
365366
)
366367

367368

369+
@app.post("/variance-analysis/compute-embeddings", response_model=ComputeEmbeddingsResponse)
370+
async def compute_embeddings(request: ComputeEmbeddingsRequest):
371+
"""
372+
Compute embeddings for a list of images from file paths.
373+
Returns embeddings for all available embedders.
374+
"""
375+
from PIL import Image as PImage
376+
377+
embedders = embedder_manager.get_image_embedders()
378+
embedder_names = list(embedders.keys())
379+
380+
results = []
381+
382+
for image_path in request.image_paths:
383+
if not os.path.exists(image_path):
384+
from monitoring import logger
385+
logger.warning(f"Image path does not exist: {image_path}")
386+
continue
387+
388+
try:
389+
# Load image
390+
img = PImage.open(image_path).convert("RGB")
391+
392+
# Compute embeddings for all embedders
393+
embeddings_data = []
394+
for embedder_name, embedder in embedders.items():
395+
try:
396+
embedding = embedder.embed(img)
397+
embeddings_data.append(EmbeddingData(
398+
embedder_name=embedder_name,
399+
embedding=embedding.tolist() if hasattr(embedding, 'tolist') else embedding
400+
))
401+
except Exception as e:
402+
from monitoring import logger
403+
logger.error(f"Error computing embedding with {embedder_name} for {image_path}: {e}", exc_info=True)
404+
405+
if embeddings_data:
406+
results.append(ImageEmbeddingsResponse(
407+
image_path=image_path,
408+
embeddings=embeddings_data
409+
))
410+
except Exception as e:
411+
from monitoring import logger
412+
logger.error(f"Error processing image {image_path}: {e}", exc_info=True)
413+
continue
414+
415+
return ComputeEmbeddingsResponse(
416+
results=results,
417+
embedder_names=embedder_names
418+
)
419+
420+
368421
from routes.gallery import router as gallery_router
369422

370423
app.include_router(gallery_router)

backend/models/schemas.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,3 +149,18 @@ class GeneratePoolResponse(BaseModel):
149149
pool_size: int
150150
guide_images: List[GuideImageData]
151151
embedder_names: List[str]
152+
153+
154+
# Embedding computation schemas
155+
class ComputeEmbeddingsRequest(BaseModel):
156+
image_paths: List[str] = Field(..., description="List of file paths to images")
157+
158+
159+
class ImageEmbeddingsResponse(BaseModel):
160+
image_path: str
161+
embeddings: List[EmbeddingData]
162+
163+
164+
class ComputeEmbeddingsResponse(BaseModel):
165+
results: List[ImageEmbeddingsResponse]
166+
embedder_names: List[str]

0 commit comments

Comments
 (0)