Spaces:
Running
Running
| 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" | |
| ) |