Conacyta Core
by Universidad Nacional de Frontera · github.com/nftsaavedra/conacyta-core · website
Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/nftsaavedra/conacyta-core/archive/refs/heads/main.zipConacyta Core ·

Plugin core para el XVII CONACYTA 2026 — Congreso Nacional de Ciencia y Tecnología de Alimentos.
8 Custom Post Types, REST API, asistente IA (Gemini + DeepSeek V4), paneles Gutenberg para el editor de bloques.
Estado: Estable. Configuración completa del evento, chatbot dual (Gemini + DeepSeek V4), Abilities API (MCP), 4 endpoints REST, 8 CPTs y 4 taxonomías.
Organizado por la Universidad Nacional de Frontera · Sullana, Perú.
📦 Características
| Categoría | Detalle |
|---|---|
| 🧩 8 CPTs | Ponentes, Actividades, Agenda, Tarifas, Comité, Partners, Cronograma, Portada |
| 🏷️ 4 Taxonomías | Áreas Temáticas, Auditorios, Tipos de Sesión, Beneficios de Tarifa |
| 🔌 4 REST Endpoints | Chat IA, Historial de chat, Formulario de Contacto, Agenda pública con filtros |
| 🤖 Abilities API (MCP) | 3 abilities WP 7.0+ para integración MCP (sitio, ponentes, agenda) |
| ⚙️ Página de configuración | Fechas del evento, sede, cuenta regresiva, chatbot, contacto |
| 🧱 Block Variations | Query Loop para cada CPT — listo para Site Editor (FSE) |
| 💬 Chatbot Enterprise | Gemini (Connectors API) + DeepSeek V4 (OpenAI tool calls + XML DSML) |
| 🎨 Paneles Gutenberg | PluginDocumentSettingPanel con meta fields tipados |
| ⚡ WP 7.0+ & FSE | Block Theme compatible, sin jQuery, Interactivity API |
📁 Arquitectura
conacyta-core/
├── conacyta-core.php # Punto de entrada y constants
├── uninstall.php # Limpieza al desinstalar
├── composer.json # PSR-4: ConacytaCore\ → src/
├── package.json # @wordpress/scripts build
├── README.md # Este archivo
├── readme.txt # WordPress.org plugin directory
│
├── src/ # Lógica de negocio
│ ├── Core/ # Plugin lifecycle, Assets
│ ├── Shared/ # Auth, Sanitizer, MetaRegistrar, VariationFactory, EventDateHelper
│ ├── Ponente/ # CPT + Variation
│ ├── Actividad/ # CPT + Variation
│ ├── Agenda/ # CPT + Variation + REST + Query Filter
│ ├── Tarifa/ # CPT + Variation + Taxonomía Beneficio
│ ├── Comite/ # CPT + Variation
│ ├── Partner/ # CPT + Variation
│ ├── Cronograma/ # CPT + Variation
│ ├── Portada/ # CPT + Variation + Query Filter
│ ├── AreaTematica/ # Taxonomía + Query Filter
│ ├── Abilities/ # WP 7.0+ AbilityRegistrar (MCP: site-info, ponentes, agenda)
│ ├── Chatbot/ # AbstractAiClient + GeminiClient + DeepSeekClient + Settings + REST
│ ├── Contacto/ # REST Controller + Settings
│ ├── Settings/ # EventoSettings + SettingsPage
│ └── admin/ # Paneles Gutenberg (8 features)
│ ├── index.js # Entry — registra todos los paneles
│ └── panels/ # 8 paneles JS (uno por CPT)
│
├── admin/ # Assets
│ ├── admin.js # Modal confirmacion + sync ano (vanilla, no compilado)
│ ├── css/editor.css # Estilos del editor
│ ├── colors.json # Paleta de colores para Combobox
│ ├── icons.json # Iconos Font Awesome para Combobox
│ └── js/ # Output de npm run build
│ ├── index.js # Paneles compilados
│ └── index.asset.php # Dependencias auto-resueltas
│
├── languages/ # Traducciones (.pot)
└── vendor/ # Composer autoload (PSR-4)
⚡ Quick Start
# 1. Instalar dependencias
cd wp-content/plugins/conacyta-core
composer install
npm install
# 2. Compilar assets
npm run build
# 3. (Opcional) Regenerar archivo de traducciones .pot
npm run i18n:pot
# 4. Activar desde wp-admin > Plugins
# 5. Configurar: CONACYTA 2026 > Configuración > Evento
# 6. Cargar datos de demo (opcional)
# Copia el seed a mu-plugins/ — se ejecuta automaticamente una sola vez
cp conacyta-seed.php wp-content/mu-plugins/
🔌 REST API
Todos los endpoints se exponen bajo el namespace conacyta/v1. Los endpoints autenticados requieren el header X-WP-Nonce: {nonce} y un rate limit de 60 req/min/IP (configurable en conacyta_core_chat_rate_limit).
Chatbot — envío de mensaje
POST /wp-json/conacyta/v1/chat
Content-Type: application/json
X-WP-Nonce: {nonce}
{
"message": "¿Cuáles son las tarifas?",
"session_id": "abc-123" // opcional — mantiene contexto multi-turno
}
→ {
"reply": "Tenemos 3 tarifas: Asistente S/150, Investigador S/200...",
"suggestions": ["¿Qué incluye?", "¿Dónde inscribirme?", "Fechas"],
"session_id": "abc-123"
}
Chatbot — historial de sesión
GET /wp-json/conacyta/v1/chat/history?session_id=abc-123
X-WP-Nonce: {nonce}
→ {
"session_id": "abc-123",
"messages": [
{ "role": "user", "text": "¿Cuáles son las tarifas?" },
{ "role": "bot", "text": "Tenemos 3 tarifas..." }
],
"total": 2
}
Permite re-hidratar la conversación cuando el usuario recarga la página o vuelve más tarde. Storage server-side (transient conacyta_chat_hist_{session_id}, TTL 1800s, max 20 mensajes). Nunca retorna 404 — si no hay historial devuelve messages: [] con 200.
Agenda pública
GET /wp-json/conacyta/v1/agenda?dia=1
→ {
"items": [
{ "id": 1, "titulo": "Registro e Inauguración", "dia": 1, "hora_inicio": "08:00", "ponente": { ... } },
...
],
"total": 45,
"total_pages": 1
}
Cache 5 min. Filtros: dia, auditorio, tipo, ponente_id, per_page, page.
Contacto
POST /wp-json/conacyta/v1/contacto
X-WP-Nonce: {nonce}
{
"nombre": "Juan Pérez",
"email": "juan@example.com",
"mensaje": "Información sobre ponencias"
}
→ { "message": "Mensaje enviado correctamente..." }
🤖 Chatbot — Proveedores IA
| Proveedor | API Key | Function Calling | Modelos |
|---|---|---|---|
| DeepSeek V4 | API key propia (también vía constante CONACYTA_DEEPSEEK_API_KEY) |
✅ OpenAI-compatible + XML DSML nativo | deepseek-v4-flash · deepseek-v4-pro |
| Gemini (Google) | Connectors API WP 7.0 (Settings > Connectors) |
❌ Flash-Lite no soporta | gemini-3.1-flash-lite · gemini-3.5-flash (Preview) · gemini-3.1-pro |
Tools disponibles (DeepSeek)
| Tool | Fuente |
|---|---|
get_evento |
wp_options (EventoSettings) |
get_tarifas |
CPT tarifa |
get_ponentes |
CPT ponente |
get_agenda |
CPT agenda_item |
get_comite |
CPT comite_member |
get_cronograma |
CPT cronograma_fase |
get_actividades |
CPT actividad |
get_partners |
CPT partner |
buscar_informacion |
WP_Query (posts + páginas, top 5 por relevancia) |
get_conocimiento_general |
Conocimiento del modelo + zonas Sullana/Piura |
El modelo decide en tiempo real qué tool llamar según la pregunta del usuario. Soporta dos formatos de tool calls:
- OpenAI estándar (
finish_reason: tool_calls) — usado pordeepseek-v4-flash/v4-pro. - XML DSML nativo (
<调用 name="..."><参数 name="...">...</参数></调用>) — usado por variantes chinas. Extraído por regex y ejecutado transparentemente.
Multi-turn: hasta 3 rondas consecutivas de tool calls por mensaje. Tras tool execution, el prompt de Gemini se cachea en transient conacyta_context_prompt (TTL 300s) para reducir latencia.
Sugerencias estructuradas
Cada respuesta del bot debe terminar con un bloque ---SUGERENCIAS--- y exactamente 2 preguntas sugeridas. El cliente extrae y expone como array suggestions[] en la respuesta REST.
🎨 Paneles Gutenberg
Cada CPT tiene un panel en el sidebar del editor de bloques (PluginDocumentSettingPanel):
| CPT | Panel | Campos |
|---|---|---|
ponente |
Datos del Ponente | Título académico, Institución, País, Bandera |
actividad |
Detalles de Actividad | Icono (Font Awesome), Color Tailwind |
agenda_item |
Detalles de Agenda | Día, Hora inicio/fin, Ponente, Color dot |
tarifa |
Detalles de Tarifa | Precio, Moneda, Badge, URL inscripción |
comite_member |
Datos del Miembro | Rol (Presidente, Secretario, Tesorero, Vocal, Coordinador) |
partner |
Datos del Partner | Tipo, URL |
cronograma_fase |
Detalles de Fase | Fecha inicio, Fecha fin, Destacada |
portada |
Detalles de Portada | Principal, Tagline, CTA principal/secundario |
🌐 Frontend Integration
El plugin expone window.conacytaData en todas las páginas del frontend:
// window.conacytaData
{
restUrl: "https://.../wp-json/conacyta/v1",
nonce: "b09cd91446...", // Nonce REST válido sin login
chatEndpoint: ".../chat",
eventoFechaInicio: "2026-10-12",
eventoFechaFin: "2026-10-16"
}
Vanilla JS (fetch)
const { chatEndpoint, nonce } = window.conacytaData;
const res = await fetch(chatEndpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-WP-Nonce': nonce,
},
body: JSON.stringify({
message: '¿Cuáles son las tarifas?',
session_id: sessionId, // opcional — mantener contexto multi-turno
}),
});
const { reply, suggestions, session_id } = await res.json();
Interactivity API (recomendado WP 7.0+)
import { store } from '@wordpress/interactivity';
store('conacyta/chatbot', {
state: {
get nonce() {
return window.conacytaData?.nonce || '';
},
},
actions: {
async sendMessage(message) {
const res = await fetch(window.conacytaData.chatEndpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-WP-Nonce': state.nonce,
},
body: JSON.stringify({ message, session_id: state.sessionId }),
});
return await res.json();
},
},
});
No requiere login. El nonce REST es generado automáticamente por WordPress incluso para visitantes no logueados.
🤖 Abilities API (WP 7.0+ MCP integration)
El plugin registra 3 abilities via Abilities\AbilityRegistrar que exponen datos del evento a clientes MCP (Model Context Protocol) y a otros agentes IA. Se activan automáticamente si wp_register_ability() está disponible (WP 6.9+).
| Ability | Descripción | Output |
|---|---|---|
conacyta/get-site-info |
Información del evento: nombre, fechas, sede, organizador, URL inscripción | Objeto con evento, edicion, acronimo, anio, inicio, fin, sede, ciudad, organizador, facultad, url_inscripcion |
conacyta/list-ponentes |
Lista de ponentes magistrales | Array con id, nombre, titulo, institucion, pais, enlace |
conacyta/get-agenda |
Agenda filtrada por día, auditorio y tipo | Array con id, titulo, hora_inicio, hora_fin, auditorios[], tipos[], ponente |
Permisos: __return_true (públicas, sin auth, para consumo por agentes). Definidas con input_schema y output_schema JSON-Schema, y metadata mcp: { public: true, type: "tool" } para descubrimiento.
🌐 Internacionalización
- Text domain:
conacyta - Archivo POT:
languages/conacyta.pot - Generación automática:
npm run i18n:pot— escaneasrc/**/*.phpyadmin/**/*.jsextrayendo strings con__(),_e(),esc_html__(), etc.
El plugin incluye .editorconfig con reglas de encoding consistentes con el tema (charset = utf-8 sin BOM, end_of_line = lf, indentación por tipo de archivo).
🔧 Requisitos
| Requisito | Versión |
|---|---|
| WordPress | 7.0 o superior |
| PHP | 8.3 o superior |
| Tema | Block Theme (FSE) — recomendado: Conacyta Theme |
| Node.js | 24 LTS (solo para desarrollo) |
| pnpm / npm | Para build de assets |
📦 Build & Release
# Desarrollo
npm run build # Compilar paneles Gutenberg (webpack)
npm run i18n:pot # Regenerar languages/conacyta.pot
composer dump-autoload # Regenerar autoload PSR-4
# Distribución
npm run build:zip # → conacyta-core-1.0.2.zip (~80 KB, listo para produccion)
🤝 Contributing
- Clona el repositorio en
wp-content/plugins/conacyta-core/ - Instala dependencias:
composer install && npm install - Crea un branch:
git checkout -b feature/nueva-funcionalidad - Asegúrate que el build compile:
npm run build - PHP lint:
composer dump-autoload --optimize - Commit y PR
📄 Licencia
GPLv2 or later. Ver LICENSE.
📝 Changelog
v1.0.2 (jun 2026) — Release actual
Nuevas funcionalidades
- Abilities API (MCP): 3 abilities registradas vía
AbilityRegistrar(conacyta/get-site-info,conacyta/list-ponentes,conacyta/get-agenda) para integración con clientes MCP y agentes IA externos (WP 6.9+ / 7.0+). - Endpoint historial de chat:
GET /conacyta/v1/chat/history?session_id=...permite re-hidratar conversaciones al recargar la página. Storage unificado en transient (TTL 1800s, max 20 mensajes). - DeepSeek V4 tool calls duales: soporte para formato OpenAI estándar (
finish_reason: tool_calls) y XML DSML nativo (<调用 name="..."><参数 .../></调用>) con extracción transparente via regex. - Script de internacionalización:
npm run i18n:potgeneralanguages/conacyta.potdesdesrc/**/*.phpyadmin/**/*.js. .editorconfig: reglas de encoding (UTF-8 sin BOM, LF, indentación por tipo) sincronizadas con el tema.- SVG upload support: archivos
.svgpermitidos en el media library con sanitización de cabeceras XML para prevenir XSS. - Cache de contexto de Gemini: el system prompt con datos de CPTs inyectados se cachea 5 min (
conacyta_context_prompt) para reducir latencia.
Correcciones
- Defaults en
wp_optionscon tildes y caracteres UTF-8 correctos (Sullana, Perú,Facultad de Ingeniería de Industrias Alimentarias y Biotecnología,Convocatoria Próxima,Envío de Resúmenes, etc.). - Etiqueta
conacyta_evento_seccion_agendacambiada aPrograma(default:Programa Oficial del Congreso). - Rate limit por IP con headers
CF-Connecting-IP/X-Forwarded-Forpara compatibilidad con proxies y CDNs. - Gemini 3.5 Flash (Preview) agregado a los modelos disponibles.
v1.0.1 (jun 2026)
- 8 CPTs con paneles Gutenberg y meta fields tipados.
- 4 taxonomías con capacidades por rol.
- 3 REST endpoints públicos (chat, contacto, agenda).
- Página de configuración con 3 pestañas y 5 sub-tabs en Evento.
- Chatbot IA dual: Gemini (Connectors API WP 7.0) y DeepSeek V4 (10 tools).
- 8 Block Variations generadas vía
VariationFactory. - Registro unificado de meta vía
MetaRegistrar(register_post_meta + register_rest_field con type coercion). - Helpers compartidos:
EventDateHelper,AbstractAiClient,Auth.
v1.0.0 (may 2026)
- Release inicial.
👤 Créditos
Desarrollado por Leumin Omar Saavedra Peña (@nftsaavedra)
Soporte tecnológico · Unidad de Proyectos de Investigación
Universidad Nacional de Frontera · Sullana, Perú
XVII CONACYTA 2026 — Innovación, sostenibilidad y seguridad alimentaria para el futuro.