local-deep-research 0.4.0__py3-none-any.whl → 0.4.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,6 +9,7 @@ from .__version__ import __version__
9
9
  from .config.llm_config import get_llm
10
10
  from .config.search_config import get_search
11
11
  from .report_generator import get_report_generator
12
+ from .web.app import main
12
13
 
13
14
 
14
15
  def get_advanced_search_system(strategy_name: str = "iterdrag"):
@@ -1 +1 @@
1
- __version__ = "0.4.0"
1
+ __version__ = "0.4.2"
@@ -79,7 +79,7 @@ def get_llm(model_name=None, temperature=None, provider=None, openai_endpoint_ur
79
79
  if get_db_setting("llm.supports_max_tokens", True):
80
80
  # Use 80% of context window to leave room for prompts
81
81
  max_tokens = min(
82
- get_db_setting("llm.max_tokens", 30000), int(context_window_size * 0.8)
82
+ int(get_db_setting("llm.max_tokens", 30000)), int(context_window_size * 0.8)
83
83
  )
84
84
  common_params["max_tokens"] = max_tokens
85
85
 
@@ -342,7 +342,7 @@
342
342
  "options": null,
343
343
  "step": 0.05,
344
344
  "type": "LLM",
345
- "ui_element": "slider",
345
+ "ui_element": "range",
346
346
  "value": 0.7,
347
347
  "visible": true
348
348
  },
@@ -94,7 +94,14 @@ def main():
94
94
  debug = get_db_setting("web.debug", True)
95
95
 
96
96
  logger.info(f"Starting web server on {host}:{port} (debug: {debug})")
97
- socketio.run(app, debug=debug, host=host, port=port, allow_unsafe_werkzeug=True)
97
+ socketio.run(
98
+ app,
99
+ debug=debug,
100
+ host=host,
101
+ port=port,
102
+ allow_unsafe_werkzeug=True,
103
+ use_reloader=False,
104
+ )
98
105
 
99
106
 
100
107
  if __name__ == "__main__":
@@ -1,8 +1,8 @@
1
1
  import hashlib
2
2
  import json
3
- import os
4
3
  import threading
5
4
  from datetime import datetime
5
+ from pathlib import Path
6
6
 
7
7
  from loguru import logger
8
8
 
@@ -15,7 +15,7 @@ from ..models.database import add_log_to_db, calculate_duration, get_db_connecti
15
15
  from .socket_service import emit_to_subscribers
16
16
 
17
17
  # Output directory for research results
18
- OUTPUT_DIR = "research_outputs"
18
+ OUTPUT_DIR = Path("research_outputs")
19
19
 
20
20
 
