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.
- 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/defaults/default_settings.json +35 -35
- 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 +58 -18
- 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/components/settings.js +70 -47
- 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.3.dist-info → local_deep_research-0.5.0.dist-info}/METADATA +8 -2
- local_deep_research-0.5.0.dist-info/RECORD +265 -0
- local_deep_research-0.4.3.dist-info/RECORD +0 -177
- {local_deep_research-0.4.3.dist-info → local_deep_research-0.5.0.dist-info}/WHEEL +0 -0
- {local_deep_research-0.4.3.dist-info → local_deep_research-0.5.0.dist-info}/entry_points.txt +0 -0
- {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
|
-
|
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:
|
@@ -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(
|
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,
|
73
|
-
|
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(
|
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(
|
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_(
|
143
|
-
|
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] =
|
156
|
-
|
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(
|
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)
|
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(
|
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(
|
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(
|
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 =
|
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(
|
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(
|
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 [
|
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(
|
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)
|