Coverage for src / local_deep_research / web_search_engines / engine_registry.py: 100%
9 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-14 23:55 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-14 23:55 +0000
1"""
2Hardcoded registry of search engine module paths and class names.
4This is the single source of truth for which Python module/class implements
5each search engine. These are internal wiring details — not user configuration.
7Engines NOT in this registry (registered at runtime instead):
8- library → LibraryRAGSearchEngine (registered in search_engines_config.py)
9- collection_* → CollectionSearchEngine (registered in search_engines_config.py)
10- LangChain retrievers (registered in search_engines_config.py)
11"""
13from dataclasses import dataclass
14from typing import Dict, Optional
17@dataclass(frozen=True)
18class EngineEntry:
19 """Immutable record mapping an engine name to its implementation."""
21 module_path: str
22 class_name: str
23 full_search_module: Optional[str] = None
24 full_search_class: Optional[str] = None
27ENGINE_REGISTRY: Dict[str, EngineEntry] = {
28 # --- Engines from default_settings.json ---
29 "arxiv": EngineEntry(
30 module_path=".engines.search_engine_arxiv",
31 class_name="ArXivSearchEngine",
32 ),
33 "brave": EngineEntry(
34 module_path=".engines.search_engine_brave",
35 class_name="BraveSearchEngine",
36 full_search_module=".engines.full_search",
37 full_search_class="FullSearchResults",
38 ),
39 "exa": EngineEntry(
40 module_path=".engines.search_engine_exa",
41 class_name="ExaSearchEngine",
42 ),
43 "github": EngineEntry(
44 module_path=".engines.search_engine_github",
45 class_name="GitHubSearchEngine",
46 ),
47 "google_pse": EngineEntry(
48 module_path=".engines.search_engine_google_pse",
49 class_name="GooglePSESearchEngine",
50 full_search_module=".engines.full_search",
51 full_search_class="FullSearchResults",
52 ),
53 "mojeek": EngineEntry(
54 module_path=".engines.search_engine_mojeek",
55 class_name="MojeekSearchEngine",
56 full_search_module=".engines.full_search",
57 full_search_class="FullSearchResults",
58 ),
59 "pubmed": EngineEntry(
60 module_path=".engines.search_engine_pubmed",
61 class_name="PubMedSearchEngine",
62 ),
63 "searxng": EngineEntry(
64 module_path=".engines.search_engine_searxng",
65 class_name="SearXNGSearchEngine",
66 full_search_module=".engines.full_search",
67 full_search_class="FullSearchResults",
68 ),
69 "serpapi": EngineEntry(
70 module_path=".engines.search_engine_serpapi",
71 class_name="SerpAPISearchEngine",
72 full_search_module=".engines.full_search",
73 full_search_class="FullSearchResults",
74 ),
75 "tavily": EngineEntry(
76 module_path=".engines.search_engine_tavily",
77 class_name="TavilySearchEngine",
78 ),
79 "wayback": EngineEntry(
80 module_path=".engines.search_engine_wayback",
81 class_name="WaybackSearchEngine",
82 ),
83 "wikinews": EngineEntry(
84 module_path=".engines.search_engine_wikinews",
85 class_name="WikinewsSearchEngine",
86 ),
87 "wikipedia": EngineEntry(
88 module_path=".engines.search_engine_wikipedia",
89 class_name="WikipediaSearchEngine",
90 ),
91 # --- Engines from defaults/settings/search_engines/*.json ---
92 "elasticsearch": EngineEntry(
93 module_path=".engines.search_engine_elasticsearch",
94 class_name="ElasticsearchSearchEngine",
95 ),
96 "paperless": EngineEntry(
97 module_path=".engines.search_engine_paperless",
98 class_name="PaperlessSearchEngine",
99 ),
100 "parallel": EngineEntry(
101 module_path=".engines.parallel_search_engine",
102 class_name="ParallelSearchEngine",
103 ),
104 "scaleserp": EngineEntry(
105 module_path=".engines.search_engine_scaleserp",
106 class_name="ScaleSerpSearchEngine",
107 ),
108 "serper": EngineEntry(
109 module_path=".engines.search_engine_serper",
110 class_name="SerperSearchEngine",
111 ),
112 # --- Engines from defaults/settings_*.json ---
113 "nasa_ads": EngineEntry(
114 module_path=".engines.search_engine_nasa_ads",
115 class_name="NasaAdsSearchEngine",
116 ),
117 "openalex": EngineEntry(
118 module_path=".engines.search_engine_openalex",
119 class_name="OpenAlexSearchEngine",
120 ),
121 "semantic_scholar": EngineEntry(
122 module_path=".engines.search_engine_semantic_scholar",
123 class_name="SemanticScholarSearchEngine",
124 ),
125 # --- Engines from defaults/settings_*.json (added in #1540) ---
126 "gutenberg": EngineEntry(
127 module_path=".engines.search_engine_gutenberg",
128 class_name="GutenbergSearchEngine",
129 ),
130 "openlibrary": EngineEntry(
131 module_path=".engines.search_engine_openlibrary",
132 class_name="OpenLibrarySearchEngine",
133 ),
134 "pubchem": EngineEntry(
135 module_path=".engines.search_engine_pubchem",
136 class_name="PubChemSearchEngine",
137 ),
138 "stackexchange": EngineEntry(
139 module_path=".engines.search_engine_stackexchange",
140 class_name="StackExchangeSearchEngine",
141 ),
142 "zenodo": EngineEntry(
143 module_path=".engines.search_engine_zenodo",
144 class_name="ZenodoSearchEngine",
145 ),
146 # --- Engines implemented but without settings files ---
147 "ddg": EngineEntry(
148 module_path=".engines.search_engine_ddg",
149 class_name="DuckDuckGoSearchEngine",
150 ),
151 "guardian": EngineEntry(
152 module_path=".engines.search_engine_guardian",
153 class_name="GuardianSearchEngine",
154 ),
155 # --- Meta engine ---
156 "auto": EngineEntry(
157 module_path=".engines.meta_search_engine",
158 class_name="MetaSearchEngine",
159 ),
160}
163def get_engine_entry(name: str) -> Optional[EngineEntry]:
164 """Look up an engine's implementation details by name."""
165 return ENGINE_REGISTRY.get(name)