ADR-003: Plugin separado para el proxy del tutor IA (Alcance 3)
Estado: Aceptado | Fecha: 2026-06-22 | Autores: jcarroyos@gmail.com
Contexto
El Alcance 3 tiene dos flujos de datos con direcciones opuestas:
-
Consulta (pull): un agente IA externo consulta datos del campus (progreso, calificaciones, alertas) para tomar decisiones autonomas. Este flujo esta cubierto por ADR-001, que decide implementar funciones externas de solo lectura dentro de
local_pccntr8203403_dashboard. -
Conversacion (push): el estudiante envia un mensaje al tutor IA desde Moodle y recibe una respuesta. Este flujo requiere una funcion externa de tipo
writeconajax: true, un proxy cURL al servicio externo, rate limiting, sanitizacion de la respuesta HTML y soporte para contexto SCORM.
La decision a tomar es si el flujo conversacional se implementa dentro de local_pccntr8203403_dashboard (junto con la capa de consulta) o en un plugin separado.
Opciones consideradas
Opcion 1: Agregar la funcion al plugin dashboard
- Ventajas: un solo plugin local para todo el Alcance 3; menos artefactos que desplegar; misma ruta de upgrade.
- Desventajas: mezcla responsabilidades: el dashboard es una capa de datos de solo lectura (ADR-001/ADR-002), y la funcion del tutor es un proxy de escritura que transmite datos personales a un servicio externo; las dependencias de configuracion (URL del servidor, token, rate limiting, timeout) no tienen relacion con las del dashboard; la capacidad
RISK_PERSONALdel tutor contaminaria el perfil de riesgo del dashboard; el privacy provider del tutor (datos enviados al exterior) es fundamentalmente distinto al del dashboard (sin datos personales almacenados).
Opcion 2: Plugin separado local_pccntr8203403_aitutor
- Ventajas: separacion de responsabilidades (lectura vs. proxy de escritura); configuracion autonoma (URL, token, rate limiting); capacidad propia con perfil de riesgo aislado; privacy provider especifico; se puede instalar, desinstalar o desactivar independientemente del dashboard; el tema consume ambos plugins pero por canales distintos (renderer + layout vs.
standard_after_main_region_html()). - Desventajas: un plugin adicional que desplegar y mantener; no reutiliza la capa de datos del dashboard (no la necesita: el proxy transmite contexto de APIs core, no de
course_stats).
Decision
Opcion elegida: Opcion 2 (plugin separado), porque la funcion de proxy tiene responsabilidades, configuracion, modelo de privacidad y perfil de riesgo distintos a los de la capa de datos del dashboard. La independencia permite activar o desactivar el tutor IA sin afectar el Dashboard de aprendizaje.
Reglas resultantes:
local_pccntr8203403_aitutores el plugin del flujo conversacional (proxy al servicio externo). Su unica funcion externa essend_message.local_pccntr8203403_dashboardcontinua siendo la capa de datos del Alcance 2, reutilizable por la capa de consulta del Alcance 3 (ADR-001) cuando se construya.- La presentacion del Drawer IA vive en
theme_cdigital(plantilla, SCSS, AMD), coherente con el patron de ADR-002. - Los ajustes de conexion al servicio externo (URL, token, rate limiting, timeout) se administran desde la pagina de configuracion propia del plugin.
Consecuencias
- El Alcance 3 tendra dos plugins locales:
local_pccntr8203403_dashboard(consulta, ADR-001) ylocal_pccntr8203403_aitutor(conversacion, este ADR). Ambos son independientes y desplegables por separado. - Si en el futuro el tutor IA necesita datos de
course_statsoacademic_alertspara enriquecer el contexto del lado del servidor, el plugin puede importar esas clases sin establecer una dependencia formal enversion.php(patron habitual entre pluginslocal_en Moodle).