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