LabrvUaem/chatbot-uaemex
0
1### 📁 chatbot_app/interface.py2 3import gradio as gr4from logic.response_engine import respond_letra_por_letra5from logic.response_engine import set_and_respond6from logic.feedback import enviar_y_actualizar, verificar_clave7from logic.chat_manager import chat_manager8from config.settings import ADMIN_PASS9 10 11def create_interface():12 with gr.Blocks(theme=gr.themes.Soft(), title="Asistente UAEMex") as app:13 with gr.Column(visible=True) as vista_chatbot:14 gr.Markdown("# 🏛️ Asistente Virtual UAEMex")15 gr.Markdown("### Control Escolar - Campus Ecatepec")16 17 with gr.Row():18 with gr.Column(scale=3):19 chatbot = gr.Chatbot(height=400, type="messages")20 user_input = gr.Textbox(21 placeholder="Ej: ¿Qué necesito para cambiar de carrera?",22 label=""23 )24 with gr.Row():25 submit_btn = gr.Button("Enviar", variant="primary")26 clear_btn = gr.Button("Limpiar")27 28 with gr.Column(scale=1):29 gr.Markdown("### 📋 Preguntas Frecuentes")30 with gr.Row():31 btn_becas = gr.Button("Becas")32 btn_reins = gr.Button("Reinscripción")33 with gr.Row():34 btn_pagos = gr.Button("Pagos")35 btn_titu = gr.Button("Titulación")36 37 gr.Markdown("### 🔗 Enlaces Útiles")38 gr.Markdown("- [SIBECAS](https://sibecas.uaemex.mx/)")39 gr.Markdown("- [Control Escolar](https://controlescolar.uaemex.mx/)")40 gr.Markdown("- [Calendario Escolar](http://dep.uaemex.mx/portal/calendario/)")41 42 boton_ir_a_reporte = gr.Button("⚠️ ¿El chatbot respondió mal? Envía un reporte")43 44 gr.Examples(45 examples=[46 ["¿Cuál es el horario de control escolar?"],47 ["¿Cómo solicito la beca de Movilidad?"],48 ["¿Cómo llego a la Uaemex?"],49 ["¿Cómo puedo solicitar un prestamo de libros?"]50 ],51 inputs=user_input,52 label="💡 Haz clic para probar"53 )54 55 estado = gr.Label(value="", elem_id="estado")56 57 submit_btn.click(58 respond_letra_por_letra,59 inputs=[user_input, chatbot],60 outputs=[user_input, chatbot, estado]61 )62 63 btn_becas.click(64 respond_letra_por_letra,65 inputs=[gr.State("¿Qué tipos de becas existen y sus requisitos?"), chatbot],66 outputs=[user_input, chatbot, estado]67 )68 btn_reins.click(69 respond_letra_por_letra,70 inputs=[gr.State("¿Qué necesito para mi reinscripción?"), chatbot],71 outputs=[user_input, chatbot, estado]72 )73 btn_pagos.click(74 respond_letra_por_letra,75 inputs=[gr.State("¿Dónde puedo hacer pagos escolares?"), chatbot],76 outputs=[user_input, chatbot, estado]77 )78 btn_titu.click(79 respond_letra_por_letra,80 inputs=[gr.State("¿Cuáles son los requisitos para titulación?"), chatbot],81 outputs=[user_input, chatbot, estado]82 )83 84 clear_btn.click(85 lambda: ([], "", ""),86 None,87 [chatbot, user_input, estado],88 queue=False89 )90 91 with gr.Column(visible=False) as vista_reporte:92 gr.Markdown("## 🛠️ Ayúdanos a mejorar")93 gr.Markdown("Por favor, cuéntanos qué pregunta hiciste y qué respondió mal el chatbot.")94 gr.Markdown("### 📬 Reportar un error en la respuesta")95 96 input_pregunta = gr.Textbox(97 label="¿Qué pregunta hiciste?",98 placeholder= "Ej: ¿Qué es lo necesario para la inscripción?")99 input_respuesta = gr.Textbox(100 label="¿Qué respondió el chatbot?",101 placeholder= "Ej: 🎓 Puedes consultarla en Control Escolar o recibirla por correo una vez estés inscrito. La convocatoria suele publicarse entre julio y septiembre del año siguiente al ingreso.",102 lines=3)103 input_comentario = gr.Textbox(104 label="¿Por qué piensas que estuvo mal la respuesta?",105 placeholder= "Ej: ❌ La respuesta no menciona los documentos ni pasos necesarios para inscribirse.\n🤔 Solo dice que se recibe por correo después de estar inscrito, lo cual no tiene sentido si aún no me inscribo. \n✅ Yo esperaba que dijera algo como: “Debes entregar acta de nacimiento, CURP, comprobante de pago, etc.”",106 lines=3)107 btn_enviar_reporte = gr.Button("Enviar reporte")108 label_confirmacion = gr.Label()109 110 clave_admin = gr.Textbox(label="🔐 Acceder a reportes", type="password")111 btn_verificar_clave = gr.Button("Verificar")112 descarga_csv = gr.File(value="reportes.csv", label="Descargar reportes", interactive=True, visible=False)113 mensaje_clave = gr.Label()114 115 btn_verificar_clave.click(116 verificar_clave,117 inputs=clave_admin,118 outputs=[descarga_csv, mensaje_clave]119 )120 121 btn_volver = gr.Button("⬅️ Volver al chatbot")122 123 def mostrar_reporte():124 return gr.update(visible=False), gr.update(visible=True)125 126 def volver_a_chatbot():127 return gr.update(visible=True), gr.update(visible=False)128 129 boton_ir_a_reporte.click(mostrar_reporte, outputs=[vista_chatbot, vista_reporte])130 btn_volver.click(volver_a_chatbot, outputs=[vista_chatbot, vista_reporte])131 132 btn_enviar_reporte.click(133 enviar_y_actualizar,134 inputs=[input_pregunta, input_respuesta, input_comentario],135 outputs=[label_confirmacion, descarga_csv]136 )137 138 return app139 