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

1""" 

2Hardcoded registry of search engine module paths and class names. 

3 

4This is the single source of truth for which Python module/class implements 

5each search engine. These are internal wiring details — not user configuration. 

6 

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""" 

12 

13from dataclasses import dataclass 

14from typing import Dict, Optional 

15 

16 

17@dataclass(frozen=True) 

18class EngineEntry: 

19 """Immutable record mapping an engine name to its implementation.""" 

20 

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 

26 

27 

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} 

178 

179 

180def get_engine_entry(name: str) -> Optional[EngineEntry]: 

181 """Look up an engine's implementation details by name.""" 

182 return ENGINE_REGISTRY.get(name)