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"
        )