import os import streamlit as st from incident_crew import IncidentReporterCrew # --- Interfaz de Usuario con Streamlit --- st.set_page_config( page_title="Generador IA de Informes Post-Mortem", layout="wide" ) # Inicializar el estado de la sesión para la API Key si no existe if 'gemini_api_key' not in st.session_state: st.session_state['gemini_api_key'] = os.getenv("GEMINI_API_KEY", "") if 'ipinfo_api_key' not in st.session_state: st.session_state['ipinfo_api_key'] = os.getenv("IPINFO_API_KEY", "") st.title("📄 Generador IA de Informes Post-Mortem") # --- Sidebar para la configuración de la API Key --- with st.sidebar: st.header("⚙️ Instrucciones") # Campo de entrada para la API Key if not os.getenv("GEMINI_API_KEY"): st.session_state['gemini_api_key'] = st.text_input( "- 🔑 Ingresa tu API Key de Gemini", type="password", value=st.session_state['gemini_api_key'] ) if st.session_state['gemini_api_key']: st.success("Gemini API Key cargada!") else: st.warning("🚨 Por favor, ingresa tu API Key de Gemini.") if not os.getenv("IPINFO_API_KEY"): st.session_state['ipinfo_api_key'] = st.text_input( "- 🔑 Ingresa tu API Key de IPInfo", type="password", value=st.session_state['ipinfo_api_key'] ) if st.session_state['ipinfo_api_key']: st.success("IPInfo API Key cargada!") else: st.warning("🚨 Por favor, ingresa tu API Key de IPInfo.") st.write("- 📄 Completa el formulario con los detalles de la incidencia") st.write("- 🚀 Presiona el botón y la IA generará un informe técnico estructurado post-mortem de tu incidente.") # --- Formulario de entrada de datos principal --- with st.form("post_mortem_form"): # Usar session_state para precompletar si corresponde col1, col2 = st.columns(2) with col1: tipo_alerta = st.text_input( "Tipo de Alerta / Título del Problema", placeholder="Ej: High CPU usage en DB Server; Caída del servicio de Login", ) sistema_afectado = st.text_input( "Sistema Afectado", placeholder="Ej: Servidor de Base de Datos; Microservicio de Autenticación", ) with col2: fecha_hora = st.text_input( "Fecha y Hora", placeholder="Ej: 26/Sep/2025 21:45 PM UTC-3", ) impacto_detalle = st.text_area( "Detalles del incidente e Impacto", placeholder="Ej: Latencia elevada afectó al 20% de los usuarios.", height=150, ) acciones_tomadas = st.text_area( "Acciones Tomadas (Mitigación Inmediata)", placeholder="Ej: Se escaló a Dev Team. Se reinició el servicio crítico.", height=150, ) # Botón de envío submitted = st.form_submit_button("🚀 Generar Informe Post-Mortem") # --- Lógica de procesamiento --- if submitted: #if not st.session_state.get('gemini_api_key'): #st.error("❌ Por favor, ingresa tu API Key de Gemini en el panel lateral (sidebar) antes de continuar.") if not all([tipo_alerta, sistema_afectado, fecha_hora, impacto_detalle, acciones_tomadas]): st.error("❌ Por favor, completa todos los campos del formulario para generar el informe.") else: inputs = { "tipo_alerta": tipo_alerta, "sistema_afectado": sistema_afectado, "fecha_hora": fecha_hora, "impacto_detalle": impacto_detalle, "acciones_tomadas": acciones_tomadas, } with st.spinner("⏳ Generando informe técnico..."): crew_response = IncidentReporterCrew( api_key=st.session_state['gemini_api_key'], ).crew().kickoff(inputs=inputs) lineas = crew_response.raw.splitlines() if len(lineas) >= 2: lineas.pop(0) # Elimina la primera línea lineas.pop() # Elimina la última línea final_report = "\n".join(lineas) # Mostrar el resultado st.divider() st.success("✅ Informe post-mortem generado correctamente.") #st.code(incident_crew.usage_metrics) st.markdown(final_report) st.download_button( label="Descargar Informe (.md)", data=final_report, file_name="post_mortem_incidencia.md", mime="text/markdown", on_click="ignore" )