mod.ai-content — Generador de contenido formativo¶
Community · Categoría ai (desactivable)
Qué hace¶
Genera borradores formativos a partir del texto de una lección: resúmenes (SUMMARY), flashcards (FLASHCARDS) y quizzes (QUIZ). El resultado se persiste siempre como borrador: el formador revisa, puede editar el JSON, y después publica o rechaza con motivo. Human-in-the-loop por defecto — nada se publica automáticamente.
Cómo funciona¶
- El prompt es específico por tipo y la llamada pasa por el AI Gateway con la configuración del tenant.
- Cada borrador guarda telemetría de la generación: proveedor, modelo y tokens de entrada/salida.
- Una lección sin texto responde
AI_CONTENT_LESSON_TEXT_EMPTY422; sin proveedor configurado, 503 con mensaje claro. - Solo se puede editar/publicar/rechazar un borrador en estado
DRAFT(409 en otro estado). - El formador espera la generación (~5-30 s); no hay streaming todavía. La ingestión automática del quiz publicado hacia
mod.assessmentses un paso posterior — hoy el flujo emite el evento y el formador crea el quiz.
Configuración¶
Activar el módulo. En /admin/configuracion?tab=modules (pestaña «Módulos»). La fila del módulo muestra «Depende de: mod.courses» — su única dependencia dura. Este módulo no aporta hoy ninguna pantalla propia: ni entrada de menú ni panel; toda su superficie es la API.

Proveedor de IA (BYOK). Usa solo el propósito chat del AI Gateway: bloque «Chat (tutor IA)» de /admin/ia/providers (menú «Integraciones y API → Proveedores de IA») o, en su defecto, el default global DEFAULT_AI_CHAT_*. Proveedores de chat que acepta el código hoy: OpenAI, Anthropic (Claude), Google Gemini, OpenRouter, Mistral AI, Groq y Ollama (self-hosted). Detalle del gateway y del cifrado de claves en Configuración → IA. Sin proveedor configurado (o si el proveedor falla), la generación devuelve 503 AI_CONTENT_PROVIDER_ERROR.

Sin variables propias, sin ajustes por tenant y sin exigencia de licencia Enterprise.
Uso paso a paso¶
Todo el flujo es por API (rol formador, tenant_admin o super_admin), con el prefijo /modules/ai-content:
- Generar:
POST /modules/ai-content/generatecon{ "lessonId": "...", "courseId": "...", "type": "SUMMARY" | "FLASHCARDS" | "QUIZ" }. La llamada es síncrona (~5-30 s) y devuelve el borrador en estadoDRAFTcon su telemetría (proveedor, modelo, tokens). La lección debe pertenecer al curso y tener texto. - Revisar:
GET /modules/ai-content/drafts(filtros opcionaleslessonId,courseId,status) yGET /modules/ai-content/drafts/:idpara el detalle. - Editar (opcional):
PATCH /modules/ai-content/drafts/:id/contentcon el JSON corregido; se revalida la forma por tipo (SUMMARY→{text},FLASHCARDS→{cards:[{front,back}]},QUIZ→{questions:[{prompt,options?,answer,explanation?}]}). Solo en estadoDRAFT. - Decidir:
PATCH /modules/ai-content/drafts/:id/publishoPATCH /modules/ai-content/drafts/:id/reject(conreasonopcional). Cada borrador se publica o rechaza una sola vez; en otro estado la transición responde 409. - Publicar emite
ai-content.draft.published. El quiz publicado no se convierte hoy automáticamente en un quiz demod.assessments: el formador lo crea a mano con el contenido del borrador.
Dependencias¶
Dura: mod.courses (resolver el curso y validar que la lección le pertenece).
Modelo de datos¶
mod_ai_content_draft — el borrador: tipo, estado (DRAFT/PUBLISHED/REJECTED), contenido JSON (forma distinta por tipo) y telemetría IA.
API¶
Prefijo /modules/ai-content (formador+): generate, listado/detalle de drafts y transiciones. Detalle en Referencia → Pagos, aula e IA.
Eventos¶
Emite: ai-content.draft.generated, ai-content.draft.published, ai-content.draft.rejected. No consume.