local-deep-research 0.4.3__py3-none-any.whl → 0.5.0__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.
Files changed (222) hide show
  1. local_deep_research/__init__.py +7 -0
  2. local_deep_research/__version__.py +1 -1
  3. local_deep_research/advanced_search_system/answer_decoding/__init__.py +5 -0
  4. local_deep_research/advanced_search_system/answer_decoding/browsecomp_answer_decoder.py +421 -0
  5. local_deep_research/advanced_search_system/candidate_exploration/README.md +219 -0
  6. local_deep_research/advanced_search_system/candidate_exploration/__init__.py +25 -0
  7. local_deep_research/advanced_search_system/candidate_exploration/adaptive_explorer.py +329 -0
  8. local_deep_research/advanced_search_system/candidate_exploration/base_explorer.py +341 -0
  9. local_deep_research/advanced_search_system/candidate_exploration/constraint_guided_explorer.py +436 -0
  10. local_deep_research/advanced_search_system/candidate_exploration/diversity_explorer.py +457 -0
  11. local_deep_research/advanced_search_system/candidate_exploration/parallel_explorer.py +250 -0
  12. local_deep_research/advanced_search_system/candidate_exploration/progressive_explorer.py +255 -0
  13. local_deep_research/advanced_search_system/candidates/__init__.py +5 -0
  14. local_deep_research/advanced_search_system/candidates/base_candidate.py +59 -0
  15. local_deep_research/advanced_search_system/constraint_checking/README.md +150 -0
  16. local_deep_research/advanced_search_system/constraint_checking/__init__.py +35 -0
  17. local_deep_research/advanced_search_system/constraint_checking/base_constraint_checker.py +122 -0
  18. local_deep_research/advanced_search_system/constraint_checking/constraint_checker.py +223 -0
  19. local_deep_research/advanced_search_system/constraint_checking/constraint_satisfaction_tracker.py +387 -0
  20. local_deep_research/advanced_search_system/constraint_checking/dual_confidence_checker.py +424 -0
  21. local_deep_research/advanced_search_system/constraint_checking/evidence_analyzer.py +174 -0
  22. local_deep_research/advanced_search_system/constraint_checking/intelligent_constraint_relaxer.py +503 -0
  23. local_deep_research/advanced_search_system/constraint_checking/rejection_engine.py +143 -0
  24. local_deep_research/advanced_search_system/constraint_checking/strict_checker.py +259 -0
  25. local_deep_research/advanced_search_system/constraint_checking/threshold_checker.py +213 -0
  26. local_deep_research/advanced_search_system/constraints/__init__.py +6 -0
  27. local_deep_research/advanced_search_system/constraints/base_constraint.py +58 -0
  28. local_deep_research/advanced_search_system/constraints/constraint_analyzer.py +143 -0
  29. local_deep_research/advanced_search_system/evidence/__init__.py +12 -0
  30. local_deep_research/advanced_search_system/evidence/base_evidence.py +57 -0
  31. local_deep_research/advanced_search_system/evidence/evaluator.py +159 -0
  32. local_deep_research/advanced_search_system/evidence/requirements.py +122 -0
  33. local_deep_research/advanced_search_system/filters/base_filter.py +3 -1
  34. local_deep_research/advanced_search_system/filters/cross_engine_filter.py +8 -2
  35. local_deep_research/advanced_search_system/filters/journal_reputation_filter.py +43 -29
  36. local_deep_research/advanced_search_system/findings/repository.py +54 -17
  37. local_deep_research/advanced_search_system/knowledge/standard_knowledge.py +3 -1
  38. local_deep_research/advanced_search_system/query_generation/adaptive_query_generator.py +405 -0
  39. local_deep_research/advanced_search_system/questions/__init__.py +16 -0
  40. local_deep_research/advanced_search_system/questions/atomic_fact_question.py +171 -0
  41. local_deep_research/advanced_search_system/questions/browsecomp_question.py +287 -0
  42. local_deep_research/advanced_search_system/questions/decomposition_question.py +13 -4
  43. local_deep_research/advanced_search_system/questions/entity_aware_question.py +184 -0
  44. local_deep_research/advanced_search_system/questions/standard_question.py +9 -3
  45. local_deep_research/advanced_search_system/search_optimization/cross_constraint_manager.py +624 -0
  46. local_deep_research/advanced_search_system/source_management/diversity_manager.py +613 -0
  47. local_deep_research/advanced_search_system/strategies/__init__.py +42 -0
  48. local_deep_research/advanced_search_system/strategies/adaptive_decomposition_strategy.py +564 -0
  49. local_deep_research/advanced_search_system/strategies/base_strategy.py +4 -4
  50. local_deep_research/advanced_search_system/strategies/browsecomp_entity_strategy.py +1031 -0
  51. local_deep_research/advanced_search_system/strategies/browsecomp_optimized_strategy.py +778 -0
  52. local_deep_research/advanced_search_system/strategies/concurrent_dual_confidence_strategy.py +446 -0
  53. local_deep_research/advanced_search_system/strategies/constrained_search_strategy.py +1348 -0
  54. local_deep_research/advanced_search_system/strategies/constraint_parallel_strategy.py +522 -0
  55. local_deep_research/advanced_search_system/strategies/direct_search_strategy.py +217 -0
  56. local_deep_research/advanced_search_system/strategies/dual_confidence_strategy.py +320 -0
  57. local_deep_research/advanced_search_system/strategies/dual_confidence_with_rejection.py +219 -0
  58. local_deep_research/advanced_search_system/strategies/early_stop_constrained_strategy.py +369 -0
  59. local_deep_research/advanced_search_system/strategies/entity_aware_source_strategy.py +140 -0
  60. local_deep_research/advanced_search_system/strategies/evidence_based_strategy.py +1248 -0
  61. local_deep_research/advanced_search_system/strategies/evidence_based_strategy_v2.py +1337 -0
  62. local_deep_research/advanced_search_system/strategies/focused_iteration_strategy.py +537 -0
  63. local_deep_research/advanced_search_system/strategies/improved_evidence_based_strategy.py +782 -0
  64. local_deep_research/advanced_search_system/strategies/iterative_reasoning_strategy.py +760 -0
  65. local_deep_research/advanced_search_system/strategies/iterdrag_strategy.py +55 -21
  66. local_deep_research/advanced_search_system/strategies/llm_driven_modular_strategy.py +865 -0
  67. local_deep_research/advanced_search_system/strategies/modular_strategy.py +1142 -0
  68. local_deep_research/advanced_search_system/strategies/parallel_constrained_strategy.py +506 -0
  69. local_deep_research/advanced_search_system/strategies/parallel_search_strategy.py +34 -16
  70. local_deep_research/advanced_search_system/strategies/rapid_search_strategy.py +29 -9
  71. local_deep_research/advanced_search_system/strategies/recursive_decomposition_strategy.py +492 -0
  72. local_deep_research/advanced_search_system/strategies/smart_decomposition_strategy.py +284 -0
  73. local_deep_research/advanced_search_system/strategies/smart_query_strategy.py +515 -0
  74. local_deep_research/advanced_search_system/strategies/source_based_strategy.py +48 -24
  75. local_deep_research/advanced_search_system/strategies/standard_strategy.py +34 -14
  76. local_deep_research/advanced_search_system/tools/base_tool.py +7 -2
  77. local_deep_research/api/benchmark_functions.py +6 -2
  78. local_deep_research/api/research_functions.py +10 -4
  79. local_deep_research/benchmarks/__init__.py +9 -7
  80. local_deep_research/benchmarks/benchmark_functions.py +6 -2
  81. local_deep_research/benchmarks/cli/benchmark_commands.py +27 -10
  82. local_deep_research/benchmarks/cli.py +38 -13
  83. local_deep_research/benchmarks/comparison/__init__.py +4 -2
  84. local_deep_research/benchmarks/comparison/evaluator.py +316 -239
  85. local_deep_research/benchmarks/datasets/__init__.py +1 -1
  86. local_deep_research/benchmarks/datasets/base.py +91 -72
  87. local_deep_research/benchmarks/datasets/browsecomp.py +54 -33
  88. local_deep_research/benchmarks/datasets/custom_dataset_template.py +19 -19
  89. local_deep_research/benchmarks/datasets/simpleqa.py +14 -14
  90. local_deep_research/benchmarks/datasets/utils.py +48 -29
  91. local_deep_research/benchmarks/datasets.py +4 -11
  92. local_deep_research/benchmarks/efficiency/__init__.py +8 -4
  93. local_deep_research/benchmarks/efficiency/resource_monitor.py +223 -171
  94. local_deep_research/benchmarks/efficiency/speed_profiler.py +62 -48
  95. local_deep_research/benchmarks/evaluators/browsecomp.py +3 -1
  96. local_deep_research/benchmarks/evaluators/composite.py +6 -2
  97. local_deep_research/benchmarks/evaluators/simpleqa.py +36 -13
  98. local_deep_research/benchmarks/graders.py +32 -10
  99. local_deep_research/benchmarks/metrics/README.md +1 -1
  100. local_deep_research/benchmarks/metrics/calculation.py +25 -10
  101. local_deep_research/benchmarks/metrics/reporting.py +7 -3
  102. local_deep_research/benchmarks/metrics/visualization.py +42 -23
  103. local_deep_research/benchmarks/metrics.py +1 -1
  104. local_deep_research/benchmarks/optimization/__init__.py +3 -1
  105. local_deep_research/benchmarks/optimization/api.py +7 -1
  106. local_deep_research/benchmarks/optimization/optuna_optimizer.py +75 -26
  107. local_deep_research/benchmarks/runners.py +48 -15
  108. local_deep_research/citation_handler.py +65 -92
  109. local_deep_research/citation_handlers/__init__.py +15 -0
  110. local_deep_research/citation_handlers/base_citation_handler.py +70 -0
  111. local_deep_research/citation_handlers/forced_answer_citation_handler.py +179 -0
  112. local_deep_research/citation_handlers/precision_extraction_handler.py +550 -0
  113. local_deep_research/citation_handlers/standard_citation_handler.py +80 -0
  114. local_deep_research/config/llm_config.py +271 -169
  115. local_deep_research/config/search_config.py +14 -5
  116. local_deep_research/defaults/__init__.py +0 -1
  117. local_deep_research/defaults/default_settings.json +35 -35
  118. local_deep_research/metrics/__init__.py +13 -0
  119. local_deep_research/metrics/database.py +58 -0
  120. local_deep_research/metrics/db_models.py +115 -0
  121. local_deep_research/metrics/migrate_add_provider_to_token_usage.py +148 -0
  122. local_deep_research/metrics/migrate_call_stack_tracking.py +105 -0
  123. local_deep_research/metrics/migrate_enhanced_tracking.py +75 -0
  124. local_deep_research/metrics/migrate_research_ratings.py +31 -0
  125. local_deep_research/metrics/models.py +61 -0
  126. local_deep_research/metrics/pricing/__init__.py +12 -0
  127. local_deep_research/metrics/pricing/cost_calculator.py +237 -0
  128. local_deep_research/metrics/pricing/pricing_cache.py +143 -0
  129. local_deep_research/metrics/pricing/pricing_fetcher.py +240 -0
  130. local_deep_research/metrics/query_utils.py +51 -0
  131. local_deep_research/metrics/search_tracker.py +380 -0
  132. local_deep_research/metrics/token_counter.py +1078 -0
  133. local_deep_research/migrate_db.py +3 -1
  134. local_deep_research/report_generator.py +22 -8
  135. local_deep_research/search_system.py +390 -9
  136. local_deep_research/test_migration.py +15 -5
  137. local_deep_research/utilities/db_utils.py +7 -4
  138. local_deep_research/utilities/es_utils.py +115 -104
  139. local_deep_research/utilities/llm_utils.py +15 -5
  140. local_deep_research/utilities/log_utils.py +151 -0
  141. local_deep_research/utilities/search_cache.py +387 -0
  142. local_deep_research/utilities/search_utilities.py +14 -6
  143. local_deep_research/utilities/threading_utils.py +92 -0
  144. local_deep_research/utilities/url_utils.py +6 -0
  145. local_deep_research/web/api.py +347 -0
  146. local_deep_research/web/app.py +13 -17
  147. local_deep_research/web/app_factory.py +71 -66
  148. local_deep_research/web/database/migrate_to_ldr_db.py +12 -4
  149. local_deep_research/web/database/migrations.py +5 -3
  150. local_deep_research/web/database/models.py +51 -2
  151. local_deep_research/web/database/schema_upgrade.py +49 -29
  152. local_deep_research/web/models/database.py +51 -61
  153. local_deep_research/web/routes/api_routes.py +56 -22
  154. local_deep_research/web/routes/benchmark_routes.py +4 -1
  155. local_deep_research/web/routes/globals.py +22 -0
  156. local_deep_research/web/routes/history_routes.py +71 -46
  157. local_deep_research/web/routes/metrics_routes.py +1155 -0
  158. local_deep_research/web/routes/research_routes.py +227 -41
  159. local_deep_research/web/routes/settings_routes.py +156 -55
  160. local_deep_research/web/services/research_service.py +310 -103
  161. local_deep_research/web/services/resource_service.py +36 -11
  162. local_deep_research/web/services/settings_manager.py +58 -18
  163. local_deep_research/web/services/settings_service.py +12 -4
  164. local_deep_research/web/services/socket_service.py +295 -188
  165. local_deep_research/web/static/css/custom_dropdown.css +180 -0
  166. local_deep_research/web/static/css/styles.css +39 -1
  167. local_deep_research/web/static/js/components/detail.js +633 -267
  168. local_deep_research/web/static/js/components/details.js +751 -0
  169. local_deep_research/web/static/js/components/fallback/formatting.js +11 -11
  170. local_deep_research/web/static/js/components/fallback/ui.js +23 -23
  171. local_deep_research/web/static/js/components/history.js +76 -76
  172. local_deep_research/web/static/js/components/logpanel.js +61 -13
  173. local_deep_research/web/static/js/components/progress.js +13 -2
  174. local_deep_research/web/static/js/components/research.js +99 -12
  175. local_deep_research/web/static/js/components/results.js +239 -106
  176. local_deep_research/web/static/js/components/settings.js +70 -47
  177. local_deep_research/web/static/js/main.js +40 -40
  178. local_deep_research/web/static/js/services/audio.js +1 -1
  179. local_deep_research/web/static/js/services/formatting.js +11 -11
  180. local_deep_research/web/static/js/services/keyboard.js +157 -0
  181. local_deep_research/web/static/js/services/pdf.js +80 -80
  182. local_deep_research/web/static/sounds/README.md +1 -1
  183. local_deep_research/web/templates/base.html +1 -0
  184. local_deep_research/web/templates/components/log_panel.html +7 -1
  185. local_deep_research/web/templates/components/mobile_nav.html +1 -1
  186. local_deep_research/web/templates/components/sidebar.html +3 -0
  187. local_deep_research/web/templates/pages/cost_analytics.html +1245 -0
  188. local_deep_research/web/templates/pages/details.html +325 -24
  189. local_deep_research/web/templates/pages/history.html +1 -1
  190. local_deep_research/web/templates/pages/metrics.html +1929 -0
  191. local_deep_research/web/templates/pages/progress.html +2 -2
  192. local_deep_research/web/templates/pages/research.html +53 -17
  193. local_deep_research/web/templates/pages/results.html +12 -1
  194. local_deep_research/web/templates/pages/star_reviews.html +803 -0
  195. local_deep_research/web/utils/formatters.py +9 -3
  196. local_deep_research/web_search_engines/default_search_engines.py +5 -3
  197. local_deep_research/web_search_engines/engines/full_search.py +8 -2
  198. local_deep_research/web_search_engines/engines/meta_search_engine.py +59 -20
  199. local_deep_research/web_search_engines/engines/search_engine_arxiv.py +19 -6
  200. local_deep_research/web_search_engines/engines/search_engine_brave.py +6 -2
  201. local_deep_research/web_search_engines/engines/search_engine_ddg.py +3 -1
  202. local_deep_research/web_search_engines/engines/search_engine_elasticsearch.py +81 -58
  203. local_deep_research/web_search_engines/engines/search_engine_github.py +46 -15
  204. local_deep_research/web_search_engines/engines/search_engine_google_pse.py +16 -6
  205. local_deep_research/web_search_engines/engines/search_engine_guardian.py +39 -15
  206. local_deep_research/web_search_engines/engines/search_engine_local.py +58 -25
  207. local_deep_research/web_search_engines/engines/search_engine_local_all.py +15 -5
  208. local_deep_research/web_search_engines/engines/search_engine_pubmed.py +63 -21
  209. local_deep_research/web_search_engines/engines/search_engine_searxng.py +37 -11
  210. local_deep_research/web_search_engines/engines/search_engine_semantic_scholar.py +27 -9
  211. local_deep_research/web_search_engines/engines/search_engine_serpapi.py +12 -4
  212. local_deep_research/web_search_engines/engines/search_engine_wayback.py +31 -10
  213. local_deep_research/web_search_engines/engines/search_engine_wikipedia.py +12 -3
  214. local_deep_research/web_search_engines/search_engine_base.py +83 -35
  215. local_deep_research/web_search_engines/search_engine_factory.py +25 -8
  216. local_deep_research/web_search_engines/search_engines_config.py +9 -3
  217. {local_deep_research-0.4.3.dist-info → local_deep_research-0.5.0.dist-info}/METADATA +8 -2
  218. local_deep_research-0.5.0.dist-info/RECORD +265 -0
  219. local_deep_research-0.4.3.dist-info/RECORD +0 -177
  220. {local_deep_research-0.4.3.dist-info → local_deep_research-0.5.0.dist-info}/WHEEL +0 -0
  221. {local_deep_research-0.4.3.dist-info → local_deep_research-0.5.0.dist-info}/entry_points.txt +0 -0
  222. {local_deep_research-0.4.3.dist-info → local_deep_research-0.5.0.dist-info}/licenses/LICENSE +0 -0
