WEBINAR TÉCNICO EXCLUSIVO

De los datos a las decisiones: Habilitando agentes de IA con MCP

FECHA 2025

VIERNES 31 DE OCTUBRE

¿Tu equipo pierde más tiempo buscando información que resolviendo problemas?

Descubre cómo los nuevos Agentes de IA conversacional transforman tus manuales, reportes y datos de planta en un experto disponible 24/7, listo para darte respuestas precisas y acelerar tus decisiones.

EXPOSITOR

Mario Hernández

Head of ML & Data Models en PK Soluciones, con la misión de transformar datos industriales en decisiones rentables. Especialista en IA Predictiva, Visión Artificial e IA Generativa para minería, cemento y manufactura. Ingeniero Mecatrónico, Candidato a Magíster en Ciencia de Datos y AWS Certified Machine Learning - Specialty.

Mario Hernández

En este WEBINAR aprenderás cómo:

Reducir el tiempo de análisis de horas a segundos.

Acelerar la resolución de problemas con acceso inmediato a documentación técnica.

FECHA: VIERNES, OCTUBRE 31, 2025
} } } // ✅ PROTECCIÓN 3: Detección de spam básico (Contenido - Nivel MEDIO) function detectSpam(datos) { const spamIndicators = [ /(.)\1{4,}/g, // Caracteres repetidos /(free|gratis|oferta|descuento|promocion|viagra|casino|poker|lottery)/gi, /[A-Z]{10,}/g, // Muchas mayúsculas /[0-9]{8,}/g, // Muchos números seguidos /(http|www|\.com|\.net|\.org)/gi // URLs ]; let spamScore = 0; const allText = Object.values(datos).join(' ').toLowerCase(); for (let pattern of spamIndicators) { const matches = allText.match(pattern); if (matches) { spamScore += matches.length; } } if (spamScore > 3) { console.warn('⚠️ Posible spam detectado. Score:', spamScore); throw new Error('Contenido sospechoso detectado'); } return spamScore; } // Funcionalidad del menú móvil document.addEventListener('DOMContentLoaded', function() { const menuToggle = document.querySelector('.menu-toggle'); const navMenu = document.querySelector('.nav-menu'); const nav = document.querySelector('.main-nav'); // Toggle menú móvil menuToggle.addEventListener('click', function() { navMenu.classList.toggle('show'); }); // Efecto scroll en navegación window.addEventListener('scroll', function() { if (window.scrollY > 50) { nav.classList.add('scrolled'); } else { nav.classList.remove('scrolled'); } }); // Funcionalidad del formulario const form = document.querySelector('.webinar-form'); form.addEventListener('submit', function(e) { e.preventDefault(); // Deshabilitar botón durante el envío const submitButton = form.querySelector('.register-btn'); const originalText = submitButton.innerHTML; submitButton.innerHTML = ' Procesando...'; submitButton.disabled = true; try { // Obtener los datos del formulario const formData = new FormData(form); const datos = Object.fromEntries(formData); // Validar campos requeridos if (!datos.nombre || !datos.email || !datos.acepto) { throw new Error('Por favor completa todos los campos y acepta los términos de privacidad.'); } // ✅ PROTECCIÓN 9: Limpieza de datos (Sanitización - Nivel ALTO) const datosSanitizados = {}; for (let [key, value] of Object.entries(datos)) { if (key !== 'acepto') { // No sanitizar checkbox datosSanitizados[key] = sanitizeInput(value); } else { datosSanitizados[key] = value; } } // ✅ Validar límites de datos validateDataLimits(datosSanitizados); // ✅ Detectar spam const spamScore = detectSpam(datosSanitizados); // ✅ PROTECCIÓN 4: Validación de email mejorada const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; if (!emailRegex.test(datosSanitizados.email)) { throw new Error('Por favor, ingresa un email válido.'); } // ✅ Preparar datos para envío const datosEnvio = { ...datosSanitizados, evento: 'Webinar: De los datos a las decisiones - Habilitando agentes de IA con MCP', fecha_evento: '2025-10-31', origen: 'Webinar Landing Page', timestamp: new Date().toISOString() }; console.log('Datos a enviar:', datosEnvio); // ✅ PROTECCIÓN 6: Timeout automático (Red - Nivel MEDIO) const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), 30000); // ✅ Enviar datos a API Gateway fetch('https://46g3qw11gg.execute-api.us-east-1.amazonaws.com/prod/eventos', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(datosEnvio), signal: controller.signal }) .then(response => { clearTimeout(timeoutId); console.log('Response status:', response.status); if (!response.ok) { return response.text().then(text => { console.error('Error response body:', text); throw new Error(`Error del servidor: ${response.status}`); }); } return response.json(); }) .then(data => { console.log('✅ Success response:', data); // ✅ Resetear contador de intentos fallidos submissionAttempts = 0; // ✅ Activar evento de LinkedIn solo cuando el formulario se envía exitosamente if (window.lintrk) { window.lintrk('track', { conversion_id: 22929130 }); console.log('✅ LinkedIn conversion event triggered'); } // Éxito: mostrar mensaje de confirmación showNotification('¡Registro exitoso!', 'Te enviaremos los detalles del webinar por email.', 'success'); // Limpiar el formulario completamente form.reset(); // Asegurar que todos los campos estén limpios form.querySelectorAll('input[type="text"], input[type="email"]').forEach(input => { input.value = ''; }); form.querySelector('input[type="checkbox"]').checked = false; }) .catch(error => { clearTimeout(timeoutId); // ✅ PROTECCIÓN 7: Contador de intentos fallidos (Monitoreo - Nivel BAJO) submissionAttempts++; console.error('❌ Full error details:', error); // ✅ PROTECCIÓN 10: Manejo de errores específicos (UX - Nivel BAJO) let errorMessage = 'Error al enviar formulario'; if (error.name === 'AbortError') { errorMessage = 'Tiempo de espera agotado. Verifica tu conexión e intenta nuevamente.'; } else if (error.message.includes('spam') || error.message.includes('malicioso')) { errorMessage = 'Contenido no permitido detectado.'; } else if (error.message === 'Failed to fetch') { errorMessage = 'Error de conexión.'; } else if (error.message.includes('404')) { errorMessage = 'Servicio no disponible temporalmente.'; } else if (error.message.includes('500')) { errorMessage = 'Error interno del servidor. Intenta más tarde.'; } else { errorMessage = `Error: ${error.message}`; } showNotification('Error al enviar formulario', errorMessage, 'error'); }) .finally(() => { // ✅ Restaurar botón siempre submitButton.innerHTML = originalText; submitButton.disabled = false; }); } catch (error) { // ✅ Manejar errores de validación console.error('❌ Validation error:', error); showNotification('Error de validación', error.message, 'error'); // Restaurar botón submitButton.innerHTML = originalText; submitButton.disabled = false; } }); // Función para mostrar notificaciones function showNotification(title, message, type = 'success') { const container = document.getElementById('notification-container'); // Crear elemento de notificación const notification = document.createElement('div'); notification.className = `notification ${type}`; // Iconos según el tipo const icons = { success: '✓', error: '✕' }; notification.innerHTML = `
${icons[type] || '✓'}

