local-deep-research 0.1.26__py3-none-any.whl → 0.2.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. local_deep_research/__init__.py +23 -22
  2. local_deep_research/__main__.py +16 -0
  3. local_deep_research/advanced_search_system/__init__.py +7 -0
  4. local_deep_research/advanced_search_system/filters/__init__.py +8 -0
  5. local_deep_research/advanced_search_system/filters/base_filter.py +38 -0
  6. local_deep_research/advanced_search_system/filters/cross_engine_filter.py +200 -0
  7. local_deep_research/advanced_search_system/findings/base_findings.py +81 -0
  8. local_deep_research/advanced_search_system/findings/repository.py +452 -0
  9. local_deep_research/advanced_search_system/knowledge/__init__.py +1 -0
  10. local_deep_research/advanced_search_system/knowledge/base_knowledge.py +151 -0
  11. local_deep_research/advanced_search_system/knowledge/standard_knowledge.py +159 -0
  12. local_deep_research/advanced_search_system/questions/__init__.py +1 -0
  13. local_deep_research/advanced_search_system/questions/base_question.py +64 -0
  14. local_deep_research/advanced_search_system/questions/decomposition_question.py +445 -0
  15. local_deep_research/advanced_search_system/questions/standard_question.py +119 -0
  16. local_deep_research/advanced_search_system/repositories/__init__.py +7 -0
  17. local_deep_research/advanced_search_system/strategies/__init__.py +1 -0
  18. local_deep_research/advanced_search_system/strategies/base_strategy.py +118 -0
  19. local_deep_research/advanced_search_system/strategies/iterdrag_strategy.py +450 -0
  20. local_deep_research/advanced_search_system/strategies/parallel_search_strategy.py +312 -0
  21. local_deep_research/advanced_search_system/strategies/rapid_search_strategy.py +270 -0
  22. local_deep_research/advanced_search_system/strategies/standard_strategy.py +300 -0
  23. local_deep_research/advanced_search_system/tools/__init__.py +1 -0
  24. local_deep_research/advanced_search_system/tools/base_tool.py +100 -0
  25. local_deep_research/advanced_search_system/tools/knowledge_tools/__init__.py +1 -0
  26. local_deep_research/advanced_search_system/tools/question_tools/__init__.py +1 -0
  27. local_deep_research/advanced_search_system/tools/search_tools/__init__.py +1 -0
  28. local_deep_research/api/__init__.py +5 -5
  29. local_deep_research/api/research_functions.py +154 -160
  30. local_deep_research/app.py +8 -0
  31. local_deep_research/citation_handler.py +25 -16
  32. local_deep_research/{config.py → config/config_files.py} +102 -110
  33. local_deep_research/config/llm_config.py +472 -0
  34. local_deep_research/config/search_config.py +77 -0
  35. local_deep_research/defaults/__init__.py +10 -5
  36. local_deep_research/defaults/main.toml +2 -2
  37. local_deep_research/defaults/search_engines.toml +60 -34
  38. local_deep_research/main.py +121 -19
  39. local_deep_research/migrate_db.py +147 -0
  40. local_deep_research/report_generator.py +87 -45
  41. local_deep_research/search_system.py +153 -283
  42. local_deep_research/setup_data_dir.py +35 -0
  43. local_deep_research/test_migration.py +178 -0
  44. local_deep_research/utilities/__init__.py +0 -0
  45. local_deep_research/utilities/db_utils.py +49 -0
  46. local_deep_research/{utilties → utilities}/enums.py +2 -2
  47. local_deep_research/{utilties → utilities}/llm_utils.py +63 -29
  48. local_deep_research/utilities/search_utilities.py +242 -0
  49. local_deep_research/{utilties → utilities}/setup_utils.py +4 -2
  50. local_deep_research/web/__init__.py +0 -1
  51. local_deep_research/web/app.py +86 -1709
  52. local_deep_research/web/app_factory.py +289 -0
  53. local_deep_research/web/database/README.md +70 -0
  54. local_deep_research/web/database/migrate_to_ldr_db.py +289 -0
  55. local_deep_research/web/database/migrations.py +447 -0
  56. local_deep_research/web/database/models.py +117 -0
  57. local_deep_research/web/database/schema_upgrade.py +107 -0
  58. local_deep_research/web/models/database.py +294 -0
  59. local_deep_research/web/models/settings.py +94 -0
  60. local_deep_research/web/routes/api_routes.py +559 -0
  61. local_deep_research/web/routes/history_routes.py +354 -0
  62. local_deep_research/web/routes/research_routes.py +715 -0
  63. local_deep_research/web/routes/settings_routes.py +1583 -0
  64. local_deep_research/web/services/research_service.py +947 -0
  65. local_deep_research/web/services/resource_service.py +149 -0
  66. local_deep_research/web/services/settings_manager.py +669 -0
  67. local_deep_research/web/services/settings_service.py +187 -0
  68. local_deep_research/web/services/socket_service.py +210 -0
  69. local_deep_research/web/static/css/custom_dropdown.css +277 -0
  70. local_deep_research/web/static/css/settings.css +1223 -0
  71. local_deep_research/web/static/css/styles.css +525 -48
  72. local_deep_research/web/static/js/components/custom_dropdown.js +428 -0
  73. local_deep_research/web/static/js/components/detail.js +348 -0
  74. local_deep_research/web/static/js/components/fallback/formatting.js +122 -0
  75. local_deep_research/web/static/js/components/fallback/ui.js +215 -0
  76. local_deep_research/web/static/js/components/history.js +487 -0
  77. local_deep_research/web/static/js/components/logpanel.js +949 -0
  78. local_deep_research/web/static/js/components/progress.js +1107 -0
  79. local_deep_research/web/static/js/components/research.js +1865 -0
  80. local_deep_research/web/static/js/components/results.js +766 -0
  81. local_deep_research/web/static/js/components/settings.js +3981 -0
  82. local_deep_research/web/static/js/components/settings_sync.js +106 -0
  83. local_deep_research/web/static/js/main.js +226 -0
  84. local_deep_research/web/static/js/services/api.js +253 -0
  85. local_deep_research/web/static/js/services/audio.js +31 -0
  86. local_deep_research/web/static/js/services/formatting.js +119 -0
  87. local_deep_research/web/static/js/services/pdf.js +622 -0
  88. local_deep_research/web/static/js/services/socket.js +882 -0
  89. local_deep_research/web/static/js/services/ui.js +546 -0
  90. local_deep_research/web/templates/base.html +72 -0
  91. local_deep_research/web/templates/components/custom_dropdown.html +47 -0
  92. local_deep_research/web/templates/components/log_panel.html +32 -0
  93. local_deep_research/web/templates/components/mobile_nav.html +22 -0
  94. local_deep_research/web/templates/components/settings_form.html +299 -0
  95. local_deep_research/web/templates/components/sidebar.html +21 -0
  96. local_deep_research/web/templates/pages/details.html +73 -0
  97. local_deep_research/web/templates/pages/history.html +51 -0
  98. local_deep_research/web/templates/pages/progress.html +57 -0
  99. local_deep_research/web/templates/pages/research.html +139 -0
  100. local_deep_research/web/templates/pages/results.html +59 -0
  101. local_deep_research/web/templates/settings_dashboard.html +78 -192
  102. local_deep_research/web/utils/__init__.py +0 -0
  103. local_deep_research/web/utils/formatters.py +76 -0
  104. local_deep_research/web_search_engines/engines/full_search.py +18 -16
  105. local_deep_research/web_search_engines/engines/meta_search_engine.py +182 -131
  106. local_deep_research/web_search_engines/engines/search_engine_arxiv.py +224 -139
  107. local_deep_research/web_search_engines/engines/search_engine_brave.py +88 -71
  108. local_deep_research/web_search_engines/engines/search_engine_ddg.py +48 -39
  109. local_deep_research/web_search_engines/engines/search_engine_github.py +415 -204
  110. local_deep_research/web_search_engines/engines/search_engine_google_pse.py +123 -90
  111. local_deep_research/web_search_engines/engines/search_engine_guardian.py +210 -157
  112. local_deep_research/web_search_engines/engines/search_engine_local.py +532 -369
  113. local_deep_research/web_search_engines/engines/search_engine_local_all.py +42 -36
  114. local_deep_research/web_search_engines/engines/search_engine_pubmed.py +358 -266
  115. local_deep_research/web_search_engines/engines/search_engine_searxng.py +212 -160
  116. local_deep_research/web_search_engines/engines/search_engine_semantic_scholar.py +213 -170
  117. local_deep_research/web_search_engines/engines/search_engine_serpapi.py +84 -68
  118. local_deep_research/web_search_engines/engines/search_engine_wayback.py +186 -154
  119. local_deep_research/web_search_engines/engines/search_engine_wikipedia.py +115 -77
  120. local_deep_research/web_search_engines/search_engine_base.py +174 -99
  121. local_deep_research/web_search_engines/search_engine_factory.py +192 -102
  122. local_deep_research/web_search_engines/search_engines_config.py +22 -15
  123. {local_deep_research-0.1.26.dist-info → local_deep_research-0.2.2.dist-info}/METADATA +177 -97
  124. local_deep_research-0.2.2.dist-info/RECORD +135 -0
  125. {local_deep_research-0.1.26.dist-info → local_deep_research-0.2.2.dist-info}/WHEEL +1 -2
  126. {local_deep_research-0.1.26.dist-info → local_deep_research-0.2.2.dist-info}/entry_points.txt +3 -0
  127. local_deep_research/defaults/llm_config.py +0 -338
  128. local_deep_research/utilties/search_utilities.py +0 -114
  129. local_deep_research/web/static/js/app.js +0 -3763
  130. local_deep_research/web/templates/api_keys_config.html +0 -82
  131. local_deep_research/web/templates/collections_config.html +0 -90
  132. local_deep_research/web/templates/index.html +0 -348
  133. local_deep_research/web/templates/llm_config.html +0 -120
  134. local_deep_research/web/templates/main_config.html +0 -89
  135. local_deep_research/web/templates/search_engines_config.html +0 -154
  136. local_deep_research/web/templates/settings.html +0 -519
  137. local_deep_research-0.1.26.dist-info/RECORD +0 -61
  138. local_deep_research-0.1.26.dist-info/top_level.txt +0 -1
  139. /local_deep_research/{utilties → config}/__init__.py +0 -0
  140. {local_deep_research-0.1.26.dist-info → local_deep_research-0.2.2.dist-info}/licenses/LICENSE +0 -0
