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.
- local_deep_research/__init__.py +23 -22
- local_deep_research/__main__.py +16 -0
- local_deep_research/advanced_search_system/__init__.py +7 -0
- local_deep_research/advanced_search_system/filters/__init__.py +8 -0
- local_deep_research/advanced_search_system/filters/base_filter.py +38 -0
- local_deep_research/advanced_search_system/filters/cross_engine_filter.py +200 -0
- local_deep_research/advanced_search_system/findings/base_findings.py +81 -0
- local_deep_research/advanced_search_system/findings/repository.py +452 -0
- local_deep_research/advanced_search_system/knowledge/__init__.py +1 -0
- local_deep_research/advanced_search_system/knowledge/base_knowledge.py +151 -0
- local_deep_research/advanced_search_system/knowledge/standard_knowledge.py +159 -0
- local_deep_research/advanced_search_system/questions/__init__.py +1 -0
- local_deep_research/advanced_search_system/questions/base_question.py +64 -0
- local_deep_research/advanced_search_system/questions/decomposition_question.py +445 -0
- local_deep_research/advanced_search_system/questions/standard_question.py +119 -0
- local_deep_research/advanced_search_system/repositories/__init__.py +7 -0
- local_deep_research/advanced_search_system/strategies/__init__.py +1 -0
- local_deep_research/advanced_search_system/strategies/base_strategy.py +118 -0
- local_deep_research/advanced_search_system/strategies/iterdrag_strategy.py +450 -0
- local_deep_research/advanced_search_system/strategies/parallel_search_strategy.py +312 -0
- local_deep_research/advanced_search_system/strategies/rapid_search_strategy.py +270 -0
- local_deep_research/advanced_search_system/strategies/standard_strategy.py +300 -0
- local_deep_research/advanced_search_system/tools/__init__.py +1 -0
- local_deep_research/advanced_search_system/tools/base_tool.py +100 -0
- local_deep_research/advanced_search_system/tools/knowledge_tools/__init__.py +1 -0
- local_deep_research/advanced_search_system/tools/question_tools/__init__.py +1 -0
- local_deep_research/advanced_search_system/tools/search_tools/__init__.py +1 -0
- local_deep_research/api/__init__.py +5 -5
- local_deep_research/api/research_functions.py +154 -160
- local_deep_research/app.py +8 -0
- local_deep_research/citation_handler.py +25 -16
- local_deep_research/{config.py → config/config_files.py} +102 -110
- local_deep_research/config/llm_config.py +472 -0
- local_deep_research/config/search_config.py +77 -0
- local_deep_research/defaults/__init__.py +10 -5
- local_deep_research/defaults/main.toml +2 -2
- local_deep_research/defaults/search_engines.toml +60 -34
- local_deep_research/main.py +121 -19
- local_deep_research/migrate_db.py +147 -0
- local_deep_research/report_generator.py +87 -45
- local_deep_research/search_system.py +153 -283
- local_deep_research/setup_data_dir.py +35 -0
- local_deep_research/test_migration.py +178 -0
- local_deep_research/utilities/__init__.py +0 -0
- local_deep_research/utilities/db_utils.py +49 -0
- local_deep_research/{utilties → utilities}/enums.py +2 -2
- local_deep_research/{utilties → utilities}/llm_utils.py +63 -29
- local_deep_research/utilities/search_utilities.py +242 -0
- local_deep_research/{utilties → utilities}/setup_utils.py +4 -2
- local_deep_research/web/__init__.py +0 -1
- local_deep_research/web/app.py +86 -1709
- local_deep_research/web/app_factory.py +289 -0
- local_deep_research/web/database/README.md +70 -0
- local_deep_research/web/database/migrate_to_ldr_db.py +289 -0
- local_deep_research/web/database/migrations.py +447 -0
- local_deep_research/web/database/models.py +117 -0
- local_deep_research/web/database/schema_upgrade.py +107 -0
- local_deep_research/web/models/database.py +294 -0
- local_deep_research/web/models/settings.py +94 -0
- local_deep_research/web/routes/api_routes.py +559 -0
- local_deep_research/web/routes/history_routes.py +354 -0
- local_deep_research/web/routes/research_routes.py +715 -0
- local_deep_research/web/routes/settings_routes.py +1583 -0
- local_deep_research/web/services/research_service.py +947 -0
- local_deep_research/web/services/resource_service.py +149 -0
- local_deep_research/web/services/settings_manager.py +669 -0
- local_deep_research/web/services/settings_service.py +187 -0
- local_deep_research/web/services/socket_service.py +210 -0
- local_deep_research/web/static/css/custom_dropdown.css +277 -0
- local_deep_research/web/static/css/settings.css +1223 -0
- local_deep_research/web/static/css/styles.css +525 -48
- local_deep_research/web/static/js/components/custom_dropdown.js +428 -0
- local_deep_research/web/static/js/components/detail.js +348 -0
- local_deep_research/web/static/js/components/fallback/formatting.js +122 -0
- local_deep_research/web/static/js/components/fallback/ui.js +215 -0
- local_deep_research/web/static/js/components/history.js +487 -0
- local_deep_research/web/static/js/components/logpanel.js +949 -0
- local_deep_research/web/static/js/components/progress.js +1107 -0
- local_deep_research/web/static/js/components/research.js +1865 -0
- local_deep_research/web/static/js/components/results.js +766 -0
- local_deep_research/web/static/js/components/settings.js +3981 -0
- local_deep_research/web/static/js/components/settings_sync.js +106 -0
- local_deep_research/web/static/js/main.js +226 -0
- local_deep_research/web/static/js/services/api.js +253 -0
- local_deep_research/web/static/js/services/audio.js +31 -0
- local_deep_research/web/static/js/services/formatting.js +119 -0
- local_deep_research/web/static/js/services/pdf.js +622 -0
- local_deep_research/web/static/js/services/socket.js +882 -0
- local_deep_research/web/static/js/services/ui.js +546 -0
- local_deep_research/web/templates/base.html +72 -0
- local_deep_research/web/templates/components/custom_dropdown.html +47 -0
- local_deep_research/web/templates/components/log_panel.html +32 -0
- local_deep_research/web/templates/components/mobile_nav.html +22 -0
- local_deep_research/web/templates/components/settings_form.html +299 -0
- local_deep_research/web/templates/components/sidebar.html +21 -0
- local_deep_research/web/templates/pages/details.html +73 -0
- local_deep_research/web/templates/pages/history.html +51 -0
- local_deep_research/web/templates/pages/progress.html +57 -0
- local_deep_research/web/templates/pages/research.html +139 -0
- local_deep_research/web/templates/pages/results.html +59 -0
- local_deep_research/web/templates/settings_dashboard.html +78 -192
- local_deep_research/web/utils/__init__.py +0 -0
- local_deep_research/web/utils/formatters.py +76 -0
- local_deep_research/web_search_engines/engines/full_search.py +18 -16
- local_deep_research/web_search_engines/engines/meta_search_engine.py +182 -131
- local_deep_research/web_search_engines/engines/search_engine_arxiv.py +224 -139
- local_deep_research/web_search_engines/engines/search_engine_brave.py +88 -71
- local_deep_research/web_search_engines/engines/search_engine_ddg.py +48 -39
- local_deep_research/web_search_engines/engines/search_engine_github.py +415 -204
- local_deep_research/web_search_engines/engines/search_engine_google_pse.py +123 -90
- local_deep_research/web_search_engines/engines/search_engine_guardian.py +210 -157
- local_deep_research/web_search_engines/engines/search_engine_local.py +532 -369
- local_deep_research/web_search_engines/engines/search_engine_local_all.py +42 -36
- local_deep_research/web_search_engines/engines/search_engine_pubmed.py +358 -266
- local_deep_research/web_search_engines/engines/search_engine_searxng.py +212 -160
- local_deep_research/web_search_engines/engines/search_engine_semantic_scholar.py +213 -170
- local_deep_research/web_search_engines/engines/search_engine_serpapi.py +84 -68
- local_deep_research/web_search_engines/engines/search_engine_wayback.py +186 -154
- local_deep_research/web_search_engines/engines/search_engine_wikipedia.py +115 -77
- local_deep_research/web_search_engines/search_engine_base.py +174 -99
- local_deep_research/web_search_engines/search_engine_factory.py +192 -102
- local_deep_research/web_search_engines/search_engines_config.py +22 -15
- {local_deep_research-0.1.26.dist-info → local_deep_research-0.2.2.dist-info}/METADATA +177 -97
- local_deep_research-0.2.2.dist-info/RECORD +135 -0
- {local_deep_research-0.1.26.dist-info → local_deep_research-0.2.2.dist-info}/WHEEL +1 -2
- {local_deep_research-0.1.26.dist-info → local_deep_research-0.2.2.dist-info}/entry_points.txt +3 -0
- local_deep_research/defaults/llm_config.py +0 -338
- local_deep_research/utilties/search_utilities.py +0 -114
- local_deep_research/web/static/js/app.js +0 -3763
- local_deep_research/web/templates/api_keys_config.html +0 -82
- local_deep_research/web/templates/collections_config.html +0 -90
- local_deep_research/web/templates/index.html +0 -348
- local_deep_research/web/templates/llm_config.html +0 -120
- local_deep_research/web/templates/main_config.html +0 -89
- local_deep_research/web/templates/search_engines_config.html +0 -154
- local_deep_research/web/templates/settings.html +0 -519
- local_deep_research-0.1.26.dist-info/RECORD +0 -61
- local_deep_research-0.1.26.dist-info/top_level.txt +0 -1
- /local_deep_research/{utilties → config}/__init__.py +0 -0
- {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,
|
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
|
12
|
-
from
|
13
|
-
from
|
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__(
|
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(
|
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
|
-
|
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(
|
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(
|
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
|