| 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"):
|
|
|
| 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("---")
|
|
|
|
|
| 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("---")
|
|
|
|
|
| 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("---")
|
|
|
|
|
| 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("---")
|
|
|
|
|
| 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:
|
|
|
| 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("---")
|
|
|
|
|
| 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:
|
|
|
| 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)
|
|
|
|
|
| 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)
|
|
|
| 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()
|
|
|
|
|
| st.markdown("---")
|
|
|
|
|
| st.markdown(
|
| """
|
| <style>
|
| div[data-testid="baseButton-secondary"] button {
|
| background-color: #f97316 !important;
|
| border-color: #ea580c !important;
|
| color: white !important;
|
| }
|
| </style>
|
| """,
|
| unsafe_allow_html=True,
|
| )
|
|
|
| col_b1, col_b2, col_b3 = st.columns(3)
|
| with col_b1:
|
| st.button("Buïdar fitxers temporals", type="secondary", use_container_width=True)
|
| with col_b2:
|
| st.button("Reconstruir audiodescripcions", type="secondary", use_container_width=True)
|
| with col_b3:
|
| st.button("Reentrenar refinament", type="secondary", use_container_width=True)
|
|
|