Coverage for src/local_deep_research/web_search_engines/engine_registry.py: 100%
10 statements
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-22 21:20 +0000
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-22 21:20 +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
25 supports_query_search: bool = True
28ENGINE_REGISTRY: Dict[str, EngineEntry] = {
29 # --- Engines from default_settings.json ---
30 "arxiv": EngineEntry(
31 module_path=".engines.search_engine_arxiv",
32 class_name="ArXivSearchEngine",
33 ),
34 "brave": EngineEntry(
35 module_path=".engines.search_engine_brave",
36 class_name="BraveSearchEngine",
37 full_search_module=".engines.full_search",
38 full_search_class="FullSearchResults",
39 ),
40 "exa": EngineEntry(
41 module_path=".engines.search_engine_exa",
42 class_name="ExaSearchEngine",
43 ),
44 "federal_register": EngineEntry(
45 module_path=".engines.search_engine_federal_register",
46 class_name="FederalRegisterSearchEngine",
47 ),
48 "github": EngineEntry(
49 module_path=".engines.search_engine_github",
50 class_name="GitHubSearchEngine",
51 ),
52 "google_pse": EngineEntry(
53 module_path=".engines.search_engine_google_pse",
54 class_name="GooglePSESearchEngine",
55 full_search_module=".engines.full_search",
56 full_search_class="FullSearchResults",
57 ),
58 "mojeek": EngineEntry(
59 module_path=".engines.search_engine_mojeek",
60 class_name="MojeekSearchEngine",
61 full_search_module=".engines.full_search",
62 full_search_class="FullSearchResults",
63 ),
64 "pubmed": EngineEntry(
65 module_path=".engines.search_engine_pubmed",
66 class_name="PubMedSearchEngine",
67 ),
68 "searxng": EngineEntry(
69 module_path=".engines.search_engine_searxng",
70 class_name="SearXNGSearchEngine",
71 full_search_module=".engines.full_search",
72 full_search_class="FullSearchResults",
73 ),
74 "serpapi": EngineEntry(
75 module_path=".engines.search_engine_serpapi",
76 class_name="SerpAPISearchEngine",
77 full_search_module=".engines.full_search",
78 full_search_class="FullSearchResults",
79 ),
80 "tavily": EngineEntry(
81 module_path=".engines.search_engine_tavily",
82 class_name="TavilySearchEngine",
83 full_search_module=".engines.full_search",
84 full_search_class="FullSearchResults",
85 ),
86 "tinyfish": EngineEntry(
87 module_path=".engines.search_engine_tinyfish",
88 class_name="TinyFishSearchEngine",
89 ),
90 "wayback": EngineEntry(
91 module_path=".engines.search_engine_wayback",
92 class_name="WaybackSearchEngine",
93 supports_query_search=False,
94 ),
95 "wikinews": EngineEntry(
96 module_path=".engines.search_engine_wikinews",
97 class_name="WikinewsSearchEngine",
98 ),
99 "wikipedia": EngineEntry(
100 module_path=".engines.search_engine_wikipedia",
101 class_name="WikipediaSearchEngine",
102 ),
103 # --- Engines from defaults/settings/search_engines/*.json ---
104 "elasticsearch": EngineEntry(
105 module_path=".engines.search_engine_elasticsearch",
106 class_name="ElasticsearchSearchEngine",
107 ),
108 "paperless": EngineEntry(
109 module_path=".engines.search_engine_paperless",
110 class_name="PaperlessSearchEngine",
111 ),
112 "scaleserp": EngineEntry(
113 module_path=".engines.search_engine_scaleserp",
114 class_name="ScaleSerpSearchEngine",
115 full_search_module=".engines.full_search",
116 full_search_class="FullSearchResults",
117 ),
118 "serper": EngineEntry(
119 module_path=".engines.search_engine_serper",
120 class_name="SerperSearchEngine",
121 full_search_module=".engines.full_search",
122 full_search_class="FullSearchResults",
123 ),
124 "serply": EngineEntry(
125 module_path=".engines.search_engine_serply",
126 class_name="SerplySearchEngine",
127 ),
128 "webz": EngineEntry(
129 module_path=".engines.search_engine_webz",
130 class_name="WebzSearchEngine",
131 full_search_module=".engines.full_search",
132 full_search_class="FullSearchResults",
133 ),
134 "sofya": EngineEntry(
135 module_path=".engines.search_engine_sofya",
136 class_name="SofyaSearchEngine",
137 ),
138 # --- Engines from defaults/settings_*.json ---
139 "nasa_ads": EngineEntry(
140 module_path=".engines.search_engine_nasa_ads",
141 class_name="NasaAdsSearchEngine",
142 ),
143 "openalex": EngineEntry(
144 module_path=".engines.search_engine_openalex",
145 class_name="OpenAlexSearchEngine",
146 ),
147 "semantic_scholar": EngineEntry(
148 module_path=".engines.search_engine_semantic_scholar",
149 class_name="SemanticScholarSearchEngine",
150 ),
151 # --- Engines from defaults/settings_*.json (added in #1540) ---
152 "gutenberg": EngineEntry(
153 module_path=".engines.search_engine_gutenberg",
154 class_name="GutenbergSearchEngine",
155 ),
156 "openlibrary": EngineEntry(
157 module_path=".engines.search_engine_openlibrary",
158 class_name="OpenLibrarySearchEngine",
159 ),
160 "pubchem": EngineEntry(
161 module_path=".engines.search_engine_pubchem",
162 class_name="PubChemSearchEngine",
163 ),
164 "stackexchange": EngineEntry(
165 module_path=".engines.search_engine_stackexchange",
166 class_name="StackExchangeSearchEngine",
167 ),
168 "zenodo": EngineEntry(
169 module_path=".engines.search_engine_zenodo",
170 class_name="ZenodoSearchEngine",
171 ),
172 # --- Engines implemented but without settings files ---
173 "guardian": EngineEntry(
174 module_path=".engines.search_engine_guardian",
175 class_name="GuardianSearchEngine",
176 ),
177}
180def get_engine_entry(name: str) -> Optional[EngineEntry]:
181 """Look up an engine's implementation details by name."""
182 return ENGINE_REGISTRY.get(name)