import asyncio from enum import Enum from typing import List class SearchAPI(Enum): PERPLEXITY = "perplexity" TAVILY = "tavily" EXA = "exa" ARXIV = "arxiv" PUBMED = "pubmed" LINKUP = "linkup" class SearchException(Exception): def __init__(self, message, error_code=None): super().__init__() self.message = message self.error_code = error_code def __str__(self): return f'{self.message}' class SearchEngine: def batch_search(self, queries: List[str], max_results=5, include_raw_content=False, **kwargs): try: return asyncio.run( self.async_batch_search(queries, max_results=max_results, include_raw_content=include_raw_content, **kwargs)) except Exception as err: raise SearchException(f"search queries = {queries} failed.") async def async_batch_search(self, queries: List[str], max_results=5, include_raw_content=False, **kwargs): search_tasks = [] for query in queries: search_tasks.append( self.async_search(query, max_results, include_raw_content, **kwargs) ) # Execute all searches concurrently search_docs = await asyncio.gather(*search_tasks) return search_docs async def async_search(self, query: str, max_results=5, include_raw_content=False, **kwargs) -> dict: pass