from __future__ import annotations from pathlib import Path from typing import Any, Dict import os import yaml import streamlit as st BASE_DIR = Path(__file__).resolve().parent.parent CONFIG_PATH = BASE_DIR / "config.yaml" def _load_config() -> Dict[str, Any]: if not CONFIG_PATH.exists(): return {} with CONFIG_PATH.open("r", encoding="utf-8") as f: cfg = yaml.safe_load(f) or {} return cfg def _save_config(cfg: Dict[str, Any]) -> None: """Guarda el diccionario cfg en config.yaml preservando estructura básica.""" with CONFIG_PATH.open("w", encoding="utf-8") as f: yaml.safe_dump(cfg, f, allow_unicode=True, sort_keys=False) def render_machine_room_page() -> None: st.header("Sala de màquines") cfg = _load_config() app_cfg = cfg.get("app", {}) or {} media_cfg = cfg.get("media", {}) or {} versions_cfg = cfg.get("versions", {}) or {} refinement_cfg = cfg.get("refinement", {}) or {} automation_cfg = cfg.get("automation", {}) or {} validation_cfg = cfg.get("validation", {}) or {} compliance_cfg = cfg.get("compliance", {}) or {} with st.form("machine_room_form"): # 1) Mida del vídeo st.subheader("Mida del vídeo") col1, col2 = st.columns(2) with col1: max_size_mb = st.number_input( "Mida màxima (MB)", min_value=1, max_value=10_000, value=int(media_cfg.get("max_size_mb", 20) or 20), ) with col2: max_duration_s = st.number_input( "Durada màxima (s)", min_value=1, max_value=60 * 60, value=int(media_cfg.get("max_duration_s", 30) or 30), ) st.markdown("---") # 2) Modalitat / app st.subheader("Modalitat") data_origin = app_cfg.get("data_origin", "external") or "external" origin_label = "persistent" if data_origin == "external" else "temporal" origin = st.selectbox( "Origen de dades", options=["persistent", "temporal"], index=["persistent", "temporal"].index(origin_label), help="'persistent' equival a 'external'; 'temporal' equival a 'internal'.", ) manual_validation_enabled = bool(app_cfg.get("manual_validation_enabled", False)) manual_validation_enabled = st.checkbox( "Incloure validació manual", value=manual_validation_enabled, ) st.markdown("---") # 3) Versions d'audiodescripció st.subheader("Versions d'audiodescripció") salamandra_enabled = bool(versions_cfg.get("Salamandra_enabled", True)) moe_enabled = bool(versions_cfg.get("MoE_enabled", True)) salamandra_enabled = st.checkbox("Salamandra", value=salamandra_enabled) moe_enabled = st.checkbox("Mixture of Experts (MoE)", value=moe_enabled) st.markdown("---") # 4) Refinament final st.subheader("Refinament final") reflection_enabled = bool(refinement_cfg.get("reflection_enabled", True)) reflection_ma_enabled = bool(refinement_cfg.get("reflection_ma_enabled", False)) reflexion_enabled = bool(refinement_cfg.get("reflexion_enabled", False)) introspection_enabled = bool(refinement_cfg.get("introspection_enabled", False)) reflection_enabled = st.checkbox("Reflection (clàssic)", value=reflection_enabled) reflection_ma_enabled = st.checkbox("Reflection multi-agent (4 agents)", value=reflection_ma_enabled) reflexion_enabled = st.checkbox("Reflexion", value=reflexion_enabled) introspection_enabled = st.checkbox("Introspection", value=introspection_enabled) st.markdown("---") # 5) Automatitzacions st.subheader("Automatitzacions") twilio_enabled = bool(automation_cfg.get("twilio_enabled", False)) zapier_enabled = bool(automation_cfg.get("zapier_enabled", False)) col_a, col_b = st.columns(2) with col_a: twilio_enabled = st.checkbox("Twilio", value=twilio_enabled) with col_b: # Deshabilitat per no permetre canvis st.checkbox("Zapier", value=zapier_enabled, disabled=True) user_sms_enabled = bool(validation_cfg.get("user_sms_enabled", False)) video_validator_sms_enabled = bool(validation_cfg.get("video_validator_sms_enabled", False)) une_validator_sms_enabled = bool(validation_cfg.get("une_validator_sms_enabled", False)) user_sms_enabled = st.checkbox("SMS a l'usuari", value=user_sms_enabled) video_validator_sms_enabled = st.checkbox( "SMS al validador de vídeos", value=video_validator_sms_enabled ) une_validator_sms_enabled = st.checkbox( "SMS validador UNE-153020", value=une_validator_sms_enabled ) st.markdown("---") # 6) Traçabilitat st.subheader("Traçabilitat") private_blockchain_enabled = bool(compliance_cfg.get("private_blockchain_enabled", False)) public_blockchain_enabled = bool(compliance_cfg.get("public_blockchain_enabled", True)) monthly_digest_enabled = bool(compliance_cfg.get("monthly_digest_enabled", False)) public_blockchain_enabled = st.checkbox( "Public blockchain (Polygon)", value=public_blockchain_enabled ) st.checkbox( "Private blockchain (QLDB)", value=private_blockchain_enabled, disabled=True ) monthly_digest_enabled = st.checkbox("Monthly digest", value=monthly_digest_enabled) st.markdown("---") submitted = st.form_submit_button("Desar canvis", type="primary") if submitted: # Actualitzar seccions del cfg en memòria cfg.setdefault("media", {}) cfg["media"]["max_size_mb"] = int(max_size_mb) cfg["media"]["max_duration_s"] = int(max_duration_s) cfg.setdefault("app", {}) cfg["app"]["data_origin"] = "external" if origin == "persistent" else "internal" cfg["app"]["manual_validation_enabled"] = bool(manual_validation_enabled) cfg.setdefault("versions", {}) cfg["versions"]["Salamandra_enabled"] = bool(salamandra_enabled) cfg["versions"]["MoE_enabled"] = bool(moe_enabled) cfg.setdefault("refinement", {}) cfg["refinement"]["reflection_enabled"] = bool(reflection_enabled) cfg["refinement"]["reflection_ma_enabled"] = bool(reflection_ma_enabled) cfg["refinement"]["reflexion_enabled"] = bool(reflexion_enabled) cfg["refinement"]["introspection_enabled"] = bool(introspection_enabled) cfg.setdefault("automation", {}) cfg["automation"]["twilio_enabled"] = bool(twilio_enabled) # zapier_enabled es manté però no es canvia des de la UI cfg.setdefault("validation", {}) cfg["validation"]["user_sms_enabled"] = bool(user_sms_enabled) cfg["validation"]["video_validator_sms_enabled"] = bool(video_validator_sms_enabled) cfg["validation"]["une_validator_sms_enabled"] = bool(une_validator_sms_enabled) cfg.setdefault("compliance", {}) cfg["compliance"]["public_blockchain_enabled"] = bool(public_blockchain_enabled) # private_blockchain_enabled no es modifica des de la UI cfg["compliance"]["monthly_digest_enabled"] = bool(monthly_digest_enabled) _save_config(cfg) st.success("Configuració desada correctament. Reinicia la pàgina per veure els canvis aplicats.") st.experimental_rerun()