Inteligencia artificial
Chat de IA actual con local_ai_manager, block_ai_chat y Groq; niveles por perfil, persona, agente de acciones, servicio MCP y plan de la Fase 5 con Dify.
Estado actual en una línea
Hoy el chat de la Academia funciona así: block_ai_chat (interfaz) → local_ai_manager (proveedor, cuotas, registro) → Groq por su API compatible con OpenAI, sin servicio intermedio. La plataforma RAG con Dify de la Fase 5 no está desplegada.
Navegador (botón ✦ y panel flotante)
│
▼
block_ai_chat v1.0 ──► local_ai_manager v1.1 (submit_query.php)
│ parche 1: ai_role_injector → agrega el perfil del usuario al prompt de sistema
│ parche 2: ai_agent → si el mensaje es una acción de gestión, la resuelve
│ con function-calling (modelo openai/gpt-oss-120b);
│ cédulas, RUC y correos viajan como marcadores
▼
Conector "chatgpt" (formato OpenAI)
│ https://api.groq.com/openai/v1/chat/completions
▼
Groq · modelo openai/gpt-oss-20b · temperatura 0.2Componentes
| Componente | Función |
|---|---|
block_ai_chat | Interfaz del chat. En modo global (showonpagetypes = '*') muestra un botón flotante en todas las páginas. El panel se abre a la derecha (a pantalla completa en el celular); su estilo y su comportamiento van en línea en additionalhtmlhead para no depender de cachés |
local_ai_manager | Guarda la instancia del proveedor (endpoint, modelo, clave), las cuotas por nivel, los propósitos y las estadísticas |
tiny_ai | Dependencia de block_ai_chat (IA en el editor) |
local_deltamodules | Perfil en el prompt (ai_role_injector), agente de acciones (ai_agent), niveles por perfil (ai_tiers), condiciones de uso (policies), autor de borradores (ai_author) y la página Configuración IA |
Proveedor y modelos
| Uso | Modelo | Dónde se define |
|---|---|---|
| Conversación | openai/gpt-oss-20b, temperatura 0.2 | Instancia "Chat IA - Academia Deltamontero" de local_ai_manager (configure-ai-groq.php) |
| Agente de acciones (function-calling) | openai/gpt-oss-120b | Constante AGENT_MODEL en ai_agent.php |
| Borradores al crear módulos desde un documento | openai/gpt-oss-20b | Constante MODEL en ai_author.php |
La clave se toma de la variable de entorno GROQ_API_KEY. moodle-config.sh ejecuta configure-ai-groq.php en cada despliegue cuando la variable está definida (paso crítico, antes de las cuotas de IA): crea o actualiza la instancia con esa clave. Para cambiar la clave basta con actualizar GROQ_API_KEY en Coolify y hacer Redeploy. Si la variable no está definida, el paso no corre y se conservan la instancia y la clave guardadas en la base de datos (por ejemplo, una clave cambiada en Configuración IA → Ajustes técnicos). Groq reemplazó a Gemini, que daba errores intermitentes por alta demanda en el nivel gratuito; configure-ai-manager.php y GEMINI_API_KEY quedan de esa configuración anterior.
Si GROQ_API_KEY está definida en Coolify, en cada despliegue su valor reemplaza a la clave que se haya puesto a mano en Configuración IA. Mantenga la clave vigente en la variable.
Si Groq retira un modelo (respuesta 404), se consulta la lista de modelos disponibles de su API y se ajusta el nombre en la instancia y en las constantes del código.
Niveles y cuotas por perfil
local_ai_manager v1.1 tiene tres niveles. ai_tiers asigna el nivel según el rol de sistema de cada persona (el mayor si tiene varios), al crear la cuenta o cambiar el cargo y en cada despliegue (configure-ai-quotas-and-persona.php).
| Nivel | Perfiles | Cuota del chat |
|---|---|---|
| Sin límite | Socios, Administrador de Formación, Administrador Técnico | Sin tope |
| Ampliado | Gerencia, Jefatura Técnica, Líder Operativo, RRHH Operativo | 60 mensajes por día |
| Básico | Operativo, Operativo Técnico, Operativo / Back Office, Auxiliar, Pasante | 15 mensajes por día |
El periodo de la cuota es de 24 horas y lo reinicia el cron (si el cron no corre, la cuota no se reinicia). Se respetan los cambios hechos a mano en Configuración IA y nunca se desbloquea a quien fue bloqueado a mano. El chat global está disponible en todas las páginas para cualquier usuario con sesión (parche patch-ai-chat-everywhere.php), dentro de su cuota.
Quién no tiene chat:
- Visitantes sin sesión e invitados.
- Postulantes (rol
delta_postulantey el agente lo excluye). - Cualquier persona mientras rinde un examen (intento y resumen).
Persona del asistente
La persona "Deltamontero — Asistente Academia" es una plantilla visible para todos los bloques, con un prompt de sistema que establece:
- Transparencia: es un asistente automatizado, no una persona.
- Alcance: solo la Academia (módulos, contenidos, uso de la plataforma, rutas, avance y evaluaciones).
- Límites de autoridad: no toma decisiones vinculantes ni promete accesos, notas, certificados o plazos; explica procesos pero no los ejecuta.
- Escalamiento a Talento Humano en problemas de cuenta, quejas o pedido de hablar con una persona (salvo que quien pregunta sea de Talento Humano o administración).
- Orientación por perfil y un mapa de ubicaciones de la plataforma, para no inventar menús ni direcciones. El mapa indica que se entra con el usuario o el correo y explica las dos formas de recuperar la contraseña desde ¿Olvidó su contraseña?: por correo (enlace de un solo uso que vence en 1 hora) o, sin correo, con el usuario y la cédula (contraseña temporal). Las cuentas que administran la Academia no se recuperan desde ahí.
ai_role_injector agrega en cada petición una línea con el perfil real del usuario, calculada en el servidor; así el modelo adapta su orientación sin poder conceder accesos. El historial de contexto se amplía a 50 mensajes en cada despliegue; las conversaciones se guardan y cada persona puede borrar una conversación desde el panel.
Agente de acciones
Para quien tiene moodle/user:create (en la práctica, Talento Humano y administradores), el chat también ejecuta acciones. Regla de diseño: la IA propone, Moodle dispone.
- Cada herramienta se ejecuta como el usuario con sesión, sin escalar privilegios, y vuelve a validar sus permisos en el servidor.
- Las acciones de escritura muestran primero un resumen y exigen confirmación; la confirmación ("sí") la resuelve el código, no el modelo.
- Herramientas de lectura:
buscar_usuario,avance_de_usuario,pendientes_de_curso,generar_reporte,reporte_formacion,menu_reportes(las de reportes requierenlocal/deltamodules:viewreports). - Herramientas de escritura:
guia_crear_usuario,crear_colaborador,asignar_cargo,asignar_cedula,matricular_en_cohorte,resetear_contrasena.
Condiciones de uso
Antes de usar el chat, cada persona acepta las Condiciones de uso del Asistente de IA (versión, resumen de puntos y acuerdo completo). Se editan en Configuración IA; publicar una versión nueva obliga a aceptarlas otra vez, y la aceptación se puede dejar de pedir. El texto inicial informa que los mensajes se envían a un proveedor externo que puede procesarlos fuera del Ecuador y que no se deben incluir datos personales de terceros ni información confidencial. Debe validarlo Talento Humano con asesoría legal (LOPDP).
Frontera de datos con el proveedor
En el agente de acciones, las cédulas (10 dígitos), los RUC (13 dígitos) y los correos no viajan a Groq. Antes de enviar el mensaje, el historial y el resultado de cada herramienta, el código los reemplaza por marcadores (CEDULA_1, RUC_1, correo1@dato.oculto). La tabla que relaciona cada marcador con el dato real vive solo en la sesión de la plataforma; el modelo trabaja con los marcadores y Moodle vuelve a poner el dato real al ejecutar la herramienta y en la respuesta que ve la persona.
| Dato | ¿Llega al proveedor? |
|---|---|
| Cédulas, RUC y correos en el agente de acciones | No: viajan como marcadores |
| Nombres de personas | Sí: hacen falta para buscar y responder |
Perfil del usuario (línea de ai_role_injector) | Sí |
Mensajes del chat informativo (cuando no se usa ninguna herramienta, o la persona no tiene moodle/user:create) | Sí, tal como se escriben |
Texto de cada tema de un documento al crear un módulo con propuestas de IA (ai_author, hasta 6.000 caracteres por tema) | Sí |
El proveedor externo y lo que se le envía están declarados en el proveedor de privacidad de local_deltamodules (ubicación externa groq). La brecha G-2 de docs/roadmap_v4_gaps.md exige además la aprobación legal por escrito de esta frontera (Groq procesa fuera del Ecuador): estado de la revisión legal Por confirmar. Por eso las condiciones de uso siguen pidiendo no escribir datos personales de terceros ni información confidencial.
Configuración IA
Página de Administración del sitio para quien tiene local/ai_manager:manage (Socios, Jefe de Talento Humano, Administrador Técnico y super administrador):
- Resumen: activar o desactivar el Asistente, estado de las condiciones y de las aceptaciones, proveedor y modelo en uso.
- Condiciones de uso: edición y versiones.
- Aceptaciones: quién aceptó y quién falta, con descarga.
- Ajustes técnicos: las páginas de
local_ai_manager(proveedor y modelo, propósitos, límites, estadísticas).
Servicio MCP para administración
Además del chat de usuarios, existe un acceso técnico por MCP (Model Context Protocol) para que un cliente MCP externo consulte y gestione la plataforma en lenguaje natural. No es el chat de los usuarios.
| Elemento | Valor |
|---|---|
| Plugin | webservice_mcp, endpoint /webservice/mcp/server.php |
| Protocolos activos | rest y mcp |
| Cuenta de servicio | mcpservice, con el rol delta_ai_mcp_ro ("Delta AI MCP (gestión completa)") |
| Servicio externo | delta_ai_mcp_ro, restringido a usuarios autorizados, con token permanente |
| Funciones | Lectura (sitio, cursos, contenidos, categorías, matriculados, usuarios, finalización, calificaciones, certificados emitidos, Report Builder), gestión de usuarios, matrículas y cohortes, creación y edición de cursos y categorías, y local_deltamodules_create_module |
| Fuera de alcance | El borrado permanente de usuarios no está en la lista |
Lo crea y mantiene setup-mcp-service.php en cada despliegue (paso crítico); el token no se imprime completo. La superficie del agente es exactamente la lista de funciones del servicio.
Plan de la Fase 5: RAG con Dify
El objetivo es que el asistente responda con el contenido de los cursos y enlace al segundo exacto del video. El plan vigente (docs/roadmap.md) reemplazó al servicio propio con FastAPI y ChromaDB por Dify, una plataforma LLMOps de código abierto autoalojada.
lms-course-scrap (scraper) ──► chunks.jsonl en almacenamiento de objetos
│
local_dify_sync (tarea programada + observadores de eventos en el cron de Moodle)
│ API de la base de conocimiento de Dify
▼
block_ai_chat → local_ai_manager → Dify (RAG, historial, prompt) → proveedor LLM
├─ LLM: Groq u otro, cambiable por interfaz
├─ Embedding: bge-m3 (fijo; cambiarlo obliga a re-indexar)
└─ Reranker: opcionalPrincipio de portabilidad de proveedor (docs/roadmap.md §2):
- Moodle habla siempre con un solo endpoint compatible con OpenAI (Dify); el cambio de proveedor ocurre dentro de Dify, sin tocar Moodle.
- La fuente de verdad del RAG es texto más metadatos sin vectores (
chunks.jsonl); los vectores son derivados y se regeneran con cualquier proveedor de embeddings. - El contrato hacia los proveedores es la API compatible con OpenAI.
Pendientes y riesgos documentados:
| Punto | Estado |
|---|---|
| Despliegue de Dify | Pendiente. Levanta entre 8 y 10 contenedores: hay que medir la memoria en el servidor |
Plugin local_dify_sync | No existe en el repositorio |
local_ai_manager apuntando a Dify | Sin probar (brecha G-3). Hoy el conector chatgpt ya apunta a un endpoint compatible con OpenAI distinto del original (Groq), lo que indica que es viable, pero el tramo hacia Dify no se ha validado |
| Recuperación | Decisión abierta: base de conocimiento nativa de Dify (1 segmento = 1 fragmento) o External Knowledge API con Qdrant si se pierden los enlaces con marca de tiempo |
| Transporte de artefactos | Almacenamiento de objetos (MinIO o S3) o HTTP: por decidir |
Alternativa preparada en el repositorio
Existe una base para un RAG dentro de la misma MariaDB: la tabla local_deltamodules_chunks y el script import-rag-chunks.php, que genera embeddings con la API de Gemini. El propio script indica que no debe ejecutarse todavía, y ningún componente del chat consulta esa tabla. Su relación con el plan de Dify: Por confirmar.
Repositorio hermano lms-course-scrap
Pipeline independiente en Python y Jupyter que extrae el contenido de los videos de la Academia y produce tres artefactos:
| Artefacto | Uso en esta plataforma |
|---|---|
chunks.jsonl | Fuente del RAG (Fase 5) |
Cuestionarios .gift por módulo | Importación de preguntas (adaptadores pendientes) |
Puntos de control de mod_interactivevideo | Ya hay paquetes del piloto en infrastructure/moodle/checkpoints/, importables con import-checkpoints.php (cuestionario después de cada video, usando el lector GIFT nativo) |
Estado según la documentación: extracción completa del piloto (Módulo 1); falta el catálogo completo (Google Drive, TikTok y temas sin enlace) y publicar los artefactos en almacenamiento de objetos. Este repositorio consume los artefactos; no los genera. El contenido generado por IA debe pasar revisión humana antes de publicarse.