${title}

${message}

`; // Agregar al contenedor container.appendChild(notification); // Trigger de animación setTimeout(() => { notification.classList.add('show'); }, 100); // Auto-close después de 5 segundos setTimeout(() => { closeNotification(notification.querySelector('.notification-close')); }, 5000); } // Función para cerrar notificaciones function closeNotification(closeButton) { const notification = closeButton.closest('.notification'); notification.classList.remove('show'); setTimeout(() => { if (notification.parentNode) { notification.parentNode.removeChild(notification); } }, 400); } // Animaciones al hacer scroll const observerOptions = { threshold: 0.1, rootMargin: '0px 0px -50px 0px' }; const observer = new IntersectionObserver(function(entries) { entries.forEach(entry => { if (entry.isIntersecting) { entry.target.style.opacity = '1'; entry.target.style.transform = 'translateY(0)'; } }); }, observerOptions); // Observar elementos para animación document.querySelectorAll('.learning-item, .expositor-section, .event-date-section').forEach(el => { el.style.opacity = '0'; el.style.transform = 'translateY(30px)'; el.style.transition = 'all 0.6s ease'; observer.observe(el); }); }); } } } // ✅ PROTECCIÓN 3: Detección de spam básico (Contenido - Nivel MEDIO) function detectSpam(datos) { const spamIndicators = [ /(.)\1{4,}/g, // Caracteres repetidos /(free|gratis|oferta|descuento|promocion|viagra|casino|poker|lottery)/gi, /[A-Z]{10,}/g, // Muchas mayúsculas /[0-9]{8,}/g, // Muchos números seguidos /(http|www|\.com|\.net|\.org)/gi // URLs ]; let spamScore = 0; const allText = Object.values(datos).join(' ').toLowerCase(); for (let pattern of spamIndicators) { const matches = allText.match(pattern); if (matches) { spamScore += matches.length; } } if (spamScore > 3) { console.warn('⚠️ Posible spam detectado. Score:', spamScore); throw new Error('Contenido sospechoso detectado'); } return spamScore; } // Funcionalidad del menú móvil document.addEventListener('DOMContentLoaded', function() { const menuToggle = document.querySelector('.menu-toggle'); const navMenu = document.querySelector('.nav-menu'); const nav = document.querySelector('.main-nav'); // Toggle menú móvil menuToggle.addEventListener('click', function() { navMenu.classList.toggle('show'); }); // Efecto scroll en navegación window.addEventListener('scroll', function() { if (window.scrollY > 50) { nav.classList.add('scrolled'); } else { nav.classList.remove('scrolled'); } }); // Funcionalidad del formulario const form = document.querySelector('.webinar-form'); form.addEventListener('submit', function(e) { e.preventDefault(); // Deshabilitar botón durante el envío const submitButton = form.querySelector('.register-btn'); const originalText = submitButton.innerHTML; submitButton.innerHTML = ' Procesando...'; submitButton.disabled = true; try { // Obtener los datos del formulario const formData = new FormData(form); const datos = Object.fromEntries(formData); // Validar campos requeridos if (!datos.nombre || !datos.email || !datos.acepto) { throw new Error('Por favor completa todos los campos y acepta los términos de privacidad.'); } // ✅ PROTECCIÓN 9: Limpieza de datos (Sanitización - Nivel ALTO) const datosSanitizados = {}; for (let [key, value] of Object.entries(datos)) { if (key !== 'acepto') { // No sanitizar checkbox datosSanitizados[key] = sanitizeInput(value); } else { datosSanitizados[key] = value; } } // ✅ Validar límites de datos validateDataLimits(datosSanitizados); // ✅ Detectar spam const spamScore = detectSpam(datosSanitizados); // ✅ PROTECCIÓN 4: Validación de email mejorada const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; if (!emailRegex.test(datosSanitizados.email)) { throw new Error('Por favor, ingresa un email válido.'); } // ✅ Preparar datos para envío const datosEnvio = { ...datosSanitizados, evento: 'Webinar: De los datos a las decisiones - Habilitando agentes de IA con MCP', fecha_evento: '2025-10-31', origen: 'Webinar Landing Page', timestamp: new Date().toISOString() }; console.log('Datos a enviar:', datosEnvio); // ✅ PROTECCIÓN 6: Timeout automático (Red - Nivel MEDIO) const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), 30000); // ✅ Enviar datos a API Gateway fetch('https://46g3qw11gg.execute-api.us-east-1.amazonaws.com/prod/eventos', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(datosEnvio), signal: controller.signal }) .then(response => { clearTimeout(timeoutId); console.log('Response status:', response.status); if (!response.ok) { return response.text().then(text => { console.error('Error response body:', text); throw new Error(`Error del servidor: ${response.status}`); }); } return response.json(); }) .then(data => { console.log('✅ Success response:', data); // ✅ Resetear contador de intentos fallidos submissionAttempts = 0; // ✅ Activar evento de LinkedIn solo cuando el formulario se envía exitosamente if (window.lintrk) { window.lintrk('track', { conversion_id: 22929130 }); console.log('✅ LinkedIn conversion event triggered'); } // Éxito: mostrar mensaje de confirmación showNotification('¡Registro exitoso!', 'Te enviaremos los detalles del webinar por email.', 'success'); // Limpiar el formulario completamente form.reset(); // Asegurar que todos los campos estén limpios form.querySelectorAll('input[type="text"], input[type="email"]').forEach(input => { input.value = ''; }); form.querySelector('input[type="checkbox"]').checked = false; }) .catch(error => { clearTimeout(timeoutId); // ✅ PROTECCIÓN 7: Contador de intentos fallidos (Monitoreo - Nivel BAJO) submissionAttempts++; console.error('❌ Full error details:', error); // ✅ PROTECCIÓN 10: Manejo de errores específicos (UX - Nivel BAJO) let errorMessage = 'Error al enviar formulario'; if (error.name === 'AbortError') { errorMessage = 'Tiempo de espera agotado. Verifica tu conexión e intenta nuevamente.'; } else if (error.message.includes('spam') || error.message.includes('malicioso')) { errorMessage = 'Contenido no permitido detectado.'; } else if (error.message === 'Failed to fetch') { errorMessage = 'Error de conexión.'; } else if (error.message.includes('404')) { errorMessage = 'Servicio no disponible temporalmente.'; } else if (error.message.includes('500')) { errorMessage = 'Error interno del servidor. Intenta más tarde.'; } else { errorMessage = `Error: ${error.message}`; } showNotification('Error al enviar formulario', errorMessage, 'error'); }) .finally(() => { // ✅ Restaurar botón siempre submitButton.innerHTML = originalText; submitButton.disabled = false; }); } catch (error) { // ✅ Manejar errores de validación console.error('❌ Validation error:', error); showNotification('Error de validación', error.message, 'error'); // Restaurar botón submitButton.innerHTML = originalText; submitButton.disabled = false; } }); // Función para mostrar notificaciones function showNotification(title, message, type = 'success') { const container = document.getElementById('notification-container'); // Crear elemento de notificación const notification = document.createElement('div'); notification.className = `notification ${type}`; // Iconos según el tipo const icons = { success: '✓', error: '✕' }; notification.innerHTML = `
${icons[type] || '✓'}

${title}

${message}

`; // Agregar al contenedor container.appendChild(notification); // Trigger de animación setTimeout(() => { notification.classList.add('show'); }, 100); // Auto-close después de 5 segundos setTimeout(() => { closeNotification(notification.querySelector('.notification-close')); }, 5000); } // Función para cerrar notificaciones function closeNotification(closeButton) { const notification = closeButton.closest('.notification'); notification.classList.remove('show'); setTimeout(() => { if (notification.parentNode) { notification.parentNode.removeChild(notification); } }, 400); } // Animaciones al hacer scroll const observerOptions = { threshold: 0.1, rootMargin: '0px 0px -50px 0px' }; const observer = new IntersectionObserver(function(entries) { entries.forEach(entry => { if (entry.isIntersecting) { entry.target.style.opacity = '1'; entry.target.style.transform = 'translateY(0)'; } }); }, observerOptions); // Observar elementos para animación document.querySelectorAll('.learning-item, .expositor-section, .event-date-section').forEach(el => { el.style.opacity = '0'; el.style.transform = 'translateY(30px)'; el.style.transition = 'all 0.6s ease'; observer.observe(el); }); });