demo / page_modules /machine_room.py
VeuReu's picture
Upload 10 files
e2c60fb verified
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()
# Botons d'accions avançades a la part inferior de la pantalla
st.markdown("---")
# Estil bàsic per fer els botons secundaris de color taronja
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)