@@ -30,9 +30,15 @@ def get_resources_for_research(research_id):
30
30
 
31
31
  resources = []
32
32
  for row in cursor.fetchall():
33
- id, research_id, title, url, content_preview, source_type, metadata_str = (
34
- row
35
- )
33
+ (
34
+ id,
35
+ research_id,
36
+ title,
37
+ url,
38
+ content_preview,
39
+ source_type,
40
+ metadata_str,
41
+ ) = row
36
42
 
37
43
  # Parse metadata if available
38
44
  metadata = {}
@@ -40,7 +46,9 @@ def get_resources_for_research(research_id):
40
46
  try:
41
47
  metadata = json.loads(metadata_str)
42
48
  except json.JSONDecodeError:
43
- logger.warning(f"Invalid JSON in metadata for resource {id}")
49
+ logger.warning(
50
+ f"Invalid JSON in metadata for resource {id}"
51
+ )
44
52
 
45
53
  resources.append(
46
54
  {
@@ -58,12 +66,19 @@ def get_resources_for_research(research_id):
58
66
  return resources
59
67
 
60
68
  except Exception as e:
61
- logger.error(f"Error retrieving resources for research {research_id}: {str(e)}")
69
+ logger.error(
70
+ f"Error retrieving resources for research {research_id}: {str(e)}"
71
+ )
62
72
  raise
63
73
 
64
74
 
65
75
  def add_resource(
66
- research_id, title, url, content_preview=None, source_type="web", metadata=None
76
+ research_id,
77
+ title,
78
+ url,
79
+ content_preview=None,
80
+ source_type="web",
81
+ metadata=None,
67
82
  ):
68
83
  """
69
84
  Add a new resource to the research_resources table
@@ -104,11 +119,15 @@ def add_resource(
104
119
  conn.commit()
105
120
  conn.close()
106
121
 
107
- logger.info(f"Added resource {resource_id} for research {research_id}: {title}")
122
+ logger.info(
123
+ f"Added resource {resource_id} for research {research_id}: {title}"
124
+ )
108
125
  return resource_id
109
126
 
110
127
  except Exception as e:
111
- logger.error(f"Error adding resource for research {research_id}: {str(e)}")
128
+ logger.error(
129
+ f"Error adding resource for research {research_id}: {str(e)}"
130
+ )
112
131
  raise
113
132
 
114
133
 
@@ -127,7 +146,9 @@ def delete_resource(resource_id):
127
146
  cursor = conn.cursor()
128
147
 
129
148
  # First check if the resource exists
130
- cursor.execute("SELECT id FROM research_resources WHERE id = ?", (resource_id,))
149
+ cursor.execute(
150
+ "SELECT id FROM research_resources WHERE id = ?", (resource_id,)
151
+ )
131
152
  result = cursor.fetchone()
132
153
 
133
154
  if not result:
@@ -135,13 +156,17 @@ def delete_resource(resource_id):
135
156
  return False
136
157
 
137
158
  # Delete the resource
138
- cursor.execute("DELETE FROM research_resources WHERE id = ?", (resource_id,))
159
+ cursor.execute(
160
+ "DELETE FROM research_resources WHERE id = ?", (resource_id,)
161
+ )
139
162
 
140
163
  rows_affected = cursor.rowcount
141
164
  conn.commit()
142
165
  conn.close()
143
166
 
144
- logger.info(f"Deleted resource {resource_id}, {rows_affected} rows affected")
167
+ logger.info(
168
+ f"Deleted resource {resource_id}, {rows_affected} rows affected"
169
+ )
145
170
  return rows_affected > 0
146
171
 
147
172
  except Exception as e:
@@ -47,6 +47,8 @@ class SettingsManager:
47
47
 
48
48
  _UI_ELEMENT_TO_SETTING_TYPE = {
49
49
  "text": str,
50
+ # SQLAlchemy should already handle JSON parsing.
51
+ "json": lambda x: x,
50
52
  "password": str,
51
53
  "select": str,
52
54
  "number": float,
@@ -65,12 +67,17 @@ class SettingsManager:
65
67
  self.db_first = True # Always prioritize DB settings
66
68
 
67
69
  # Load default settings.
68
- default_settings = pkg_resources.read_text(defaults, "default_settings.json")
70
+ default_settings = pkg_resources.read_text(
71
+ defaults, "default_settings.json"
72
+ )
69
73
  self.default_settings = json.loads(default_settings)
70
74
 
71
75
  def __get_typed_setting_value(
72
- self, setting: Type[Setting], default: Any = None, check_env: bool = True
73
- ) -> str | float | bool | None:
76
+ self,
77
+ setting: Type[Setting],
78
+ default: Any = None,
79
+ check_env: bool = True,
80
+ ) -> Any:
74
81
  """
75
82
  Extracts the value for a particular setting, ensuring that it has the
76
83
  correct type.
@@ -86,7 +93,9 @@ class SettingsManager:
86
93
  The value of the setting.
87
94
 
88
95
  """
89
- setting_type = self._UI_ELEMENT_TO_SETTING_TYPE.get(setting.ui_element, None)
96
+ setting_type = self._UI_ELEMENT_TO_SETTING_TYPE.get(
97
+ setting.ui_element, None
98
+ )
90
99
  if setting_type is None:
91
100
  logger.warning(
92
101
  "Got unknown type {} for setting {}, returning default value.",
@@ -119,7 +128,9 @@ class SettingsManager:
119
128
  )
120
129
  return default
121
130
 
122
- def get_setting(self, key: str, default: Any = None, check_env: bool = True) -> Any:
131
+ def get_setting(
132
+ self, key: str, default: Any = None, check_env: bool = True
133
+ ) -> Any:
123
134
  """
124
135
  Get a setting value
125
136
 
@@ -139,8 +150,12 @@ class SettingsManager:
139
150
  self.db_session.query(Setting)
140
151
  # This will find exact matches and any subkeys.
141
152
  .filter(
142
- or_(Setting.key == key, Setting.key.startswith(f"{key}."))
143
- ).all()
153
+ or_(
154
+ Setting.key == key,
155
+ Setting.key.startswith(f"{key}."),
156
+ )
157
+ )
158
+ .all()
144
159
  )
