local-deep-research 0.3.2__py3-none-any.whl → 0.3.5__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.2"
1
+ __version__ = "0.3.5"
@@ -31,7 +31,7 @@ class CrossEngineFilter(BaseFilter):
31
31
  super().__init__(model)
32
32
  # Get max_results from database settings if not provided
33
33
  if max_results is None:
34
- max_results = get_db_setting("search.cross_engine_max_results", 100)
34
+ max_results = int(get_db_setting("search.cross_engine_max_results", 100))
35
35
  self.max_results = max_results
36
36
  self.default_reorder = default_reorder
37
37
  self.default_reindex = default_reindex
@@ -60,12 +60,6 @@ class ParallelSearchStrategy(BaseSearchStrategy):
60
60
  self.filter_reorder = filter_reorder
61
61
  self.filter_reindex = filter_reindex
62
62
 
63
- # Get max_filtered_results from database if not provided
64
- if cross_engine_max_results is None:
65
- cross_engine_max_results = get_db_setting(
66
- "search.cross_engine_max_results", 100
67
- )
68
-
69
63
  # Initialize the cross-engine filter
70
64
  self.cross_engine_filter = CrossEngineFilter(
71
65
  model=self.model,
@@ -45,12 +45,6 @@ class SourceBasedSearchStrategy(BaseSearchStrategy):
45
45
  self.filter_reorder = filter_reorder
46
46
  self.filter_reindex = filter_reindex
47
47
 
48
- # Get cross_engine_max_results from database if not provided
49
- if cross_engine_max_results is None:
50
- cross_engine_max_results = get_db_setting(
51
- "search.cross_engine_max_results", 100
52
- )
53
-
54
48
  # Initialize the cross-engine filter
55
49
  self.cross_engine_filter = CrossEngineFilter(
56
50
  model=self.model,
@@ -6,8 +6,6 @@ API module for programmatic access to Local Deep Research functionality.
6
6
  from .research_functions import (
7
7
  analyze_documents,
8
8
  generate_report,
9
- get_available_collections,
10
- get_available_search_engines,
11
9
  quick_summary,
12
10
  )
13
11
 
@@ -15,6 +13,4 @@ __all__ = [
15
13
  "quick_summary",
16
14
  "generate_report",
17
15
  "analyze_documents",
18
- "get_available_search_engines",
19
- "get_available_collections",
20
16
  ]
@@ -216,31 +216,51 @@ def get_llm(model_name=None, temperature=None, provider=None, openai_endpoint_ur
216
216
  )
217
217
  return wrap_llm_without_think_tags(llm)
218
218
 
219
+ # Update the llamacpp section in get_llm function
219
220
  elif provider == "llamacpp":
220
221
  # Import LlamaCpp
221
222
  from langchain_community.llms import LlamaCpp
222
223
 
223
- # Get LlamaCpp model path from settings
224
- model_path = get_db_setting("llm.llamacpp_model_path")
225
- if not model_path:
226
- logger.error("llamacpp_model_path not set in settings")
227
- raise ValueError("llamacpp_model_path not set in settings")
228
-
229
- # Get additional LlamaCpp parameters
230
- n_gpu_layers = get_db_setting("llm.llamacpp_n_gpu_layers", 1)
231
- n_batch = get_db_setting("llm.llamacpp_n_batch", 512)
232
- f16_kv = get_db_setting("llm.llamacpp_f16_kv", True)
233
-
234
- # Create LlamaCpp instance
235
- llm = LlamaCpp(
236
- model_path=model_path,
237
- temperature=temperature,
238
- max_tokens=get_db_setting("llm.max_tokens", 30000),
239
- n_gpu_layers=n_gpu_layers,
240
- n_batch=n_batch,
241
- f16_kv=f16_kv,
242
- verbose=True,
243
- )
224
+ # Get LlamaCpp connection mode from settings
225
+ connection_mode = get_db_setting("llm.llamacpp_connection_mode", "local")
226
+
227
+ if connection_mode == "http":
228
+ # Use HTTP client mode
229
+ from langchain_community.llms.llamacpp_client import LlamaCppClient
230
+
231
+ server_url = get_db_setting(
232
+ "llm.llamacpp_server_url", "http://localhost:8000"
233
+ )
234
+
235
+ llm = LlamaCppClient(
236
+ server_url=server_url,
237
+ temperature=temperature,
238
+ max_tokens=get_db_setting("llm.max_tokens", 30000),
239
+ )
240
+ else:
241
+ # Use direct model loading (existing code)
242
+ # Get LlamaCpp model path from settings
243
+ model_path = get_db_setting("llm.llamacpp_model_path")
244
+ if not model_path:
245
+ logger.error("llamacpp_model_path not set in settings")
246
+ raise ValueError("llamacpp_model_path not set in settings")
247
+
248
+ # Get additional LlamaCpp parameters
249
+ n_gpu_layers = get_db_setting("llm.llamacpp_n_gpu_layers", 1)
250
+ n_batch = get_db_setting("llm.llamacpp_n_batch", 512)
251
+ f16_kv = get_db_setting("llm.llamacpp_f16_kv", True)
252
+
253
+ # Create LlamaCpp instance
254
+ llm = LlamaCpp(
255
+ model_path=model_path,
256
+ temperature=temperature,
257
+ max_tokens=get_db_setting("llm.max_tokens", 30000),
258
+ n_gpu_layers=n_gpu_layers,
259
+ n_batch=n_batch,
260
+ f16_kv=f16_kv,
261
+ verbose=True,
262
+ )
263
+
244
264
  return wrap_llm_without_think_tags(llm)
245
265
 
246
266
  else:
@@ -1,18 +1,4 @@
1
1
  {
2
- "app.version": {
3
- "category": null,
4
- "description": "Version of the app this database is associated with.",
5
- "editable": false,
6
- "max_value": null,
7
- "min_value": null,
8
- "name": "App Version",
9
- "options": null,
10
- "step": null,
11
- "type": "APP",
12
- "ui_element": "text",
13
- "value": "0.3.2",
14
- "visible": false
15
- },
16
2
  "app.debug": {
17
3
  "category": "app_interface",
18
4
  "description": "Enable debug mode for the web application",
@@ -3992,5 +3978,42 @@
3992
3978
  "ui_element": "checkbox",
3993
3979
  "value": false,
3994
3980
  "visible": true
3981
+ },
3982
+ "llm.llamacpp_connection_mode": {
3983
+ "category": "llm_parameters",
3984
+ "description": "Connection mode for LlamaCpp: 'local' for direct model loading or 'http' for using a remote server",
3985
+ "editable": true,
3986
+ "max_value": null,
3987
+ "min_value": null,
3988
+ "name": "LlamaCpp Connection Mode",
3989
+ "options": [
3990
+ {
3991
+ "label": "Local Model",
3992
+ "value": "local"
3993
+ },
3994
+ {
3995
+ "label": "HTTP Server",
3996
+ "value": "http"
3997
+ }
3998
+ ],
3999
+ "step": null,
4000
+ "type": "LLM",
4001
+ "ui_element": "select",
4002
+ "value": "local",
4003
+ "visible": true
4004
+ },
4005
+ "llm.llamacpp_server_url": {
4006
+ "category": "llm_parameters",
4007
+ "description": "URL of the LlamaCpp HTTP server (only used when connection mode is 'http')",
4008
+ "editable": true,
4009
+ "max_value": null,
4010
+ "min_value": null,
4011
+ "name": "LlamaCpp Server URL",
4012
+ "options": null,
4013
+ "step": null,
4014
+ "type": "LLM",
4015
+ "ui_element": "text",
4016
+ "value": "http://localhost:8000",
4017
+ "visible": true
3995
4018
  }
3996
4019
  }
@@ -13,7 +13,7 @@ def import_default_settings_file(db_session):
13
13
  Imports all settings from the default settings file to the DB.
14
14
  """
15
15
  settings_mgr = SettingsManager(db_session)
16
- if settings_mgr.db_version_matches_defaults():
16
+ if settings_mgr.db_version_matches_package():
17
17
  # We probably shouldn't bother loading settings if the version didn't
18
18
  # change.
19
19
  return
@@ -26,6 +26,9 @@ def import_default_settings_file(db_session):
26
26
  # old versions of the settings.
27
27
  settings_mgr.load_from_defaults_file(overwrite=False, delete_extra=True)
28
28
  logger.info("Successfully imported settings from files")
29
+
30
+ # Update the saved version.
31
+ settings_mgr.update_db_version()
29
32
  except Exception as e:
30
33
  logger.error("Error importing settings from files: %s", e)
31
34
 
@@ -10,7 +10,6 @@ from flask import (
10
10
  current_app,
11
11
  jsonify,
12
12
  redirect,
13
- render_template,
14
13
  request,
15
14
  send_from_directory,
16
15
  url_for,
@@ -18,6 +17,7 @@ from flask import (
18
17
 
19
18
  from ..models.database import add_log_to_db, calculate_duration, get_db_connection
20
19
  from ..services.research_service import run_research_process, start_research_process
20
+ from ..utils.templates import render_template_with_defaults
21
21
 
22
22
  # Initialize logger
23
23
  logger = logging.getLogger(__name__)
@@ -48,7 +48,7 @@ def get_globals():
48
48
  # Route for index page - redirection
49
49
  @research_bp.route("/")
50
50
  def index():
51
- return render_template("pages/research.html")
51
+ return render_template_with_defaults("pages/research.html")
52
52
 
53
53
 
54
54
  # Add the missing static file serving route
@@ -70,62 +70,62 @@ def redirect_static(path):
70
70
  @research_bp.route("/progress/<int:research_id>")
71
71
  def progress_page(research_id):
72
72
  """Render the research progress page"""
73
- return render_template("pages/progress.html")
73
+ return render_template_with_defaults("pages/progress.html")
74
74
 
75
75
 
76
76
  @research_bp.route("/details/<int:research_id>")
77
77
  def research_details_page(research_id):
78
78
  """Render the research details page"""
79
- return render_template("pages/details.html")
79
+ return render_template_with_defaults("pages/details.html")
80
80
 
81
81
 
82
82
  @research_bp.route("/results/<int:research_id>")
83
83
  def results_page(research_id):
84
84
  """Render the research results page"""
85
- return render_template("pages/results.html")
85
+ return render_template_with_defaults("pages/results.html")
86
86
 
87
87
 
88
88
  @research_bp.route("/history")
89
89
  def history_page():
90
90
  """Render the history page"""
91
- return render_template("pages/history.html")
91
+ return render_template_with_defaults("pages/history.html")
92
92
 
93
93
 
94
94
  # Add missing settings routes
95
95
  @research_bp.route("/settings", methods=["GET"])
96
96
  def settings_page():
97
97
  """Render the settings page"""
98
- return render_template("settings_dashboard.html")
98
+ return render_template_with_defaults("settings_dashboard.html")
99
99
 
100
100
 
101
101
  @research_bp.route("/settings/main", methods=["GET"])
102
102
  def main_config_page():
103
103
  """Render the main settings config page"""
104
- return render_template("main_config.html")
104
+ return render_template_with_defaults("main_config.html")
105
105
 
106
106
 
107
107
  @research_bp.route("/settings/collections", methods=["GET"])
108
108
  def collections_config_page():
109
109
  """Render the collections config page"""
110
- return render_template("collections_config.html")
110
+ return render_template_with_defaults("collections_config.html")
111
111
 
112
112
 
113
113
  @research_bp.route("/settings/api_keys", methods=["GET"])
114
114
  def api_keys_config_page():
115
115
  """Render the API keys config page"""
116
- return render_template("api_keys_config.html")
116
+ return render_template_with_defaults("api_keys_config.html")
117
117
 
118
118
 
119
119
  @research_bp.route("/settings/search_engines", methods=["GET"])
120
120
  def search_engines_config_page():
121
121
  """Render the search engines config page"""
122
- return render_template("search_engines_config.html")
122
+ return render_template_with_defaults("search_engines_config.html")
123
123
 
124
124
 
125
125
  @research_bp.route("/settings/llm", methods=["GET"])
126
126
  def llm_config_page():
127
127
  """Render the LLM config page"""
128
- return render_template("llm_config.html")
128
+ return render_template_with_defaults("llm_config.html")
129
129
 
130
130
 
131
131
  @research_bp.route("/api/start_research", methods=["POST"])
@@ -12,7 +12,6 @@ from flask import (
12
12
  flash,
13
13
  jsonify,
14
14
  redirect,
15
- render_template,
16
15
  request,
17
16
  url_for,
18
17
  )
@@ -27,6 +26,7 @@ from ..services.settings_service import (
27
26
  get_settings_manager,
28
27
  set_setting,
29
28
  )
29
+ from ..utils.templates import render_template_with_defaults
30
30
 
31
31
  # Initialize logger
32
32
  logger = logging.getLogger(__name__)
@@ -88,7 +88,7 @@ def validate_setting(setting: Setting, value: Any) -> Tuple[bool, Optional[str]]
88
88
  @settings_bp.route("/", methods=["GET"])
89
89
  def settings_page():
90
90
  """Main settings dashboard with links to specialized config pages"""
91
- return render_template("settings_dashboard.html")
91
+ return render_template_with_defaults("settings_dashboard.html")
92
92
 
93
93
 
94
94
  @settings_bp.route("/save_all_settings", methods=["POST"])
@@ -9,6 +9,7 @@ from sqlalchemy.exc import SQLAlchemyError
9
9
  from sqlalchemy.orm import Session
10
10
 
11
11
  from ... import defaults
12
+ from ...__version__ import __version__ as package_version
12
13
  from ..database.models import Setting, SettingType
13
14
  from ..models.settings import (
14
15
  AppSetting,
@@ -331,21 +332,41 @@ class SettingsManager:
331
332
  """
332
333
  self.import_settings(self.default_settings, commit=commit, **kwargs)
333
334
 
334
- def db_version_matches_defaults(self) -> bool:
335
+ def db_version_matches_package(self) -> bool:
335
336
  """
336
337
  Returns:
337
- True if the version saved in the DB matches that in the default
338
- settings file.
338
+ True if the version saved in the DB matches the package version.
339
339
 
340
340
  """
341
341
  db_version = self.get_setting("app.version")
342
- default_version = self.default_settings["app.version"]["value"]
343
342
  logger.debug(
344
- f"App version saved in DB is {db_version}, have default "
345
- f"settings from version {default_version}."
343
+ f"App version saved in DB is {db_version}, have package "
344
+ f"settings from version {package_version}."
346
345
  )
347
346
 
348
- return db_version == default_version
347
+ return db_version == package_version
348
+
349
+ def update_db_version(self) -> None:
350
+ """
351
+ Updates the version saved in the DB based on the package version.
352
+
353
+ """
354
+ logger.debug(f"Updating saved DB version to {package_version}.")
355
+
356
+ self.delete_setting("app.version", commit=False)
357
+ version = Setting(
358
+ key="app.version",
359
+ value=package_version,
360
+ description="Version of the app this database is associated with.",
361
+ editable=False,
362
+ name="App Version",
363
+ type=SettingType.APP,
364
+ ui_element="text",
365
+ visible=False,
366
+ )
367
+
368
+ self.db_session.add(version)
369
+ self.db_session.commit()
349
370
 
350
371
  @classmethod
351
372
  def get_instance(cls, db_session: Optional[Session] = None) -> "SettingsManager":
@@ -16,6 +16,6 @@
16
16
  </ul>
17
17
  </nav>
18
18
  <div class="sidebar-footer">
19
- <p>v0.2.0 | <i class="fas fa-brain"></i></p>
19
+ <p>{{ version }} | <i class="fas fa-brain"></i></p>
20
20
  </div>
21
21
  </aside>
@@ -0,0 +1,24 @@
1
+ """
2
+ Utilities for rendering templates.
3
+ """
4
+
5
+ from typing import Any
6
+
7
+ from flask import render_template
8
+
9
+ from ...__version__ import __version__
10
+
11
+
12
+ def render_template_with_defaults(*args: Any, **kwargs: Any) -> str:
13
+ """
14
+ Renders templates with some default values filled.
15
+
16
+ Args:
17
+ *args: Will be passed to the normal `render_template`.
18
+ **kwargs: Will be passed to the normal `render_template`.
19
+
20
+ Returns:
21
+ The rendered template.
22
+
23
+ """
24
+ return render_template(*args, version=__version__, **kwargs)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: local-deep-research
3
- Version: 0.3.2
3
+ Version: 0.3.5
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
@@ -99,41 +99,74 @@ Local Deep Research is a powerful AI research assistant that:
99
99
 
100
100
  Local Deep Research combines the power of large language models with intelligent search strategies to provide well-researched, properly cited answers to complex questions. It can process queries in just seconds with the Quick Summary option, or create detailed reports with proper section organization for more comprehensive analysis.
101
101
 
102
- ## ⚡ Quick Start (Recommended)
102
+ ## ⚡ Quick Start
103
+
104
+ ### Option 1: Docker (Recommended)
105
+
106
+ ```bash
107
+ # Step 1: Pull and run SearXNG for optimal search results
108
+ docker pull searxng/searxng
109
+ docker run -d -p 8080:8080 --name searxng searxng/searxng
110
+
111
+ # Step 2: Pull and run Local Deep Research
112
+ docker pull localdeepresearch/local-deep-research
113
+ docker run -d -p 5000:5000 --name local-deep-research localdeepresearch/local-deep-research
114
+
115
+ # Optional 3a: For connecting to already installed local Ollama (https://ollama.com/download) or other local services
116
+ # docker run -d -p 5000:5000 --network host --name local-deep-research localdeepresearch/local-deep-research
117
+
118
+ # Optional 3b (recommended): Pull and run Ollama for local LLM capabilities
119
+ # docker pull ollama/ollama
120
+ # docker run -d -p 11434:11434 --name ollama ollama/ollama
121
+ # docker exec -it ollama ollama pull gemma3:12b
122
+
123
+ # Start containers - Required after each reboot (can be automated with this flag --restart unless-stopped in run)
124
+ docker start searxng
125
+ docker start local-deep-research
126
+ # docker start ollama
127
+ ```
128
+
129
+ Then visit `http://127.0.0.1:5000` to start researching!
130
+
131
+ > **Note**: If you need to connect to local services (like Ollama), add `--network host` to the command.
132
+ >
133
+ > **Don't have Docker? It's installed in a few clicks: [Install Docker here](https://www.docker.com/get-started/)**
134
+
135
+ ### Option 2: Python Package (mostly for programmatic access)
103
136
 
104
137
  ```bash
105
- # 1. Install
138
+ # Install the package
106
139
  pip install local-deep-research
107
140
 
108
- # 2. Setup SearXNG for best results
141
+ # Setup SearXNG for best results
109
142
  docker pull searxng/searxng
110
143
  docker run -d -p 8080:8080 --name searxng searxng/searxng
111
- docker start searxng (required after every reboot)
112
144
 
113
- # 3. Install Ollama and pull a model
145
+ # Install Ollama and pull a model
114
146
  # Download from https://ollama.ai and run:
115
147
  ollama pull gemma3:12b
116
148
 
117
- # 4. Start the web interface
149
+ # Start the web interface
118
150
  python -m local_deep_research.web.app
119
151
  ```
120
152
 
121
- Then visit `http://127.0.0.1:5000` to start researching!
122
-
123
- ### Alternative Installation Options
153
+ For programmatic use in your Python code:
124
154
 
125
- **Windows Installer**: Download the [Windows Installer](https://github.com/LearningCircuit/local-deep-research/releases/download/v0.1.0/LocalDeepResearch_Setup.exe) for one-click setup.
155
+ ```python
156
+ from local_deep_research import quick_summary
126
157
 
127
- **Docker**: Run with Docker using:
128
- ```bash
129
- docker run --network=host \
130
- local-deep-research
158
+ results = quick_summary(
159
+ query="advances in fusion energy",
160
+ search_tool="auto",
161
+ iterations=1
162
+ )
163
+ print(results["summary"])
131
164
  ```
132
165
 
133
- **Command Line**: Alternatively, use the CLI version with:
134
- ```bash
135
- python -m local_deep_research.main
136
- ```
166
+ ### Additional Installation Options
167
+
168
+ **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
+
137
170
 
138
171
  ## 🔍 Research Capabilities
139
172
 
@@ -1,14 +1,14 @@
1
- local_deep_research-0.3.2.dist-info/METADATA,sha256=nEBQaPbFORrkT0zPmgOC2ja04hQUB0Dpu3C9tBAFx2k,15340
2
- local_deep_research-0.3.2.dist-info/WHEEL,sha256=tSfRZzRHthuv7vxpI4aehrdN9scLjk-dCJkPLzkHxGg,90
3
- local_deep_research-0.3.2.dist-info/entry_points.txt,sha256=GcXS501Rjh-P80S8db7hnrQ23mS_Jg27PwpVQVO77as,113
4
- local_deep_research-0.3.2.dist-info/licenses/LICENSE,sha256=Qg2CaTdu6SWnSqk1_JtgBPp_Da-LdqJDhT1Vt1MUc5s,1072
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
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=vNiWJ14r_cw5t_7UDqDQIVZvladKFGyHH2avsLpN7Vg,22
7
+ local_deep_research/__version__.py,sha256=ThnCuF3X7rsQSd5PAea_jfYA70ZmhLvkFcLBxBPwZnY,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
11
- local_deep_research/advanced_search_system/filters/cross_engine_filter.py,sha256=R2pM5p06gXLwOvXexGcUe5h4OQpxmlft-DXC217CiOo,8004
11
+ local_deep_research/advanced_search_system/filters/cross_engine_filter.py,sha256=HzhlIrtQlMEPMIibW2ySzMB8aXV2hQBNfCWRo_AJJpM,8009
12
12
  local_deep_research/advanced_search_system/findings/base_findings.py,sha256=tTVEQZeGuTdJ1tDF8QAkiS5pWest8_lmbq3Oq5EPGeY,2052
13
13
  local_deep_research/advanced_search_system/findings/repository.py,sha256=nIdF114IaSNLjnjetbXE8s8C69djik3lywOiFvFI4Lk,19804
14
14
  local_deep_research/advanced_search_system/knowledge/__init__.py,sha256=9zjQkdmomZCgZZP45fqw0E8UVpBjkzkyW7RpY0f8gY8,34
@@ -22,25 +22,25 @@ local_deep_research/advanced_search_system/repositories/__init__.py,sha256=cCjAR
22
22
  local_deep_research/advanced_search_system/strategies/__init__.py,sha256=upbslnB6Ns8RJ0-b1bH74-f5gZbo7evpx1dRrKEkzHA,35
23
23
  local_deep_research/advanced_search_system/strategies/base_strategy.py,sha256=NVowhf36DLeES302v0U6cWDCmQvNuV0cVj4glSculfQ,3975
24
24
  local_deep_research/advanced_search_system/strategies/iterdrag_strategy.py,sha256=dKTgwXaXFxBqzUw_S434LdEvV4HL2CrR9K9KBaMYxOg,18473
25
- local_deep_research/advanced_search_system/strategies/parallel_search_strategy.py,sha256=iOWxbfKQZAt-Ua8NDqKaMZugete0YMCk9wfQfKkQHVE,19385
25
+ local_deep_research/advanced_search_system/strategies/parallel_search_strategy.py,sha256=kbmzG3klXHgC9HfT6NTc9ipiHGzt1dnRPIfYqr23jLA,19150
26
26
  local_deep_research/advanced_search_system/strategies/rapid_search_strategy.py,sha256=giuBMkkxUkdI4J9711bjM3ReMLTFfyt6irT4v-3ef_Q,10426
27
- local_deep_research/advanced_search_system/strategies/source_based_strategy.py,sha256=QmdwUV56ZGCHMLti91hEFQ6As9Yp0C_rvC6aJsnfI0U,17288
27
+ local_deep_research/advanced_search_system/strategies/source_based_strategy.py,sha256=hMX91leNgCc2GPnLr9pQnXH8_6pfFv4BYqhrPBh2FTQ,17049
28
28
  local_deep_research/advanced_search_system/strategies/standard_strategy.py,sha256=Yqe5N3bUCDXjeSlP8__AORPYyHVY5sEb82zvpTU34r8,12774
29
29
  local_deep_research/advanced_search_system/tools/__init__.py,sha256=73jLuCKigwc9lJQ0uD3_F16dgCg4pL-F2cwC6tk9-oc,30
30
30
  local_deep_research/advanced_search_system/tools/base_tool.py,sha256=jEs4eroCvo0dHP_uF-5kLiQP7OfkD1YzNAD650a8Ktk,2865
31
31
  local_deep_research/advanced_search_system/tools/knowledge_tools/__init__.py,sha256=73jLuCKigwc9lJQ0uD3_F16dgCg4pL-F2cwC6tk9-oc,30
32
32
  local_deep_research/advanced_search_system/tools/question_tools/__init__.py,sha256=73jLuCKigwc9lJQ0uD3_F16dgCg4pL-F2cwC6tk9-oc,30
33
33
  local_deep_research/advanced_search_system/tools/search_tools/__init__.py,sha256=73jLuCKigwc9lJQ0uD3_F16dgCg4pL-F2cwC6tk9-oc,30
34
- local_deep_research/api/__init__.py,sha256=-tJQp7Qm1aPg6fgfuw-w9dfNo8GzrJLOy2i3dG8Drl8,441
34
+ local_deep_research/api/__init__.py,sha256=KS5QcF5MzbUDPnXEzOAztcUw-HUQs4EVCH4k0YDMgCM,307
35
35
  local_deep_research/api/research_functions.py,sha256=SItLEuib94AXrhMsgmYDtykGrVmBPDKYHzzeDPhH688,9563
36
36
  local_deep_research/app.py,sha256=U_92UX0dpVAQoaXciVNy_By_AyDEWGlXSeTwFpohALQ,155
37
37
  local_deep_research/citation_handler.py,sha256=MZVd6xl7g3xrWauFBPuVIC36z8onc-zQb8xI4dQXxsU,4307
38
38
  local_deep_research/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
- local_deep_research/config/llm_config.py,sha256=r4ubJaNV3F5gLCpmpcNeCINH-ce_F6iEVO20QEjLGcY,14751
39
+ local_deep_research/config/llm_config.py,sha256=bYxhwyjkdBlap832aWvWgHWjjPq45Oh2NtDOLJFf4go,15560
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=3buAVqMJqCvpg6J9lpXh9QprNLgDnEOcxx6kxYxZHk0,119769
43
+ local_deep_research/defaults/default_settings.json,sha256=uN3LHCuGIN3dDlAYwEv4t_onYsw0U2TDjxQrN4_z2FM,120530
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
@@ -58,18 +58,18 @@ local_deep_research/web/app.py,sha256=tl3PAf41NBYYGq0oeIKAZw_hVSB8JmjyF8jzvYPeAU
58
58
  local_deep_research/web/app_factory.py,sha256=rk5QCwpxrub6ptKsvjSDTNtq8d2RWbKo2LZLvL__fPo,8107
59
59
  local_deep_research/web/database/README.md,sha256=eEDLqLIfOBRvc0TFh3J1HrtFbZceYmVgpjS3-oyZ5nI,2861
60
60
  local_deep_research/web/database/migrate_to_ldr_db.py,sha256=-ltKuhgosPhybDsJ13BuvvHEDJTN4Jx6SiO6XvW0SKA,9823
61
- local_deep_research/web/database/migrations.py,sha256=ylfHrPGs0xWwUAAratsXGJ2aoS_C0ysHd92EwniLz44,1618
61
+ local_deep_research/web/database/migrations.py,sha256=2z8-5P8gJ8vIEzLTbswNx0Ui7ZNveSFoad6JesOKhJk,1695
62
62
  local_deep_research/web/database/models.py,sha256=MIxYWIQIovkrR65rFMxlDXn2iZXf5SIePIE_-vSmLXg,3489
63
63
  local_deep_research/web/database/schema_upgrade.py,sha256=u3tx_tlsuzJw-NhvhKvQG6dqzwUckQkic0D3taZAt-k,2924
64
64
  local_deep_research/web/models/database.py,sha256=NV4h0RU0ta408SkI_ZmquCplMTNH1Q4zxYJ4SHwmiGY,9489
65
65
  local_deep_research/web/models/settings.py,sha256=rXBI9vY5k3ndR8dPd3fZJy-6HwYltQihhSBRq-sZutw,2314
66
66
  local_deep_research/web/routes/api_routes.py,sha256=S0UdCmfm0v1GEM4UiSbI0PE3xUOxiGaYFR2ZOE0256U,19075
67
67
  local_deep_research/web/routes/history_routes.py,sha256=6a_8nX349viuvi1zP5S7BaPPpAh133eTi1NVWO545A8,12622
68
- local_deep_research/web/routes/research_routes.py,sha256=JlzaP1z-7XAP3E0nkEjLIfYj_NKf5qDcrjxBmUouAhM,23492
69
- local_deep_research/web/routes/settings_routes.py,sha256=DkG0JzYQZHzbMoJRxcEreHHYTbzwhhpSvIUHmEMYQAw,49227
68
+ local_deep_research/web/routes/research_routes.py,sha256=zSU21oAkZnADnuhJniShd8US8hpPDiYqQxUhalJwQeU,23685
69
+ local_deep_research/web/routes/settings_routes.py,sha256=fkYLwDgcHfiHVml3ux6qCc5qFMjfnKfPcwisqhg995s,49280
70
70
  local_deep_research/web/services/research_service.py,sha256=vs_pWuv56rG2atgSamlDK4MdxpWTxbBVf3rHztr6y2A,39488
71
71
  local_deep_research/web/services/resource_service.py,sha256=yKgOC6GEOmHqRoGzwf52e19UaGCCS1DbDbOIXgWGvGc,4378
72
- local_deep_research/web/services/settings_manager.py,sha256=lHc0Arh9RR4D_Dubj6OxtlZw7MvHtdY8Db9p5LnX_ac,16376
72
+ local_deep_research/web/services/settings_manager.py,sha256=W3i0ZW8Ds4PhjlzPUiHoBwhzEdlnVGhnCKexjSnvlyc,17013
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
@@ -102,7 +102,7 @@ local_deep_research/web/templates/components/custom_dropdown.html,sha256=ELoC9Pw
102
102
  local_deep_research/web/templates/components/log_panel.html,sha256=hVyLTJMuU7iURSOKUZnB0Z8a7lcIUuT5m6mUVruYVuQ,1462
103
103
  local_deep_research/web/templates/components/mobile_nav.html,sha256=rVOLbEp6lGrX8F8q24vTLTSdcP6xxi4wqBrBBrfb9Ek,865
104
104
  local_deep_research/web/templates/components/settings_form.html,sha256=Z1eEQ_SFlioH24zrIDpjMQ-ajEJC2lLN4Tu8Y8uASLY,15987
105
- local_deep_research/web/templates/components/sidebar.html,sha256=FLjlpwlXPoNd-NcBxWqiB-d7yg3uBtgoOVGD3pUeVf4,1014
105
+ local_deep_research/web/templates/components/sidebar.html,sha256=xWklsiZ5LCG6Ev68lTVjpeeqKF4LS9ssMx5ByJehTpg,1021
106
106
  local_deep_research/web/templates/pages/details.html,sha256=OYvSNfi8uFD1wNeHxWza1-xWMrT9c4V7U0ZEZnISlCU,2768
107
107
  local_deep_research/web/templates/pages/history.html,sha256=ZS3QufL2beUVB9P_LvqIixvYfCT-EjtokQa9LRp5sUs,1982
108
108
  local_deep_research/web/templates/pages/progress.html,sha256=tq9XRRZBm2KnnBxPlAa7cWWDAP-pqJeHGgtlul7UVSs,2550
@@ -111,6 +111,7 @@ local_deep_research/web/templates/pages/results.html,sha256=XKZVWo1CfbyjxMOntFO7
111
111
  local_deep_research/web/templates/settings_dashboard.html,sha256=A1fBe1D29v8G3ys94_rIiBP6Ky-rtYL6TRbDluoBMPI,4342
112
112
  local_deep_research/web/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
113
113
  local_deep_research/web/utils/formatters.py,sha256=Gj_a0oFveNXHtvkiFe1rwlEtzYerMd0TtPO3Yh2e2bI,3155
114
+ local_deep_research/web/utils/templates.py,sha256=scBPbjUJqaFltFX37ZLsdcgPycPY7kMSew5mZWCG1H0,535
114
115
  local_deep_research/web_search_engines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
115
116
  local_deep_research/web_search_engines/engines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
116
117
  local_deep_research/web_search_engines/engines/full_search.py,sha256=6Pi_wj9oAtDHAyLsIbWGBeS8QBv6yCJEJ87LN68Cp-k,4703
@@ -132,4 +133,4 @@ local_deep_research/web_search_engines/engines/search_engine_wikipedia.py,sha256
132
133
  local_deep_research/web_search_engines/search_engine_base.py,sha256=PLU_sAWhWKTOQWcv32GINuhLdIwB0sEQy-pp9oG9Ggo,9835
133
134
  local_deep_research/web_search_engines/search_engine_factory.py,sha256=DghAkQvLKRJYl5xb9AUjUv7ydAQ4rPi-TvzrmqdyGxE,10890
134
135
  local_deep_research/web_search_engines/search_engines_config.py,sha256=rgKo3UQhXov_4QxPcdzMqnAfJc5a6tGXtfnjIzKeHdQ,4584
135
- local_deep_research-0.3.2.dist-info/RECORD,,
136
+ local_deep_research-0.3.5.dist-info/RECORD,,