Spaces:
Running
Running
| from typing import Any, Dict, List, Optional, Union | |
| import httpx | |
| from utils.image_utils import base64_to_image | |
| class RemoteRetrievalClient: | |
| def __init__(self, server_url: str = "http://localhost:8000"): | |
| self.server_url = server_url | |
| self.client = httpx.AsyncClient(timeout=60.0) | |
| async def search_images(self, query: str, top_k: int = 5): | |
| try: | |
| response = await self.client.post( | |
| f"{self.server_url}/search", | |
| json={"query": query, "top_k": top_k} | |
| ) | |
| response.raise_for_status() | |
| data = response.json() | |
| # Load images from paths | |
| images = [base64_to_image(image) for image in data["images"]] | |
| return images, data["scores"], data["image_paths"] | |
| except Exception as e: | |
| raise Exception(f"Remote search failed: {str(e)}") | |
| async def process_feedback( | |
| self, | |
| query: str, | |
| relevant_image_paths: List[str], | |
| annotator_json_boxes_list: List[Optional[List[Dict[str, Any]]]], | |
| visualization: bool = False, | |
| top_k_feedback: int = 5, | |
| prompt_based_on_query: bool = False, | |
| user_prompt: Optional[str] = None, | |
| relevant_captions: Optional[Union[List[str], str]] = None, | |
| irrelevant_captions: Optional[Union[List[str], str]] = None, | |
| prompt: Optional[str] = None | |
| ): | |
| try: | |
| response = await self.client.post( | |
| f"{self.server_url}/process_feedback", | |
| json={ | |
| "query": query, | |
| "relevant_image_paths": relevant_image_paths, | |
| "user_prompt": user_prompt, | |
| "annotator_json_boxes_list": annotator_json_boxes_list, | |
| "visualization": visualization, | |
| "top_k_feedback": top_k_feedback, | |
| "prompt_based_on_query": prompt_based_on_query, | |
| "relevant_captions": relevant_captions, | |
| "irrelevant_captions": irrelevant_captions, | |
| "prompt": prompt | |
| } | |
| ) | |
| response.raise_for_status() | |
| data = response.json() | |
| return data["relevance_feedback_results"] | |
| except Exception as e: | |
| raise Exception(f"Remote process feedback failed: {str(e)}") | |
| async def apply_feedback( | |
| self, | |
| query: str, | |
| top_k: int, | |
| relevant_captions: Optional[List[str]] = None, | |
| irrelevant_captions: Optional[List[str]] = None, | |
| fuse_initial_query: bool = False | |
| ): | |
| try: | |
| relevant_captions = relevant_captions.split(",") | |
| irrelevant_captions = irrelevant_captions.split(",") | |
| response = await self.client.post( | |
| f"{self.server_url}/apply_feedback", | |
| json={ | |
| "query": query, | |
| "top_k": top_k, | |
| "relevant_captions": relevant_captions, | |
| "irrelevant_captions": irrelevant_captions, | |
| "fuse_initial_query": fuse_initial_query | |
| } | |
| ) | |
| response.raise_for_status() | |
| data = response.json() | |
| images = [base64_to_image(image) for image in data["images"]] | |
| return images, data["scores"], data["image_paths"] | |
| except Exception as e: | |
| raise Exception(f"Remote feedback failed: {str(e)}") | |
| async def health(self): | |
| try: | |
| response = await self.client.get(f"{self.server_url}/health") | |
| response.raise_for_status() | |
| return response.json() | |
| except Exception as e: | |
| raise Exception(f"Remote health check failed: {str(e)}") | |
| async def close(self): | |
| await self.client.aclose() | |