diff --git a/web/clean_dashboard.py b/web/clean_dashboard.py index 04bbe0a..34520a7 100644 --- a/web/clean_dashboard.py +++ b/web/clean_dashboard.py @@ -1328,7 +1328,9 @@ class CleanTradingDashboard: ) def update_dqn_inference_toggle(value): if self.orchestrator: - self.orchestrator.set_model_toggle_state("dqn", inference_enabled=value) + enabled = bool(value and len(value) > 0) # Convert list to boolean + self.orchestrator.set_model_toggle_state("dqn", inference_enabled=enabled) + logger.info(f"DQN inference toggle: {enabled}") return value @self.app.callback( @@ -1338,7 +1340,9 @@ class CleanTradingDashboard: ) def update_dqn_training_toggle(value): if self.orchestrator: - self.orchestrator.set_model_toggle_state("dqn", training_enabled=value) + enabled = bool(value and len(value) > 0) # Convert list to boolean + self.orchestrator.set_model_toggle_state("dqn", training_enabled=enabled) + logger.info(f"DQN training toggle: {enabled}") return value @self.app.callback( @@ -1348,7 +1352,9 @@ class CleanTradingDashboard: ) def update_cnn_inference_toggle(value): if self.orchestrator: - self.orchestrator.set_model_toggle_state("cnn", inference_enabled=value) + enabled = bool(value and len(value) > 0) # Convert list to boolean + self.orchestrator.set_model_toggle_state("cnn", inference_enabled=enabled) + logger.info(f"CNN inference toggle: {enabled}") return value @self.app.callback( @@ -1358,7 +1364,9 @@ class CleanTradingDashboard: ) def update_cnn_training_toggle(value): if self.orchestrator: - self.orchestrator.set_model_toggle_state("cnn", training_enabled=value) + enabled = bool(value and len(value) > 0) # Convert list to boolean + self.orchestrator.set_model_toggle_state("cnn", training_enabled=enabled) + logger.info(f"CNN training toggle: {enabled}") return value @self.app.callback( @@ -1368,7 +1376,9 @@ class CleanTradingDashboard: ) def update_cob_rl_inference_toggle(value): if self.orchestrator: - self.orchestrator.set_model_toggle_state("cob_rl", inference_enabled=value) + enabled = bool(value and len(value) > 0) # Convert list to boolean + self.orchestrator.set_model_toggle_state("cob_rl", inference_enabled=enabled) + logger.info(f"COB RL inference toggle: {enabled}") return value @self.app.callback( @@ -1378,7 +1388,9 @@ class CleanTradingDashboard: ) def update_cob_rl_training_toggle(value): if self.orchestrator: - self.orchestrator.set_model_toggle_state("cob_rl", training_enabled=value) + enabled = bool(value and len(value) > 0) # Convert list to boolean + self.orchestrator.set_model_toggle_state("cob_rl", training_enabled=enabled) + logger.info(f"COB RL training toggle: {enabled}") return value @self.app.callback( @@ -1388,7 +1400,9 @@ class CleanTradingDashboard: ) def update_decision_fusion_inference_toggle(value): if self.orchestrator: - self.orchestrator.set_model_toggle_state("decision_fusion", inference_enabled=value) + enabled = bool(value and len(value) > 0) # Convert list to boolean + self.orchestrator.set_model_toggle_state("decision_fusion", inference_enabled=enabled) + logger.info(f"Decision Fusion inference toggle: {enabled}") return value @self.app.callback( @@ -1398,7 +1412,9 @@ class CleanTradingDashboard: ) def update_decision_fusion_training_toggle(value): if self.orchestrator: - self.orchestrator.set_model_toggle_state("decision_fusion", training_enabled=value) + enabled = bool(value and len(value) > 0) # Convert list to boolean + self.orchestrator.set_model_toggle_state("decision_fusion", training_enabled=enabled) + logger.info(f"Decision Fusion training toggle: {enabled}") return value """Update cold start training mode""" logger.debug(f"Cold start callback triggered with value: {switch_value}") diff --git a/web/component_manager.py b/web/component_manager.py index 6b61b3a..70c9a24 100644 --- a/web/component_manager.py +++ b/web/component_manager.py @@ -783,16 +783,29 @@ class DashboardComponentManager: html.Span(f" [{checkpoint_status}]", className=f"small {'text-success' if checkpoint_status == 'LOADED' else 'text-warning'} ms-1") ], style={"flex": "1"}), - # Activation toggle (if easy to implement) + # Inference and Training toggles html.Div([ - dcc.Checklist( - id=f"toggle-{model_name}", - options=[{"label": "", "value": "active"}], - value=["active"] if is_active else [], - className="form-check-input", - style={"transform": "scale(0.8)"} - ) - ], className="form-check form-switch") + html.Div([ + html.Label("Inf", className="text-muted small me-1", style={"font-size": "10px"}), + dcc.Checklist( + id=f"{model_name}-inference-toggle", + options=[{"label": "", "value": True}], + value=[True] if model_info.get('inference_enabled', True) else [], + className="form-check-input me-2", + style={"transform": "scale(0.7)"} + ) + ], className="d-flex align-items-center me-2"), + html.Div([ + html.Label("Trn", className="text-muted small me-1", style={"font-size": "10px"}), + dcc.Checklist( + id=f"{model_name}-training-toggle", + options=[{"label": "", "value": True}], + value=[True] if model_info.get('training_enabled', True) else [], + className="form-check-input", + style={"transform": "scale(0.7)"} + ) + ], className="d-flex align-items-center") + ], className="d-flex") ], className="d-flex align-items-center mb-1"), # Model metrics