import json import boto3 import os from dotenv import load_dotenv def generar_prompt_tutor(payload_alumno): """ Construye el System Prompt y el User Prompt inyectando los datos del alumno. """ system_prompt = """Eres un Asistente de Orientación Académica experto en retención escolar. Tu objetivo es analizar los datos predictivos de estudiantes en riesgo de abandono escolar (Churn) y redactar un informe ejecutivo para el Tutor del alumno. REGLAS ESTRICTAS: 1. No te dirijas al alumno, dirígete al Tutor Escolar. 2. Sé objetivo, profesional y empático. 3. Basa tus recomendaciones ÚNICAMENTE en los datos matemáticos y demográficos proporcionados. No inventes causas. 4. Tu respuesta debe tener tres partes: - Análisis de Situación: Resumen rápido de por qué ha saltado la alerta. - Contexto del Alumno: Cómo su perfil demográfico o historial puede estar afectando. - Plan de Acción Propuesto: 2 o 3 acciones concretas que el tutor debería tomar hoy. - Borrador de Email: Un texto sugerido y empático que el tutor pueda copiar, pegar y enviar al alumno.""" user_prompt = f"""Por favor, genera el informe de alerta temprana para el siguiente estudiante: DATOS DEL SISTEMA PREDICTIVO: {json.dumps(payload_alumno, indent=2, ensure_ascii=False)} """ return system_prompt, user_prompt def invocar_agente_aws(payload_alumno): load_dotenv() system, user = generar_prompt_tutor(payload_alumno) try: client = boto3.client('bedrock-runtime', region_name='eu-south-2') # Usamos CONVERSE API (más moderna y tolerante) response = client.converse( modelId= 'eu.anthropic.claude-haiku-4-5-20251001-v1:0', messages=[{"role": "user", "content": [{"text": user}]}], system=[{"text": system}], inferenceConfig={"temperature": 0.3, "maxTokens": 2000} ) texto_generado = response['output']['message']['content'][0]['text'] print("\n📥 INFORME RECIBIDO:\n" + "-"*40 + "\n" + texto_generado) return texto_generado except Exception as e: print(f"\n❌ Error al conectar con AWS Bedrock: {e}") return None if __name__ == "__main__": from explicabilidad_shap import obtener_explicacion_alumno print("1. Analizando alumno con Motor SHAP...") payload = obtener_explicacion_alumno( id_alumno=30268, ruta_modelo='datos_procesados/modelo_rf_optimizado.pkl', ruta_datos_ml='datos_procesados/dataset_preparado_ml.csv', ruta_datos_maestro='datos_procesados/dataset_maestro_churn.csv' ) if "error" in payload: print(payload["error"]) elif not payload.get("alerta", False): print(payload["mensaje"]) else: print("2. Motor completado. Pasando contexto a IA Generativa...") invocar_agente_aws(payload)