local-deep-research 0.3.6__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/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.6.dist-info → local_deep_research-0.3.8.dist-info}/METADATA +13 -7
- {local_deep_research-0.3.6.dist-info → local_deep_research-0.3.8.dist-info}/RECORD +12 -12
- {local_deep_research-0.3.6.dist-info → local_deep_research-0.3.8.dist-info}/WHEEL +0 -0
- {local_deep_research-0.3.6.dist-info → local_deep_research-0.3.8.dist-info}/entry_points.txt +0 -0
- {local_deep_research-0.3.6.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)
|
@@ -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
|
|
@@ -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
|
@@ -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
|
@@ -69,7 +69,7 @@ local_deep_research/web/routes/research_routes.py,sha256=zSU21oAkZnADnuhJniShd8U
|
|
69
69
|
local_deep_research/web/routes/settings_routes.py,sha256=fkYLwDgcHfiHVml3ux6qCc5qFMjfnKfPcwisqhg995s,49280
|
70
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.6.dist-info → local_deep_research-0.3.8.dist-info}/entry_points.txt
RENAMED
File without changes
|
{local_deep_research-0.3.6.dist-info → local_deep_research-0.3.8.dist-info}/licenses/LICENSE
RENAMED
File without changes
|