Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| import pandas as pd | |
| import tempfile | |
| import uuid | |
| import os | |
| from analysis.network_analysis import analizar_excel_redes_y_generar_pdf, comparar_informes_docx | |
| from utils.selector_panel import render_selector_panel | |
| def interfaz_redes(session_id_state): | |
| """ | |
| Crea la interfaz de análisis de redes sociales utilizando Gradio. | |
| Esta interfaz permite al usuario: | |
| - Seleccionar el método de carga de datos (archivo local o base de datos). | |
| - Subir un archivo Excel o CSV con comentarios de redes sociales. | |
| - Elegir entre distintos tipos de informe de análisis. | |
| - Ingresar parámetros como nombre del cliente o competidor si el informe lo requiere. | |
| - Ejecutar el análisis con IA (GPT) y descargar los informes generados (.docx). | |
| También incluye: | |
| - Indicadores de progreso del análisis. | |
| - Mensajes informativos o de error. | |
| """ | |
| # Generar un identificador de sesión único para evitar conflictos entre usuarios | |
| # session_id = str(uuid.uuid4())[:8] | |
| # session_id_state = gr.State(session_id) | |
| with gr.Row(): | |
| gr.Markdown("## 📝 Análisis de Contenido en Redes Sociales con Inteligencia Artificial") | |
| # Selector de método de carga: archivo o base de datos | |
| metodo_input = gr.Radio( | |
| ["Subir archivo", "Descargar desde base de datos"], | |
| label="Selecciona el método de ingreso de datos", | |
| value="Subir archivo" | |
| ) | |
| # Panel de carga de archivo Excel o Csv (activo por defecto) | |
| with gr.Group(visible=True) as panel_excel: | |
| with gr.Row(): | |
| boton_excel = gr.Button("📥 Descargar Archivo de Ejemplo") | |
| archivo_descarga = gr.File(label="Archivo de ejemplo", interactive=False, visible=False) | |
| archivo_input = gr.File(label="Sube el archivo Excel (.xlsx) o Csv (.csv)") | |
| def generar_excel_ejemplo(): | |
| ruta_archivo = "data/Excel_para_analisis_redes.csv" | |
| if not os.path.exists(ruta_archivo): | |
| return gr.update(visible=False) | |
| return gr.update(value=ruta_archivo, visible=True) | |
| boton_excel.click(fn=generar_excel_ejemplo, inputs=[], outputs=[archivo_descarga],show_progress=True) | |
| # Panel de carga de datos desde base de datos (oculto inicialmente) | |
| with gr.Group(visible=False) as panel_base: | |
| with gr.Tab("Selector de Eventos"): | |
| selector_outputs = render_selector_panel(session_id_state) # Tab de gradio para consulta a base de datos | |
| # Dropdown con tipos de informe posibles | |
| informe = gr.Dropdown( | |
| [ | |
| "¿De qué se habla HOY en las redes?", | |
| "¿Cuál fue HOY mi desempeño en las Redes?", | |
| "¿Cómo Me fue HOY en las Redes en Comparación a Mis Competidores?", | |
| "¿Cuáles son las FORTALEZAS y DEBILIDADES de mi estrategia digital?", | |
| "¿Cuáles son las FORTALEZAS y DEBILIDADES de la estrategia digital de Mi Competidor?" | |
| ], | |
| label="Selecciona el informe", | |
| value="¿Cuál fue HOY mi desempeño en las Redes?" # Tipo de informe seleccionado por defecto | |
| ) | |
| # 🔽 CAMPOS CONDICIONALES: ingreso del cliente (oculto por defecto) | |
| nombre_cliente = gr.Textbox(label="Nombre del cliente", visible=True) | |
| nombre_competidor = gr.Textbox(label="Nombre del competidor", visible=False) | |
| def mostrar_ocultar_cliente(informe_sel): | |
| if informe_sel == "¿Cuál fue HOY mi desempeño en las Redes?": | |
| return gr.update(visible=True), gr.update(visible=False) | |
| elif informe_sel == "¿De qué se habla HOY en las redes?": | |
| return gr.update(visible=False), gr.update(visible=False) | |
| elif informe_sel == "¿Cómo Me fue HOY en las Redes en Comparación a Mis Competidores?": | |
| return gr.update(visible=True), gr.update(visible=True) | |
| elif informe_sel == "¿Cuáles son las FORTALEZAS y DEBILIDADES de mi estrategia digital?": | |
| return gr.update(visible=True), gr.update(visible=False) | |
| elif informe_sel == "¿Cuáles son las FORTALEZAS y DEBILIDADES de la estrategia digital de Mi Competidor?": | |
| return gr.update(visible=True), gr.update(visible=True) | |
| else: | |
| return gr.update(visible=False), gr.update(visible=False) | |
| informe.change( | |
| fn=mostrar_ocultar_cliente, | |
| inputs=[informe], | |
| outputs=[nombre_cliente, nombre_competidor] | |
| ) | |
| # Elementos de ejecución y salida | |
| boton = gr.Button("Generar Análisis", interactive=True) | |
| salida_pdf = gr.File(label="📄 Informes por Red Social y Resumen Global (formato Word .docx)") | |
| mensaje_error = gr.Textbox(label="📢 Estado del Análisis (mensajes y advertencias)", interactive=False, visible=True) | |
| progreso_texto = gr.Textbox(label="📊 Detalle del Proceso de Generación de Resúmenes", lines=25, interactive=False) | |
| # # Título de comparativa separado para evitar que Gradio lo renderice debajo | |
| # gr.Markdown("## 📊 Comparativa de Informes de Redes Sociales") | |
| # ⏳ Procesamiento: Función que ejecuta el análisis de los comentarios en redes con los inputs actuales | |
| def wrapper_func(metodo, archivo_excel, informe, nombre_cliente, nombre_competidor, session_id): | |
| salida, mensaje, progreso = None, "", "" | |
| # Determinar si se usará un archivo subido por el usuario o descargado de la base de datos | |
| if metodo == "Subir archivo": | |
| archivo = archivo_excel | |
| else: | |
| temp_path = os.path.join(tempfile.gettempdir(), f"df_events_{session_id}.pkl") | |
| archivo = temp_path if os.path.exists(temp_path) else None | |
| if not archivo: | |
| yield gr.update(interactive=True), None, "❌ No se encontró el archivo para procesar.", "" | |
| return | |
| yield gr.update(interactive=False), None, "⏳ Procesando archivo... por favor espera.", "" | |
| for salida_, mensaje_, progreso_ in analizar_excel_redes_y_generar_pdf(archivo, informe, nombre_cliente, nombre_competidor): | |
| salida, mensaje, progreso = salida_, mensaje_, progreso_ | |
| yield gr.update(interactive=False), salida, mensaje, progreso | |
| yield gr.update(interactive=True), salida, mensaje, progreso | |
| # Vincula el botón con la función anterior | |
| boton.click( | |
| fn=wrapper_func, | |
| inputs=[metodo_input, archivo_input, informe, nombre_cliente, nombre_competidor, session_id_state], | |
| outputs=[boton, salida_pdf, mensaje_error, progreso_texto] | |
| ) | |
| with gr.Group(visible=False) as bloque_comparativa: | |
| gr.Markdown("## 📊 Comparativa de Informes de Redes Sociales") | |
| cliente_comparativa = gr.Textbox(label="Nombre del Cliente para la Comparativa", visible=True) | |
| comparativa_docs = gr.File(label="Sube hasta 3 informes (.docx) para comparar", file_types=[".docx"], file_count="multiple") | |
| boton_comparar = gr.Button("📈 Comparar Informes", interactive=True) | |
| salida_comparativa = gr.File(label="📄 Informe Comparativo (formato Word .docx)") | |
| mensaje_comparativa = gr.Textbox(label="📢 Estado del Análisis Comparativo", interactive=False, visible=True) | |
| progreso_comparativa = gr.Textbox(label="📊 Detalle del Proceso Comparativo", lines=15, interactive=False) | |
| # Función que alterna visibilidad entre carga por archivo o por base de datos | |
| def alternar_paneles(metodo): | |
| if metodo == "Subir archivo": | |
| return gr.update(visible=True), gr.update(visible=False), gr.update(visible=False) | |
| else: | |
| return gr.update(visible=False), gr.update(visible=True), gr.update(visible=True) | |
| metodo_input.change(fn=alternar_paneles, inputs=[metodo_input], outputs=[panel_excel, panel_base, bloque_comparativa]) | |
| def comparar_informes_archivos(archivos, cliente_c, session_id): | |
| if archivos is None or len(archivos) < 2: | |
| yield gr.update(interactive=True), None, "❌ Por favor sube al menos 2 documentos para comparar.", "" | |
| return | |
| if len(archivos) > 3: | |
| yield gr.update(interactive=True), None, "❌ El límite es de 3 documentos.", "" | |
| return | |
| yield gr.update(interactive=False), None, "⏳ Comparando informes... por favor espera.", "" | |
| # 👉 Lógica de comparación | |
| for salida_, mensaje_, progreso_ in comparar_informes_docx(archivos, cliente_c, session_id): | |
| yield gr.update(interactive=False), salida_, mensaje_, progreso_ | |
| yield gr.update(interactive=True), salida_, mensaje_, progreso_ | |
| boton_comparar.click( | |
| fn=comparar_informes_archivos, | |
| inputs=[comparativa_docs, cliente_comparativa, session_id_state], | |
| outputs=[boton_comparar, salida_comparativa, mensaje_comparativa, progreso_comparativa] | |
| ) | |
| bloque_analisis = gr.Column([ | |
| metodo_input, panel_excel, panel_base, informe, nombre_cliente, nombre_competidor, | |
| boton, salida_pdf, mensaje_error, progreso_texto | |
| ]) | |
| # componentes_ui = gr.Column([ | |
| # bloque_analisis, | |
| # bloque_comparativa | |
| # ]) | |
| componentes_ui = gr.Column([ | |
| metodo_input, | |
| panel_excel, | |
| panel_base, | |
| bloque_analisis, | |
| bloque_comparativa | |
| ]) | |
| return session_id_state, componentes_ui | |