@@ -3,18 +3,19 @@ Search engine that searches across all local collections
3
3
  """
4
4
 
5
5
  import logging
6
- from typing import Dict, List, Any, Optional
6
+ from typing import Any, Dict, List, Optional
7
7
 
8
8
  import toml
9
9
  from langchain_core.language_models import BaseLLM
10
10
 
11
- from local_deep_research.web_search_engines.search_engine_base import BaseSearchEngine
12
- from local_deep_research.web_search_engines.search_engine_factory import create_search_engine
13
- from local_deep_research.config import LOCAL_COLLECTIONS_FILE
11
+ from ...config.config_files import LOCAL_COLLECTIONS_FILE
12
+ from ..search_engine_base import BaseSearchEngine
13
+ from ..search_engine_factory import create_search_engine
14
14
 
15
15
  # Setup logging
16
16
  logger = logging.getLogger(__name__)
17
17
 
18
+
18
19
  class LocalAllSearchEngine(BaseSearchEngine):
19
20
  """
20
21
  Search engine that searches across all local document collections.
@@ -26,11 +27,11 @@ class LocalAllSearchEngine(BaseSearchEngine):
26
27
  llm: Optional[BaseLLM] = None,
27
28
  max_results: int = 10,
28
29
  max_filtered_results: Optional[int] = None,
