Spaces:
Sleeping
Sleeping
File size: 4,562 Bytes
9fceb39 3c27a10 b8d9e47 3c27a10 d183fa0 e0c9b20 d183fa0 9fceb39 d183fa0 e0c9b20 d183fa0 e0c9b20 d183fa0 b8d9e47 9fceb39 b8d9e47 9fceb39 b8d9e47 9fceb39 b8d9e47 9fceb39 d183fa0 e0c9b20 d183fa0 e0c9b20 d183fa0 e0c9b20 d183fa0 e0c9b20 d183fa0 41f9f93 d183fa0 9ac0306 d183fa0 e0c9b20 d183fa0 41f9f93 d183fa0 e0c9b20 d183fa0 41f9f93 d183fa0 b8d9e47 f9ccc70 41f9f93 f9ccc70 d183fa0 41f9f93 d183fa0 b8d9e47 9ac0306 9702341 b8d9e47 9702341 d183fa0 b8d9e47 9ac0306 d183fa0 9702341 d183fa0 551a5dc d183fa0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
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"
) |