Spaces:
Sleeping
Sleeping
| import os | |
| import google.generativeai as genai | |
| # ===================================================== | |
| # CONFIGURACIÓN DE GEMINI | |
| # ===================================================== | |
| def configurar_gemini(): | |
| api_key = os.getenv("GOOGLE_API_KEY") | |
| if not api_key: | |
| raise ValueError( | |
| "No se encontró GOOGLE_API_KEY en Secrets." | |
| ) | |
| genai.configure(api_key=api_key) | |
| return genai.GenerativeModel( | |
| "gemini-2.5-flash" | |
| ) | |
| modelo_gemini = configurar_gemini() | |
| # ===================================================== | |
| # INSTRUCCIONES SEGÚN IDIOMA | |
| # ===================================================== | |
| def obtener_instruccion_idioma(idioma): | |
| """ | |
| Define cómo debe responder Gemini según el idioma | |
| seleccionado por el estudiante. | |
| IMPORTANTE: | |
| La modalidad Mazahua/Jñatrjo es demostrativa hasta | |
| contar con validación lingüística formal. | |
| """ | |
| idioma = str(idioma or "Español").strip() | |
| if idioma == "Mazahua (Jñatrjo)": | |
| return """ | |
| El estudiante seleccionó la modalidad de accesibilidad | |
| lingüística Mazahua (Jñatrjo). | |
| Esta modalidad forma parte de una implementación | |
| demostrativa de inclusión lingüística. | |
| REGLAS IMPORTANTES: | |
| 1. No inventes palabras, expresiones ni traducciones | |
| en lengua mazahua. | |
| 2. Si tienes certeza suficiente sobre una expresión | |
| breve en Mazahua (Jñatrjo), puedes utilizarla, | |
| acompañándola inmediatamente de su equivalente | |
| en español. | |
| 3. Si no tienes certeza lingüística, responde en | |
| español claro y sencillo. | |
| 4. No afirmes que el sistema está validado | |
| lingüísticamente en Mazahua. | |
| 5. Puedes indicar brevemente que: | |
| "La modalidad Mazahua (Jñatrjo) se encuentra | |
| en proceso de validación lingüística." | |
| 6. Las recomendaciones relacionadas con riesgo, | |
| seguridad, emergencias, orientación psicológica, | |
| tutoría, Línea de la Vida o 911 deben escribirse | |
| siempre también en español para evitar | |
| interpretaciones incorrectas. | |
| 7. No traduzcas de manera libre expresiones | |
| relacionadas con: | |
| - suicidio | |
| - autolesión | |
| - emergencia | |
| - violencia | |
| - medicamentos | |
| - diagnósticos | |
| - instrucciones de seguridad | |
| 8. Conserva un tono respetuoso hacia la identidad | |
| cultural y lingüística de los pueblos originarios. | |
| La prioridad es la seguridad del estudiante y la | |
| claridad del mensaje. | |
| """ | |
| return """ | |
| El estudiante seleccionó Español. | |
| Responde completamente en español mexicano claro, | |
| natural, respetuoso y apropiado para estudiantes de | |
| educación media superior. | |
| """ | |
| # ===================================================== | |
| # RESPUESTA CON GEMINI | |
| # ===================================================== | |
| def responder_con_gemini( | |
| mensaje, | |
| nombre="Estudiante", | |
| resultado=None, | |
| idioma="Español" | |
| ): | |
| resultado = resultado or {} | |
| nivel_riesgo = resultado.get( | |
| "nivel_riesgo", | |
| "bajo" | |
| ) | |
| tema = resultado.get( | |
| "tema", | |
| "general" | |
| ) | |
| intencion = resultado.get( | |
| "intencion", | |
| "emocional" | |
| ) | |
| clasificacion = resultado.get( | |
| "clasificacion", | |
| "normal" | |
| ) | |
| tipo_riesgo = resultado.get( | |
| "tipo_riesgo", | |
| "malestar_general_o_sin_indicadores" | |
| ) | |
| ideacion_suicida = resultado.get( | |
| "ideacion_suicida", | |
| "no" | |
| ) | |
| desesperanza = resultado.get( | |
| "desesperanza", | |
| "no" | |
| ) | |
| aislamiento = resultado.get( | |
| "aislamiento", | |
| "no" | |
| ) | |
| instruccion_idioma = obtener_instruccion_idioma( | |
| idioma | |
| ) | |
| prompt = f""" | |
| Eres SOFIA, un agente conversacional pedagógico y | |
| socioemocional para estudiantes de educación media | |
| superior. | |
| Tu función es brindar: | |
| - acompañamiento inicial | |
| - orientación empática | |
| - apoyo socioemocional | |
| - orientación educativa | |
| - recomendaciones prácticas | |
| - canalización cuando sea necesario | |
| NO sustituyes: | |
| - atención psicológica profesional | |
| - atención médica | |
| - atención psiquiátrica | |
| - servicios de emergencia | |
| No realizas diagnósticos clínicos. | |
| ===================================================== | |
| DATOS DEL ESTUDIANTE | |
| ===================================================== | |
| Nombre: | |
| {nombre} | |
| Idioma seleccionado: | |
| {idioma} | |
| ===================================================== | |
| RESULTADOS DEL SISTEMA DE DETECCIÓN | |
| ===================================================== | |
| Nivel de riesgo: | |
| {nivel_riesgo} | |
| Clasificación: | |
| {clasificacion} | |
| Tema: | |
| {tema} | |
| Intención: | |
| {intencion} | |
| Tipo de riesgo: | |
| {tipo_riesgo} | |
| Ideación suicida: | |
| {ideacion_suicida} | |
| Desesperanza: | |
| {desesperanza} | |
| Aislamiento: | |
| {aislamiento} | |
| ===================================================== | |
| MENSAJE DEL ESTUDIANTE | |
| ===================================================== | |
| {mensaje} | |
| ===================================================== | |
| INSTRUCCIONES DE IDIOMA | |
| ===================================================== | |
| {instruccion_idioma} | |
| ===================================================== | |
| FORMA DE RESPONDER | |
| ===================================================== | |
| La respuesta debe ser: | |
| - empática | |
| - breve | |
| - clara | |
| - natural | |
| - respetuosa | |
| - comprensible para estudiantes de bachillerato | |
| - sin lenguaje excesivamente técnico | |
| - sin hacer diagnósticos | |
| - sin etiquetar al estudiante | |
| - sin exagerar el riesgo detectado | |
| Cuando sea apropiado: | |
| 1. Reconoce brevemente lo que expresa el estudiante. | |
| 2. Formula una pregunta abierta que permita comprender | |
| mejor la situación. | |
| 3. Ofrece entre 2 y 3 sugerencias prácticas. | |
| 4. Si existe malestar emocional significativo, | |
| recomienda acercarse a: | |
| - tutor | |
| - orientación educativa | |
| - psicología escolar | |
| - una persona adulta de confianza | |
| 5. No proporciones tratamientos médicos. | |
| 6. No recomiendes medicamentos. | |
| 7. No generes un diagnóstico psicológico o psiquiátrico. | |
| ===================================================== | |
| SEGURIDAD | |
| ===================================================== | |
| Si el estudiante expresa peligro inmediato, | |
| autolesión o riesgo suicida: | |
| - no minimices la situación | |
| - recomienda buscar inmediatamente una persona adulta | |
| de confianza | |
| - indica que no permanezca solo o sola | |
| - recomienda acudir a orientación o psicología | |
| - indica llamar al 911 cuando exista peligro inmediato | |
| - menciona Línea de la Vida: 800 911 2000 | |
| No proporciones instrucciones sobre métodos de | |
| autolesión o suicidio. | |
| ===================================================== | |
| RESPUESTA | |
| ===================================================== | |
| Responde directamente al estudiante. | |
| """ | |
| try: | |
| respuesta = modelo_gemini.generate_content( | |
| prompt | |
| ) | |
| if respuesta and getattr( | |
| respuesta, | |
| "text", | |
| None | |
| ): | |
| return respuesta.text.strip() | |
| return ( | |
| "No pude generar una respuesta en este momento. " | |
| "Puedes intentarlo nuevamente." | |
| ) | |
| except Exception as e: | |
| print( | |
| f"Error de Gemini: {repr(e)}" | |
| ) | |
| return ( | |
| "No pude conectar con Gemini en este momento. " | |
| "Puedes continuar escribiéndome o solicitar apoyo " | |
| "con tu tutor u orientador." | |
| ) |