29
- **kwargs
30
+ **kwargs,
30
31
  ):
31
32
  """
32
33
  Initialize the local all-collections search engine.
33
-
34
+
34
35
  Args:
35
36
  llm: Language model for relevance filtering
36
37
  max_results: Maximum number of search results
@@ -38,8 +39,10 @@ class LocalAllSearchEngine(BaseSearchEngine):
38
39
  **kwargs: Additional parameters passed to LocalSearchEngine instances
39
40
  """
40
41
  # Initialize the BaseSearchEngine with LLM, max_filtered_results, and max_results
41
- super().__init__(llm=llm, max_filtered_results=max_filtered_results, max_results=max_results)
42
-
42
+ super().__init__(
43
+ llm=llm, max_filtered_results=max_filtered_results, max_results=max_results
44
+ )
45
+
43
46
  # Find all local collection search engines
44
47
  self.local_engines = {}
45
48
  try:
@@ -48,78 +51,79 @@ class LocalAllSearchEngine(BaseSearchEngine):
48
51
  for collection_id, collection in local_collections.items():
49
52
  if not collection.get("enabled", True):
50
53
  continue
51
-
54
+
52
55
  # Create a search engine for this collection
53
56
  try:
54
57
  engine = create_search_engine(
55
58
  collection_id,
56
59
  llm=llm,
57
- max_filtered_results=max_filtered_results
60
+ max_filtered_results=max_filtered_results,
58
61
  )