21
21
  def start_research_process(
@@ -68,7 +68,7 @@ def start_research_process(
68
68
  return thread
69
69
 
70
70
 
71
- def _generate_report_path(query: str) -> str:
71
+ def _generate_report_path(query: str) -> Path:
72
72
  """
73
73
  Generates a path for a new report file based on the query.
74
74
 
@@ -82,9 +82,8 @@ def _generate_report_path(query: str) -> str:
82
82
  # Generate a unique filename that does not contain
83
83
  # non-alphanumeric characters.
84
84
  query_hash = hashlib.md5(query.encode("utf-8")).hexdigest()[:10]
85
- return os.path.join(
86
- OUTPUT_DIR,
87
- f"research_report_{query_hash}_{datetime.now().isoformat()}.md",
85
+ return OUTPUT_DIR / (
86
+ f"research_report_{query_hash}_{int(datetime.now().timestamp())}.md"
88
87
  )
89
88
 
90
89
 
@@ -139,8 +138,8 @@ def run_research_process(
139
138
  )
140
139
 
141
140
  # Set up the AI Context Manager
142
- output_dir = os.path.join(OUTPUT_DIR, f"research_{research_id}")
143
- os.makedirs(output_dir, exist_ok=True)
141
+ output_dir = OUTPUT_DIR / f"research_{research_id}"
142
+ output_dir.mkdir(parents=True, exist_ok=True)
144
143
 
145
144
  # Set up progress callback
146
145
  def progress_callback(message, progress_percent, metadata):
@@ -532,9 +531,7 @@ def run_research_process(
532
531
  )
533
532
 
534
533
  # Save as markdown file
535
- if not os.path.exists(OUTPUT_DIR):
536
- os.makedirs(OUTPUT_DIR)
537
-
534
+ OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
538
535
  report_path = _generate_report_path(query)
539
536
 
540
537
  # Send progress update for writing to file
@@ -545,7 +542,7 @@ def run_research_process(
545
542
  )
546
543
 
547
544
  logger.info("Writing report to: %s", report_path)
548
- with open(report_path, "w", encoding="utf-8") as f:
545
+ with report_path.open("w", encoding="utf-8") as f:
549
546
  f.write("# Quick Research Summary\n\n")
550
547
  f.write(f"Query: {query}\n\n")
551
548
  f.write(clean_markdown)
@@ -583,7 +580,7 @@ def run_research_process(
583
580
  "completed",
584
581
  completed_at,
585
582
  duration_seconds,
586
- report_path,
583
+ str(report_path),
587
584
  json.dumps(metadata),
588
585
  research_id,
589
586
  ),
@@ -598,7 +595,7 @@ def run_research_process(
598
595
  progress_callback(
599
596
  "Research completed successfully",
600
597
  100,
601
- {"phase": "complete", "report_path": report_path},
598
+ {"phase": "complete", "report_path": str(report_path)},
602
599
  )
603
600
 
604
601
  # Clean up resources
@@ -635,12 +632,10 @@ def run_research_process(
635
632
  )
636
633
 
637
634
  # Save as markdown file
638
- if not os.path.exists(OUTPUT_DIR):
639
- os.makedirs(OUTPUT_DIR)
640
-
635
+ OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
641
636
  report_path = _generate_report_path(query)
642
637
 
643
- with open(report_path, "w", encoding="utf-8") as f:
638
+ with report_path.open("w", encoding="utf-8") as f:
644
639
  f.write(final_report["content"])
645
640
 
646
641
  # Update database
@@ -668,7 +663,7 @@ def run_research_process(
668
663
  "completed",
669
664
  completed_at,
670
665
  duration_seconds,
671
- report_path,
666
+ str(report_path),
672
667
  json.dumps(metadata),
673
668
  research_id,
674
669
  ),
@@ -679,7 +674,7 @@ def run_research_process(
679
674
  progress_callback(
680
675
  "Research completed successfully",
681
676
  100,
682
- {"phase": "complete", "report_path": report_path},
677
+ {"phase": "complete", "report_path": str(report_path)},
683
678
  )
684
679
 
685
680
  # Clean up resources
@@ -1,7 +1,7 @@
1
1
  import importlib.resources as pkg_resources
2
2
  import json
3
3
  import os
4
- from typing import Any, Dict, Optional, Union
4
+ from typing import Any, Dict, Optional, Type, Union
5
5
 
6
6
  from loguru import logger
7
7
  from sqlalchemy import func
@@ -45,6 +45,15 @@ class SettingsManager:
45
45
  Provides methods to get and set settings, with the ability to override settings in memory.
46
46
  """
47
47
 
48
+ _UI_ELEMENT_TO_SETTING_TYPE = {
49
+ "text": str,
50
+ "password": str,
51
+ "select": str,
52
+ "number": float,
53
+ "range": float,
54
+ "checkbox": bool,
55
+ }
56
+
48
57
  def __init__(self, db_session: Session):
49
58
  """
50
59
  Initialize the settings manager
@@ -59,6 +68,57 @@ class SettingsManager:
59
68
  default_settings = pkg_resources.read_text(defaults, "default_settings.json")
60
69
  self.default_settings = json.loads(default_settings)
61
70
 
71
+ def __get_typed_setting_value(
72
+ self, setting: Type[Setting], default: Any = None, check_env: bool = True
73
+ ) -> str | float | bool | None:
74
+ """
75
+ Extracts the value for a particular setting, ensuring that it has the
76
+ correct type.
77
+
78
+ Args:
79
+ setting: The setting to get the value for.
80
+ default: Default value to return if the value of the setting is
81
+ invalid.
82
+ check_env: If true, it will check the environment variable for
83
+ this setting before reading from the DB.
84
+
85
+ Returns:
86
+ The value of the setting.
87
+
88
+ """
89
+ setting_type = self._UI_ELEMENT_TO_SETTING_TYPE.get(setting.ui_element, None)
90
+ if setting_type is None:
91
+ logger.warning(
92
+ "Got unknown type {} for setting {}, returning default value.",
93
+ setting.ui_element,
94
+ setting.key,
95
+ )
96
+ return default
97
+
98
+ # Check environment variable first, then database.
99
+ if check_env:
100
+ env_value = check_env_setting(setting.key)
101
+ if env_value is not None:
102
+ try:
103
+ return setting_type(env_value)
104
+ except ValueError:
105
+ logger.warning(
106
+ "Setting {} has invalid value {}. Falling back to DB.",
107
+ setting.key,
108
+ env_value,
109
+ )
110
+
111
+ # If environment variable does not exist, read from the database.
112
+ try:
113
+ return setting_type(setting.value)
114
+ except ValueError:
115
+ logger.warning(
116
+ "Setting {} has invalid value {}. Returning default.",
117
+ setting.key,
118
+ setting.value,
119
+ )
120
+ return default
121
+
62
122
  def get_setting(self, key: str, default: Any = None, check_env: bool = True) -> Any:
63
123
  """
64
124
  Get a setting value
@@ -72,11 +132,6 @@ class SettingsManager:
72
132
  Returns:
73
133
  Setting value or default if not found
74
134
  """
75
- if check_env:
76
- env_value = check_env_setting(key)
77
- if env_value is not None:
78
- return env_value
79
-
80
135
  # If using database first approach and session available, check database
81
136
  if self.db_first and self.db_session:
82
137
  try:
@@ -87,22 +142,17 @@ class SettingsManager:
87
142
  )
88
143
  if len(settings) == 1:
89
144
  # This is a bottom-level key.
90
- value = settings[0].value
91
- return value
145
+ return self.__get_typed_setting_value(
146
+ settings[0], default, check_env
147
+ )
92
148
  elif len(settings) > 1:
93
149
  # This is a higher-level key.
94
150
  settings_map = {}
95
151
  for setting in settings:
96
152
  output_key = setting.key.removeprefix(f"{key}.")
97
- value = setting.value
98
-
99
- if check_env:
100
- # Handle possible replacements from environment variables.
101
- env_value = check_env_setting(setting.key)
102
- if env_value is not None:
103
- value = env_value
104
-
105
- settings_map[output_key] = value
153
+ settings_map[output_key] = self.__get_typed_setting_value(
154
+ setting, default, check_env
155
+ )
106
156
  return settings_map
107
157
  except SQLAlchemyError as e:
108
158
  logger.error(f"Error retrieving setting {key} from database: {e}")
@@ -149,6 +199,7 @@ class SettingsManager:
149
199
  value=value,
150
200
  type=setting_type,
151
201
  name=key.split(".")[-1].replace("_", " ").title(),
202
+ ui_element="text",
152
203
  description=f"Setting for {key}",
153
204
  )
154
205
  self.db_session.add(new_setting)
@@ -98,7 +98,7 @@ class SearXNGSearchEngine(BaseSearchEngine):
98
98
  self.language = language
99
99
  try:
100
100
  self.safe_search = SafeSearchSetting[safe_search]
101
- except ValueError:
101
+ except KeyError:
102
102
  logger.error(
103
103
  "'{}' is not a valid safe search setting. Disabling safe search",
104
104
  safe_search,
@@ -49,8 +49,6 @@ def create_search_engine(
49
49
 
50
50
  # If not found, check the database for the API key
51
51
  if not api_key:
52
- from ..utilities.db_utils import get_db_setting
53
-
54
52
  api_key = get_db_setting(f"search.engine.web.{engine_name}.api_key")
55
53
 
56
54
  # Still try to get from engine config if not found
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: local-deep-research
3
- Version: 0.4.0
3
+ Version: 0.4.2
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
@@ -1,9 +1,9 @@
1
- local_deep_research-0.4.0.dist-info/METADATA,sha256=7uDHSL-BSiWwI_X9EbHquJ0BUNbyHxyUAMLzPZYJKZs,17352
2
- local_deep_research-0.4.0.dist-info/WHEEL,sha256=tSfRZzRHthuv7vxpI4aehrdN9scLjk-dCJkPLzkHxGg,90
3
- local_deep_research-0.4.0.dist-info/entry_points.txt,sha256=GcXS501Rjh-P80S8db7hnrQ23mS_Jg27PwpVQVO77as,113
4
- local_deep_research-0.4.0.dist-info/licenses/LICENSE,sha256=Qg2CaTdu6SWnSqk1_JtgBPp_Da-LdqJDhT1Vt1MUc5s,1072
5
- local_deep_research/__init__.py,sha256=9wV3oonZMEHsE_JhyZU9P0hW2Uwv47zotGlbAB_gQiA,885
6
- local_deep_research/__version__.py,sha256=42STGor_9nKYXumfeV5tiyD_M8VdcddX7CEexmibPBk,22
1
+ local_deep_research-0.4.2.dist-info/METADATA,sha256=2YQpanXEg8odVlrIsUPgeLDW-pK8sUqQ0UD6qIrlmc4,17352
2
+ local_deep_research-0.4.2.dist-info/WHEEL,sha256=tSfRZzRHthuv7vxpI4aehrdN9scLjk-dCJkPLzkHxGg,90
3
+ local_deep_research-0.4.2.dist-info/entry_points.txt,sha256=GcXS501Rjh-P80S8db7hnrQ23mS_Jg27PwpVQVO77as,113
4
+ local_deep_research-0.4.2.dist-info/licenses/LICENSE,sha256=Qg2CaTdu6SWnSqk1_JtgBPp_Da-LdqJDhT1Vt1MUc5s,1072
5
+ local_deep_research/__init__.py,sha256=BPWOE6L1vBgBshHlyzrrp0gYo6uR3ljiNBFDRK_3aIw,911
6
+ local_deep_research/__version__.py,sha256=6hfVa12Q-nXyUEXr6SyKpqPEDJW6vlRHyPxlA27PfTs,22
7
7
  local_deep_research/advanced_search_system/__init__.py,sha256=sGusMj4eFIrhXR6QbOM16UDKB6aI-iS4IFivKWpMlh0,234
8
8
  local_deep_research/advanced_search_system/filters/__init__.py,sha256=2dXrV4skcVHI2Lb3BSL2Ajq0rnLeSw7kc1MbIynMxa4,190
9
9
  local_deep_research/advanced_search_system/filters/base_filter.py,sha256=58Ux0ppXafL8Vy2qbWioUBMqGtK1dgtSF5A68BP8M8Y,1010
@@ -34,7 +34,6 @@ local_deep_research/advanced_search_system/tools/search_tools/__init__.py,sha256
34
34
  local_deep_research/api/__init__.py,sha256=KS5QcF5MzbUDPnXEzOAztcUw-HUQs4EVCH4k0YDMgCM,307
35
35
  local_deep_research/api/benchmark_functions.py,sha256=Fnv5-qVK0mpNJN6TEbltj6jxfohXLvtlTmcSzQ08NHw,8953
36
36
  local_deep_research/api/research_functions.py,sha256=jfpr6FdmtpLP_F63WvJPDptE6xqjzGpXyk0apkwe2Ns,9746
37
- local_deep_research/app.py,sha256=U_92UX0dpVAQoaXciVNy_By_AyDEWGlXSeTwFpohALQ,155
38
37
  local_deep_research/benchmarks/README.md,sha256=H1o_Ig-pjTAK_dDki3MyoUTS1A_zClTLhuiieTe_UKk,4346
39
38
  local_deep_research/benchmarks/__init__.py,sha256=O5uQKqUWoxiAvGEzbtCvcAhVuhKgyUksUjjE0fHv1DA,1287
40
39
  local_deep_research/benchmarks/benchmark_functions.py,sha256=XAOnw1sTXP2EcZY2zB0722BqeDEVIOpwZq9CC-1IoF4,11949
@@ -73,11 +72,11 @@ local_deep_research/benchmarks/runners.py,sha256=ktdEYgoVoQtToCJSKPMB7rF2fOzimFR
73
72
  local_deep_research/benchmarks/templates.py,sha256=ooRYTbFmSQCKxHVuXAYofTDTXAQ9yDaAUtKGqRaHy2E,2276
74
73
  local_deep_research/citation_handler.py,sha256=MZVd6xl7g3xrWauFBPuVIC36z8onc-zQb8xI4dQXxsU,4307
75
74
  local_deep_research/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
- local_deep_research/config/llm_config.py,sha256=Y-56Bc05Kglh1jxTwa1xVLso7YBUGJqQHq3y_R-un34,16022
75
+ local_deep_research/config/llm_config.py,sha256=31F-nlloP_N30HYZqnJ2sCNMZXlJVB9AMwz99UctHi4,16027
77
76
  local_deep_research/config/search_config.py,sha256=-m4BkHHMvzNkIuZmximmE3T5_H-JU4UZubEc_cDpWH0,2130
78
77
  local_deep_research/defaults/.env.template,sha256=_eVCy4d_XwpGXy8n50CG3wH9xx2oqJCFKS7IbqgInDk,491
79
78
  local_deep_research/defaults/__init__.py,sha256=C_0t0uZmtrVB4rM9NM9Wx8PJU5kFcT-qOHvws5W2iOg,1352
80
- local_deep_research/defaults/default_settings.json,sha256=k5H2pRXiOb0OeCfmgFKZqS9Rh3myjtHZDbnVNdDXxnQ,124257
79
+ local_deep_research/defaults/default_settings.json,sha256=UTzWrOONlvR6UELT7remAN5qLLMLYvjnQXNMd0cH87w,124256
81
80
  local_deep_research/migrate_db.py,sha256=S1h6Bv0OJdRW4BaH7MIMrUXBRV_yqgH2T6LVOZKTQjI,4634
82
81
  local_deep_research/report_generator.py,sha256=-G3KDEbsuU3PdxDfuo5v28DIX7RE1yJCCBU2KgRbNzI,9084
83
82
  local_deep_research/search_system.py,sha256=DCBSLSUyLqPuHrgOuTlDizT_cnWRBICYKH-haMWWoDo,8412
@@ -93,7 +92,7 @@ local_deep_research/utilities/search_utilities.py,sha256=eew5w70tYTnm9J9Ov0TGCmg
93
92
  local_deep_research/utilities/setup_utils.py,sha256=0Us6doQ6xQtKzgtnN1C4L7sSgxzFKJ35FpmZdj1tCDM,213
94
93
  local_deep_research/utilities/url_utils.py,sha256=8tvLoar3Mq7xHFM_b5kp8Nf2Kdykz4C7wTejjUcg4vA,1714
95
94
  local_deep_research/web/__init__.py,sha256=CynnuRxCf9mB0AHeylhF5yVZwdj0H6bxVrZtniw3xmE,44
96
- local_deep_research/web/app.py,sha256=88Nz686YhK6Q4eFI_YvThG-AqIzPTQahdbXqPxKNI5M,3333
95
+ local_deep_research/web/app.py,sha256=oDX022oim1tOawCdqN9uAtGeccvBGxIe7xtJenRLD3Y,3408
97
96
  local_deep_research/web/app_factory.py,sha256=mBv79XlEQ-H9-oSlBJZjv3hBVjBGZZ5piI4CZCh-jBU,8131
98
97
  local_deep_research/web/database/README.md,sha256=eEDLqLIfOBRvc0TFh3J1HrtFbZceYmVgpjS3-oyZ5nI,2861
99
98
  local_deep_research/web/database/migrate_to_ldr_db.py,sha256=-ltKuhgosPhybDsJ13BuvvHEDJTN4Jx6SiO6XvW0SKA,9823
@@ -107,9 +106,9 @@ local_deep_research/web/routes/benchmark_routes.py,sha256=WqJcI394ec3pzigRGUa6Gl
107
106
  local_deep_research/web/routes/history_routes.py,sha256=6a_8nX349viuvi1zP5S7BaPPpAh133eTi1NVWO545A8,12622
108
107
  local_deep_research/web/routes/research_routes.py,sha256=RkuT6VA5BlKzfeFzp3HvoEQajnUK34fFa8tto38NPps,23658
109
108
  local_deep_research/web/routes/settings_routes.py,sha256=Yt4xVt6XcGPSEFuAkcQ4zlZ2r5dIbV3VNsWIXoGeflw,58606
110
- local_deep_research/web/services/research_service.py,sha256=qHtPM5YOKQrtOSlKP3yhnZ0AjzTFQnH0aqUjsGBrVAs,38861
109
+ local_deep_research/web/services/research_service.py,sha256=kHdonXtGDTSU2_jBlCP_deqMdydhxA_p7EabsR5kBkE,38812
111
110
  local_deep_research/web/services/resource_service.py,sha256=yKgOC6GEOmHqRoGzwf52e19UaGCCS1DbDbOIXgWGvGc,4378
112
- local_deep_research/web/services/settings_manager.py,sha256=Emo_QRnjVwi8HHT8N79io3SOUxPf_VwwwOHTTvJ1C-c,17238
111
+ local_deep_research/web/services/settings_manager.py,sha256=xqEouK4DlzqYO83Ia3dve1JRXLAVB8MSSYTasyRD7Ag,18976
113
112
  local_deep_research/web/services/settings_service.py,sha256=-ZG78JR14GuhsaXIF4OQOqfRfrw2QIqYEKwTOFhsuFo,3497
114
113
  local_deep_research/web/services/socket_service.py,sha256=jZGXk6kesBOf4bAdLiT3V4Ofod12pGKTsvxr3ml8ydY,7272
115
114
  local_deep_research/web/static/css/custom_dropdown.css,sha256=-pCx6oazWVgwqFAGq_eZ8OrTKMVQlgkKYCM6w-bACLs,7949
@@ -167,12 +166,12 @@ local_deep_research/web_search_engines/engines/search_engine_guardian.py,sha256=
167
166
  local_deep_research/web_search_engines/engines/search_engine_local.py,sha256=RJEXb6wTPgTfQoOyuLYLZwqx0JU7yukehHiu4C0Zel4,41221
168
167
  local_deep_research/web_search_engines/engines/search_engine_local_all.py,sha256=8hAYhacU15Vi13pjo0LRVt2tI5SqcONDwYwvdtg1HyY,5620
169
168
  local_deep_research/web_search_engines/engines/search_engine_pubmed.py,sha256=O99qfbSz7RHqinAP_C0iod-ZaEGE5tyBbh1DJi2-VhQ,38495
170
- local_deep_research/web_search_engines/engines/search_engine_searxng.py,sha256=amEK2ljX-6QtJPBUB9fS0bE48Q8SmYInO2LaSq_x-Rw,17867
169
+ local_deep_research/web_search_engines/engines/search_engine_searxng.py,sha256=gS-GjjLzjZvlaQB-E0u-IADzJmLRGZaLmNQ7DpdqMw4,17865
171
170
  local_deep_research/web_search_engines/engines/search_engine_semantic_scholar.py,sha256=jYs_TRM0izMfldsZ8NkCQsP-o6vCPXUjyxt0nIsxOVI,22799
172
171
  local_deep_research/web_search_engines/engines/search_engine_serpapi.py,sha256=_afKJVFV0xpdrO3vL71aORMIGmbe0y8o7Ly0_xXryDQ,8920
173
172
  local_deep_research/web_search_engines/engines/search_engine_wayback.py,sha256=rfRs7WJxa-H1DXSyduFHBMfpFwWEVRXLd8s_78iU8gU,17894
174
173
  local_deep_research/web_search_engines/engines/search_engine_wikipedia.py,sha256=UxYBSGD-XZGQantq_AdgtBA8FCKV0C6mEr6GS_vleQQ,10092
175
174
  local_deep_research/web_search_engines/search_engine_base.py,sha256=TFmkIGgzIkXFsk9jhGn2PYyxveOWzKQLrhpZy5qaggE,10803
176
- local_deep_research/web_search_engines/search_engine_factory.py,sha256=QjnU6R3Q0irTXG7StoeOwhbhd5B4nRKO65hkuodpWWU,11926
175
+ local_deep_research/web_search_engines/search_engine_factory.py,sha256=73lwSenv7tK7eGIBOPh13hPdn0oZ9FC0EMjZx5YRPg4,11865
177
176
  local_deep_research/web_search_engines/search_engines_config.py,sha256=bRly8zsoXvlQIovbVChnkhj4AsGJMzFlEiArrmsblrE,5375
178
- local_deep_research-0.4.0.dist-info/RECORD,,
177
+ local_deep_research-0.4.2.dist-info/RECORD,,
@@ -1,8 +0,0 @@
1
- """
2
- Main entry point for the Local Deep Research application.
3
- """
4
-
5
- from src.local_deep_research.web.app import main
6
-
7
- if __name__ == "__main__":
8
- main()