vvillarreal-cfee's picture
feat(app): Ahora utilizamos Groq
f9ccc70 verified
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"
)