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

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 

26 

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} 

161 

162 

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

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

165 return ENGINE_REGISTRY.get(name)