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