local-deep-research 0.3.5__py3-none-any.whl → 0.3.8__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/__version__.py +1 -1
- local_deep_research/defaults/default_settings.json +9 -9
- local_deep_research/search_system.py +5 -2
- local_deep_research/utilities/db_utils.py +5 -9
- local_deep_research/web/services/research_service.py +7 -2
- local_deep_research/web/services/settings_manager.py +12 -5
- local_deep_research/web_search_engines/engines/search_engine_searxng.py +17 -22
- local_deep_research/web_search_engines/search_engines_config.py +16 -9
- {local_deep_research-0.3.5.dist-info → local_deep_research-0.3.8.dist-info}/METADATA +16 -17
- {local_deep_research-0.3.5.dist-info → local_deep_research-0.3.8.dist-info}/RECORD +13 -13
- {local_deep_research-0.3.5.dist-info → local_deep_research-0.3.8.dist-info}/WHEEL +0 -0
- {local_deep_research-0.3.5.dist-info → local_deep_research-0.3.8.dist-info}/entry_points.txt +0 -0
- {local_deep_research-0.3.5.dist-info → local_deep_research-0.3.8.dist-info}/licenses/LICENSE +0 -0
@@ -1 +1 @@
|
|
1
|
-
__version__ = "0.3.
|
1
|
+
__version__ = "0.3.8"
|
@@ -2927,32 +2927,32 @@
|
|
2927
2927
|
"value": "A locally-hosted meta-search engine.",
|
2928
2928
|
"visible": false
|
2929
2929
|
},
|
2930
|
-
"search.engine.web.searxng.
|
2930
|
+
"search.engine.web.searxng.class_name": {
|
2931
2931
|
"category": "searxng",
|
2932
|
-
"description": "
|
2932
|
+
"description": "Setting for searxng.class_name",
|
2933
2933
|
"editable": true,
|
2934
2934
|
"max_value": null,
|
2935
2935
|
"min_value": null,
|
2936
|
-
"name": "
|
2936
|
+
"name": "Class Name",
|
2937
2937
|
"options": null,
|
2938
2938
|
"step": null,
|
2939
2939
|
"type": "SEARCH",
|
2940
|
-
"ui_element": "
|
2941
|
-
"value": "
|
2940
|
+
"ui_element": "text",
|
2941
|
+
"value": "SearXNGSearchEngine",
|
2942
2942
|
"visible": true
|
2943
2943
|
},
|
2944
|
-
"search.engine.web.searxng.
|
2944
|
+
"search.engine.web.searxng.default_params.instance_url": {
|
2945
2945
|
"category": "searxng",
|
2946
|
-
"description": "
|
2946
|
+
"description": "The SearXNG API endpoint URL.",
|
2947
2947
|
"editable": true,
|
2948
2948
|
"max_value": null,
|
2949
2949
|
"min_value": null,
|
2950
|
-
"name": "
|
2950
|
+
"name": "Endpoint URL",
|
2951
2951
|
"options": null,
|
2952
2952
|
"step": null,
|
2953
2953
|
"type": "SEARCH",
|
2954
2954
|
"ui_element": "text",
|
2955
|
-
"value": "
|
2955
|
+
"value": "http://localhost:8080",
|
2956
2956
|
"visible": true
|
2957
2957
|
},
|
2958
2958
|
"search.engine.web.searxng.default_params.categories": {
|
@@ -180,8 +180,11 @@ class AdvancedSearchSystem:
|
|
180
180
|
self.questions_by_iteration = self.strategy.questions_by_iteration.copy()
|
181
181
|
# Send progress message with search info
|
182
182
|
|
183
|
-
# if
|
184
|
-
|
183
|
+
# Only extend if they're different objects in memory to avoid duplication
|
184
|
+
# This check prevents doubling the list when they reference the same object
|
185
|
+
# Fix for issue #301: "too many links in detailed report mode"
|
186
|
+
if id(self.all_links_of_system) != id(self.strategy.all_links_of_system):
|
187
|
+
self.all_links_of_system.extend(self.strategy.all_links_of_system)
|
185
188
|
|
186
189
|
# Include the search system instance for access to citations
|
187
190
|
result["search_system"] = self
|
@@ -6,7 +6,7 @@ from typing import Any, Dict
|
|
6
6
|
from sqlalchemy import create_engine
|
7
7
|
from sqlalchemy.orm import Session, sessionmaker
|
8
8
|
|
9
|
-
from ..web.services.settings_manager import SettingsManager
|
9
|
+
from ..web.services.settings_manager import SettingsManager
|
10
10
|
|
11
11
|
logger = logging.getLogger(__name__)
|
12
12
|
|
@@ -38,7 +38,7 @@ def get_settings_manager() -> SettingsManager:
|
|
38
38
|
|
39
39
|
|
40
40
|
def get_db_setting(
|
41
|
-
key: str, default_value: Any | None = None
|
41
|
+
key: str, default_value: Any | None = None
|
42
42
|
) -> str | Dict[str, Any] | None:
|
43
43
|
"""
|
44
44
|
Get a setting from the database with fallback to default value
|
@@ -46,15 +46,11 @@ def get_db_setting(
|
|
46
46
|
Args:
|
47
47
|
key: The setting key.
|
48
48
|
default_value: If the setting is not found, it will return this instead.
|
49
|
-
check_env: If true, it will check the corresponding environment
|
50
|
-
variable before checking the DB and return that if it is set.
|
51
49
|
|
52
|
-
|
53
|
-
|
54
|
-
env_value = check_env_setting(key)
|
55
|
-
if env_value is not None:
|
56
|
-
return env_value
|
50
|
+
Returns:
|
51
|
+
The setting value.
|
57
52
|
|
53
|
+
"""
|
58
54
|
try:
|
59
55
|
# Get settings manager which handles database access
|
60
56
|
value = get_settings_manager().get_setting(key)
|
@@ -528,7 +528,9 @@ def run_research_process(
|
|
528
528
|
)[:50]
|
529
529
|
safe_query = safe_query.replace(" ", "_").lower()
|
530
530
|
report_path = os.path.join(
|
531
|
-
OUTPUT_DIR,
|
531
|
+
OUTPUT_DIR,
|
532
|
+
f"quick_summary_{safe_query}_"
|
533
|
+
f"{datetime.now().isoformat()}.md",
|
532
534
|
)
|
533
535
|
|
534
536
|
# Send progress update for writing to file
|
@@ -639,7 +641,10 @@ def run_research_process(
|
|
639
641
|
x for x in query if x.isalnum() or x in [" ", "-", "_"]
|
640
642
|
)[:50]
|
641
643
|
safe_query = safe_query.replace(" ", "_").lower()
|
642
|
-
report_path = os.path.join(
|
644
|
+
report_path = os.path.join(
|
645
|
+
OUTPUT_DIR,
|
646
|
+
f"detailed_report_{safe_query}_{datetime.now().isoformat()}.md",
|
647
|
+
)
|
643
648
|
|
644
649
|
with open(report_path, "w", encoding="utf-8") as f:
|
645
650
|
f.write(final_report["content"])
|
@@ -94,11 +94,18 @@ class SettingsManager:
|
|
94
94
|
return value
|
95
95
|
elif len(settings) > 1:
|
96
96
|
# This is a higher-level key.
|
97
|
-
settings_map = {
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
97
|
+
settings_map = {}
|
98
|
+
for setting in settings:
|
99
|
+
output_key = setting.key.removeprefix(f"{key}.")
|
100
|
+
value = setting.value
|
101
|
+
|
102
|
+
if check_env:
|
103
|
+
# Handle possible replacements from environment variables.
|
104
|
+
env_value = check_env_setting(setting.key)
|
105
|
+
if env_value is not None:
|
106
|
+
value = env_value
|
107
|
+
|
108
|
+
settings_map[output_key] = value
|
102
109
|
return settings_map
|
103
110
|
except SQLAlchemyError as e:
|
104
111
|
logger.error(f"Error retrieving setting {key} from database: {e}")
|
@@ -25,7 +25,7 @@ class SearXNGSearchEngine(BaseSearchEngine):
|
|
25
25
|
def __init__(
|
26
26
|
self,
|
27
27
|
max_results: int = 15,
|
28
|
-
instance_url:
|
28
|
+
instance_url: str = "http://localhost:8080",
|
29
29
|
categories: Optional[List[str]] = None,
|
30
30
|
engines: Optional[List[str]] = None,
|
31
31
|
language: str = "en",
|
@@ -35,7 +35,6 @@ class SearXNGSearchEngine(BaseSearchEngine):
|
|
35
35
|
llm: Optional[BaseLLM] = None,
|
36
36
|
max_filtered_results: Optional[int] = None,
|
37
37
|
include_full_content: bool = True,
|
38
|
-
api_key: Optional[str] = None,
|
39
38
|
): # API key is actually the instance URL
|
40
39
|
"""
|
41
40
|
Initialize the SearXNG search engine with ethical usage patterns.
|
@@ -52,7 +51,6 @@ class SearXNGSearchEngine(BaseSearchEngine):
|
|
52
51
|
llm: Language model for relevance filtering
|
53
52
|
max_filtered_results: Maximum number of results to keep after filtering
|
54
53
|
include_full_content: Whether to include full webpage content in results
|
55
|
-
api_key: Alternative way to provide instance URL (takes precedence over instance_url)
|
56
54
|
"""
|
57
55
|
|
58
56
|
# Initialize the BaseSearchEngine with LLM, max_filtered_results, and max_results
|
@@ -60,28 +58,25 @@ class SearXNGSearchEngine(BaseSearchEngine):
|
|
60
58
|
llm=llm, max_filtered_results=max_filtered_results, max_results=max_results
|
61
59
|
)
|
62
60
|
|
63
|
-
|
64
|
-
# 1. api_key parameter (which is actually the instance URL)
|
65
|
-
# 2. SEARXNG_INSTANCE environment variable
|
66
|
-
# 3. instance_url parameter
|
67
|
-
# 4. Default to None, which will disable the engine
|
68
|
-
self.instance_url = api_key or os.getenv("SEARXNG_INSTANCE") or instance_url or "http://localhost:8080"
|
69
|
-
|
70
|
-
# Add debug logging for instance URL
|
71
|
-
logger.info(
|
72
|
-
f"SearXNG init - Instance URL sources: api_key={api_key}, env={os.getenv('SEARXNG_INSTANCE')}, param={instance_url}"
|
73
|
-
)
|
74
|
-
|
61
|
+
self.instance_url = instance_url
|
75
62
|
# Validate and normalize the instance URL if provided
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
63
|
+
self.instance_url = self.instance_url.rstrip("/")
|
64
|
+
logger.info(f"SearXNG initialized with instance URL: {self.instance_url}")
|
65
|
+
try:
|
66
|
+
# Make sure it's accessible.
|
67
|
+
response = requests.get(self.instance_url, timeout=5)
|
68
|
+
if response.status_code == 200:
|
69
|
+
logger.info("SearXNG instance is accessible.")
|
70
|
+
self.is_available = True
|
71
|
+
else:
|
72
|
+
self.is_available = False
|
73
|
+
logger.error(
|
74
|
+
f"Failed to access SearXNG instance at {self.instance_url}. Status code: {response.status_code}"
|
75
|
+
)
|
76
|
+
except requests.RequestException as e:
|
81
77
|
self.is_available = False
|
82
78
|
logger.error(
|
83
|
-
"
|
84
|
-
"Set SEARXNG_INSTANCE environment variable or provide instance_url parameter."
|
79
|
+
f"Error while trying to access SearXNG instance at {self.instance_url}: {str(e)}"
|
85
80
|
)
|
86
81
|
|
87
82
|
# Add debug logging for all parameters
|
@@ -5,7 +5,6 @@ Loads search engine definitions from the user's configuration.
|
|
5
5
|
|
6
6
|
import json
|
7
7
|
import logging
|
8
|
-
from functools import cache
|
9
8
|
from typing import Any, Dict, List
|
10
9
|
|
11
10
|
from ..utilities.db_utils import get_db_setting
|
@@ -25,16 +24,26 @@ def _extract_per_engine_config(raw_config: Dict[str, Any]) -> Dict[str, Dict[str
|
|
25
24
|
Configuration dictionaries indexed by engine name.
|
26
25
|
|
27
26
|
"""
|
28
|
-
|
27
|
+
nested_config = {}
|
29
28
|
for key, value in raw_config.items():
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
if "." in key:
|
30
|
+
# This is a higher-level key.
|
31
|
+
top_level_key = key.split(".")[0]
|
32
|
+
lower_keys = ".".join(key.split(".")[1:])
|
33
|
+
nested_config.setdefault(top_level_key, {})[lower_keys] = value
|
34
|
+
else:
|
35
|
+
# This is a low-level key.
|
36
|
+
nested_config[key] = value
|
33
37
|
|
34
|
-
|
38
|
+
# Expand all the lower-level keys.
|
39
|
+
for key, value in nested_config.items():
|
40
|
+
if isinstance(value, dict):
|
41
|
+
# Expand the child keys.
|
42
|
+
nested_config[key] = _extract_per_engine_config(value)
|
43
|
+
|
44
|
+
return nested_config
|
35
45
|
|
36
46
|
|
37
|
-
@cache
|
38
47
|
def search_config() -> Dict[str, Any]:
|
39
48
|
"""
|
40
49
|
Returns:
|
@@ -105,7 +114,6 @@ def search_config() -> Dict[str, Any]:
|
|
105
114
|
return search_engines
|
106
115
|
|
107
116
|
|
108
|
-
@cache
|
109
117
|
def default_search_engine() -> str:
|
110
118
|
"""
|
111
119
|
Returns:
|
@@ -115,7 +123,6 @@ def default_search_engine() -> str:
|
|
115
123
|
return get_db_setting("search.engine.DEFAULT_SEARCH_ENGINE", "wikipedia")
|
116
124
|
|
117
125
|
|
118
|
-
@cache
|
119
126
|
def local_search_engines() -> List[str]:
|
120
127
|
"""
|
121
128
|
Returns:
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: local-deep-research
|
3
|
-
Version: 0.3.
|
3
|
+
Version: 0.3.8
|
4
4
|
Summary: AI-powered research assistant with deep, iterative analysis using LLMs and web searches
|
5
5
|
Author-Email: LearningCircuit <185559241+LearningCircuit@users.noreply.github.com>, HashedViking <6432677+HashedViking@users.noreply.github.com>
|
6
6
|
License: MIT License
|
@@ -80,9 +80,14 @@ Description-Content-Type: text/markdown
|
|
80
80
|
|
81
81
|
*AI-powered research assistant that performs deep, iterative analysis using multiple LLMs and web searches*
|
82
82
|
|
83
|
-
<
|
84
|
-
<
|
85
|
-
|
83
|
+
<div align="center">
|
84
|
+
<a href="https://www.youtube.com/watch?v=0ISreg9q0p0">
|
85
|
+
<img src="https://img.youtube.com/vi/0ISreg9q0p0/0.jpg" alt="Local Deep Research">
|
86
|
+
<br>
|
87
|
+
<span>▶️ Watch Video</span>
|
88
|
+
</a>
|
89
|
+
</div>
|
90
|
+
|
86
91
|
|
87
92
|
</div>
|
88
93
|
|
@@ -129,7 +134,7 @@ docker start local-deep-research
|
|
129
134
|
Then visit `http://127.0.0.1:5000` to start researching!
|
130
135
|
|
131
136
|
> **Note**: If you need to connect to local services (like Ollama), add `--network host` to the command.
|
132
|
-
>
|
137
|
+
>
|
133
138
|
> **Don't have Docker? It's installed in a few clicks: [Install Docker here](https://www.docker.com/get-started/)**
|
134
139
|
|
135
140
|
### Option 2: Python Package (mostly for programmatic access)
|
@@ -167,6 +172,7 @@ print(results["summary"])
|
|
167
172
|
|
168
173
|
**Windows**: Docker is the easiest option for Windows users. If preferred, a [Windows Installer](https://github.com/LearningCircuit/local-deep-research/releases/download/v0.1.0/LocalDeepResearch_Setup.exe) is also available.
|
169
174
|
|
175
|
+
For more information on installation options, see [the wiki](https://github.com/LearningCircuit/local-deep-research/wiki/Installation).
|
170
176
|
|
171
177
|
## 🔍 Research Capabilities
|
172
178
|
|
@@ -273,9 +279,9 @@ For enhanced web search capabilities, you can configure these additional engines
|
|
273
279
|
|
274
280
|
```bash
|
275
281
|
# Search API keys (if not using the web UI)
|
276
|
-
|
277
|
-
|
278
|
-
|
282
|
+
LDR_SEARCH_ENGINE_WEB_SERPAPI_API_KEY=your-key-here # Google results via SerpAPI
|
283
|
+
LDR_SEARCH_ENGINE_WEB_GOOGLE_PSE_API_KEY=your-key-here # Google Programmable Search
|
284
|
+
LDR_SEARCH_ENGINE_WEB_BRAVE_API_KEY=your-key-here # Brave Search
|
279
285
|
```
|
280
286
|
|
281
287
|
### Search Engine Comparison
|
@@ -304,15 +310,8 @@ Local Deep Research includes powerful Retrieval Augmented Generation (RAG) capab
|
|
304
310
|
- CSV files
|
305
311
|
- And more
|
306
312
|
|
307
|
-
|
308
|
-
|
309
|
-
You can use your documents in research via:
|
310
|
-
- Auto-selection (when relevant to query)
|
311
|
-
- Direct collection selection: `tool = "project_docs"`
|
312
|
-
- All collections: `tool = "local_all"`
|
313
|
-
- Query syntax: `collection:project_docs your query`
|
314
|
-
|
315
|
-
This allows you to integrate your private knowledge base with web search results for comprehensive research that includes your own documents and data.
|
313
|
+
See [this page](https://github.com/LearningCircuit/local-deep-research/wiki/Configuring-Local-Search) for
|
314
|
+
configuration instructions.
|
316
315
|
|
317
316
|
## 🛠️ Advanced Configuration
|
318
317
|
|
@@ -1,10 +1,10 @@
|
|
1
|
-
local_deep_research-0.3.
|
2
|
-
local_deep_research-0.3.
|
3
|
-
local_deep_research-0.3.
|
4
|
-
local_deep_research-0.3.
|
1
|
+
local_deep_research-0.3.8.dist-info/METADATA,sha256=JbBUBL45YxHNBx5eXFfTgMWmNhjo7MmCMTFgZdgFLlo,16628
|
2
|
+
local_deep_research-0.3.8.dist-info/WHEEL,sha256=tSfRZzRHthuv7vxpI4aehrdN9scLjk-dCJkPLzkHxGg,90
|
3
|
+
local_deep_research-0.3.8.dist-info/entry_points.txt,sha256=GcXS501Rjh-P80S8db7hnrQ23mS_Jg27PwpVQVO77as,113
|
4
|
+
local_deep_research-0.3.8.dist-info/licenses/LICENSE,sha256=Qg2CaTdu6SWnSqk1_JtgBPp_Da-LdqJDhT1Vt1MUc5s,1072
|
5
5
|
local_deep_research/__init__.py,sha256=9wV3oonZMEHsE_JhyZU9P0hW2Uwv47zotGlbAB_gQiA,885
|
6
6
|
local_deep_research/__main__.py,sha256=LIxK5iS6aLAKMFBDpUS3V-jDcxchqi3eSUsI2jAZUXk,371
|
7
|
-
local_deep_research/__version__.py,sha256=
|
7
|
+
local_deep_research/__version__.py,sha256=7dTW0A5-FkrEuNOotvR8oW59M2lvIwYouVqfJzvXpKk,22
|
8
8
|
local_deep_research/advanced_search_system/__init__.py,sha256=sGusMj4eFIrhXR6QbOM16UDKB6aI-iS4IFivKWpMlh0,234
|
9
9
|
local_deep_research/advanced_search_system/filters/__init__.py,sha256=2dXrV4skcVHI2Lb3BSL2Ajq0rnLeSw7kc1MbIynMxa4,190
|
10
10
|
local_deep_research/advanced_search_system/filters/base_filter.py,sha256=dFNQ7U2dj4bf3voT73YhcG-w9eW-BTlc4F9kstFcETY,969
|
@@ -40,15 +40,15 @@ local_deep_research/config/llm_config.py,sha256=bYxhwyjkdBlap832aWvWgHWjjPq45Oh2
|
|
40
40
|
local_deep_research/config/search_config.py,sha256=ruryPSS4Wy9-xi_02c-98KLKaELeLnZ10pnCpc0-ogg,2171
|
41
41
|
local_deep_research/defaults/.env.template,sha256=_eVCy4d_XwpGXy8n50CG3wH9xx2oqJCFKS7IbqgInDk,491
|
42
42
|
local_deep_research/defaults/__init__.py,sha256=C_0t0uZmtrVB4rM9NM9Wx8PJU5kFcT-qOHvws5W2iOg,1352
|
43
|
-
local_deep_research/defaults/default_settings.json,sha256=
|
43
|
+
local_deep_research/defaults/default_settings.json,sha256=OcRS16WAP4zKvU0UAbXlvBcitt0wv_Z7hq93x1OZBdA,120559
|
44
44
|
local_deep_research/main.py,sha256=umGmaQmW7bpx27wUAgSNjNr4oSHV6mDX5hoyfb22HEY,7033
|
45
45
|
local_deep_research/migrate_db.py,sha256=S1h6Bv0OJdRW4BaH7MIMrUXBRV_yqgH2T6LVOZKTQjI,4634
|
46
46
|
local_deep_research/report_generator.py,sha256=-G3KDEbsuU3PdxDfuo5v28DIX7RE1yJCCBU2KgRbNzI,9084
|
47
|
-
local_deep_research/search_system.py,sha256=
|
47
|
+
local_deep_research/search_system.py,sha256=dq9US9zoB7TSiMorsrFFrSHlR6MSqE0IP3NBKB3fP8U,7830
|
48
48
|
local_deep_research/setup_data_dir.py,sha256=7MJa2MMdDUnktJVHwMpyNL2079-qylpIyyLpVbF5AUY,1134
|
49
49
|
local_deep_research/test_migration.py,sha256=cXY9WbpxLslNEa1vFwLMvcvKBbUe7Wosm--AqmPIPYM,6459
|
50
50
|
local_deep_research/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
51
|
-
local_deep_research/utilities/db_utils.py,sha256=
|
51
|
+
local_deep_research/utilities/db_utils.py,sha256=eEfMI_9xtRfJ3o1EES6BOFoGa2uRLR_mmyV6Jkd8KIQ,1557
|
52
52
|
local_deep_research/utilities/enums.py,sha256=yFwmodt93uETdQd7qyW4vOUhiAzZF-BHBbVYHKN7scU,223
|
53
53
|
local_deep_research/utilities/llm_utils.py,sha256=1O8faskPSnyave15cxOVXQcdcFrDybQA445m0OjnD9g,4877
|
54
54
|
local_deep_research/utilities/search_utilities.py,sha256=k4Eag-XJOZl4cRd4GO1z2WpvVPLLhZ-HuBD7RswhaQM,9604
|
@@ -67,9 +67,9 @@ local_deep_research/web/routes/api_routes.py,sha256=S0UdCmfm0v1GEM4UiSbI0PE3xUOx
|
|
67
67
|
local_deep_research/web/routes/history_routes.py,sha256=6a_8nX349viuvi1zP5S7BaPPpAh133eTi1NVWO545A8,12622
|
68
68
|
local_deep_research/web/routes/research_routes.py,sha256=zSU21oAkZnADnuhJniShd8US8hpPDiYqQxUhalJwQeU,23685
|
69
69
|
local_deep_research/web/routes/settings_routes.py,sha256=fkYLwDgcHfiHVml3ux6qCc5qFMjfnKfPcwisqhg995s,49280
|
70
|
-
local_deep_research/web/services/research_service.py,sha256=
|
70
|
+
local_deep_research/web/services/research_service.py,sha256=RyZ4cCePV9n--wm-8-c0wpLGwA1aQIiuTpnRlLuU8-I,39646
|
71
71
|
local_deep_research/web/services/resource_service.py,sha256=yKgOC6GEOmHqRoGzwf52e19UaGCCS1DbDbOIXgWGvGc,4378
|
72
|
-
local_deep_research/web/services/settings_manager.py,sha256=
|
72
|
+
local_deep_research/web/services/settings_manager.py,sha256=CHz_nd49BVRJiLALAjTHfmkKNy_Vr3ogCm5P-_633bk,17281
|
73
73
|
local_deep_research/web/services/settings_service.py,sha256=SgmjhMvGZjJE63hKKaqY7kPGphnUyXcQG8NFN5rTizs,3550
|
74
74
|
local_deep_research/web/services/socket_service.py,sha256=jZGXk6kesBOf4bAdLiT3V4Ofod12pGKTsvxr3ml8ydY,7272
|
75
75
|
local_deep_research/web/static/css/custom_dropdown.css,sha256=-pCx6oazWVgwqFAGq_eZ8OrTKMVQlgkKYCM6w-bACLs,7949
|
@@ -125,12 +125,12 @@ local_deep_research/web_search_engines/engines/search_engine_guardian.py,sha256=
|
|
125
125
|
local_deep_research/web_search_engines/engines/search_engine_local.py,sha256=ephjkDrQbvil6GnceW31qSt70k11REOJ9o7y-bl69-A,40857
|
126
126
|
local_deep_research/web_search_engines/engines/search_engine_local_all.py,sha256=vznpusmCBY9bLjD8EPrVhCb_8RZ8e9Wa8x386zv0pcM,5681
|
127
127
|
local_deep_research/web_search_engines/engines/search_engine_pubmed.py,sha256=O99qfbSz7RHqinAP_C0iod-ZaEGE5tyBbh1DJi2-VhQ,38495
|
128
|
-
local_deep_research/web_search_engines/engines/search_engine_searxng.py,sha256=
|
128
|
+
local_deep_research/web_search_engines/engines/search_engine_searxng.py,sha256=LjArsD5ICgfsaFupF3O31oqb60ONgwqwWu-UDt7eA68,17710
|
129
129
|
local_deep_research/web_search_engines/engines/search_engine_semantic_scholar.py,sha256=jYs_TRM0izMfldsZ8NkCQsP-o6vCPXUjyxt0nIsxOVI,22799
|
130
130
|
local_deep_research/web_search_engines/engines/search_engine_serpapi.py,sha256=OnoYL89WX1qWC6mOosSdgbJ-rXcIFmCVdrd6-qg7xes,8711
|
131
131
|
local_deep_research/web_search_engines/engines/search_engine_wayback.py,sha256=rfRs7WJxa-H1DXSyduFHBMfpFwWEVRXLd8s_78iU8gU,17894
|
132
132
|
local_deep_research/web_search_engines/engines/search_engine_wikipedia.py,sha256=UxYBSGD-XZGQantq_AdgtBA8FCKV0C6mEr6GS_vleQQ,10092
|
133
133
|
local_deep_research/web_search_engines/search_engine_base.py,sha256=PLU_sAWhWKTOQWcv32GINuhLdIwB0sEQy-pp9oG9Ggo,9835
|
134
134
|
local_deep_research/web_search_engines/search_engine_factory.py,sha256=DghAkQvLKRJYl5xb9AUjUv7ydAQ4rPi-TvzrmqdyGxE,10890
|
135
|
-
local_deep_research/web_search_engines/search_engines_config.py,sha256=
|
136
|
-
local_deep_research-0.3.
|
135
|
+
local_deep_research/web_search_engines/search_engines_config.py,sha256=UAE6TfxFXrt-RvSfGQ_FRsOGGrsSs8VI3n1i-0Lfo2s,4929
|
136
|
+
local_deep_research-0.3.8.dist-info/RECORD,,
|
File without changes
|
{local_deep_research-0.3.5.dist-info → local_deep_research-0.3.8.dist-info}/entry_points.txt
RENAMED
File without changes
|
{local_deep_research-0.3.5.dist-info → local_deep_research-0.3.8.dist-info}/licenses/LICENSE
RENAMED
File without changes
|