from typing import List, Type from ..config.config import Config def get_retriever(retriever): """ Gets the retriever Args: retriever: retriever name Returns: retriever: Retriever class """ match retriever: case "google": from gpt_researcher.retrievers import GoogleSearch retriever = GoogleSearch case "searx": from gpt_researcher.retrievers import SearxSearch retriever = SearxSearch case "searchapi": from gpt_researcher.retrievers import SearchApiSearch retriever = SearchApiSearch case "serpapi": from gpt_researcher.retrievers import SerpApiSearch retriever = SerpApiSearch case "serper": from gpt_researcher.retrievers import SerperSearch retriever = SerperSearch case "duckduckgo": from gpt_researcher.retrievers import Duckduckgo retriever = Duckduckgo case "bing": from gpt_researcher.retrievers import BingSearch retriever = BingSearch case "arxiv": from gpt_researcher.retrievers import ArxivSearch retriever = ArxivSearch case "tavily": from gpt_researcher.retrievers import TavilySearch retriever = TavilySearch case "exa": from gpt_researcher.retrievers import ExaSearch retriever = ExaSearch case "semantic_scholar": from gpt_researcher.retrievers import SemanticScholarSearch retriever = SemanticScholarSearch case "pubmed_central": from gpt_researcher.retrievers import PubMedCentralSearch retriever = PubMedCentralSearch case "custom": from gpt_researcher.retrievers import CustomRetriever retriever = CustomRetriever case _: retriever = None return retriever def get_retrievers(headers, cfg): """ Determine which retriever(s) to use based on headers, config, or default. Args: headers (dict): The headers dictionary cfg (Config): The configuration object Returns: list: A list of retriever classes to be used for searching. """ # Check headers first for multiple retrievers if headers.get("retrievers"): retrievers = headers.get("retrievers").split(",") # If not found, check headers for a single retriever elif headers.get("retriever"): retrievers = [headers.get("retriever")] # If not in headers, check config for multiple retrievers elif cfg.retrievers: retrievers = cfg.retrievers # If not found, check config for a single retriever elif cfg.retriever: retrievers = [cfg.retriever] # If still not set, use default retriever else: retrievers = [get_default_retriever().__name__] # Convert retriever names to actual retriever classes # Use get_default_retriever() as a fallback for any invalid retriever names return [get_retriever(r) or get_default_retriever() for r in retrievers] def get_default_retriever(retriever): from gpt_researcher.retrievers import TavilySearch return TavilySearch