Coverage for src/local_deep_research/web_search_engines/engine_registry.py: 100%
9 statements
« prev ^ index » next coverage.py v7.15.1, created at 2026-07-19 23:35 +0000
« prev ^ index » next coverage.py v7.15.1, created at 2026-07-19 23:35 +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 "tinyfish": EngineEntry(
80 module_path=".engines.search_engine_tinyfish",
81 class_name="TinyFishSearchEngine",
82 ),
83 "wayback": EngineEntry(
84 module_path=".engines.search_engine_wayback",
85 class_name="WaybackSearchEngine",
86 ),
87 "wikinews": EngineEntry(
88 module_path=".engines.search_engine_wikinews",
89 class_name="WikinewsSearchEngine",
90 ),
91 "wikipedia": EngineEntry(
92 module_path=".engines.search_engine_wikipedia",
93 class_name="WikipediaSearchEngine",
94 ),
95 # --- Engines from defaults/settings/search_engines/*.json ---
96 "elasticsearch": EngineEntry(
97 module_path=".engines.search_engine_elasticsearch",
98 class_name="ElasticsearchSearchEngine",
99 ),
100 "paperless": EngineEntry(
101 module_path=".engines.search_engine_paperless",
102 class_name="PaperlessSearchEngine",
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 "sofya": EngineEntry(
113 module_path=".engines.search_engine_sofya",
114 class_name="SofyaSearchEngine",
115 ),
116 # --- Engines from defaults/settings_*.json ---
117 "nasa_ads": EngineEntry(
118 module_path=".engines.search_engine_nasa_ads",
119 class_name="NasaAdsSearchEngine",
120 ),
121 "openalex": EngineEntry(
122 module_path=".engines.search_engine_openalex",
123 class_name="OpenAlexSearchEngine",
124 ),
125 "semantic_scholar": EngineEntry(
126 module_path=".engines.search_engine_semantic_scholar",
127 class_name="SemanticScholarSearchEngine",
128 ),
129 # --- Engines from defaults/settings_*.json (added in #1540) ---
130 "gutenberg": EngineEntry(
131 module_path=".engines.search_engine_gutenberg",
132 class_name="GutenbergSearchEngine",
133 ),
134 "openlibrary": EngineEntry(
135 module_path=".engines.search_engine_openlibrary",
136 class_name="OpenLibrarySearchEngine",
137 ),
138 "pubchem": EngineEntry(
139 module_path=".engines.search_engine_pubchem",
140 class_name="PubChemSearchEngine",
141 ),
142 "stackexchange": EngineEntry(
143 module_path=".engines.search_engine_stackexchange",
144 class_name="StackExchangeSearchEngine",
145 ),
146 "zenodo": EngineEntry(
147 module_path=".engines.search_engine_zenodo",
148 class_name="ZenodoSearchEngine",
149 ),
150 # --- Engines implemented but without settings files ---
151 "ddg": EngineEntry(
152 module_path=".engines.search_engine_ddg",
153 class_name="DuckDuckGoSearchEngine",
154 ),
155 "guardian": EngineEntry(
156 module_path=".engines.search_engine_guardian",
157 class_name="GuardianSearchEngine",
158 ),
159}
162def get_engine_entry(name: str) -> Optional[EngineEntry]:
163 """Look up an engine's implementation details by name."""
164 return ENGINE_REGISTRY.get(name)