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.
@@ -1 +1 @@
1
- __version__ = "0.3.5"
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.api_key": {
2930
+ "search.engine.web.searxng.class_name": {
2931
2931
  "category": "searxng",
2932
- "description": "The SearXNG API key to use.",
2932
+ "description": "Setting for searxng.class_name",
2933
2933
  "editable": true,
2934
2934
  "max_value": null,
2935
2935
  "min_value": null,
2936
- "name": "Api Key",
2936
+ "name": "Class Name",
2937
2937
  "options": null,
2938
2938
  "step": null,
2939
2939
  "type": "SEARCH",
2940
- "ui_element": "password",
2941
- "value": "SEARXNG_API_KEY",
2940
+ "ui_element": "text",
2941
+ "value": "SearXNGSearchEngine",
2942
2942
  "visible": true
2943
2943
  },
2944
- "search.engine.web.searxng.class_name": {
2944
+ "search.engine.web.searxng.default_params.instance_url": {
2945
2945
  "category": "searxng",
2946
- "description": "Setting for searxng.class_name",
2946
+ "description": "The SearXNG API endpoint URL.",
2947
2947
  "editable": true,
2948
2948
  "max_value": null,
2949
2949
  "min_value": null,
2950
- "name": "Class Name",
2950
+ "name": "Endpoint URL",
2951
2951
  "options": null,
2952
2952
  "step": null,
2953
2953
  "type": "SEARCH",
2954
2954
  "ui_element": "text",
2955
- "value": "SearXNGSearchEngine",
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 hasattr(self.strategy, "all_links_of_system"):
184
- self.all_links_of_system.extend(self.strategy.all_links_of_system)
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, check_env_setting
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, check_env: bool = True
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
- if check_env:
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, f"quick_summary_{safe_query}.md"
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(OUTPUT_DIR, f"detailed_report_{safe_query}.md")
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
- s.key.removeprefix(f"{key}."): s.value for s in settings
99
- }
100
- # We deliberately don't update the cache here to avoid
101
- # conflicts between low-level keys and their parent keys.
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: Optional[str] = None, # Can be None if using env var
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
- # Get instance URL from various sources in priority order:
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
- if self.instance_url:
77
- self.instance_url = self.instance_url.rstrip("/")
78
- self.is_available = True
79
- logger.info(f"SearXNG initialized with instance URL: {self.instance_url}")
80
- else:
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
- "No SearXNG instance URL provided. The engine is disabled. "
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
- engine_config = {}
27
+ nested_config = {}
29
28
  for key, value in raw_config.items():
30
- engine_name = key.split(".")[0]
31
- setting_name = ".".join(key.split(".")[1:])
32
- engine_config.setdefault(engine_name, {})[setting_name] = value
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
- return engine_config
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.5
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
- <a href="https://www.youtube.com/watch?v=0ISreg9q0p0">
84
- <img src="https://img.youtube.com/vi/0ISreg9q0p0/0.jpg" alt="Local Deep Research Demo" width="500">
85
- </a>
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
- SERP_API_KEY=your-key-here # Google results via SerpAPI
277
- GOOGLE_PSE_API_KEY=your-key-here # Google Programmable Search
278
- BRAVE_API_KEY=your-key-here # Brave Search
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
- ### Using Document Collections
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.5.dist-info/METADATA,sha256=InfWqPp3XGvKc0cwx_S0TSm_MMqvPK3SPcprjoWTXTk,16645
2
- local_deep_research-0.3.5.dist-info/WHEEL,sha256=tSfRZzRHthuv7vxpI4aehrdN9scLjk-dCJkPLzkHxGg,90
3
- local_deep_research-0.3.5.dist-info/entry_points.txt,sha256=GcXS501Rjh-P80S8db7hnrQ23mS_Jg27PwpVQVO77as,113
4
- local_deep_research-0.3.5.dist-info/licenses/LICENSE,sha256=Qg2CaTdu6SWnSqk1_JtgBPp_Da-LdqJDhT1Vt1MUc5s,1072
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=ThnCuF3X7rsQSd5PAea_jfYA70ZmhLvkFcLBxBPwZnY,22
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=uN3LHCuGIN3dDlAYwEv4t_onYsw0U2TDjxQrN4_z2FM,120530
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=hzJRsT5iX_D65Su4Q8v6Dd9ElH-oG0E7RhqulgEqXSY,7567
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=27RTIWrzyNC0oDmJAOc6raTmmgrc8jqJLxH7jQbCt0g,1830
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=vs_pWuv56rG2atgSamlDK4MdxpWTxbBVf3rHztr6y2A,39488
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=W3i0ZW8Ds4PhjlzPUiHoBwhzEdlnVGhnCKexjSnvlyc,17013
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=wPYIl22SgXjIDYzcq62glGH2JZywCnZR31he1i7U1cE,18053
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=rgKo3UQhXov_4QxPcdzMqnAfJc5a6tGXtfnjIzKeHdQ,4584
136
- local_deep_research-0.3.5.dist-info/RECORD,,
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,,