59
-
62
+
60
63
  if engine:
61
64
  self.local_engines[collection_id] = {
62
65
  "engine": engine,
63
66
  "name": collection.get("name", collection_id),
64
- "description": collection.get("description", "")
67
+ "description": collection.get("description", ""),
65
68
  }
66
69
  except Exception as e:
67
- logger.error(f"Error creating search engine for collection '{collection_id}': {e}")
70
+ logger.error(
71
+ f"Error creating search engine for collection '{collection_id}': {e}"
72
+ )
68
73
  except ImportError:
69
74
  logger.warning("No local collections configuration found")
70
-
75
+
71
76
  def _get_previews(self, query: str) -> List[Dict[str, Any]]:
72
77
  """
73
78
  Get preview information for documents from all local collections.
74
-
79
+
75
80
  Args:
76
81
  query: The search query
77
-
82
+
78
83
  Returns:
79
84
  List of preview dictionaries
80
85
  """
81
86
  logger.info(f"Searching across all local collections for query: {query}")
82
-
87
+
83
88
  all_previews = []
84
-
89
+
85
90
  # Get previews from each local search engine
86
91
  for collection_id, engine_info in self.local_engines.items():
87
92
  engine = engine_info["engine"]
88
93
  try:
89
94
  # Get previews from this engine
90
95
  previews = engine._get_previews(query)
91
-
96
+
92
97
  # Add collection info to each preview
93
98
  for preview in previews:
94
99
  preview["collection_id"] = collection_id
95
100
  preview["collection_name"] = engine_info["name"]
96
101
  preview["collection_description"] = engine_info["description"]
97
-
102
+
98
103
  all_previews.extend(previews)
99
104
  except Exception as e:
100
105
  logger.error(f"Error searching collection '{collection_id}': {e}")
101
-
106
+
102
107
  if not all_previews:
103
108
  logger.info(f"No local documents found for query: {query}")
104
109
  return []
105
-
110
+
106
111
  # Sort by similarity score if available
107
- all_previews.sort(
108
- key=lambda x: float(x.get("similarity", 0)),
109
- reverse=True
110
- )
111
-
112
+ all_previews.sort(key=lambda x: float(x.get("similarity", 0)), reverse=True)
113
+
112
114
  # Limit to max_results
113
- return all_previews[:self.max_results]
114
-
115
- def _get_full_content(self, relevant_items: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
115
+ return all_previews[: self.max_results]
116
+
117
+ def _get_full_content(
118
+ self, relevant_items: List[Dict[str, Any]]
119
+ ) -> List[Dict[str, Any]]:
116
120
  """
117
121
  Get full content for the relevant documents.
118
122
  Delegates to the appropriate collection's search engine.
119
-
123
+
120
124
  Args:
121
125
  relevant_items: List of relevant preview dictionaries
122
-
126
+
123
127
  Returns:
124
128
  List of result dictionaries with full content
125
129
  """
@@ -131,7 +135,7 @@ class LocalAllSearchEngine(BaseSearchEngine):
131
135
  if collection_id not in items_by_collection:
132
136
  items_by_collection[collection_id] = []
133
137
  items_by_collection[collection_id].append(item)
134
-
138
+
135
139
  # Process each collection's items with its own engine
136
140
  all_results = []
137
141
  for collection_id, items in items_by_collection.items():
@@ -140,14 +144,16 @@ class LocalAllSearchEngine(BaseSearchEngine):
140
144
  results = engine._get_full_content(items)
141
145
  all_results.extend(results)
142
146
  except Exception as e:
143
- logger.error(f"Error getting full content from collection '{collection_id}': {e}")
147
+ logger.error(
148
+ f"Error getting full content from collection '{collection_id}': {e}"
149
+ )
144
150
  # Fall back to returning the items without full content
145
151
  all_results.extend(items)
146
-
152
+
147
153
  # Add any items that weren't processed
148
154
  processed_ids = set(item["id"] for item in all_results)
149
155
  for item in relevant_items:
150
156
  if item["id"] not in processed_ids:
151
157
  all_results.append(item)
152
-
158
+
153
159
  return all_results