145
160
  if len(settings) == 1:
146
161
  # This is a bottom-level key.
@@ -152,12 +167,16 @@ class SettingsManager:
152
167
  settings_map = {}
153
168
  for setting in settings:
154
169
  output_key = setting.key.removeprefix(f"{key}.")
155
- settings_map[output_key] = self.__get_typed_setting_value(
156
- setting, default, check_env
170
+ settings_map[output_key] = (
171
+ self.__get_typed_setting_value(
172
+ setting, default, check_env
173
+ )
157
174
  )
158
175
  return settings_map
159
176
  except SQLAlchemyError as e:
160
- logger.error(f"Error retrieving setting {key} from database: {e}")
177
+ logger.error(
178
+ f"Error retrieving setting {key} from database: {e}"
179
+ )
161
180
 
162
181
  # Return default if not found
163
182
  return default
@@ -178,7 +197,9 @@ class SettingsManager:
178
197
  if self.db_session:
179
198
  try:
180
199
  setting = (
181
- self.db_session.query(Setting).filter(Setting.key == key).first()
200
+ self.db_session.query(Setting)
201
+ .filter(Setting.key == key)
202
+ .first()
182
203
  )
183
204
  if setting:
184
205
  setting.value = value
@@ -255,7 +276,9 @@ class SettingsManager:
255
276
  # variable is set.
256
277
  result[setting.key]["editable"] = False
257
278
  except SQLAlchemyError as e:
258
- logger.error(f"Error retrieving all settings from database: {e}")
279
+ logger.error(
280
+ f"Error retrieving all settings from database: {e}"
281
+ )
259
282
 
260
283
  return result
261
284
 
@@ -346,7 +369,9 @@ class SettingsManager:
346
369
  return db_setting
347
370
 
348
371
  except SQLAlchemyError as e:
349
- logger.error(f"Error creating/updating setting {setting_obj.key}: {e}")
372
+ logger.error(
373
+ f"Error creating/updating setting {setting_obj.key}: {e}"
374
+ )
350
375
  self.db_session.rollback()
351
376
  return None
352
377
 
@@ -362,12 +387,18 @@ class SettingsManager:
362
387
  True if successful, False otherwise
363
388
  """
364
389
  if not self.db_session:
365
- logger.warning("No database session available, cannot delete setting")
390
+ logger.warning(
391
+ "No database session available, cannot delete setting"
392
+ )
366
393
  return False
367
394
 
368
395
  try:
369
396
  # Remove from database
370
- result = self.db_session.query(Setting).filter(Setting.key == key).delete()
397
+ result = (
398
+ self.db_session.query(Setting)
399
+ .filter(Setting.key == key)
400
+ .delete()
401
+ )
371
402
 
372
403
  if commit:
373
404
  self.db_session.commit()
@@ -378,7 +409,9 @@ class SettingsManager:
378
409
  self.db_session.rollback()
379
410
  return False
380
411
 
381
- def load_from_defaults_file(self, commit: bool = True, **kwargs: Any) -> None:
412
+ def load_from_defaults_file(
413
+ self, commit: bool = True, **kwargs: Any
414
+ ) -> None:
382
415
  """
383
416
  Import settings from the defaults settings file.
384
417
 
@@ -426,7 +459,9 @@ class SettingsManager:
426
459
  self.db_session.commit()
427
460
 
428
461
  @classmethod
429
- def get_instance(cls, db_session: Optional[Session] = None) -> "SettingsManager":
462
+ def get_instance(
463
+ cls, db_session: Optional[Session] = None
464
+ ) -> "SettingsManager":
430
465
  """
431
466
  Get a singleton instance of the settings manager
432
467
 
@@ -501,7 +536,12 @@ class SettingsManager:
501
536
  elif key.startswith("llm."):
502
537
  if any(
503
538
  param in key
504
- for param in ["temperature", "max_tokens", "n_batch", "n_gpu_layers"]
539
+ for param in [
540
+ "temperature",
541
+ "max_tokens",
542
+ "n_batch",
543
+ "n_gpu_layers",
544
+ ]
505
545
  ):
506
546
  category = "llm_parameters"
507
547
  else:
@@ -35,7 +35,9 @@ def get_setting(key: str, default: Any = None, db_session=None) -> Any:
35
35
  return manager.get_setting(key, default)
36
36
 
37
37
 
38
- def set_setting(key: str, value: Any, commit: bool = True, db_session=None) -> bool:
38
+ def set_setting(
39
+ key: str, value: Any, commit: bool = True, db_session=None
40
+ ) -> bool:
39
41
  """
40
42
  Set a setting value
41
43
 
@@ -67,7 +69,9 @@ def get_all_settings(db_session=None) -> Dict[str, Any]:
67
69
 
68
70
 
69
71
  def create_or_update_setting(
70
- setting: Union[Dict[str, Any], Setting], commit: bool = True, db_session=None
72
+ setting: Union[Dict[str, Any], Setting],
73
+ commit: bool = True,
74
+ db_session=None,
71
75
  ) -> Optional[Setting]:
72
76
  """
73
77
  Create or update a setting
@@ -116,7 +120,9 @@ def bulk_update_settings(
116
120
  return success
117
121
 
118
122
 
119
- def validate_setting(setting: Setting, value: Any) -> tuple[bool, Optional[str]]:
123
+ def validate_setting(
124
+ setting: Setting, value: Any
125
+ ) -> tuple[bool, Optional[str]]:
120
126
  """
121
127
  Validate a setting value based on its type and constraints
122
128
 
@@ -127,6 +133,8 @@ def validate_setting(setting: Setting, value: Any) -> tuple[bool, Optional[str]]
127
133
  Returns:
128
134
  tuple[bool, Optional[str]]: (is_valid, error_message)
129
135
  """
130
- from ..routes.settings_routes import validate_setting as routes_validate_setting
136
+ from ..routes.settings_routes import (
137
+ validate_setting as routes_validate_setting,
138
+ )
131
139
 
132
140
  return routes_validate_setting(setting, value)