Transcription
Bienvenido al curso más completo en español para pasar de absolutamente cero, sin saber nada de automatización, a convertirte en una persona que resuelve problemas reales y es capaz de venderlos con N8N. Este curso está diseñado para que aprendas desde la base, aunque no tengas experiencia técnica, y termines siendo capaz de automatizar procesos reales, tanto para ti como para otros.
El objetivo es que puedas usar las automatizaciones para emprender tu propia agencia de inteligencia artificial y resolver problemas con impacto real. Yo soy Agustín Medina, dirijo mi propia agencia de inteligencia artificial. De hecho, ahora mismo estoy en mi oficina, donde trabajo a diario construyendo sistemas para empresas que quieren dejar el trabajo manual a un lado. Y empecé desde cero, sin formación previa, sin saber programar, pero con una obsesión total por aprender lo que de verdad funciona. Y ahora, un año después, lideramos la comunidad más grande para emprendedores de agencias de inteligencia artificial de habla hispana, Aink.
Hemos visto a demasiada gente muy estancada, y no por falta de ganas, sino por todo el ruido que hay actualmente. Y por eso hicimos este curso, porque estamos cansados. Cansados de cursitos vacíos que solo tienen la función de venderte otro cursito, y cansados de ver a gente enseñar cosas que no usan ni entienden a la perfección. Esto no es un curso más. Es una guía práctica, clara y directa, enfocada en enseñarte a pensar como un arquitecto de sistemas, construir automatizaciones simples y escalables, y aplicar N8N y las automatizaciones para resolver problemas con propósitos reales.
He dividido este vídeo en capítulos muy diferenciados por si ya tienes más experiencia y quieres saltar a partes más avanzadas. Si vas en serio, te recomiendo verlo completo, porque va a cambiar tu forma de ver la inteligencia artificial. La idea de este curso es que reduzcamos la fricción prácticamente a cero y tomemos acción inmediata. Es por eso que vamos a empezar construyendo aplicaciones reales que podéis implementar directamente en vuestra agencia, aunque estéis empezando, o que incluso podéis vender a clientes si las implementáis correctamente. Y para esto vamos a utilizar la versión cloud de N8N con la versión gratuita. Y la instalación en local o en VPS la cubriremos al final del curso. Por lo tanto, tranquilos en esto.
Después pasaremos a ver cómo manipulamos e integramos en vivo los diferentes nodos de inteligencia artificial. Incluso veréis cómo integro un agente de inteligencia artificial en forma de chatbot en mi propia página web en vivo, de nuevo. Después pasaremos a nodos de manipulación de datos, nodos de manipulación de flujos, estructuras de datos, y acabaremos culminando con un proyecto integrador donde escaparemos una página web de artículos donde hay diferentes precios e información relativa a estos artículos, y pasaremos un reporte a un cliente simulado que nos ha solicitado esta automatización para estar al tanto de los últimos cambios en su competencia.
Después pasaremos a una parte fundamental que es la teoría de RAG, que no es de miedo este nombre, que al final es chatear con documentos internos, documentos que ocupen una gran cantidad de caracteres, que sean dimensiones muy grandes, y que tengamos chatbots con la capacidad de chatear con estos documentos. Esto lo haremos con un proyecto profesional, un proyecto que haremos paso a paso de la mano, y que veréis cómo integramos con todas las problemáticas que vayan surgiendo.
Después pasaremos a instalar nuestro N8N en una instancia local. Utilizaremos un VPS gratuito, en este caso la versión gratuita inicial para que no haya fricción. Siempre veréis cómo exploramos los nodos comunitarios, en concreto Evolution Appi, para aprovechar y que veáis cómo integramos WhatsApp directamente en una automatización, en concreto con un agente de inteligencia artificial que tiene la capacidad de agendar directamente en Google Calendar, tener acceso al stock de una tienda y poder hacer consultas relativas a consultas frecuentes, valga la redundancia, de este negocio.
Por último, acabaremos hablando acerca de diferentes cuestiones relacionadas con el global del negocio, como puede ser cultura general acerca de lo que debemos conocer de inteligencia artificial para poder iniciarnos en esto, iniciarnos como profesionales reales. Y por último hablaremos de ventas y la importancia que tiene la correcta mentalidad. Espero que de verdad os guste lo que se viene, porque veréis que es una completa locura.
Bien, pues para acceder a la versión Cloud de N8N, lo que tendremos que hacer simplemente es buscarlo en Google. El primer resultado que nos aparezca, pulsamos en él. Esto nos llevará a la página principal de N8N, que es la que estáis viendo aquí. Aquí tenemos, bueno, multitud de opciones y de datos que ahora mismo no tienen demasiada importancia. Incluso, bueno, nos ponen aquí un poco jactándose de las colaboraciones que tienen y sobre todo las integraciones, ¿no?, que como veníamos diciendo es una de las partes más importantes que tiene N8N, las integraciones con servicios externos.
Em, están haciendo un esfuerzo bastante intensivo en mejorar. Se va notando en detallitos como la página web, que hace muy poco la han la han mejorado. Han puesto este tema así un poco más oscuro, dark. A mí personalmente no me acaba de gustar. El anterior me parecía que tenía mejor branding, pero bueno. Para acceder y registrarnos vamos al botoncito este que nos aparece aquí arriba o este de aquí, como queráis. Get started. Pulsamos en él. Nos aparecerá un registro convencional. Simplemente rellenamos el formulario con nuestros datos. Esto ponemos un correo electrónico. Como veis, e nos dice que tiene que ser un correo electrónico de de empresa, pero no es necesario, ¿vale? Con un Gmail convencional que utilicéis personal vuestro, más que suficiente.
Vale, aquí nos pide la confirmación, nos deja pegar bien. Password y el account name. Vale, esto es bastante importante lo de la cod name porque es lo que aparecerá en vuestra URL cuando compartáis vuestro espacio de trabajo o cuando creéis webhooks externos para acceder a vuestra aplicación. Esto ya lo entenderemos, ¿vale?, de en sesiones más avanzadas, pero básicamente que sea un nombre representativo, algo que tanto os podáis acordar como os gustaría ver constantemente, ¿no? En este caso vamos a poner tutorial eh YouTube link, sin más, un poco largo, pero vaya, esto no lo vamos a pulsar, ¿vale?, para que no nos bombardeen con el tema de la newsletter. Y como veis, en el primer registro con el correo electrónico que que hayamos seleccionado, nos permiten una prueba de 14 días, una prueba gratuita. ¿Vale? En esta prueba tendremos desbloqueadas todas las funcionalidades y no no os lo voy a decir yo, pero vaya, si tenéis varios correos electrónicos, ya os podéis imaginar lo que podéis hacer, ¿verdad?
Aquí simplemente nos hacen el típico cuestionario de todos los softwares y programas que que te bombardean hoy en día con este cuestionario que es bastante aburrido, pero vaya, vamos a hacerlo lo más rápido posible. Esto es para invitar a usuarios a nuestro workspace. Imaginad que trabajamos en un equipo y queremos que múltiples personas interaccionen dentro de ese workspace y de esta forma pues tener ese espacio más colaborativo y no tener que estar compartiendo los workflows de forma convencional, que es un poquito más lento. Vale, de momento no lo vamos a hacer, simplemente skip y ya está. Nos aparece el vídeo del señor fundador de de N8N, si no recuerdo mal, que es este de aquí, que es un poco el onboarding explicando, bueno, pues los keycepts, ¿no?, que le llaman aquí. De momento lo vamos a saltar esto de aquí y veremos que lo primero que nos encontramos es esta página, ¿vale? Esta especie de menú donde hay muchísima información y sé que al principio puede ser un poquito abrumador, pero que vamos a desgranar poco a poco y que veréis que es muy sencillo.
Aquí arriba a la izquierda nos aparece el número de ejecuciones que tenemos disponibles, ¿vale? N8N trabaja con un modelo de ejecuciones por tiempo, es decir, si nosotros tenemos una suscripción de $25 mensuales, si no recuerdo mal, tendremos hasta 2,500 ejecuciones mensuales. Eso quiere decir que ese workflow, ese flujo de trabajo, se podrá ejecutar 2,500 veces. Con el plan gratuito nos permiten hasta 1000 ejecuciones. A partir de ahí, pues se nos limita y ya está. Aquí nos pone lo de upgrade, que lo vamos a cerrar de momento. Em, tenemos la opción de crear un workflow, como veis aquí arriba a la a la derecha y con el con el desplegable de crear credenciales. Esto de las credenciales es por si necesitamos integrar servicios externos como puede ser Gmail, Google Sheets, Air Table, WhatsApp, sea lo que sea que necesitemos, tenemos que hacerlo creando una credencial, una autenticación para poder acceder a ese servicio externo. Y de igual forma podemos crear nuestro workflow directamente desde aquí. Si os fijáis, aquí han añadido recientemente una especie de de interfaz o una especie de de locks, ¿vale?, donde podemos ver cómo las ejecuciones en los últimos 7 días se han dado, ¿vale?, tanto los fallos como el ratio de fallos como el tiempo guardado como el tiempo que ha estado ejecutándose esto, ¿vale? Esto es para que tengamos aquí un dashboard donde de un solo vistazo podemos ver cómo están funcionando nuestras automatizaciones.
Siguiendo un poco con la parte que tenemos por aquí, como veis tenemos una sección de workflows, que aquí como su nombre indica, es donde se guardan ordenadamente todos los workflows y proyectos que vamos a ir creando a lo largo del tiempo. Tenemos la opción de start from scratch, que básicamente es empezar de cero, exactamente lo que haríamos desde este botoncito. Y esto de aquí de test un agente de inteligencia artificial simple, básicamente es que directamente cuando pulsas ahí te pone un agente de inteligencia artificial directamente en N8N sin más. Lo mismo con las credenciales. Aquí tendríamos listadas todas las credenciales de un solo vistazo y en ejecuciones tendríamos cómo se han dado las diferentes ejecuciones de nuestros diferentes flujos a lo largo del tiempo. Esto nos permitiría saber si alguna de ellas ha fallado directamente aquí desde estatus. El workflow nos dice el nombre del workflow, cuándo ha empezado, el tiempo que ha estado ejecutándose y el ID de ejecución. ¿Vale?
Em, siguiendo un poco con la columna que estamos viendo aquí en la parte izquierda, tenemos una sección de personal porque esto serían los proyectos, sería como una forma de modularizar los diferentes proyectos jerárquicamente. ¿Vale? Podríamos poner, por ejemplo, que un proyecto sea ALink y de ALink subyacen todas los flujos o todos los subproyectos que conforman a ese proyecto superior. En el panel de administración, este de aquí, que esto solo lo tenéis en la versión cloud, no lo tenéis en la versión local, es donde tenemos todo lo relativo a la información de versiones, ¿vale? Los logs, esto debéis acceder desde aquí, ¿vale? Al a la ruedita esta de aquí. Bueno, aquí nos pone lo primero que si queremos actualizar el plan, pero como si os fijáis desde aquí lo primero que nos pone es la versión, ¿vale? Esto no se actualiza automáticamente, sino que debemos hacerlo nosotros manualmente a través de este desplegable y deberíamos seleccionar la última versión, siempre seleccionando la estable, ¿vale? Si si seleccionáis la beta, muy probablemente eh tendréis el riesgo de que de que no esté correctamente probada, no esté testeada y podéis tener algún fallito, ¿vale?, aún aún sabiendo que tendremos lo último, ¿vale?
Aquí en zona horaria es muy importante que configuréis vuestra zona horaria, ya que del de lo contrario lo que ocurrirá es que vuestro workflow estará desfasado, ¿vale? Si configuráis fechas internas o hacéis condiciones dentro de vuestro workflow que dependan de la fecha, tendréis problemas. Entonces, es muy importante que que pongáis vuestra vuestra fecha. Y en esto de executions to safe, eh, no os voy a dar la chapa porque realmente no merece mucho la pena en el momento del curso que nos encontramos. Básicamente es que almacena estas este tipo de información. Una vez actualizáis la versión, le dais a save change, ¿vale?, y directamente lo que hará es actualizarlo sin más. Esto nos permite reiniciar el el workspace, ¿vale?, nuestro nuestro canva, nuestros nuestros flujos. Esto es para saber cómo están el estado de de nuestros pagos, ¿vale?, de las suscripciones y esto es para exportar. Sin más, volvemos a la sección del dashboard, que es esta de aquí. Y para acceder de nuevo a nuestro interfaz general, le damos aquí a open. Volvemos a nuestro interfaz general y seguimos por la parte izquierda, donde, como veis, tenemos otra sección que son los templates.
Esto de los templates sí que es muy interesante y suelo recomendar muchísimo que al menos cuando empecemos a dar nuestros primeros pasos perdamos un poco el tiempo mirando los diferentes templates de la comunidad que hay aquí expuestos y que la mayoría de ellos son totalmente gratuitos, ya que muy probablemente e todas las necesidades que nosotros vayamos detectando a lo largo del día, imaginad por ejemplo que necesitamos un flujo de marketing o que le estamos ofreciendo a un cliente una solución relacionada con mejorar sus ventas, ¿vale?, pues lo único que tenemos que hacer es venir a la sección de ventas o a la sección de marketing y buscar aquellos flujos que puedan parecerse a aquello que necesitamos, ¿vale? Muy de forma poco probable vamos a encontrar exactamente aquella necesidad al 100%, pero sí que vamos a sí que vamos a encontrar aproximaciones bastante buenas. Por ejemplo, este de aquí, ¿no?, que que es un flujo de inteligencia artificial que genera leads con reddit, open router y Gmail. Bueno, en este caso este es de pago, ¿vale? Vamos a seleccionar, por ejemplo, este. Y si accedéis veréis que simplemente lo podéis utilizar de forma totalmente gratuita pulsando y se os importará directamente a vuestro canvas. Vamos a ir cerrando y volvemos a al menú general.
Esto de variables que veis aquí es para tener variables globales dentro de todos vuestros workflows. Ahora mismo no os interesa demasiado, ¿vale? Es algo que veremos posteriormente. E de estos menús no vamos a comentar nada de momento, no creo que merezca la pena. Y vamos a ir a nuestro personal para crear nuestro primer workflow. Como comentábamos, para crear un Wflow pulsamos aquí en Create Worflow y ahora ya tenemos acceso a lo que es nuestro canvas, ¿vale? Desde aquí es donde nosotros configuraremos todos nuestros flujos de trabajo, donde arrastraremos nuestros nodos y donde haremos todo lo relativo a la creación de nuestras automatizaciones. ¿Vale?
Em, como veis aquí en la parte superior izquierda tenemos que estamos en personal, que nuestro workflow actualmente por defecto es My Workflow. Aquí es donde cambiamos el nombre y le damos el nombre específico de nuestro Wflow. vamos a decir que es test eh YouTube. Y por otro lado, eh siguiendo con el tema de darle un poquito más de especificidad por aquello de que si vamos a tener muchísimos workflows no nos confundamos, podemos darle un pequeño tag y así lo tenemos identificado, ¿vale? Lo podemos crear directamente desde aquí y como veis automáticamente está bajo el tag de YouTube. Aquí, como veis, tenemos tanto el editor como las ejecuciones, que es exactamente lo mismo que hemos comentado en el menú principal. Aquí es donde se guardarían todos los logs de las diferentes ejecuciones de esta automatización. Volviendo al editor, veremos que tenemos una pestañita aquí que nos Veremos que tenemos una pestañita aquí que nos permite ponerlo tanto en activo como en inactivo. E esto sería para pasarlo a producción, ¿vale? Nosotros por defecto los workflows que tenemos configurados están en modo prueba. Si queremos pasarlos a producción para que se ejecutenante. Desde aquí. Esto ya lo comentaremos. Esto de share es por si queremos compartirlo, pero compartirlo directamente con alguien que ya tenga acceso a lo que sería N8N y esté registrado, ¿vale?, tendríamos que tener su correo electrónico y de esta forma lo podemos invitar para que pueda acceder a este flujo de trabajo. Normalmente no es una funcionalidad que se utilice demasiado, ya os lo digo.
Desde aquí eh lo que podemos hacer es restaurar versiones anteriores de este mismo workflow. Imaginad que por lo que sea habéis hecho algo sobre un workflow que ya funcionaba correctamente, os empieza a fallar desde aquel entonces. En ese caso, esta funcionalidad de aquí os aporta muchísimo y os ayuda muchísimo. Vamos a cerrar. Aquí en los tres puntitos, ¿vale?, que están bastante ocultos, pero que son muy necesarios, tenemos funcionalidades tales como duplicar, que esto simplemente, como su nombre indica, duplicar este este flujo de trabajo. En otro canvas, podemos descargarlo. Esto se lo descarga en Jason, JavaScript object Notation, ¿vale?, Vale, que es como están codificados los flujos de trabajo en N8N por defecto. Le dais a permitir y veréis que os descarga un punto Jason directamente en vuestro ordenador. Esto si lo compartís con otros usuarios lo puede importar directamente con esta funcionalidad de aquí de import from file, ¿vale?, import from URL, básicamente es que te comparten una URL en específico, la pegas y de esa forma puedes tener acceso a ese flujo.
Aquí en settings son configuraciones que no vais a tener que tocar demasiado, ¿vale? Eh, no merece la pena ni que ni que las comentemos. Ya veis que son cosas muy estandarizadas y realmente lo importante aquí y lo que sí que debéis de tener en cuenta es lo de la zona horaria, ¿vale?, aunque si lo tenéis bien configurado donde lo hemos visto antes, realmente no creo que tengáis demasiado problemas. Em, vamos a a guardar, vamos a salir. Como vemos, aquí tenemos acceso al GitHub, ¿vale?, de N8N. Y aquí ya tenemos lo que verdaderamente nos importa, ¿vale? Que sería el más para que podamos seleccionar los diferentes nodos y poder arrastrarlos a nuestro flujo de trabajo. Como veis aquí, que esto lo comentaremos ahora. Tenemos otra opción de sticky note aquí, que es para poner notas dentro de nuestro flujo de trabajo, que para esto hay atajos y si hacéis mayus más s, veréis que lo podéis hacer automáticamente y no tenéis que estar dándole al botón derecho o haciéndolo directamente desde aquí, que perderéis bastante tiempo. ¿Vale? Si le dais al botón derecho, como veis, podéis añadir tanto un nodo, que lo podéis hacer con tabulador directamente, fijaos, o podéis poner un sticky note. Bien.
Entonces, em comentado esto, vemos que tenemos un más aquí también, que este más simplemente si lo pulsamos es exactamente lo mismo que dar a tabulador o darle a este más de aquí para añadir el nodo. Por otro lado, tenemos aquí una serie de funciones que son funciones de navegación. Como veis, tenemos el zoom fit, que es el uno. Si por lo que sea os perdéis, ¿vale?, pulsáis el uno y debería devolver, que ahora mismo no sé por qué por qué no me está funcionando, pero vaya, debería funcionar. Aquí tenéis el zoom in, el zoom out para alejaros. Os podéis mover como queráis. Y esto que estáis viendo aquí abajo es como una especie de minimapa, ¿vale?, para que sepáis más o menos dónde estáis situados y que por otro lado pues si os perdéis por lo que sea, pues que podáis volver siempre al inicio, ¿no? Que esto lo podéis hacer gracias o bien a este botoncito de aquí o la tecla número uno. Esto de aquí, ¿vale?, sería exactamente lo mismo, ¿vale? Si le dais aquí, veis que lo ajusta. Si por lo que sea tuviésemos un flujo de trabajo gigante, lo que haría sería situarnos para tener una visión periférica y que todo esté dentro de nuestra ventana. Para esto sería esta función de aquí que va bastante bien a veces también. Y como veis, todo tiene atajos, todo, absolutamente todo. Lo ideal es que lleguemos al punto donde no tengamos que tocar prácticamente con el ratón, que lo hagamos todo manualmente.
Bien, lo primero que vamos a hacer y el primer ejemplo que vamos a a utilizar es el de enviar un correo electrónico super básico y lo vamos a utilizar como hola mundo. En programación sabéis que la primera programación que se suele hacer es la de hola mundo y en N8N no podría ser menos. Así que vamos a hacer exactamente eso. Como veis, tenemos todos los triggers que nos permite N8N. Vale, los triggers son los disparadores lógicos dentro de nuestro flujo de trabajo. Como sabéis, si nosotros encendemos una bombilla antes debemos de pulsar el pulsador, el interruptor. De esa forma le decimos a la bombilla que se encienda. Si queremos llamar a Siri o a Alexa, debemos decir, "Hey, Alexa." Y en ese caso, pues Alexa se activa o Siri se activa. Y esto siempre se da porque hay una secuencia anterior, hay un detonador que es un trigger. Un trigger está escuchando constantemente esperando a que se dé un evento determinado. En este caso, los eventos que nos proporciona N8N de forma nativa sois los que estáis viendo aquí directamente.
Uno de ellos sería el trigger manually, que como indica su nombre es que nosotros cuando pulsemos en este botoncito de aquí, ¿vale?, que podemos hacerlo con comando también. Automáticamente dispara nuestro flujo de trabajo. Como veis, se pone de color verde automáticamente y esto hace que inicie. Esto lo podemos hacer también desde este botoncito de aquí de test workflow, ¿vale?, y como veis también desde aquí lo podemos eliminar.
Seguimos con los nodos de trigger. En este caso tenemos los triggers de activación a través de evento en aplicación externa. Estos son integraciones que nos ofrece HON de forma nativa y son integraciones que hacemos en este tipo de servicios. Cada uno de estos servicios nos ofrecen una posibilidad. Cada uno de estos servicios tienen unas particularidades. Imaginad, por ejemplo, que lo que queremos es que cuando alguien nos reserve en calently, ¿vale?, que creo que estaba por aquí, aquí, automáticamente esto nos dispare o nos avise un flujo de trabajo para que enviemos un correo o para que lo actualicemos en nuestro CRM. Imaginad o que en ClickUp, exactamente lo mismo, cuando tenemos un nuevo lead automáticamente nos avise a un flujo de trabajo, incluso con Coin eco, ¿vale?, con aplicaciones de criptomonedas, DHL, Dipele. Em, tenemos una cantidad de de opciones aquí que realmente es increíble, ¿no? Incluso, mira, Facebook Leads, eh, Facebook Trigger. Bueno, realmente las más usadas, pues como sabéis, pues WhatsApp, ¿no?, Gmail. eh Google Sheets, como veis aquí, eh tenemos una gran cantidad de opciones.
Vamos a volver a al menú de opciones de trigger que nos ofrece de forma nativa. Y como veis, hay otra opción, ¿vale?, otro trigger aquí que es un trigger que se puede dar cada cierto tiempo, un trigger programado que se conoce. Si nosotros accedemos a la configuración de este trigger, ¿vale?, lo que vemos es que tenemos por un lado el intervalo, tenemos los días que pasan entre este intervalo de aquí, es decir, que se daría cada día, y la hora a la que se daría este trigger. ¿Qué quiere decir esto? Que cada día a medianoche este flujo de trabajo automáticamente, siempre y cuando lo tengamos en test se activaría. ¿Vale? Podemos configurar las bases de tiempo que queramos, podemos cambiar los intervalos, lógicamente, podemos hacer que sea cada minuto, podemos hacer que sea cada viernes, noche o tarde a las 2 de la tarde, lo que queramos. ¿Vale? Quiero que quiere quiero que quede clara la esencia.
Volviendo a los triggers, tenemos aquí el trigger de webhook. Esto es para hacer peticiones HTTP, que veremos posteriormente, no os asustéis. Y si en una determinada aplicación externa que no está de forma nativa en NN, como hemos visto en el caso de las aplicaciones, queremos enviar información y generar una activación dentro de un flujo de trabajo. Bien, esto podría ser para muchísimas cosas. Imaginad que tenéis un registro dentro de vuestra página web, un registro de captación de clientes y queréis que este registro de captación de clientes active este webhook y esto lo vuelque en un Google Sheets. Pues esto lo podríamos hacer gracias a este nodo de aquí.
Volviendo a las a los triggers, tenemos el de cuando otro flujo de trabajo se ha ejecutado. Nosotros podemos llamar a subwflows, es decir, podemos tener un workflow que llame a este segundo workflow. Y esto se utiliza sobre todo para modularizar. Como sabéis, en la programación es muy importante que nosotros modularicemos para que en caso de que existan errores o en caso de que se den problemas dentro de este workflow, podamos tener un pequeño control y podamos tener una modularización para saber exactamente dónde está fallando, así como no cargar demasiado lo que sería nuestro workflow principal. Esto lo utilizaréis, pero es algo más avanzado.
Volviendo aquí, vemos que tenemos otro que vais a utilizar muchísimo, sobre todo cuando estéis en fases de pruebas, que es On Chat Misage. Este de aquí, que básicamente lo que os permite es tener un chat interactivo aquí, ¿vale?, que este chat lo que hace es enviar esa información que nosotros hemos recogido directamente en este chat a través de este nodo, ¿vale?, y funciona a modo de activación, funciona a modo de trigger. Vamos a cerrar. Esto es para para borrar toda la información, ¿vale?, todos los logs de esa ejecución. Y como veis, aquí tenéis el asistente, que, bueno, ponen que está en beta, pero que funciona relativamente bien. En español no funciona tan bien como en inglés, pero vaya, es bastante útil. Y lo que os recomiendo, siempre que tengáis un problema es que lo primero que hagáis es preguntárselo a este asistente. Eh, ¿cómo funciona un flujo de trabajo? os va a ayudar en un 60% de las veces. No siempre funciona tan bien como me gustaría, pero vaya, funciona relativamente bien, que es lo importante. Y esto eh os preguntaréis por qué funciona mejor, por ejemplo, que Chat GPT. Y básicamente funciona mejor porque está alimentado con toda la documentación de N8N y además está alimentado con toda la documentación actualizada, que son los problemas que tenemos, por ejemplo, en Chat GPT, que no tiene toda la documentación al día. Entonces, yo recomiendo bastante que lo utilicéis, sobre todo a la hora de e eliminar problemas y de y debuguear, ¿no?, en el en el día a día.
Bien, esto sería un poco lo básico, lo esencial en cuanto a triggers y nuestro primer paso. Lo que vamos a hacer, como veníamos diciendo, es poner un trigger fundamental como es el de Test Wflow. Y con este trigger lo que queremos hacer es enviar un correo electrónico que vamos a utilizar como Hello World. Como veis, cuando ponemos un trigger, el segundo nodo que nos pone por defecto ya no sería un trigger, sino que si os fijáis se tratan de otra serie de configuraciones, ¿vale?, como inteligencia artificial, action in application, data transformation, flow, core, human in the loop, etcétera. Podemos poner otro trigger, pero como veis ya nos lo esconden aquí porque no es lo ideal que tengamos dos triggers dentro de un mismo flujo de trabajo. Nosotros lo que necesitamos es una acción en una aplicación, entonces deberíamos acceder aquí. Sin embargo, si lo buscáis directamente desde aquí es lo mismo, efectos prácticos, ¿vale? Queremos enviar un correo, buscamos Gmail. Cuando pulsamos en Gmail se nos abren una serie de acciones listadas y que al principio yo sé que os abruman muchísimo. Sin embargo, dejadme deciros que están bien modularizadas y que simplemente debemos leer en orden.
Como veníamos diciendo, lo que queremos hacer es enviar un correo electrónico. Entonces, nos quedamos en la sección de acciones de mensaje, no nos vamos a ir a la sección de etiquetas. Como queremos enviar un mensaje y estamos en la sección de mensajes, vamos a ir a send message. ¿Veis aquí? Esto lo podéis buscar también. Un segundo, vamos a volver que se se me ha cerrado. Esto lo podéis buscar directamente dentro del propio nodo, ¿vale? Le dais ahí y como veis, ya estáis filtrando. Bien, una vez lo seleccionamos automáticamente nos lo pone en nuestro canvas, ¿vale?, y nos lo conecta con el nodo anterior por defecto para conectar y desconectar. Básicamente, si tenemos este nodo por ahí volando, le damos aquí y arrastramos. ¿Veis que nos lo ha conectado? Para desconectarlo, aquí. Y esto lo podríamos hacer tantas veces como queramos. Otra particularidad es que los nodos de trigger tienen la barriguita esta aquí detrás, ¿vale?, con forme no les puede entrar información cómo serían los nodos de acción.
Bien, em si abrimos el nodo, veremos que tenemos una serie de de datos que también sé que es un poco abrumador al principio y que quiero quitaros ese miedo. Y básicamente lo que tenemos son tres secciones muy diferenciadas. Tenemos el input, tenemos el output y tenemos los parámetros. En el input son todos los datos que nos entran de nodos anteriores. Imaginad que nosotros tenemos el nodo anterior, un nodo de chat. Y en el output son todos los datos manipulados gracias a el nodo que tenemos en el centro, que son todas las configuraciones. Vamos a poner un ejemplo aquí. Lo primero que tenemos que hacer es poner las credenciales de nuestro Gmail. Simplemente pulsamos aquí, le damos a crear una nueva credencial. Como veis, nos dan dos opciones, o esta de aquí de Out 2 o esta de aquí, ¿vale?, que como veis es un poquito más complicada. Siempre que os permita, yo lo que os recomiendo es que seleccionéis esta de aquí, porque suele ser la más sencilla, ya que esta no nos pide integraciones a través de APIs y cosas raras que a veces se pueden complicar muchísimo. Y simplemente accediendo con nuestra cuenta ya será suficiente. Esto os abrirá un popup. Aquí simplemente debéis de poner vuestro correo electrónico, ¿vale? Agustín elinv.com. Bien, aquí, bueno, nos dice lo de la típica bienvenida, el consentimiento. Le damos todos los permisos que nos pida, le damos a continuar y nos dice que la conexión se ha dado de forma satisfactoria, sin más problemas. Bien, nos dice que la cuenta se ha conectado. Cerramos.
Y como vemos, tenemos dos opciones aquí que son comunes a todos los nodos de acción. El resource sería el medio o cómo lo vamos a hacer, ¿vale? Si os fijáis, es lo que nos aparecía cuando seleccionábamos el nodo y como veis como es misage, como la acción que queremos hacer es enviar un mensaje, pues el resource va a ser mis operation, si veis aquí va a ser send porque lo que queremos hacer es enviar. No queremos responder, no queremos borrar una etiqueta, no queremos hacer nada de lo que nos pone aquí. Bien, entonces lo dejamos así tal cual. En tú lo que tenemos que hacer es poner a quién le vamos a enviar ese correo electrónico, ¿vale?, siempre respetando lógicamente el el la sintaxis del correo electrónico. Aquí, pues bueno, no sé si me deja enviarlo a mí mismo. Lo voy a probar. Es que así no abro más correos electrónicos. Y aquí pues vamos a ponerle en el subject. Hola mundo, ¿no? Esto, el subject sería como el asunto, la primera línea que veis antes de abrir el correo, ¿no? Aquello que que leéis lo primero. Ponemos hola mundo. En el tipo de dato que vamos a tener dentro del correo electrónico, podemos seleccionar dos, que es o texto plano o HTML. HTML es una forma de codificar, ¿vale?, y esto nos permitiría pues poner firmas, poner una unas ciertas características estéticas y hacer que el correo electrónico sea mucho más customizado y mucho más bonito. De momento vamos a dejarlo en texto sin más. Y aquí en el Misage lo que configuramos es el cuerpo de ese correo electrónico. Aquí vamos a decirle pues eso, "Hola mundo, ¿qué tal?" Sin más, ¿no? Algo así un poco un poco de aquella manera.
Como vemos, en todos los nodos siempre tenemos opciones aquí abajo que nos nos lo suelen esconder un poquito. Y como veis la tan odiada atribución a N8N que nos habilitan por defecto. Esta atribución básicamente es que cuando enviemos este correo electrónico siempre va a aparecer que esto se ha enviado con N8N. Esto deshabilitarlo, ¿vale?, si no os molestará bastante. Vamos a darle a test. Esto lo podemos hacer tanto desde aquí como dentro del nodo dándole aquí, ¿vale? Yo siempre antes de darle a test acostumbro a guardar. Es una manía. A mí me gusta trabajar así porque puede fallar o lo que sea y perdemos los cambios. Le damos a test y como vemos se nos pone todo en verde y aquí nos pone que se ha enviado correctamente. Vamos a ver si es así. Bien. Y en efecto, como veis aquí, pues hola mundo, ¿qué tal? Ya tenemos nuestro primer caso de éxito, pequeño caso de éxito en N8N. Es un gran avance, ¿eh? Pensad en todas las cosas que podéis hacer con esto. No es para nada una tontería, ¿vale? Em, y si os fijáis, si habilitamos la atribución, pues enviaríamos otro correo electrónico, pero en este caso, como decíamos, con la atribución a N8N. Vamos a esperar un segundo. ¿Veis? Este correo electrónico se ha enviado automáticamente con NHN. Venga, vamos a quitarlo.
Aquí, como veis, a la salida y como veníamos diciendo, nos da una serie de información, ¿vale?, y esta información la podemos ver representada de diferentes formas, siempre siendo la misma información, pero viéndola en diferentes formatos. Una sería en esquema, otra en tabla y otra en Jason. Todo esto está codificado en Jason, ¿vale?, que es una forma de estructurar la información, ¿vale?, y transmitir información entre diferentes máquinas o servicios, que eso lo veremos en partes más avanzadas. Em, aquí tenemos una opción para buscar, por ejemplo, si imaginad que queremos buscar 196, pues si tuviésemos muchísimos datos podríamos filtrar automáticamente y encontrarlo de forma mucho más sencilla. Por otro lado, tenemos aquí arriba la opción de modificar los datos, ¿vale?, por si queremos hacer pruebas. Aquí guardamos. tenemos la opción de pinear estos datos, es decir, que se queden aquí clavados para que podamos hacer todas las pruebas que queramos si no estamos en producción. Copiar estos datos. Vale, los copiamos y ya estaría. Y estos serían los datos de salida. Como de entrada no hemos tenido nada porque lo hemos hecho a través de test workflow, pues no veríamos nada en la input.
Ahora vamos a tratar de hacer este flujo de trabajo algo más útil. Vamos a hacer que en este caso enviemos un correo electrónico totalmente e digamos que personalizado gracias a un formulario de clientes de captación de clientes. Imaginad que estamos empezando nuestra agencia de inteligencia artificial y queremos dar nuestros primeros pasos en cuanto a captación de clientes. Lo primero que tenemos que hacer es, por un lado, tener un formulario que nos permita recoger toda esa información para conocer tanto su contacto como sus necesidades. de esa manera poder agendar. Y esto lo podemos hacer de forma totalmente automática y personalizada, que es lo interesante, porque lo automático sin personalizar no es atractivo. Em, esto lo vamos a dejar por aquí, de momento no nos molesta, no es una buena práctica, ¿vale?, que dejéis dos dos workflows con con trigger, pero vaya, para hacer el ejemplo y que lo tengáis ahí a la vista. Vamos a venir por aquí. Y en este caso, el trigger que vamos a poner va a ser un formulario. Esto, como decíamos, podemos filtrar automáticamente gracias a esta barra de búsqueda y lo seleccionamos. Si os fijáis, nos dice que cuando un formulario o cuando en ese formulario se dé un evento que dispare nuestro flujo de trabajo, veis que automáticamente nos lo posiciona en nuestro canvas y se pone en rojo con este simbolito, ¿vale?, que veis aquí. Y esto es porque no está configurado y por lo tanto, pues tiene un problema. ¿Veis que falta un campo? Esto nos dice que no funcionará.
Voy a quitar este trigger de aquí, por lo menos guardamos y accedemos. Lo primero que vemos es que tenemos dos URLs. Una, como indica aquí, es la URL de eh de pruebas. La otra es la de producción. Básicamente esto es porque una está orientada, como su nombre indica, a realizar pruebas con el botoncito este de aquí abajo y la otra es para que funcione siempre en producción, que no tengamos que darle al botoncito, que se quede ya por defecto escuchando independientemente de cuántas ejecuciones se estén dando. ¿Vale? Para acceder a nuestro formulario, copiaríamos esto de aquí y lo pegaríamos en nuestro navegador. Como veis, nos abre un formulario de N8N y nos dice que el trigger no está escuchando de momento, ¿vale?, que debemos de pulsar en el botoncito de test. Volvemos aquí en autenticación es por si queremos ponerle una autenticación de acceso a este formulario. De momento no nos interesa para lo que estamos haciendo. Y en el título lo que podemos hacer es poner pues eso, ¿no? Como indica el nombre, contáctanos. Contacta con nosotros. Vamos a poner con Lambda, que sería mi agencia. Contacta con Lambda Automations. Y esto sería la descripción, lo que aparece justo abajo. Te daremos respuesta. Mm. Lo antes posible. Listo. Vale, guardamos. Y si ahora actualizamos aquí, un segundo, debemos de borrar. Copiamos. Y ahora sí que actualizamos. Vale, perdonad, debemos de darle a test para que nos aparezca como mínimo el título actualizado, ¿vale? Que si os fijáis aquí contacta con Lambda Automations y te daremos la respuesta lo antes posible. Fijaos que simplemente dándole al test ya se nos abre la página con el formulario, ¿vale? Aquí nos avisa de que es una versión de pruebas de mi formulario y si le doy a submit aquí automáticamente me dispara el flujo de trabajo. ¿Veis? Y además de eso me ha enviado toda la información referente a este formulario, ¿vale?, que en este caso, como solo nos puede enviar información de cuándo ha sido enviado, pues nos envía eso. Nos envía que estaba en test. Ya está.
Ahora imaginad que queremos añadir campos en este formulario. Lo que tenemos que hacer es añadir elementos. Podemos añadir tantos como queramos. No os abruméis. Si os fijáis, son bloquecitos pequeños. Y en estos bloquecitos pequeños podemos configurar lo que nosotros queramos. Por ejemplo, una pregunta muy básica sería tu nombre, ¿no? Vemos que tenemos diferentes tipos de datos que vamos a recopilar en estos campos. Pueden ser un custom HTML, una fecha, un dropdown list, que es un desplegable básicamente, un correo electrónico, una password, un texto, un texto un poquito más largo, número. ¿Y por qué hm debemos de seleccionar el tipo de de dato que van a introducir aquí o el tipo de de información más bien? Pues básicamente porque si seleccionamos email y imaginad que la persona pone pepito eh 03.com, pues no le va a aceptar porque no es un formato que esté admitido como un correo electrónico, nos falta la roa, nos falta todo, ¿no? Entonces esto va bastante bien. De momento en tu nombre lo vamos a dejar en text porque es un texto cortito. Y aquí en placeholder es básicamente lo que va a aparecer en ese campo un poquito grisáceo de fondo, ¿vale?, como de ejemplo, vamos a poner que mi nombre es Agustín. Aquí le podemos decir si el campo es requerido o de lo contrario pues simplemente se lo puede saltar. Aquí lo que vamos a pedir es eh tu apellido. De igual forma es un texto. Aquí ponemos Medina y le decimos que es un campo requerido. De igual forma, hm, le podemos pedir el correo electrónico. Correo electrónico. Aquí le decimos que es un email. Hm hmm hmm. Vale, es un campo requerido. De igual forma, aquí le podemos pedir qué presupuesto tiene para su proyecto, por qué se hace esto de tu presupuesto y ya un poco así de de cultura general, ¿no?, para automatizaciones. Nosotros algo que estamos integrando muchísimo, ya que nos llegan muchos leads y a veces son simplemente curiosos, que no tienen muchísimo presupuesto para desarrollar estas aplicaciones y tal y no merece la pena que invirtamos tiempo o recursos en leads que no nos van a generar pues una promesa elevada o un proyecto interesante, ¿no?, para nosotros. Entonces, ya con el presupuesto, pues básicamente lo que hacemos es filtrar. seleccionamos un dropdown list, que básicamente es un desplegable donde ofrecemos una serie de opciones y en estas opciones podemos poner lo que nosotros queramos, ¿no? Como serían intervalos de presupuesto. Imaginad de 1000 a 2000, eh, de 2000 a 3000, pongo dólares, podréis poner euros, lo que queráis, de 3000 a 4,000, etcétera. Vale, estas son todas las opciones que nos aparecería en este desplegable. Esto de multiple choice es por si queremos dar la opción de que esa persona seleccione tanto este intervalo
Como este intervalo, como este intervalo a la vez, ¿vale? De forma simultánea. En este caso, yo solo quiero que me dé un intervalo, así que le digo que es un campo requerido sin más. Vamos a poner otro elemento. Y en este caso, el elemento que vamos a poner va a ser, por ejemplo, describe tu necesidad de automatización. Bien. Y aquí sí que vamos a poner que es un text area, ¿vale? Es un área de texto porque esto va a ser un poquito más largo. Decimos que es un campo requerido. Aquí, como veis, tenemos otra opción de responder cuándo, es decir, cuándo este formulario va a responder con otra información. De momento no nos interesa. Y aquí, como veis, en opciones, como siempre se nos ocultan una serie de informaciones o de configuraciones por defecto, como la de la atribución a N8N, que siempre te la cuelan, y que vamos a deshabilitar.
Bien, ahora si le diésemos a test veréis que tenemos un formulario totalmente distinto, ¿vale? Y que no se me ha abierto básicamente porque ya tengo abierto el anterior. Vamos a volver a hacerlo aquí. Bien, contacta con Lambda Automations, te daremos respuesta lo antes posible. Vamos a rellenarlo. Vamos a poner test, por ejemplo. T@blabbla.es.es.es.es. Aquí veis lo del desplegable. Superinteresante. Esto creo que os gustará mucho, sobre todo si estáis empezando. Em, describe tu necesidad. Pues tengo problemas a la hora de captar clientes, ya que me supone un gasto de infraestructura comercial muy elevado. Me gustaría poder automatizar campañas de meta ads y recopilar información en un CRM. Pero en este caso vamos a poner un correo electrónico ya bueno, ya que lo vamos a hacer de verdad.
Bien, cuando le demos a enviar, que esto, por cierto, podéis cambiar también el texto que aparezca aquí, ahora lo vamos a lo vamos a hacer porque no está guay, ¿no? Que aparezca esto de submit. Vamos a enviar. Ejecuta el flujo de trabajo. Y ahora, si os fijáis, ya tenemos información relevante en la salida. Daos cuenta en la entrada no, porque es un trigger. En el trigger nunca entra nada, pero sí que salen cosas. Y estas cosas que estáis viendo aquí son claves valor. La clave sería esto de aquí y el valor sería esto de aquí. ¿Por qué es clave valor? Porque esto actúa a forma de cajita. Fijaos aquí. Tu nombre es una cajita que contiene Agustín. Tu apellido es una cajita que contiene Medina. Y si otra persona lo rellena con otro nombre otro apellido, esa cajita va a contener algo distinto. Y esto nos lo permite N8N. Vamos a hacer lo del lo del campo que comentábamos, lo del label, y vamos a poner enviar. Así lo dejamos ya fino.
Bien. Hm hm hm. Lo que vamos a hacer ahora es poner un nodo de inteligencia artificial para que toda esa información que hemos recopilado, este nodo de inteligencia artificial cree un correo electrónico customizado que vamos a enviar posteriormente con un nodo de Gmail. Para esto, yo lo que voy a hacer es estos datos que nos ha dado de salida los voy a pinear porque de esta forma, independientemente de que nosotros le volvamos a dar a Test Workflow o que le demos a la papelera esta de aquí, esto ya se va a quedar aquí clavado y entonces no vamos a tener que estar constantemente rellenando el formulario para hacer pruebas individuales, que esto nos va a ahorrar muchísimo tiempo. Yo es algo que no sabía al principio y que me dio muchísimos dolores de cabeza. Le damos aquí, le damos a inteligencia artificial y en este caso, como veis, pues tenemos diferentes nodos de inteligencia artificial. A mí personalmente no me gusta en exceso utilizar agentes. Esto es una opinión personal, igualmente los comentaremos. Hm, prefiero utilizar nodos de inteligencia artificial simple, como pueden ser estos de aquí de Openi. Vale, también tenemos otros nodos de inteligencia artificial simple. Un segundo, que esto es lo he puesto sin querer. Vale, como podrían ser este, el basic Llm Chain, que esta es una cadena de inteligencia artificial básica a la que podemos conectar diferentes modelos. Seleccionamos el de Open le decimos como siempre la acción que vamos a hacer con este nodo. En este caso, lo que nosotros queremos hacer es enviar un mensaje a un modelo. Lo seleccionamos, lo conectamos siempre poco a poco y haciendo las cosas bien. Abrimos. Aquí parece que se ha bugado un poco en 8N. A veces pasa. ¿Veis que no me deja abrir directamente? Y ahora sí.
Bien. Aquí ahora sí que veis los datos de entrada. Esto ya empieza a tomar forma, ¿vale? Ahora veréis cómo los utilizamos y cómo esta cajita de inteligencia artificial transforma estos datos de entrada. Y le podemos cambiar el nombre a nuestro nodo, ¿no? Vamos a decirle que es un eh personalizador barra baja correos. A mí me gusta utilizar la barra baja, no me gustan los espacios personalmente porque son muy ambiguos. Y como siempre, necesitamos una credencial. Esta credencial no es tan fácil como la de Gmail que hemos visto más arriba, sino que tiene cierta complejidad añadida porque, como veis, nos pide una API Key. Una API Key, básicamente es una llave universal que nos proporcionan diferentes proveedores de servicio. Cuando hablo de proveedores de servicio, me refiero a Open Mef Clou, me refiero, bueno, Clou no sería, sería Anthropic, me refiero a Meta con WhatsApp, me refiero a Telegram y estos proveedores de servicio lo que hacen es prestarte una llave, un identificador único, que sería como una tarjetita que pasas en el hotel al abrir la puerta, para que tengas acceso a esa aplicación desde otra aplicación como lo es N8N. Esto nos permite utilizar aplicaciones externas fuera de estas aplicaciones de forma nativa.
Para conseguir la API de Openi, básicamente lo que tenemos que hacer es buscar en Google lo siguiente. Open I dashboard. Yo lo busco así, tengo la manía, me funciona bien. Y básicamente en Open Dashboard, ¿vale?, que sería la plataforma de desarrolladores. Lo que veremos es que tenemos una cantidad de información bastante abrumadora al principio, pero que en realidad no tenemos que hacer caso a nada. Nos registramos aquí, ¿vale? Si no estamos registrados con con una cuenta de de CHGPT, que yo supongo que la mayoría de personas que están viendo este vídeo la tienen, sino simplemente pues iniciar sesión, ¿vale? Iniciamos sesión y como veis se nos habilitan una serie de configuraciones como lo sería el dashboard que es lo que a nosotros nos interesa. Venimos aquí a dashboard, ¿vale? Y aquí en API Keyis, como veis, podemos generar esa clave que os comentaba. Sin embargo, os debo decir algo antes. Para que nosotros podamos utilizar esta API Key y para que Openi o CH GPT nos preste CH GPT fuera de este, lo primero que tenemos que hacer siempre es pagarles, ¿vale? Por desgracia, pagarles es muy poco realmente, porque lo que vamos a gastar utilizándolo para pruebas es muy poco. Entonces, venís aquí a la ruedecita esta de aquí, os vais a la opción de billing, aquí y aquí en billing lo que podéis hacer es añadir crédito. Estos créditos, ¿cómo funcionan? Pues básicamente ellos tienen un modelo de precio por tokens. Cuando nosotros vayamos utilizando esta API, cuando vayamos llamando HGPT desde fuera, nos van a cobrar por petición. No es mucho, de nuevo. Será mucho cuando utilicéis aplicaciones a gran escala, pero para pruebas no es mucho. Cargáis nada, lo que os permita, lo mínimo, ¿vale? Para hacer pruebas, si es $ 5, si no menos, sin problema. Una vez lo tenéis, venís aquí al dashboard, como comentábamos, vamos a App Keys y desde Apik Keys le decimos crear un nuevo secreto. Aquí, aquí nos pide un nombre. Yo le voy a poner YouTube. Aquí, como veis, pues tengo un montón de API keys con nombres raros, ¿vale? Porque es de hacer pruebas que para vídeos y tal. Esta cuenta la tengo para eso. Y aquí le decimos los permisos, ¿no? Que en este caso pues yo le digo que todos los permisos. Creamos una nueva clave, la copiamos. Sin más, esto recordar que es personal e intransferible porque si no tienen acceso a utilizar vuestro chat GPT. Vamos a la piqui, pegamos, guardamos y listo, ya tenéis acceso a chat GPT desde NHN.
Ahora, como veis, nos permite seleccionar el modelo. Como veis, aparecen un montón de modelos. Esto de los modelos tienen particularidades, cada uno de ellos funciona mejor para una cosa, cada uno de ellos tiene un enfoque distinto. En definitiva, cuando estamos hablando de aplicaciones estándar, e hay modelos que mantienen una relación muy buena entre calidad y coste, como podrían ser el modelo 4o, que seguro que habéis utilizado muchísimo. Si lo que buscamos es una mayor precisión, un mayor comportamiento humano, nos tendríamos que ir a un 45. Si buscamos mayor rapidez, a un 3.5 turbo, ¿vale? Pero esto ya serían cosas más avanzadas de momento 4. Aquí, como veis, tenemos el prom, ¿vale? Y el rol. Vamos a hablar de esto y vamos a intentar que sea breve. Básicamente aquí es donde nosotros estamos chateando, entre comillas, con este modelo de lenguaje y donde le estamos dando las instrucciones. Pero esas instrucciones pueden ser de diferentes categorías. Si os fijáis aquí en roll, puede ser en roll de usuario, ¿vale? que sería el prom dinámico que le vamos a dar a este modelo. Tenemos el rol de asistente, que sería donde nosotros le damos una personalidad o un comportamiento que debe de adoptar y tenemos el de sistema, que es todo el preprompt o todas las configuraciones previas que le vamos a dar para limitar ese comportamiento. Vamos a entender esto y de momento solo vamos a utilizar el de user, ¿vale? Y el de system. Sin más, en el system le vamos a decir, eres un redactor de correos electrónicos profesional. Profesional altamente persuasivo, cálido y breve. Tu objetivo principal es h persuadir al cliente con un copy writing. Mm. Profesional de nuevo. Listo. Esto de aquí es donde lo hemos definido el system prom. Es decir, esto siempre va a estar aquí, o sea, es como la personalidad. Esto lo tendríamos que hacer en Assistant, ¿vale? Pero no quiero liaros ahora mismo. Es por un tema de limpieza. Aquí en prom, ¿vale?, le vamos a decir usuario y es donde le vamos a dar todas las variables de entrada. Y ahora vamos a añadir este concepto de variable de entrada. Veníamos diciendo que aquí en la sección de input, en la parte izquierda, teníamos todas estas cajitas que nosotros podemos hacer. que entren nuestros parámetros. Si os fijáis, veis, y para esto tenemos dos opciones, o fixed o expression, ¿vale? En las cajitas de datos que podemos darle a nuestros nodos. Si es fixed, básicamente es que independientemente de la ejecución, independientemente de si lo hemos ejecutado una o 1000 veces, los datos que estén aquí dentro van a ser los mismos. Sin embargo, si lo ponemos en expression, significa que estas cajitas de aquí, este Jason, esta información dinámica, va a cambiar dinámicamente conforme el formulario de entrada vaya cambiando. Entonces, lo que a nosotros nos interesa es que esto de aquí cree correos electrónicos customizados. Por lo tanto, necesitamos expression. Vamos a darle a expandir aquí, ¿vale? Si os fijáis, aparece un botoncito para hacerlo grande. Le dais y de esta forma tenéis exactamente lo mismo. Lo único que aquí a la parte izquierda tenéis las inputs igualmente, pero a la derecha tenéis el resultado donde ya te aparece esa variable totalmente desgranada. Fijaos aquí. ¿Veis que aquí aparece la variable? Pero aquí aparece el contenido, lo que hay dentro de la cajita. Pues eso mismo. Aquí le vamos a decir em que el nombre Bueno, un segundo. Primero le vamos a decir em lo que debe hacer. No, debes de crear un correo electrónico. Me he dejado la tilda ahí, pero bueno. Em, con intención de convertir a un cliente. Bueno, más que convertir de agendar reunión con un cliente cuyos datos hemos recogido a través de un formulario, ¿vale? Y aquí le decimos, por ejemplo, los datos de entrada son los siguientes. Aquí, como hemos dicho, tenemos el nombre, dos puntos, nombre del cliente, ¿no? Vamos a dejar nombre sin más. Mm, apellido. Ponemos esto, ¿vale? Lo arrastráis directamente y ya lo colocáis. Esto lo podéis hacer arrastrando o directamente con la sintaxis, ¿no? Abrís las dos llaves y si le dais a intro, veis, ya lo tenéis ahí. Entonces podríais poner, por ejemplo, pues eso, tu apellido, ¿no? O lo que o lo que sea. Fijaos, si le doy aquí y le doy aquí, veis, automáticamente ya me lo coloca. Esto está guay que que os vayáis acostumbrando, ¿vale? De momento no hace falta, lo hacéis arrastrando y ya está. Em, el presupuesto no es necesario que se lo pasemos al modelo de lenguaje para que redacte el correo, ¿no? No creo que sea una información relevante de momento. Y necesidad. Y aquí en necesidad, ah, vamos a ponerlo así y le vamos a decir esto, ¿no? Describe tu necesidad. Vale, recordad que lo que he hecho es exactamente lo mismo que arrastrarlo así. ¿Veis? Es lo mismo, no hay nada distinto. Bien. Ahora aquí vamos a poner así y le vamos a dar un ejemplo. Ejemplo de correo electrónico. Empléalo a modo de referencia, pero no eh lo uses como guía absoluta. Y aquí le vamos a decir e hola el nombre. Vale, esto lo que hará que el modelo automáticamente coja este nombre de aquí y lo coloque aquí, ¿vale? En el ejemplo, eh, me complace enormemente que deposites tu confianza en lambda automations. Y aquí h texto personalizado persuasivo relacionado con necesidad, ¿no? Esto lo ponemos entre comillas. para darle a entender al modelo que estamos haciéndolo de ese modo. Vale, espera, vamos a ponerlo ahora ahí, listo. Que vamos a utilizarlo de ese modo, ¿vale? para que tenga un poco más de contexto. Y aquí le podemos decir pues esto, ¿no? Eh, saludos, coma, Agustín Medina, coma llambda automations, coma. Listo.
Bien, vamos a ver qué nos genera, ¿vale? Con con este prom de aquí. Lógicamente, siempre, siempre, siempre vais a tener que refinar los promps y siempre, siempre, siempre vais a tener que hacer pequeños arreglos para que os funcione como deseáis. Vale, vamos a darle a test, vamos a observar la salida a ver qué tal esto. Lógicamente, pues tarda un ratito, ¿no? Como es normal. Fijaos, nos devuelve esto de aquí. Vamos a ponerlo en tabla para que lo veáis bien. Contenido, asunto, transformemos juntos tu proceso de captación de clientes. Hola, Agustín. Espero que te encuentres bien. Quiero agradecerte por compartir con nosotros tus desafíos actuales, bla bla bla bla bla bla. Y si os fijáis, aquí abajo nos ha puesto un error que sería tu nombre y tu puesto y una postdata. Vale, esto no me gusta. Esto ya nos indica que debemos de mejorar el prom. Y por otro lado nos ha puesto el asunto. Yo no quiero que me dé el asunto. Yo solo quiero que me dé el cuerpo del correo electrónico. Por lo tanto, ya hay dos mejoras aquí. Le voy a decir. Ah, e ah, no me devuelvas el asunto del correo electrónico. Solo el cuerpo es suficiente. El ejemplo de correo electrónico. Borros aparte. El saludo déjalo con mi nombre siempre y el puesto exactamente lo mismo. Bien, vamos a ver qué nos hace ahora. Fijaos. Hola, Agustín. Ahora ya no tenemos lo que sería el subject, ¿vale? No tenemos, solo tenemos el cuerpo. Me complace normalmente que deposites tu confianza en lambda automations. Entendemos que captar clientes es tal, tal, un texto un poco así persuasivo, mantiene la firma exactamente igual que como nosotros lo hemos redactado en el ejemplo. Si os fijáis, tenemos aquí una barra n/n y esto básicamente son saltos de línea, ¿vale? Una barra n sería un salto de línea, 2 barras n son dos saltos de línea, ¿vale? Esto es para que nos simplifique la salida y esto es por si queremos que la salida sea en Jason, siempre teniendo diferentes partes estructuradas, ¿vale? Que esto ya lo veremos. Cerramos, pineamos antes, recordar para que se nos queden estos datos aquí clavados. Si no, cada vez que ejecutemos tendremos que ejecutar todo el flujo de trabajo desde que rellenamos el formulario.
Y ahora vamos a escoger nuestro nodo de Gmail de antes y lo conectamos. Lo abrimos. Lo primero que vamos a hacer es cambiarle el nombre. enviar barra bajo. Perfecto, ya tenemos las credenciales. Es exactamente lo mismo. Y si os fijáis en el ejemplo que hemos hecho al principio, estábamos con fixet, pero ahora ya vamos a cambiar ese concepto porque ahora tenemos datos de entrada variables. ¿Veis aquí? Si yo lo arrastro, tal, independientemente de quién rellene esto, lo que va a llegar es un correo electrónico cada vez, un correo electrónico distinto. En el subject le vamos a poner, hm, propuesta de automatización con lambda automations. En el tipo de correo electrónico le dejamos que es tipo texto de momento y en message, que aquí es donde viene lo chulo, lo ponemos en expression. Siempre podemos arrastrar el contenido. Fijaos. Perfecto. Hemos quitado la atribución a N8N y vamos a hacer una prueba. Ahora, para probar esta vez sí que nos pide que quitemos el pin. Y vamos a ver. Mirad esto. Propuesta de automatización con Land Automations. Hola, Agustín. nos complacen enormemente todo el textaco, ¿no?, que estáis viendo aquí. Espero con interés nuestra conversación. Saludos y la firma. ¿Qué mejoraría yo aquí? Pues básicamente lo que podemos hacer ahora es añadir un link, ¿vale?, directamente a nuestro Calenly o la aplicación que estemos utilizando para agendar citas y que de esta forma no le demos lugar al cliente de que tenga ese repensamiento o que tenga esa posibilidad de generarle un poco de fricción y generemos ese, digamos que ese pimpón de cuándo te va bien a ti, cuándo me va bien a mí, ¿no? Que que al final hace que los clientes se pierdan. Esto lo conseguimos enviándole directamente nuestra disponibilidad con un calendly o con un cal y que directamente nos agende con ese correo electrónico. Así no tenemos conversaciones inútiles que solo nos hacen perder el tiempo.
Para esto tenemos distintas formas de hacerlo, ¿vale? Una de ellas sería, como decíamos, con calendly, que es esto de aquí. Otra forma de hacerlo sería con cal. Y la diferencia que hay entre una y otra es que Calently para utilizar su API necesitamos estar con la versión de pago, necesitamos tener una suscripción, mientras que con CAL podemos hacerlo de forma totalmente gratuita. Entonces de momento nosotros vamos a utilizar CAL y para eso vamos a cal.com, lo abrimos, le damos a iniciar sesión, ¿vale? Si no tenemos una cuenta, pues le damos a get started, lógicamente, como siempre para registrarnos. Le decimos iniciar sesión con una cuenta que tengamos habilitada. En este caso yo le voy a decir Agustín. Vale, como veis, pues el típico registro de siempre, ¿no? Donde nos piden una serie de datos. Aquí podemos configurar la URL del usuario, el nombre completo, bla, bla, bla. No es lo no es lo relevante. Ahora mismo. Continuar. Estos son los servicios externos que queremos conectar de forma nativa. Le vamos a dar a saltar. Estos son las franjas horarias que vamos a tener de disponibilidad cuando enviemos nuestro correo o bueno, más bien nuestro nuestro link de de calendario. Por esto, os recomiendo que, sobre todo si estáis empezando y no estáis excesivamente ocupados, lo que hagáis es restringirlo un poco para que no parezcáis extremadamente disponibles, porque esto normalmente lo que suele hacer o el efecto que suele generar a nivel psicológico en el cliente es un efecto de disponibilidad excesiva que se relaciona normalmente con baja calidad o con un estatus percibido un poquito más bajo. Entonces, lo que os recomiendo es que restringáis un poquito aquí, ¿vale? que parezcáis que estáis un poquito más ocupado y es de aquellas cosas que desde mi punto de vista son éticas y que os van a ayudar a cerrar más clientes. Aquí ponéis la foto de perfil, ¿vale? Y terminar. Lógicamente siempre ponemos foto y eso para que parezca que es todo más profesional. Bueno, parezca, no, para que sea más profesional más bien. Aquí, si os fijáis, tenemos diferentes reuniones, ¿vale?, que aparecen como opciones. Yo simplemente voy a dejar la de 15 minutos sin más. Y lo que debemos hacer ahora, exactamente igual que hemos hecho con Openi o que hemos hecho con Gmail, es necesitar o buscar nuestra API Key. Nuestra API Key, ahora mismo no recuerdo demasiado dónde estaba, pero como todo tiene denominadores comunes, yo sé que si me voy a ajustes y me voy a claves API, veis, lo voy a encontrar. Siempre, siempre, siempre suelen estar en el mismo sitio. Os registráis, vais al engranaje, ajustes o lo documentación de desarrolladores y lo vais a encontrar ahí. Aquí le dais añadir, ¿vale? Le dais el nombre, test YouTube, fecha de caducidad. Vale, esto si queréis que caduque. Yo le voy a poner de hecho 7 días por si se liquea. Y la copiamos aquí. Nos vamos a nuestro N8N. Seleccionamos nuestro cal, ¿vale? Y veremos que tenemos diferentes opciones dentro del trigger, ¿vale? Vamos a seleccionar que cuando se dé un una un agendamiento, cuando se dé un booking, que automáticamente se nos active otro flujo de trabajo, ¿vale? Y eso ya lo dejamos configurado con nuestra piqui, ¿vale? Vamos a seleccionar la credencial, le decimos a crear nueva credencial, exactamente igual, la pegamos y salvamos. Listo. Perfecto. Ya tenemos nuestro nodo aquí totalmente configurado. Vamos a volver a cal. Le damos a hecho y es probable que tengamos que habilitar el servicio externo, ¿vale? Desde aplicaciones, si no recuerdo mal. Un segundo si buscamos aquí N8N. Sí, correcto. No sé si es necesario ahora mismo, pero bueno, no está de más que que lo instaléis. Vale, le dais aquí. Entonces dice que aplicación instalada correctamente. Sin más, ¿vale? Aquí no sé por qué se buguea. Si os fijáis no me deja hacer nada. Salimos bien. Y ahora ya tendríamos configurado nuestro cal. Ahora, si nosotros vamos aquí a ver página pública, es el enlace que nosotros le vamos a enviar a nuestro potencial cliente para agendar. Esto, como veis, es un calendario con disponibilidades. Bien. Y es simplemente gracias a esta URL, solo este trozo de aquí, ¿vale? Todo lo demás sobra. Fijaos, veis esto lo que vamos a hacer ahora es incluirlo en nuestro correo electrónico gracias a este personalizador. Vamos a venir aquí y le vamos a decir lo siguiente. Agenda en el siguiente enlace. Y aquí le voy a decir que respeta la estructura del agenda en el enlace y mantén siempre la misma URL para que no se le vaya la olla, que eso sí que no me gustaría. Aquí vamos a poner un espacio. Los espacios que pongáis aquí y tal no afectan demasiado, ¿vale? Esto es simplemente una cuestión visual para que vosotros lo entendáis mejor. Vamos a darle a quitar el pin. Vamos a testear. Vale. Mm. Como vemos, nos ha incluido el enlace. Vamos a ver si se envía correctamente. Test step. Bien, vamos a nuestro correo [Música] electrónico. Tarda un poquito. Bien, fijaos, es exactamente el mismo correo electrónico que teníamos antes, solo que ahora pues tenemos un enlace, ¿vale? Si abrimos este enlace nos da la disponibilidad y ahora lo que podemos hacer es ponerlo en test. Hm. Vamos a quitar el pin este de aquí y vamos a ver si nos funciona nuestro trigger de cal y se dispara cuando nosotros agendamos. Vale, vamos a imaginar que somos el cliente. Se nos abrirá el formulario, lo cerramos, vamos a nuestro cal y aquí vamos a seleccionar una hora, la que sea. Mi nombre es Agustín y mi email es Agustín @elinkbig.com. Bien. debería llegar un trigger aquí. Fijaos, veis, llega este trigger que me activa todo mi flujo de trabajo, todo lo que tenga conectado posteriormente. Y lo que nosotros enviamos aquí es una serie de metadata, como por ejemplo el tipo de evento que se ha dado, cuándo se ha creado este evento, la URL, el título, cuándo empieza el evento, cuándo acaba el evento, el tipo, el email, el ID, el nombre, el Time Zone. Vale, esto es para saber, por ejemplo, si os agendan desde, yo que sé, imaginad Latinoamérica, Estados Unidos, que sepáis que hay una diferencia horaria, el formato de la fecha y la hora, correo electrónico, como decíamos, pues tenemos una serie de información, ¿no?, que puede ser útil en en determinados contextos.
Ahora mismo, como siempre, lo que hacemos es pinear. Pin. Lo que queremos hacer es enviar otro correo electrónico, ¿vale? Y este correo electrónico lo que vamos a hacer es darle una confirmación customizada que vea que estamos poniendo cariño en nuestro servicio. Y esta e confirmación customizada vamos a hacer que sea algo más simple, ¿vale? No vamos a perder tanto el tiempo como hemos hecho anteriormente con el nodo de inteligencia artificial, sino que vamos a hacerlo pues eso, un poquito más a mano, simplemente con variables dinámicas. Para esto le vamos a decir enviar confirmación. Rename. Tenemos las credenciales. Todo bien. En el to, ¿vale? ¿A quién le vamos a enviar? Vamos a seleccionar ahora porque si os fijáis nos estaba dando error, ya que la entrada de datos era otra, era la del flujo de arriba. Vamos a seleccionar esta cajita de aquí. Veis que tenemos el email de nuestro cliente, que en este caso pues soy yo, lógicamente. ¿Vale? E en el subject le vamos a decir confirmación. Hm. Reunión. Hm. Automatización. No sé por qué he puesto mayúsculas. Automatización de procesos IA. Bien. Mm, sí, me gusta. Aquí ahora no le vamos a decir que es texto plano, sino que le vamos a hacer en HTML para poder hacer saltos de línea. Ahora lo entenderéis esto. Y en el Misage content vamos a borrarlo, lo que teníamos por defecto. Le vamos a decir hola. Y el nombre, ¿no? El nombre de nuestro cliente que debería estar por aquí. Este, Hola, Agustín. ¿Cómo? Em, simplemente recordarte que nos vemos el y aquí le puedo decir el día que nos vamos a ver, ¿no? Que si os fijáis sería esto de aquí, el started time. ¿Qué ocurre? Si os fijáis, la fecha esta que nos viene aquí, el formato que tiene es superfeo, es como un formato así muy desestructurado, ¿no? No, no le podemos enviar esto a un cliente. Entonces, debemos utilizar una cosa que se conoce como Luxon, que es una forma de formatear, ¿vale?, dentro de Java. Es una transformación que se hace para que sea estandarizado y que podamos manipular la base de tiempo, podamos manipular el formato y podamos adaptarlo a diferentes estandarizaciones del mundo. Bien. Para esto, simplemente ponemos un punto, vemos que tenemos muchas opciones de editar, de bueno, muchas opciones, esto lo comentaremos posteriormente. Y lo que nos interesa es esta de aquí, to date time, ¿vale? Que básicamente es lo que decíamos, lo pasamos a Luxon. Ahora si ponemos otro puntito nos aparecen otras opciones que son las de formato, minus, plus, que es añadir, diferencia, extraer, end. Vale, esto, por ejemplo, imaginad que queréis avisar en menos de 24 horas, podéis hacer una comparación, bueno, podéis hacer muchas cosas. De momento lo que queremos hacer es un formateo. Y si os fijáis, ahora lo hemos formateado y le estamos diciendo, nos vemos el 2025 del 05, el 13, o sea, el 13 del 05 del 2025. Si os fijáis, tenemos muchas formas de formatearlo y esto gracias a esta guía de aquí, ¿vale?, que veis aquí podemos tener información de los diferentes formatos, ¿vale? Si os fijáis aquí, veis, podemos poner, por ejemplo, am, podemos poner Wednesday, ¿no? Como como simplemente el día de la semana, podemos poner solo el mes, podemos poner el año, podemos poner todos estos formatos que estáis viendo aquí. Y para eso lo que tenéis que utilizar es esto de aquí, ¿vale? Este código. Si por ejemplo queremos que aparezca el día de la semana, lo que tendremos que poner son las esas de aquí. Entonces, vamos a hacerlo entre esos paréntesis. Fijaos qué pasa que lo pone en inglés. Esto es un problema, lógicamente, no nos interesa que sea que sea en inglés. Entonces, em estuve investigando y una forma de hacerlo en español que básicamente consiste en lo siguiente, eh, to local time. Vale, para eso lo que tenemos que hacer es aquí mismo ponemos otro puntito, esto que se vaya y aquí le digo set local. Esto de aquí y en set local ponemos España. Es así, tal cual. Fijaos que ha cambiado a martes. ¿Veis? Ahora ya lo tenemos en español. Perfecto. Simplemente recordarte que nos vemos el martes. Em, y ya está, ¿no? Vamos a dejarlo así. Saludos, Agustín. Agustín. Medina coma CO lambda automations. Automats. Y vale, ¿qué ocurre? Que si nosotros enviamos esto así tal cual, lo que veréis es que no hay saltos de línea, que de hecho vamos a hacerlo porque quiero que lo veáis. Aquí veis que está todo continuado. Esto lógicamente no es ni profesional ni atractivo ni nada. Esto es horroroso. Para lograr saltos de línea en formato HTML se utiliza esta expresión de aquí, BR, ¿vale? BR. Básicamente lo que lo que le estás diciendo es salta de línea. Fijaos, veis, pero solo un salto de línea. Nosotros queremos dos saltos de línea y para eso lo que se hace es poner dos. Podéis poner tantos como queráis. Aquí exactamente igual. Y aquí exactamente igual. Fijaos, esto ya empieza a ser una cosa un poquito más interesante, ¿no? Algo más más pulido. Lógicamente se puede mejorar muchísimo más, siempre todo, pero bueno, ya estamos en un buen punto de partida.
Ahora lo que probablemente nos interese es crear un pequeño CRM que vamos a hacer con Google Sheets. Y en este Google Sheets lo que vamos a hacer es cargar tanto los datos de entrada de ese usuario como el estado en el que se encuentra, que en este caso sería estado concertado o estado agendado. Para esto, como veníamos diciendo, no todas las credenciales son igual de simples, algunas requieren unas configuraciones adicionales. Estas configuraciones adicionales las vamos a ver ahora. Seleccionamos aquí Google Sheets. Aquí le decimos actualizar una columna en una en una tabla. Vale, lo vamos a dejar así. Lo llamamos CRM. Aquí se me ha vuelto a buguear. No sé por qué últimamente veis que se me queda así. Ahora se me queda como que no me deja seleccionar, no sé por qué. Le vamos a poner CRM. Vale, rename. Vamos a seleccionar las credenciales, ¿vale? Y si os fijáis, si accedo desde mi cuenta, ah, pues mira, esto justamente no lo sabía. Esto justamente seguramente lo hayan introducido en actualizaciones recientes, entonces lo tenemos mucho más fácil, ¿vale? Porque si os si os habéis fijado, no nos han pedido una API Key como en el caso de Openi o en el caso de Cal. Básicamente porque tenemos la autenticación 2 o out 2 que habéis visto ahí. ¿Veis que directamente nos ha autenticado? Nos deja acceso y ahora ya podemos hacer lo que queramos en nuestro Google Sheets, ¿vale? Entonces recordar el resource sería una hoja con un documento, ¿vale? Una hoja que tenemos creada. La operación que queremos hacer es crear una nueva columna en una hoja de cálculo y el documento debemos seleccionarlo aquí, ¿vale? Actualmente, si os fijáis, no nos aparece ningún documento dentro de este desplegable y esto ocurre porque de momento no tengo creado ningún documento. Entonces, voy a irme a mi Google Sheets. Desde Google directamente le decimos iniciar sesión. Aquí le pongo Agustín. Bien, una vez iniciamos sesión en Google Sheets, automáticamente ya nos aparece esto, ¿vale? Una hoja creada. Le vamos a decir le estado barraaj crm. Lógicamente, lo ideal es utilizar CRMs propios, ¿vale? CRMs que ya están orientados para este uso, pero como quiero que sea algo universal y dar nuestros primeros pasos, lo vamos a hacer en Google Sheets, ¿vale? Em, aquí, si os fijáis, nos ofrecen ya unas plantillas que yo lo que os recomiendo, si queréis hacer una cosa bonita y muy rápida, es que seleccionéis una que se parezca al caso de uso que vais a utilizar. Y lo que podemos hacer, a ver, en relación con los clientes, mira, esta me gusta asignada. Lo que pasa que me deja cambiar el color de [Música] esto. Sí, mira, es que no me gusta nada el color ese. Ahora sí, en azul está mucho mejor. Vale. Vamos a necesitar de momento solo el nombre, eliminar columna, eh, la fase en la que se encuentra. El valor estimado de momento nada, aunque lo podríamos poner porque tenemos la información arriba. La probabilidad nada. Y las notas vamos a cambiar notas. Notas no me interesa tampoco. Más bien me interesa el contacto, que sería el correo electrónico. Espera, no voy a enentar. No sé qué estoy haciendo. A ver, ahora sí. Perdonad que se me estaba yendo ahí la olla. Eliminamos la columna. Aquí le ponemos correo electrónico. Electrónico. Aquí. Bien. Ahora si volvemos a N8N, que ya tenemos nuestra tabla creada, veremos que tarda un ratito esto, pero que podremos seleccionar nuestro Google Sheets que acabamos de crear. ¿Vale? Esto si veis que os da os da problemas, esperad un ratito, ¿vale? Porque suele tardar un poco. ¿Veis? Ahora automáticamente ya me deja seleccionarlo. Si queréis abrirlo directamente desde aquí, le dais a este botón de aquí y automáticamente veréis que se os abre. Vale, yo lo voy a cerrar para no tener tantas de estos abierta. Vamos a cerrar. Esto lo cerramos. Bien, seleccionamos. Esto es para seleccionar la pestaña dentro de ese Google Sheets. Y ahora lo que está haciendo es mapeando todas las columnas que tenemos dentro de ese Excel. ¿Vale? Si os fijáis, tenemos nombre, fase, propietario de la relación, que por cierto esto me lo voy a cargar, y correo electrónico. ¿Vale? Entonces, si os fijáis, nos pone nombre, fase, propietario y correo electrónico. Como he hecho un cambio, veis que se pone la advertencia. Esto es porque si lo actualizo está distinto. ¿Veis? Y ahora lo que puedo hacer es si yo ejecuto esto de aquí, fijaos, me da una salida y esta salida a su vez aquí es una entrada. Aquí tenemos la entrada de Gmail y aquí tenemos la entrada de Cal. A mí donde me están entrando los datos y donde tengo toda la información referente al contacto es directamente en cal. Por lo tanto, con arrastrar el nombre a la columna de nombre, ¿vale? Vales to send, valores a enviar, es más que suficiente. En fase nosotros tenemos aquí un desplegable, ¿vale? Este desplegable, como veis, es cliente potencial, propuesta en curso y otra serie de configuraciones. Yo lo voy a cambiar, no me gusta. Voy a poner agendado, eh. Hm. Propuesta enviada y aceptado. Venga, va. Las demás las eliminamos. Esto lo borramos. Esto lo borramos. Esto lo borramos. Y esto lo borramos. Y esto lo borramos. Listo, ahora lo tenemos limpio. Em, lo que tenemos que hacer, esto lo paso a hecho, es pasarlo a estado agendado. Por lo tanto, cuando nosotros cambiemos el valor de esta columna, ¿vale?, tenemos que pasar ese dato estático. Por lo tanto, vamos a poner aquí tal cual agendado, ¿vale? Exactamente igual que como lo tenemos escrito en nuestro Google Sheets. Para eso le damos aquí, ¿vale? Esto nos lo ha cambiado porque como hemos hecho un cambio ahí de última hora. agendado y el correo electrónico lo pasamos de igual forma. Ahí está. Vamos a darle a test. Bien, nos da el output, que son los datos que hemos enviado a nuestro Excel, y vamos a ver si ha sido así tal cual. Vamos a reiniciarlo. A mí me gusta refrescarlo. Y si os fijáis, tal cual. Agustín Medina, cliente potencial. Bueno, esto sería más bien estado. Ah, ¿por qué no me deja ahora? Estado agendado y el correo electrónico es el siguiente, ¿vale? Esto podríais tener tanto el correo electrónico como el número de teléfono, como el motivo de contacto, como la automatización que está solicitando, como tantos campos como nosotros necesitemos y como tantos campos que nosotros incluyamos dentro del formulario donde recopilamos la información de nuestro potencial cliente.
Em, eso sería un poco la parte básica, ¿vale? Yo creo que es una primera automatización que es muy interesante que trabajemos porque hemos visto tanto como una aplicación que vamos a necesitar como todos los pequeños detalles que subyacen de esta aplicación, como podrían ser las integraciones con apikis externas, cómo son las autenticaciones más básicas, los nodos de inteligencia artificial, las variables, el pinear, la información, ¿vale? para no tener que estar ejecutando constantemente. Y creo que esta es la base sobre la que podemos empezar a trabajar de forma muy contundente. Vamos a hacer aquí una última prueba para que veáis cómo funciona la automatización al completo. Le vamos a decir que me llamo Roberto, que mi apellido es González y que mi correo electrónico, lógicamente, le tengo que poner que es el mío porque si no no me va a llegar a mi correo. linkbip.com mi presupuestos son esto y que mi necesidad es automatizar la prospección en frío de clientes con correos customizados. Bueno, esto lo he escrito mal. Me dice que el formulario ha sido enviado, se lo pasamos al nodo de inteligencia artificial y automáticamente esto se envía. Si venimos a nuestro Gmail, veremos que pasados unos segunditos nos debería llegar aquí. Y hola Roberto, me complace enormemente que deposites la confianza en nosotros. E hemos ayudado a empresas de todas las industrias en la prospección en frío y no solo impresionan, sino que también convierten. Imagina que cada mensaje enviado sea una extensión genuina de tu marca diseñada para captar atención de tus proyectos desde el primer momento. Esto es porque le hemos dicho que sea un copywritter persuasivo, ¿no? Entonces, lo que está haciendo es apelar aquí un poco las emociones. Si os fijáis, esto es bastante útil. Aquí está mintiendo un poco, pero vaya, esto lo podéis refinar con el prom y que se adecúe más a lo que sería vuestra marca personal. Aquí tenemos el enlace para agendar. Para ello, lo que vamos a hacer es ponerlo de nuevo en test. Cerramos esto. Abrimos el enlace. Con el enlace seleccionamos nuestra disponibilidad, que en este caso pues mi nombre vamos a decir que es Pepito. Bueno, vamos a decir que es Alberto. Va, Alberto. Mi correo es pues el de siempre, ¿no? Mentira. Agustín. Confirmamos. Ejecuta nuestro flujo de trabajo. Automáticamente enviamos otro correo. Perdonad aquí. Perdonad de nuevo aquí. Hola, Alberto. Simplemente recordarte que nos vemos el jueves. Saludos. La firma y Alberto debería de haber sido introducido en nuestro CRM, pero estamos viendo que no. Vamos a ver por qué no. Vale, no se ha introducido básicamente porque hemos vuelto a hacer un cambio en el estado, ¿vale? Y no nos lo ha eh aceptado. Entonces, vamos a pasarlo a agendado nuevamente. Agendado. Y ahora en teoría, si os fijáis, sí que está funcionando. ¿Por qué sigue enviando a Agustín Medina Galindo? Pues básicamente porque como estoy con la cuenta de Agustín Medina Galindo, el parámetro de entrada que hemos seleccionado es el referente a la cuenta, ¿vale? No es el referente al formulario donde yo he seleccionado Alberto. Si os fijáis, el organizador es Agustín Medina Galindo y Alberto sería el que viene a a esta a esta entrevista, ¿no? A esta reunión. Entonces, tendríamos que cambiarlo por esto de aquí. Pero vaya, estos son, bueno, configuraciones y cositas que tenemos que ir adaptando en el transcurso de del tiempo de la automatización y adaptándola a la necesidad específica de ese momento. Y bueno, eso sería la primera parte. Ey, si has llegado hasta aquí, muy probablemente ya eres consciente de todo el potencial que tiene esto de las automatizaciones y la inteligencia artificial en general. Si quieres formar parte de un club selecto de emprendedores que inician totalmente desde cero y son capaces de monetizar miles de dólares en tiempo récord, únete ahora a Ail Bip, la comunidad líder para emprendedores de agencias de inteligencia artificial, donde encontrarás recursos totalmente exclusivos, encontrarás mi mentoría personalizada grupal semanalmente y además de esto tendrás acceso a un grupo de expertos que os asesorarán y responderán vuestras preguntas en menos de 24 horas. Así que si quieres formar parte de esta revolución, únete ahora a Ailen Bip. Y ahora me gustaría que nos centrásemos en la parte de los agentes de inteligencia artificial y los nodos.
de inteligencia artificial en general. Estos nodos de inteligencia artificial, al igual que con los otros nodos que hemos visto a lo largo del curso, podemos seleccionarlos desde la sección del panel de nodos, aquí arriba. Aquí siempre, como recordáis, debemos de poner un trigger antes y después nos dejará poner un nodo de inteligencia artificial, así como cualquier otro. ¿De acuerdo?
Seleccionamos inteligencia artificial, veremos que tenemos tanto agentes como el nodo de Open, que es el que estábamos viendo anteriormente, como el nodo de Basic L elm chain, que al final es un nodo de inteligencia artificial básico, el extractor de información, muy interesante, tenemos el question andare, el análisis de sentimiento, el de resumen y el text classifier. Este de aquí no sería tanto un nodo de inteligencia artificial, pero lo vamos a ver posteriormente.
Em, quisiera que comenzásemos hablando de los agentes de inteligencia artificial. Como sabéis, han sido la gran revolución en los últimos tiempos. Hay muchísimo hype en torno a este concepto de agente y hoy vamos a hablar de ellos de una forma super pragmática. Vamos a desmitificar sus partes y además vamos a entenderlos en profundidad. Para esto, lo primero que vamos a hacer es seleccionarlo aquí. Igual que con la mayoría de nodos, se nos pone automáticamente en nuestro canvas, en nuestra sección de de proyecto. Y aquí, como veis, siempre debe de estar vinculado a un chat, ¿vale? Este chat puede ser un chat de Telegram, puede ser el chat que nos viene por defecto en N8N, a través del cual podemos decirle lo que sea directamente aquí, ¿de acuerdo? Y puede ser todo nodo que permita una interacción a través de texto. No puede ser un nodo de test workflow porque no le estamos enviando nada.
Vamos a darle nombre al proyecto. Le vamos a decir test agentes. Y lo primero que quiero que entendamos es de qué está compuesto un agente de inteligencia artificial. Un agente de inteligencia artificial está compuesto de cuatro partes fundamentales. Una de ellas sería el modelo de lenguaje, es decir, el chat model que conectamos en esta patita de aquí. El chat model, pues como su nombre indica, sería lo que nosotros conocemos como Chat GPT, el Gemini de Google, Deepsic, el Cloud de Anthropic, cualquiera que a nosotros nos vaya mejor en el caso de uso y en el contexto en el que vayamos a aplicar esta solución. ¿Qué ocurre? Que por ejemplo, el de Chat GPT para ciertos proyectos donde necesitamos unas características de precisión o de rapidez nos irá mejor, ¿vale? Pero ya vamos a ver cuándo vamos a elegir un modelo frente a otro.
Seleccionamos esto, seleccionamos las credenciales, exactamente igual que hemos hecho la sesión anterior y seleccionaríamos el modelo aquí mismo. Vale, sin más. Ahora iríamos a la parte, ¿vale?, donde configuramos la memoria, la otra patita que estáis viendo aquí. Esta memoria se viene a referir a la memoria interactiva que vamos a tener nosotros en el chat abierto con este agente. ¿A qué me refiero con esto? Nosotros cuando interactuamos a través de este chat de aquí, de este nodo de aquí, lo que estamos haciendo es abrir una ventana de contexto. Y una ventana de contexto son todas las interacciones que nosotros hacemos en un tiempo determinado con un modelo de lenguaje, ¿vale? Entonces, imaginad que yo le pregunto a este modelo de lenguaje, a este agente de aquí por el tiempo, o le pregunto o más bien le digo que tengo un perro de color verde. Pues en la siguiente interacción el agente va a tener contexto de que yo tengo un perro de color verde y va a adecuar sus respuestas a ese contexto. Va a tener memoria del usuario, de las interacciones a lo largo del tiempo.
Estas memorias hay muchas, ¿vale? Entre ellas está la memoria simple que utiliza la memoria interna de N8N, que es SQLite, si no recuerdo mal, y que es una memoria que es muy sencilla de configurar, no requiere ningún parámetro ni configuración en cuanto a credenciales, simplemente la seleccionáis y puede funcionar al momento. Es plug and play. Después tendríamos otras memorias, ¿vale? Que utilizaríamos tablas externas, utilizaríamos bases de datos externas como puede ser Postgress o redis, ¿vale? Que estas son bastante potentes y que pueden tener unos casos de uso ya para producción algo más específicos y que nos darán más flexibilidad a largo plazo.
Esta memoria simple, que es la que vamos a ver ahora mismo, si la seleccionáis, veréis que el session ID es el único parámetro relevante. ¿A qué se refiere el session ID? Como sabéis, em imaginad, por ejemplo, que nosotros estamos en una empresa donde hay 50 empleados y cada uno de estos empleados tiene un número asignado del 1 al 50. Es la forma que nosotros tenemos de saber qué número o qué identificador hay asociado a cada uno de los empleados. Entonces, imaginad que le damos una tarjetita a cada uno de estos empleados y con esa tarjetita es que fichan por la mañana o es que abren la puerta de la empresa y sabemos que ese empleado número uno es el que ha abierto esa puerta. Pues ocurre exactamente con el session ID. Cada chat, cada nodo que estáis viendo aquí está vinculado a un ID y cada ID es único e irrepetible para cada usuario individual. De esta forma, si hay dos personas simultáneamente hablando con este agente, lo que ocurre es que nosotros sabemos qué memoria está asociado a cada persona, ¿vale? Que esto es muy importante porque nosotros aquí lo que vemos es un agente, un workflow, pero si este workflow nosotros lo ponemos en producción, muchas personas pueden interactuar con este agente al mismo tiempo, aunque veamos uno solo. ¿Vale? Concepto importante.
Entonces, para hacer la prueba, nosotros le podemos decir que lo definimos aquí debajo, ¿vale? O que automáticamente lo traiga del trigger de chat, ¿vale? De aquí. De momento lo vamos a dejar así. Ahora lo veremos.
Después hay una cosa que es el context Windows Lens, ¿vale? Que se refiere a cuántas interacciones pasadas tiene en la memoria este agente de inteligencia artificial. E si ponemos un número muy elevado, lo que puede ocurrir es que acabemos saturando la memoria de la gente y que al final las respuestas sean un poco erráticas. Entonces, este valor pues dejarlo así bajito, que tampoco creo que necesitéis nada del otro mundo en este nodo.
Y por último y más importante, bueno, penúltimo y más importante, tenemos la tool. ¿Qué es una tool? Una tool es una acción determinada en un servicio, en un proveedor de servicio externo, como podría ser un MCP client Tool, este de aquí que es un protocolo que hablaremos posteriormente, como podría ser una base de datos vectorial, como podría ser el nodo directamente de Google Sheets, como podría ser WhatsApp, como podría ser todos aquellos servicios que nos permitan integrar acciones dentro de nuestro agente. Y el agente lo que va a hacer es llamar a este servicio y ejecutar aquello que nosotros le hayamos dicho. Por ejemplo, le puedo decir a este agente que con la tool de Gmail envíe un correo electrónico siempre y cuando el usuario se lo solicite a través de chat. ¿Vale?
En definitiva, un agente se diferencia de una cadena de inteligencia artificial básica en el hecho de que la gente puede ejecutar instrucciones fuera de N8N. Puede utilizar herramientas. Imaginad que tenéis un martillo, se lo dais a un modelo de lenguaje, pues el modelo de lenguaje podrá clavar clavos. En este caso, de momento, e un buen ejemplo que podemos eh ver sería el de Gmail. Venga, que antes hemos puesto un ejemplo bastante similar y así vamos a tener una referencia. Como veis, exactamente igual que con el nodo básico de acción. Tenemos todas las programaciones de los parámetros, ¿vale? Exactamente las mismas, pero con unas pequeñas particularidades que veremos más tarde.
Y por último, en el concepto este de agente tenemos otra parte fundamental que es el propio agente, ¿vale? Porque cada agente tiene una función y cada agente está especificado para un uso. Este agente que nos viene en N8N por defecto es un agente que se conoce como React. React es una forma de actuar, ¿vale? una forma o un concepto en cuanto a cómo está programado este agente y básicamente lo que hace es observa lo que le hemos pedido por el chat, analiza el contexto, mira las herramientas y toma decisiones. Pero pensad que esto de aquí no es inteligente el agente. El agente es tonto. Lo que es inteligente es esto de aquí, es el modelo de lenguaje, ¿vale? El cerebro es esto. Esto es muy importante que lo entendamos, ¿vale? Ya que nos va a dar muchísima claridad y comprensión de qué es lo que estamos haciendo y cómo lo estamos haciendo.
Bien, vamos a imaginar que en esta pequeña aplicación que tenemos aquí lo que queremos hacer es enviar un correo electrónico cuando se lo solicitamos a este agente de aquí. Entonces, como hemos visto, cuando nosotros configuramos un nodo, lo primero que tenemos que decirle es de dónde proviene la información, ¿vale? Y si es fija o variable. Lo que vamos a hacer es decirle que el prom va a definirse aquí debajo, ¿vale? En una ventana de texto y va a ser expression, va a ser variable. Entonces, si nosotros ahora venimos a chat y decimos hola, veremos que automáticamente se ejecuta, nos da una serie de errores, lógicamente, porque no lo tenemos configurado. Y en la parte izquierda, donde tenemos las inputs, ahora vemos que tenemos seleccionable esta cajita de aquí donde tenemos contenido el texto del usuario, la entrada del usuario. Y por lo tanto, yo ahora si lo arrastro aquí le estoy diciendo a esta agente que tenga en cuenta esta entrada del usuario. ¿Vale? Si yo ahora le digo, "¿Cómo estás?", no tendré hola. Aquí tendré cómo estás, ¿vale? Se vuelve variable.
Em, más cositas que tendríamos. Tendríamos esto de aquí, ¿vale? Para requerir una salida en cuanto a qué nos ofrece como respuesta. Podríamos hacer que fuese JSON, por ejemplo, la salida, ¿vale? De este agente, eso ya lo veremos. Y podemos añadir una serie de propiedades como pueden ser el system misage. No sé si recordáis que anteriormente cuando estábamos haciéndolo con el nodo de Openi, cuando estábamos haciendo la solución básica de correo electrónico, lo que nosotros hacíamos era modularizar por un lado el system mis y por otro lado el user mis porque en el system es donde definimos aquello que tiene que hacer este agente, aquello que va a definir su comportamiento de forma indistinta a lo que nosotros le digamos aquí, ¿vale? Entonces, por una cuestión de limpieza, de mantener una estructura bonita y agradable, lo ideal es que lo hagamos siempre en el System Misage.
Aquí, como lo que nosotros queremos hacer es enviar un correo electrónico y tenemos una herramienta de Gmail vinculada de correo electrónico, lo que le tenemos que decir a este agente es lo siguiente: "Eres un agente especialista en la redacción de correos electrónicos profesionales. Tienes y ahora explicamos una cosa, eh, tienes una herramienta denominada Gmail, ¿vale? que debes usar para este fin." Fijaos, es extremadamente importante que nosotros a el agente le especifiquemos qué herramientas tiene disponibles. Fijaos que aquí en la tool, ¿vale? Si pinchamos aquí abajo, se llama Gmail y es la forma que tiene la gente de saber que tiene que utilizar esta herramienta, ¿vale? Se la debemos hacer conocer y le tenemos que decir cómo actuar con esa herramienta. "Tienes una herramienta Gmail que debes usar para este fin, para enviar correos electrónicos. Debes enviarlo, enviarlo al correo que solicite el usuario." [Música] Mm h m. "Le pedirás que te defina el subject y por otro lado el cuerpo del el cuerpo del correo."
Bien, fijaos, ahora le he dicho que debe enviar el correo al usuario que bueno, al correo electrónico que solicite el usuario a través del chat y por otro lado le he dicho que debemos definir el subject y el cuerpo del correo, ya que de otra forma pues enviaremos correos que no están completos, ¿no? Bien, vamos a ver. Estamos viendo que tenemos varios errores, entre ellos la memoria. Vamos a ver qué le pasa a la memoria. Hm hm hm. Nos dice que tenemos este problema de aquí, por lo tanto, lo que vamos a hacer es decirle "define below". Y no sé si recordáis que comentábamos lo de las claves. Para nosotros poder ponerle la clave de nuestro chat variable, aquí dentro lo ponemos en expression y aquí, ¿vale? Fijaos, session ID, lo arrastramos y listo, ya tenemos el session ID. Y ahora ya no debería de darnos problemas la memoria. Cerramos.
En Gmail, lógicamente, nos sigue dando problemas porque no tenemos nada configurado. Y ahora vamos a explicar otro salto conceptual. Em, cuando estábamos viendo el ejemplo con el nodo de inteligencia artificial básico de Open en el ejemplo anterior lo que veíamos es que a la hora de definir el remitente, aquel al que le enviábamos el correo electrónico, nosotros lo arrastrábamos de aquí como una variable que definíamos de un formulario. Pero en este caso, los agentes de inteligencia artificial podemos utilizar una funcionalidad extra que poseen estos, que es from AI. From AI es una forma de hacer dinámicas estas entradas y dejar al modelo, a el agente de inteligencia artificial, que las defina conforme él crea necesario. Vamos a verlo.
Fijaos que yo en ningún momento le digo a quién tiene que enviar el correo. Sin embargo, le doy aquí a estas estrellitas de aquí como de magia que "let the model define this parameter" aquí y me pone esto definido automáticamente por el modelo. En el subject hago exactamente lo mismo. En el message hago exactamente lo mismo y ya está. Vale, en el email type lo podemos cambiar, pero de momento vamos a dejarlo así. Listo, guardamos. Vamos a eliminar el contexto y vamos a decirle hola.
Bien. "Hola, ¿en qué puedo ayudarte hoy? Si necesitas redactar un correo electrónico, estaré encantado de asistirte." Venga, vamos a decirle, "Me gustaría enviar un correo a eh Agustín." Vale, me dice que le indique el subject que te gustaría para el correo y el contenido que deseas incluir en el cuerpo del mensaje. Em, subject. Le voy a decir que no puedo asistir a la reunión de hoy y el cuerpo. "Lo siento, lo siento, Agustín. No estoy disponible por una cuestión personal." Fijaos, ha cumplido las directrices una a una, es decir, hemos rellenado todos los datos que yo le he solicitado a través del prom y automáticamente ha empleado la herramienta correspondiente para realizar esta acción. Vamos a ver el correo electrónico. Fijaos, "no puedo asistir a la reunión de hoy", ¿vale? Me lo he enviado yo mismo y me dice esto. Veis que nos han vuelto a colar lo de la promoción de N8N, como siempre. Ahora lo quitamos. "Lo siento, Agustín, no estoy disponible por una cuestión personal." Listo.
Fijaos que no nos está tabulando, bueno, no nos está haciendo los saltos de línea y esto no es del todo adecuado. Vamos a ver cómo lo solucionamos, ¿vale? Y vamos a ver cómo lo mejoramos esto. De entrada, lo que vamos a hacer en el nodo de Gmail es quitar la atribución a N8N. Esto fuera. Listo. Después, como el contenido está en HTML, no sé si recordáis que para hacer saltos de línea en HTML, lo que nosotros hacíamos era el este de aquí, el BR, ¿vale? Esto sería un salto de línea y esto serían dos saltos de línea, ¿vale? Entonces, podemos decirle que mantenga una estructura en HTML con saltos de línea. Mm. dos puntos y vamos a hacer algo así. Ejemplo, ¿no? Ejemplo. Hola. Y aquí vamos a poner el nombre. Hmm. Mensaje, mensaje del usuario, ¿vale? Mensaje del usuario, br, vale, para el salto de línea. Y aquí, bueno, esto de mensaje del usuario vamos a ponerlo como corresponde, ¿vale? Que sería de la siguiente forma. Y aquí el saludo, ¿no? Saludos. Saludos. Y aquí ponemos la firma. Listo.
Vamos a probarlo ahora a ver qué tal. Eliminamos. M. "Hola, ¿qué tal?" "Hola, estoy aquí para ayudarte. Que puedo asistirte hoy." "Me gustaría enviar un correo." Vale, claro. "Estoy para ayudarte. Por favor, indícame el destinatario, el asunto y el contenido del cuerpo del correo que deseas enviar." Vamos a decirle que el destinatario nuevamente soy yo mismo. El asunto test y el cuerpo. "No puedo ir porque me ha surgido un problema grave." Bien, fijaos, ha accedido a la herramienta de Gmail. Vamos a ver el correo electrónico. Esto, como veis, siempre tarda un poco en refrescar. Y fijaos que ahora correctamente nos lo ha puesto como corresponde, con el formato que toca. Fijaos que hay los saltos de línea y los está respetando como toca.
Pero claro, no tiene mucho sentido que lo tengamos integrado directamente en N8N. Este chat aquí mismo no vale para absolutamente nada, ¿no? E, ¿qué podemos hacer? Podemos, por ejemplo, integrarlo con una aplicación externa como podría ser Telegram. Y para esto lo podemos hacer de una forma muy sencilla. Como sabéis y como venimos comentando en todo el curso, tenemos diferentes triggers de diferentes aplicaciones e integraciones externas, entre ellas está Telegram, ¿vale? Si lo buscamos aquí nos aparece. En Telegram tenemos diferentes triggers, diferentes disparadores en función de la acción que realicemos en este Telegram y uno de ellos puede ser on message. Es decir, que siempre que llegue un mensaje a un bot que nosotros programemos, automáticamente este bot dispare el workflow y envíe ese mensaje a nuestro agente de inteligencia artificial.
¿Cómo conseguimos las credenciales de Telegram? Como siempre, vamos al lápiz. En el lápiz, si tenemos dudas, vamos a abrir la documentación, ¿vale? Le damos aquí a Open Docs y veremos que mínimamente N8N se esfuerza en mantener esto un poco actualizado y normalmente si lo seguís al pie de la letra no deberíais de tener problemas, ¿vale? Excepto en integraciones o e aplicaciones externas así un poquito más complejas o que se actualicen de forma muy constante, ¿vale? En concreto con la de con la de Telegram parece estar bastante actualizado, así que vamos a hacerlos nosotros directamente, pero esto es lo que yo recomiendo siempre. Venga, vamos a Telegram. En Telegram vamos al BotFather. Para acceder al BotFather simplemente debéis de venir a la barra de búsqueda superior, escribir BotFather, tal cual que estáis viendo aquí, y ya podréis interactuar con este bot. Entráis aquí, debéis de decirle /newbot intro. Nos pregunta cómo le vamos a llamar a este bot. Vamos a decirle tutorial YouTube link. Vale, ahora nos dice cuál va a ser el nombre de usuario, es decir, el nombre a través del cual encontraremos a este bot. Y por lo tanto tiene que terminar con la palabra bot, ¿vale? Por un tema de diferenciarlo de usuarios reales. Vamos a decirle tutorial tutorial a/bing. Más. Bien. Y veréis sers sencillo. Aquí tenéis por un lado la API, la copiáis y por otro lado tenéis el chat para poder acceder a vuestro bot. Le dais a este link de aquí, le dais a iniciar y ya podréis interactuar directamente.
Vamos a volver a nuestro N8N. Pegamos la API. Aquí. Perfecto. Veis que nos dice que se ha conectado satisfactoriamente. Aquí podríamos configurar cuáles serían los triggers dentro de nuestro, bueno, más bien los activadores dentro de nuestro trigger. Podemos configurar varios, podemos configurar varias opciones siempre, ¿vale? Aquí dentro. Y vamos a probarlo. Lo conectamos, guardamos. Venga, lo ponemos en test. Lo primero y ahora le enviamos un mensaje. Vamos a decirle hola.
Fijaos que lógicamente como la variable de entrada proviene de otro nodo, ¿vale? Proviene de otra fuente, lógicamente el agente se encuentra desconfigurado. Lo que debemos hacer es cambiar el prom, ¿vale? El digamos que el source del prom y veréis que la entrada que tenemos ahora es totalmente distinta. En este caso es esto de aquí. Fijaos, chat input. Aquí lo ponemos. Perfecto. Y por otro lado, en la memoria, lógicamente también nos habrá caducado esto de aquí porque se trataba de otra entrada. Entonces, vamos a pillar el chat ID de Telegram. De nuevo, este chat ID de Telegram es único e irrepetible y además permanece siempre asociado a un número de teléfono. Entonces, este usuario, aunque se borre el número de aunque se borre la aplicación, más bien el número de teléfono, vuelva a descargarla, vuelva a iniciar sesión, cierre, apague el teléfono, haga lo que haga, siempre va a tener esta aquí y por lo tanto siempre lo podemos tener controlado y siempre lo podemos tener vinculado a un historial, ¿vale? Para tener contexto de este usuario. Pegamos aquí, guardamos y ahora sí, si lo ponemos en test workflow directamente, le podemos decir hola.
Genial, ya estamos interactuando con nuestra gente a través de Telegram. Fijaos que nos llega LOL aquí. Ahora lo que queremos es que este output de aquí no se quede lógicamente encerrado en N8N, sino recibir respuesta gracias a otro nodo de Telegram que nosotros podemos poner aquí. Hm. Telegram aquí directamente y le podemos decir que en acciones [Música] hm send a text message aquí veis aquí en send text message le debemos de indicar el chat ID al que queremos enviarle ese mensaje de vuelta, que en este caso el chat ID será el mío. ¿Por qué se hace esto de nuevo? Porque como cada uno tiene un chat ID y cada uno tiene una interacción, no tiene sentido que este agente de inteligencia artificial le envíe mi respuesta a otra persona. Si yo soy Agustín, no tiene sentido que se lo envíe Alberto. ¿Me explico? Entonces es muy importante esto. Es por eso que nos lo nos lo solicita. Vamos a darle el chat ID de aquí, ¿vale? Y por otro lado, en el text, es decir, el mensaje que nos va a dar como respuesta, le vamos a dar el output de la gente. ¿Listo?
Fijaos, si yo ahora le doy a test, automáticamente me dice que se ha dado de forma satisfactoria. Y que por otro lado, ¿vale? Nos ha dado aquí la respuesta. ¿Veis? Em, nos han vuelto a colar la atribución. Vamos a quitarla en un momento. La quitamos. Bien. Y vamos a darle a test workflow. "Hola, ¿qué tal?" "Hola, estoy aquí para ayudarte. Si necesitas redactar un correo electrónico o cualquier otra cosa, solo dímelo." Bien, vamos a pedirle. "Me gustaría enviar un correo electrónico." ¿Vale? ¿Veis que nos solicita la información que nosotros le hemos pedido como parámetros de entrada entre comillas, ¿vale? Para poder enviar el correo electrónico, exactamente igual que como estábamos haciendo con el chat. Y ahora si se lo proporcionamos, pues, Agustín, ¿vale? @ilinkvip.com em subject tutorial Bueno, lo vamos a especificar subject tutorial cuerpo. "No puedo asistir lo siento, tío." Ahora sí que accede a la herramienta. Fijaos, veis aquí abajo que ha accedido. Bien, vamos a venir a nuestro correo electrónico. Esperamos un momentito. Y como vemos, "hola no puedo asistir, lo siento tío, saludos, Agustín Medina de Landa Automations." Bueno, esto sería un ejemplo de cómo podéis sacar este agente de aquí, cómo podéis hacer que esté en otros dominios o en otras aplicaciones externas para que podamos interactuar, no solo dentro de N8N. Y esto lo podemos hacer en tantas aplicaciones, como veníamos diciendo, cómo nos permitan los integradores que tenemos por defecto en N8N. ¿Vale?
Después hay otra forma de hacerlo con integraciones que no tengamos por defecto, que son un poquito más complicadas. Vamos a poner otro ejemplo. Ahora imaginad que yo quiero integrar en mi página web a través de un código embebido este mismo chatbot, ¿vale? Y de hecho lo vamos a hacer con mi página web real. Yo mi página web actual e de Lambda Automations la tengo en Framer, que es una forma de diseñar nuestras páginas webs de una forma muy agradable, intuitiva, ¿vale? Y además tiene una estética brutal. Actualmente no lo tenemos muy optimizado porque mi problema actual no se trata en o no estaría tan enfocado en conseguir leads, en conseguir clientes. De hecho, ahora mismo tenemos más clientes de los que podemos asumir, sino que más bien nuestro problema actual es que no tenemos infraestructura para poder aceptar tantos proyectos como quisiéramos, ¿no? Es por eso que esta página web os puede servir de referencia estética, pero a nivel de funnel sería la más óptima, ¿vale? Eso lo dejo claro desde ya.
Em, en el caso de Framer, ¿vale? Nos permite y en cualquier página web que tengáis que esté codificada en HTML o lo que sea, nos permiten poner un código embebido, ¿vale? En el caso de Framer te deja ponerlo aquí abajo en custom code y este código embebido, si nosotros nos venimos a nuestro N8N aquí, ¿vale? Y vamos aquí y volvemos a poner nuestro chat trigger convencional, el que teníamos en un inicio aquí, chat trigger. Veremos que hay una opción para que nosotros este chat de aquí lo podamos hacer público. ¿Vale? Ahora nosotros podemos acceder a este chat gracias a este webhook de aquí, a esta URL. Si nosotros copiamos esto, lo ponemos en el navegador, ¿vale? Nos dirá lo siguiente. ¿Veis que nos dice que estamos accediendo, pero que sin embargo como no se encuentra en producción nos lanza un error. Si yo ahora mismo este workflow de aquí lo paso a producción, veis que está aquí arriba inactivo, ¿vale? Y vuelvo a acceder a esta URL, perdonad, veréis que se nos abre este chat interactivo fuera del propio N8N. Y yo ahora mismo puedo hablar con mi agente. Lógicamente me da error, ¿vale? Porque no tengo configurado lo de las lo de las entradas, ¿vale? Los tags dinámicos que hemos cambiado antes con Telegram. Pero como estamos viendo, las ejecuciones ya no están supeditadas a ponerlo en test. ¿Recordáis que antes lo poníamos todo el rato en test aquí abajo y que hacíamos una ejecución y volvíamos a ponerlo en test cada vez? Ahora, cuando lo pasamos a producción no sucede de esa forma. Y si os fijáis, veis aquí que tenemos las 1000 ejecuciones que nos proporciona N8N con nuestro trial de prueba. Ahora sí que se están consumiendo, ¿vale? Porque ya son ejecuciones en producción.
Mm, lo que vamos a hacer, lo primero es e, como veis, cuando nosotros lo pasamos a producción, el agente ya no se pone de color verde y vemos lo que pasa de forma superbonita, sino que directamente ya no sucede nada. ¿Veis que no pasa nada? Si yo ahora hago así y hablo con mi agente, vuelvo, ya no pasa nada aquí. ¿Veis esto? Sé que al principio puede ser algo lioso y que os puede llevar a confusión. Esto ocurre porque cuando lo pasamos a producción, las ejecuciones, la única forma que tenemos de supervisarlas sería desde esta sección de aquí, ¿no? Desde el editor, ¿vale? Desde ejecuciones. Como veis, aquí tenemos todas las ejecuciones que se han dado, ¿vale? Nuestro flujo de trabajo. ¿Y cómo se han dado estas? Como veis, se han dado cinco errores en el último en los últimos 2 minutos y han sido pues lo que comentábamos, ¿no? Que no teníamos el ID. Entonces, si yo abro aquí, como veis, me dice que esta variable de entrada no existe, que está indefinida. Bien.
Y os preguntaréis, "Vale, pero si estoy en producción, ¿cómo hago para arrastrar esta variable o para saber exactamente el nombre del tag del de este JSON?", ¿no? Pues muy fácil. Lo que podéis hacer es ponéis esto en JSON, ¿vale? Le dais aquí a copiar, aquí cerráis, venís a editor, venís a vuestro nodo, ¿vale? De de entrada y aquí, ¿vale? Le podéis dar a set mock data, es decir, a introducir datos de prueba. En introducir datos de prueba, pegáis los relativos a esa ejecución, guardáis y ahora, como veis, se ha pineado automáticamente. Recordar la importancia que tiene el hecho de pinear. Ahora no es necesario que yo esté ejecutando este nodo para hacer pruebas. Si yo vengo a mi agente y tengo este ítem de entrada, puedo arrastrarlo, ¿vale? Directamente chat input. Aquí lo llevas, ¿ves? Directo. Perfecto. Y en el simple memory, este de aquí, exactamente, le pongo la aquí de igual forma. Vale, aquí. Genial. Guardo, quito el pin. Vuelvo a guardar. Esto ya es manía personal, ¿vale? Yo guardo a cada instante, como os he dicho antes. Y ahora si hablo con este agente de aquí que tengo en el chat, como veis, ya obtenemos respuesta y podemos interactuar con él.
Pero de nuevo, a mí en este chat de aquí no me vale para nada tener este agente. Es prácticamente inútil, ¿no? Que yo tenga un chat aquí en en una URL así superrara. Pues yo lo que necesito ahora es por un lado ponerlo en público, que esto ya lo hemos hecho, y por otro lado ponerlo en la opción esta de chat embebido. Si vosotros pulsáis aquí en chat embebido, como vemos aquí, se nos habilitan unas instrucciones que simplemente las abrimos aquí y aquí nos indica el código que debemos de incrustar en nuestra página web para poder utilizar ese chatbot de N8N directamente en esta. Vale, como vemos tenemos diferentes opciones aquí, ¿vale? En concreto, la que nosotros vamos a utilizar en esta página web, ¿vale? Es la siguiente, este de aquí, ¿de acuerdo? Lo copiamos tal cual. Venimos a nuestro Framer, este de aquí, que recordar es donde yo tengo programada mi página web, ¿vale? Donde la tengo diseñada y dónde está mi página web. Este me permite incrustar custom code y entonces es simplemente pegarlo tal cual y ya está. Ahora veis que lo único que debemos de sustituir sería esto de aquí que sería la URL de nuestro webhook en producción. Para esto venimos a nuestro N8N nuevamente. Directamente veremos que tenemos el chat URL aquí. Vale, volvemos a Framer, pegamos el Webhook URL. Y ya estaría. Publicamos date y vamos a ver.
Perfecto. Antes yo no tenía esta burbujita que estáis viendo aquí y ahora ya pues directamente pues en mi página web tengo un chatbot, ¿vale? Con el que puedo en este caso enviar correos electrónicos, ¿vale? Que tampoco es que tenga muchísimo sentido, pero vamos a darle una vuelta de tuerca, ¿vale? Ahora quiero que este chatbot em avisa a los clientes o más bien informa a los clientes de mis preguntas y respuestas frecuentes que podrían ser relativas, por ejemplo, a los servicios que ofrece mi agencia. Em, ¿cómo podemos hacer esto para que sea escalable y que no esté integrado dentro del prompt? Porque si está integrado dentro del prompt está limitado. Yo no puedo poner un prompt de 500 páginas, ¿verdad? Pues yo lo que haría e es lo siguiente. Vamos a vamos a hacerlo.
Volvemos a nuestro N8N. Vamos a cambiar la herramienta que tiene vinculada este agente. Ya no quiero que envíe correos electrónicos, ahora es otro agente. Y lo que le voy a vincular es una herramienta que va a ser de Google Sheets, ¿no? De una hoja de de cálculo de toda la vida. En esta hoja de cálculo lo que vamos a hacer es tener contenidos en forma de columnas, tanto las preguntas como las respuestas frecuentes. Vale, vamos a hacerlo en un momento. Bien, iniciamos sesión en nuestra en nuestro Google. Le damos el nombre a la hoja de cálculo, como siempre. Preguntas frecuentes. Preguntas frecuentes. Creamos dos columnas donde podamos asociar un nombre a cada una de ellas, que en este caso una será para preguntas y otra respuestas. Y vamos a pensar en posibles preguntas que se puedan dar dentro de una agencia de inteligencia artificial. Una de ellas sería, ¿qué servicios ofrecéis? Otra podría ser vuestro horario de apertura, ¿no? Horario de apertura. Otra podría ser, hm, cómo puedo agendar una llamada, etcétera, etcétera. Imaginad que aquí hay miles de preguntas y las respuestas vamos a definirlas. ¿Qué servicios ofrecéis? Pues ofrecemos servicios de automatización inteligente gracias a la IA. ¿Qué horario de apertura tenemos? Supongamos de 09 a 17 horas. ¿Cómo puedo agendar una llamada? Pues puedes agendar una llamada. Hm hm hm hm directamente contactando con un correo electrónico. Aquí pensad que podríais abrir un formulario para captar los datos de este cliente también, ¿vale? O sea, esto es un ejemplo de los más básicos.
Bien, volvemos a nuestro N8N. Ahora que ya tenemos nuestros FAQs de mock data, ¿vale? de datos de prueba, vinculamos este Google Sheets a el que acabamos de crear, ¿vale? Esta configuración exactamente como hemos hecho hasta ahora. Para eso seleccionamos aquí preguntas frecuentes y aquí el número de hoja, ¿vale? Que el número de hoja sería el número uno. Bien. Em, aquí no tenemos que hacer nada, esto ya estaría bien. Y a esta herramienta, recordad que le tenemos que dar un nombre único y repetible, que de eso ya se encarga N8N, pero que además sea intuitivo para que cuando programemos en el agente el nombre de la herramienta, pues nos acordemos. En este caso le voy a decir que se llama FAQs. Listo.
Volvemos a nuestro agente. Lógicamente le tenemos que cambiar el prom. Vale, ahora le voy a llamar chatbotbot web. Rename en expression. Vamos a ver qué tiene esto. Le decíamos que era una agente tal. Nada, ahora esto ya no nos sirve para nada. "Eres un chatbot profesional h de una página web de una agencia de IA reputada reputada cuyo propósito consiste en asesorar a mis clientes con la mayor precisión y profesionalidad posible. Limítate a responder con la información contenida en la herramienta denominada FAQs. No inventes información. relativa al negocio, ni h respondas cuestiones fuera de tu dominio." Bien. Hm. ¿Qué más le podemos decir? ¿Qué más? ¿Qué más? ¿Qué más? Bueno, de momento vamos a dejarlo así. Va, la entrada ya la tenemos bien configurada. M, eso está bien también. Vamos a guardar.
Recordad que aquí nosotros le hemos dicho que nuestro horario de apertura es de 9 a 17. Vamos a preguntarle en nuestra página web a ver si esto lo hemos hecho correctamente. "¿Cuál es vuestro horario de apertura?" Fijaos, "nuestro horario de apertura es de 8 a 17 de lunes a sábado." Esto de lunes a sábado es una alucinación. No debería de haberlo dicho bajo ningún concepto, ¿vale? Porque nosotros aquí en preguntas frecuentes, si os fijáis, simplemente le hemos dicho de 9 a 17. De hecho, lo que ha respondido es de 8 a 17. Vale, vamos a ver qué ha ocurrido aquí. Esto es interesante que lo veamos en directo. Fijaos, si venimos a ejecuciones, vamos a ver cómo se ha dado esta ejecución. Fijaos que ha accedido a FAQs, ¿vale? Ha accedido a nuestras preguntas, bueno, a nuestras respuestas y preguntas frecuentes. Y como veis de ha recuperado correctamente la información, pero la respuesta que ha dado no es correcta. Y esto, ¿por qué ha ocurrido? Fijaos, pese haberle dado esto correctamente, no lo ha hecho. Esto ha ocurrido muy probablemente, por un lado, porque, como recordáis, no hemos ajustado este parámetro de aquí del sampling temperature, que este parámetro, para aquellos que no lo conozcan, ¿vale? V dentro de N8N, en todos los nodos, como venimos diciendo, siempre hay configuraciones ocultas en añadir opciones. Esta es una de ellas. Y esto es sampling temperature. Es una forma que tenemos de hacer que el modelo de inteligencia artificial sea más o menos preciso, tienda más o menos al fenómeno de la alucinación. El fenómeno de la alucinación es un es un fenómeno a través del cual un modelo de inteligencia artificial tiende a dar información incorrecta que no está dentro de su dominio y que no ha sido entrenada con este. Los modelos tienden a satisfacer necesidades, los modelos tienden a responder todo y a contentarnos y por lo tanto se equivocan. Este numerito de aquí, si tiende a valores bajos como 03, 02, 01, lo que va a hacer es que sea más determinista, va a ser más serio y no va a tender inventarse cosas que no existen. Si tiende a uno o superior, lo que va a hacer es que es más creativo, va a decir cosas más locas y va a tener una creatividad mayor. Por lo tanto, si queréis escribir poemas, probablemente uno uno con algo sea lo ideal. Si queréis información precisa, 0 con dos. Bien, entonces eh vamos a reducir esto. No recomiendo uno tampoco porque se vuelve demasiado áspero, demasiado preciso y la calidad de la experiencia del usuario en cuanto a la interacción también baja, pero sí que números bajitos es interesante. Vamos a ver si en el PROM podemos mejorar algo. Mm. Jamás bajo ningún concepto inventes información. No, no. Corroborable relacionada con la actividad del negocio. Por ejemplo, los ejemplos funcionan muy bien con los agentes de husuario. Usuario, dos puntos. ¿Qué horario tenéis? Respuesta. Listo. Vamos a guardar.
Volvemos a nuestro chatbot. Vale. Mm. ¿Qué está pasando aquí? ¿Qué está pasando aquí? Vamos a volver a nuestro agente porque nos ha vuelto a dar una respuesta errada. Vamos a volver a las ejecuciones. Vemos que efectivamente está llamando a la herramienta. Vale. Ah. Ya sé lo que está pasando. Vale, vale, perdonadme. Vale, nos ha nos ha servido para refinar el prom, pero justamente ayer estaba haciendo unas pruebas, ¿vale? Con otro que es calcado, con otro Excel que es calcado. Y si os fijáis, tengo dos preguntas frecuentes. Estaba llamando a ese otro que es calcado. Es por eso que nos estaba dando esta información. Decía, ostras, esto es bastante raro. Pero bueno, me ha gustado porque nos ha servido para ver en caso de que nos falle cómo debemos de actuar, ¿no? ¿Cuál es el razonamiento? Tocar la temperatura, irnos al prom y ir haciendo un poquito la deducción lógica hasta que nos funcione correctamente. Ahora que sí que está vinculado a este de aquí, ¿vale? Que estaba llamando a otro, nos debería funcionar. Vamos a darle a guardar.
Volvemos a nuestro Framer aquí directamente y ahora le vamos a decir "¿Qué horario tenéis?" Y ahora sí que sí debería respondernos. Sí que sí. Bien, fijaos "nuestro horario de apertura es el siguiente." Vamos a hacerle otra pregunta. Hm, ¿qué más le habíamos dicho? ¿Cómo? Ah, sí. "¿Cómo puedo solicitar vuestros servicios?" "Para solicitar nuestros servicios. Contacta aquí, ¿vale?" que sería el código, bueno, el correo electrónico que le hemos especificado en la base de datos que le hemos dado, ¿vale? Que estamos utilizando Google Sheets. Como veis, ya tenemos un agente en forma de chatbot integrado directamente en nuestra página web. Esto, lógicamente ahora mismo pues tiene unas brechas de seguridad, ahora mismo tiene unas cosas que deberíamos de solventar, esto no estaría para estar en producción directamente, ¿vale? Pero ya estaría próximo a algo bastante bastante eh cercano a lo que necesitamos en la vida real. Lógicamente también se puede cambiar la estética, ¿vale? De este widget de aquí. Esto es horroroso ahora mismo, no no está relacionado con la página web, pero esto se puede hacer.
Bien, vamos a hablar más de otro tipo de ejemplos. Ahora, hm, podemos hacer que con otro nodo de inteligencia artificial este chatbot de aquí analice la intencionalidad del usuario y en función de la intencionalidad de este chateemos con un agente o con otro. ¿Vale? Imaginad que tenemos un agente que se encarga de responder preguntas frecuentes y otro agente que se encarga de, por ejemplo, enviar correos electrónicos. ¿Vale? ¿Cómo haríamos esto? Si yo ahora mismo vengo aquí y me voy a los nodos de inteligencia artificial, como veis, tenemos muchos nodos, entre ellos el, por un lado, analizador de sentimientos y el text classifier. Estos dos son muy parecidos y cumplen una función que es prácticamente idéntica, con la única diferencia de que el analizador de sentimientos, como su nombre indica, trata de analizar los sentimientos relacionados con la interacción, mientras que el text classifier simplemente y de forma objetiva clasifica el texto en función de la intencionalidad o en función de digamos que la naturaleza de ese de ese texto. Entonces, vamos a empezar con el text classifier porque lo que queremos hacer es simplemente clasificar tipos de consulta. Em, por ejemplo, el de analizador de sentimientos iría muy bien en caso de que tengamos un servicio técnico asociado a ese chatbot y queremos saber si un cliente está enfadado para que nos avise y que haya intervención de un humano, ¿vale? Sería un ejemplo. De momento ponemos el text classifier y fijaos que tenemos que vincularle un modelo siempre a un a un nodo de inteligencia artificial. Este modelo pues podemos colocarlo aquí mismo, ¿vale? No hace falta que sean todos individuales, ¿vale? Aunque a lo mejor nos interesa que sea otro modelo.
Porque no queremos poner un cu mini, sino que queremos poner una cosita que consuma menos tokens. Eso ya a gusto y antojo de cada uno y de la aplicación.
Vamos a entrar el nodo del text classifier. Nos pregunta por un lado el texto a clasificar y por otro lado podemos añadir categorías. En el texto a clasificar simplemente lo que le tenemos que decir es la entrada. Vale, es decir, la expresión que proviene del nodo anterior del chat, es decir, esto de aquí, recordad, aquí y aquí.
En categorías debemos decirle cuántas categorías de clasificación tenemos. Ejemplo, consulta barrafa fax y en descripción le decimos todo lo relacionado con consultas comerciales. Ejemplo, ¿qué horario tenéis? ¿Cómo contacto con ustedes? Necesito no. ¿Qué servicios ofrecéis? etcétera.
Y después, por otro lado, podría ser captación de leits, captación barra bajats. Esto de las de las tildes nunca lo pongáis porque hecho nigo de esto, ¿vale? Y la programación en general no lo es. Esto lo vamos a poner en minúscula, que me gusta más. Y aquí le vamos a decir todo lo relacionado con la posibilidad de captar datos de ese cliente como potencial cliente, valga la redundancia, cliente de nuestra de nuestra agencia. Por ejemplo, quiero un servicio de automatización. Em, ¿qué más? ¿Qué más? ¿Qué más? correo electrónico electrónico. Enviar para contacto todo lo relativo a que sea cuerpo, cuerpo, asuntos, etcétera, siempre que nos venga por esta rama.
Y fijaos que ahora nosotros cuando abrimos aquí tenemos un clasificador de texto que nos diferencia entre consultas de fax y captación de leads. Las consultas de fax lo hacemos con este chatbot, ¿vale?, que ya lo tenemos por aquí tranquilito con este agente más bien. Y vamos a crear otro agente que simplemente se encargue de captar ese lead de una forma poco convencional, que sería enviando un correo electrónico. ¿Vale?
Em, ¿cómo hacemos esto? Lo primero que voy a hacer, y es a mí la forma en la que me gusta trabajar, es quitarlo de producción. Vale, esto lo quitamos de chat embebido o bueno, una prueba, perdonad, eh, que probablemente sí que me deja hacer pruebas directamente. Sí, mira, no hace falta que lo quitemos de chat embebido, no sigue funcionando. Perfecto.
Vamos a ver cómo funciona el clasificador. ¿Qué horario de apertura tenéis? Fijaos como lo hemos preguntado en una cuestión relativa a lo que nosotros le hemos especificado, que podría ser una pregunta o una respuesta frecuente dentro de nuestra empresa, lo ha llevado hacia este agente de aquí, lo ha clasificado como tal. Imaginad que ahora le digo, quiero solicitar vuestros servicios. Ajá. Ahora sí que estamos en la rama de captación de leitads. Y ahora pasa a este señor de aquí, ¿vale? que es un señor, un señor agente que se dedica precisamente a eso, a captar leads, ¿no? Y a enviar correos electrónicos.
Y este señor de aquí lo que le decimos es que hm hm hm vamos a abrir aquí. Es que es un chatbot profesional de una página web que consiste en lo siguiente, pero ahora no eres un chatbot de una página web de una agencia IA reputada cuyo propósito consiste en e enviar correos electrónicos electrónicos profesionales captando Los datos de entrada del usuario siempre solicita los siguientes datos previos a el envío del correo. M subject cuerpo y correo. Vale, es la redundancia. utiliza utiliza la herramienta Gmail para este fin. Vale, de nuevo, esto es un promásico. Los proms cuando los refinamos y los estructuramos bien funcionan mucho mejor. Hay una forma específica de estructurarlos, pero para hacer pruebas es más que suficiente. Cerramos.
Tenemos el chat input correctamente configurado y vamos a conectar un chat model de nuevo. Este chat model lo podemos conectar aquí, ¿vale? Así no tenemos tantos nodos. En la memory le conectamos una independiente. En la memory lógicamente le debemos definir el chat ID, ¿vale? El sessionón ID, este de aquí. Cerramos. Ahora le ponemos la tool, que en este caso pues es una tool de enviar un correo. Y en esta tool de enviar un correo le debemos decir como hemos hecho exactamente antes esto de aquí de to y subject y en message pues exactamente lo mismo. Bien, guardamos esto, lo enviamos a a la basura. Bien, y cerramos.
Quiero solicitar vuestros servicios. Vale, nos solicita esto de aquí. Asunto. Quiero vuestros servicios. Eh, me gustaría una automatización buenísima, buenísima para captar leats y el correo. Eh, hay el link YouTube, ¿no? Eh, bueno, no vamos a utilizar el mío porque así veremos el ejemplo. Agustín@elinkvip.com. Venga, veis, hemos vuelto por esta rama de aquí. Fijaos, ahora lógicamente pues nos habrá enviado un correo electrónico que podemos formatear correctamente con eh A ver, me lo ha enviado. Gracias. Indícame el subject. Vale, fijaos que como no lo hemos indicado el asunto, me está me está riñendo el asunto e automatización y ya. Ahora sí. Y fijaos cómo se acuerda la gente de todo lo que le he dicho antes. ¿Cómo recuerda la gente de que yo le he especificado un correo electrónico? ¿Cómo recuerda que yo le he especificado una serie de datos? Pues gracias a esta simple memory de aquí. Si no, evidentemente no lo recordaría. Vale, fijaos que habrán recibidos. Pues tengo esto de aquí. No está correctamente formateado, lógicamente por lo que comentábamos de nuevo. Nos cuelan lo de que se ha enviado automáticamente con N8N. Lo vamos a quitar aquí. Y esto lo vamos a quitar.
Lógicamente que nosotros cuando captamos un lead no debemos decirle o solicitarle el asunto, el cuerpo y todo esto, ¿no? Esto ahora lo que le podríamos decir es que envía correos electrónicos con los datos de entrada del usuario cuyo propósito sea solicitar un servicio. Vale, siempre solicita los siguientes datos previos al correo. Los datos que vamos a solicitar son los siguientes. ¿Qué tipo de automatización necesitas, tu número de teléfono y tu nombre, ¿vale? Utilizar la herramienta Gmail para este fin. Y ahora lo que podemos hacer es que el correo electrónico que definimos aquí sea sea estático, sea el que yo tengo para mi agencia de inteligencia artificial, que en este caso es Agustín @elinvip, ¿vale? Para la prueba es este. Comom. Y ahora como hemos cambiado un poco el tipo de clasificación, lo que podemos decirle en este text classifier es que también recoja cuestiones como eh solicitando automatización, especificaciones, proyecto, datos personales, etcétera. Bueno, etcétera, ya lo tenemos. Bien, bien, bien. Perfecto.
Pues ya tenemos aquí una cosa interesante como ejercicio. Vamos a ver qué tal. Vamos a ponerlo en producción directamente, ¿vale? Y vamos a ir a nuestra página web a ver cómo se comporta. Hola. Vale, nos dice que tiene un error. Vamos a ver qué está ocurriendo. Vamos a ejecuciones. En ejecuciones vemos, ¿vale? Mira, otro caso interesante de ver. Fijaos que como hola no tiene ninguna categoría, ¿vale? Es decir, no está dentro ni de consultas ni de captación, automáticamente, ¿vale? Lo que está ocurriendo aquí es que lo descategoriza y como lo está descategorizando no está pasando a ninguna gente. ¿Qué podemos hacer en este caso? Podemos añadir otra opción que se llama cuando no hay un match claro, es decir, cuando no se trata de nada de los que especificamos aquí. Es decir, es una excepción. Entonces, ponemos esto de aquí. Veis que no nos habilita ninguna ramita. Para eso lo que tenemos que hacer es que habilitemos esto de aquí, output extra. Cerramos. Y esto de aquí lo podemos conectar con el de arriba, ¿vale? Para que cuando sean saludos, cuando sean excepciones, venga por este. Venga, ahora sí. Hola. ¿Veis? Ahora ya estamos interactuando. ¿Qué horario de apertura tenéis? Perfecto. E me gustaría solicitar un servicio. Ahora ya estamos interactuando con el segundo agente, eh, el de captación de leads y captación de proyectos. Fijaos qué tipo de automatización necesitas, tu nombre y tu número de teléfono. Necesito necesito automatizar los procesos de captación de mi empresa. Mi nombre es Agustín Medina y mi número de teléfono es taata. Ahora vamos a ver cómo se comporta la tool eh de Gmail y a ver si realmente nos envía algo, porque eso lo podemos refinar también. Lógicamente. He enviado tu solicitud para servicio de automatizar los procesos de captación de tu empresa. Te contactaremos pronto para más detalles. Si necesitas algo más, no dudes en decírmelo. Gracias, Agustín. Venga, vamos al lío. Vamos aquí. Vamos a nuestro correo a ver si lo ha hecho correctamente. Fijaos. Hola, me gustaría tal. Y ahí lo tenéis. Acabáis de captar un lead con un chatbot en apenas 40 minutos, 50 minutos, una hora de totalmente cero. Y es lo que decimos al final hoy en día, el que no es capaz de generar un negocio con inteligencia artificial y con las automatizaciones en general, sinceramente creo que está desaprovechando una oportunidad única en la historia. Y os hablo ya del Lambda Automations, os hablo de Agustín como marca personal. Actualmente no somos capaces de atender a la cantidad de clientes que tenemos y esto solo está empezando. Estamos en fases embrionarias con esta tecnología. Imaginaos cuando pasen un año, cuando pasen unos meses, cuando pasen unas semanas, porque esto está acelerando una velocidad que es inconcebible, las posibilidades que se van a abrir frente a nosotros si de verdad empujamos y si de verdad nos convertimos en los primeros en adoptar esta tecnología y sobre todo no solo adoptarla, sino de verdad aplicarla al mercado, porque es que el mercado lo necesita. El problema es que nadie lo está dando. Esto no lo está dando nadie. Nadie está ofreciendo esto. Si vosotros profesionalizáis y de verdad os diferenciáis aplicando este tipo de cosas a empresas, de verdad que es que tenéis un campo abierto que es brutal. Y de esto no hay humo, no hay nada raro detrás, es que es tal cual. Lo estáis viendo. Lógicamente que esto de aquí se puede mejorar. Estamos viendo un chatbot de aprendizaje para que tengamos ejemplos interactivos y que nos vayamos familiarizando con la herramienta. Pero es que esto no está muy lejos de lo que sería una solución real. Vale, hay cosas a refinar, sí, pero no está lejos. Entonces, ostras, es increíble. Y lo digo así porque me apasiona, de verdad.
Em, vamos a pensar cómo podemos seguir perfeccionando esto comentando ya otros nodos. Vamos a hablar de, por ejemplo, el nodo de extractor de información, que este me gusta bastante también. Este nodo extractor de información de lo que se encarga es de datos aparentemente desestructurados, como podrían ser textos de novelas o textos de facturas que pueden ser muy diversas entre sí, ¿no? Al final las facturas no respetan un orden, así como una novela no respeta un orden. Sin embargo, en una novela hay nombres, hay personajes, hay fechas. En una factura hay DNIs, hay teléfonos de contactos y hay PvPs, precios de venta al público. Hay muchas empresas que actualmente se encargan de extraer manualmente datos relacionados a facturas y lo hacen con un Excel y una persona dedicada durante 8 horas a este fin. Creedme que vais a salvar muchas vidas si, [ __ ] automatizáis con este information extractor porque podéis sacar información estructurada de datos desestructurados como facturas.
Y vamos a poner un ejemplo. Venga, imaginad que ahora borrándolo todo, seleccionamos nuestro nodo de openi. Esto dejamos así. Imaginad que tenemos un chat trigger, este de aquí, que podría ser el de Telegram tranquilamente. Me lo ha puesto aquí al inicio. Vale, vamos, vamos a hacer lo mismo con una factura, que creo que es un ejemplo más comprensible y aplicable en la vida diaria. Vamos a buscar factura. Ejemplo, PDF. Vamos a buscar así alguno que sea un PDF como tal. Este, vale. Vamos a copiar todos los datos estos de aquí directamente. Y estos datos de aquí lo que le vamos a decir es que extraiga el DNI. DNI, todos los números identificativos nacionales DNI, CIF, etcétera. Y vamos a cambiar la entrada. Fijaos, DNI. Y nos devuelve el DNI que está contenido en este documento, ¿no? Que sería este. Aquí veis. Perfecto. Nos ha vuelto a devolver un ítem, ¿vale? Como veis aquí el CIF es este de aquí. Y como vemos, simplemente nos extrae un atributo, pero realmente debería de extraer varios porque pueden haber varios atributos vinculados a este a este documento. Vamos a ver si por el por el system prom que lo hemos desplegado aquí abajo, podemos conseguirlo. Vamos a decirle que extrae varios atributos con el mismo nombre y misma descripción. Es decir, si hay tres DNI en la entrada, por ejemplo, procesa los tres y devuélvelos. Vamos a probarlo. Vale, no lo está haciendo. ¿Por qué? Aquí estáis viendo también otro caso en el cual N8N nos está limitando la salida. Es decir, esto está programado de tal forma que de hecho no lo sabía porque yo siempre que he programado con con este nodo lo he hecho extrayendo un solo dato vinculado a ese concepto, ¿no? Como podría ser un nombre o un DNI. Normalmente en una en una factura, pues eso, tendrías un DNI, que es el que te interesa y ya está. Pero si tienes varios, pues tienes que añadirlo como otro atributo, ¿vale? Ponéis aquí DNI y le dais ahí. Entonces vamos a ponerlo en required. Y como veis nos ha dado el DNI y poco más. Esto lógicamente se puede seguir perfeccionando como hemos comentado siempre, pero para que veáis una aplicación que tiene un sentido aplicable muy directo, ¿no? Como valga la redundancia en la vida real y que podríamos encontrarle en nosotros mismos aplicaciones s super fácilmente.
Y por último, otro nodo que estaría interesante que comentásemos es el de summarization. Este de aquí, como indica su nombre, básicamente de lo que se encarga este nodo es de hacer resúmenes de los textos de entrada que nosotros le demos a través de la variable que le especifiquemos dentro del campo. ¿Vale? Aquí, como veis, podemos tener diferentes datos de entrada, ¿vale? Esto depende muchísimo de lo que vayamos a utilizar. Y como veis, hay una cosa aquí que es un poquito rara y que me gustaría introduciros para que no os dé miedo, porque es un concepto que vamos a estudiar muchísimo a futuro, que es el chunk. Em, el chunk básicamente es un trozo, es trozo directamente. ¿Por qué se utiliza el chunk o el chunk strategy dentro del nodo de sumarization? Básicamente este nodo, la filosofía que tiene o para lo que está orientado es para hacer resúmenes de grandes textos debido a que nosotros cuando le pasamos a un modelo de lenguaje, por ejemplo, un texto de 1000 páginas, no es capaz de procesarlo, no entra dentro de la ventana de contexto y este es el concepto que quiero que introduzcamos. Ventana de contexto. Cada modelo tiene una cierta cantidad de tokens y está limitado en esta cierta cantidad de tokens de entrada, procesamiento y respuesta. Si la entrada supera la cantidad de tokens permitido, el modelo no va a ser capaz de procesar toda la entrada y por lo tanto va a truncar. Truncar es que va a cortar, va a hacer va a ser perezoso y directamente solo va a leer un trocito del texto. Entonces, para que podamos hacer un resumen de la Biblia, que tiene pues yo que sé, 8,000 páginas, suponed, pues debemos de hacer trocitos pequeñitos de la Biblia, hacer resumen de esos trocitos pequeñitos y a su vez hacer un macro resumen de todos esos minies resúmenes. Vamos a verlo de forma gráfica, ¿vale? Porque esto de verdad que os va a aportar un valor brutal si de verdad queréis salir al mercado y hacer cosas interesantes y sobre todo porque está relacionado con un concepto que vamos a hablar más tarde.
Como veníamos diciendo, tenemos un documento gigante, vamos a pillar el lápiz, un documento gigante de 500 páginas, vamos a decir, tenemos una ventana de contexto, que esta ventana de contexto está medida en tokens. Vamos a decir que es de 128,000 tokens, que son muchos tokens. Y estos tokens, ¿vale?, Vale, podemos hacer una conversión bastante rápida y directa a caracteres. Se ha visto o se dice que es en torno a 1,5 palabras en inglés aproximadamente, ¿vale? Entonces, imaginad la cantidad de palabras que hay en esta ventana de contexto, ¿no? Estos son los modelos más nuevos, como el Gemini de última generación, pero vaya. Entonces, esto de aquí, lo que es el texto de la Biblia, no cabe dentro de la ventana de contexto, la supera, la excede y todo lo que la exceda lo va a cortar. Entonces, imaginad que nosotros le estamos pidiendo el resumen de todo esto y le pasamos todo esto, pues no lo va a hacer, no puede, no tiene capacidad de hacerlo. ¿Qué hacemos? Que hacemos trocitos pequeñitos de ese macrotexto, hacemos resúmenes y esto los vamos metiendo en ventanas de contexto. Damos la respuesta. Ventanita de contexto, damos la respuesta y así con cada una de las partes. Se ha visto, además, y esto quiero que lo sepáis, que cuando nosotros esa ventana de contexto, que quiero que la entendáis como si fuera una barrita de estamina, ¿vale? Esto de aquí, sabéis la estamina de los juegos, ¿no? Del típico juego de MMO, que si corres te cansas, pues los modelos igual tienen estamina. Y esa barrita si la estáis utilizando mucho, ¿vale? Si tenéis mucha mucho contexto, mucha memoria o lleváis muchas interacciones, lo que acaba pasando es que se da un decrecimiento en la precisión. Es decir, mediante nosotros vamos ocupando tokens, imaginad que estos son cero tokens y esto 128k tokens, 128,000 tokens y esto es la precisión o la tasa de alucinaciones, o sea, lo que tiende alucinati ons, lo que tiende a volverse loco el modelo, pues la tasa de alucinaciones o la precisión en las respuestas sería inversamente proporcional a, bueno, o directamente proporcional más bien a la cantidad de todo. Tokens que estamos utilizando, ¿vale?, de esa ventana de contexto. Es decir, cuanto más chapa le demos al modelo, cuanto más cosas le metamos dentro, menos preciso es y más se le va a ir la olla. ¿Vale? Esto como cultura general. Y para entender conceptos que se vienen después.
Volvemos aquí. Entonces, este de aquí nos sirve para, en vez de enviarle grandes cantidades de texto a un modelo de lenguaje, enviarle resúmenes y que pueda procesarlos. Ya está. Estos estos nodos los vais a utilizar en el día a día. Pues probablemente no. Vale, pero está bien que los conozcáis, está bien que sepáis cómo funcionan y está aún mejor que tengáis la posibilidad de utilizarlos cuando realmente los vayáis a necesitar, porque ahí es donde os vais a diferenciar.
Bien, en esta parte de la guía quisiera que empezáramos hablando de cuestiones fundamentales como pueden ser los diferentes tipos de datos, las estructuras que se pueden dar en estos datos en el formato JSON, JavaScript object Notation. y que de verdad le perdamos el miedo a este tipo de estructuras porque son verdaderamente sencillas si le dedicamos el tiempo suficiente y realmente nos centramos en lo que importa, que es en la práctica y en la utilidad que tienen estas. Esto vamos a empezar conceptualmente partiendo de cómo se estructuran estos datos, ¿vale? Cómo se estructura el JSON y cómo podemos interpretarlo. Y posteriormente lo que vamos a hacer con diferentes nodos de manipulación de datos, ¿vale? como tenemos aquí, data transformation, hacer unos ejemplos para acabar con un ejemplo donde vamos a scrapear una página web, vamos a leer los precios de los libros dentro de esa página web y vamos a enviar correos electrónicos a un cliente que quiere estar notificado de diferentes cuestiones, como podrían ser el cambio en los precios de los libros de forma diaria, como podría ser el incremento de precio de un momento a otro, etcétera. Esto lo vamos a hacer totalmente en freestyle, ¿vale? No quiero que nada de esto lo tengamos preparado porque la idea es que veamos cómo razonamos y cómo se van dando los pensamientos detrás de todo esto, ¿no? Porque no tiene sentido que os enseñe algo montado y que y que no veáis cómo cómo lo hemos construido.
Em, lo primero que vamos a hacer es darle el nombre a nuestro a nuestro flujo. Vamos a poner transformación. Transformación datos y directamente vamos a pasar a comentar el Jason. JavaScript object Notation. Jason, en definitiva, en lo que consiste es en transmitir información entre diferentes sistemas informáticos, que podemos transmitir información de una forma muy ligera y eficiente. Y además de esto nos permite que de forma muy visual para los seres humanos esta pueda ser comprendida, que no solo se queda en una sintaxis de máquina, la cual sería difícilmente interpretable si no la estructuramos correctamente. El concepto fundamental cuando estamos hablando de Jason es el siguiente. Esto, como veis aquí directamente en el nodo de entrada, el de test workflow, lo que he hecho es darle al lápiz, ¿vale? Para poner un MOC data, MOC data sería datos de prueba y posteriormente pinearlos, ¿vale? Como veis, yo directamente puedo escribir aquí como si fuese una consola. Esto ahora lo entenderéis. Lo más fundamental cuando estamos hablando de Jason es comprender el concepto de clave valor. ¿Qué es esto de clave valor? Siempre empezamos el JSON con una llave, abriendo una llave y posteriormente tendríamos una clave, que en este caso vamos a decir que la clave es nombre y el valor será Agustín. ¿Qué nos dice esto? Esto nos dice que para esta característica, ¿vale?, Tenemos este valor para la característica de nombre, tenemos el valor Agustín, por eso se dice clave valor. Esto lo podemos hacer tantas veces como nosotros queramos dentro de esta llave de aquí. Y lo que vendría a representar todo lo que esté dentro de esta llave sería un objeto, ¿vale? En este en este caso el objeto sería el usuario, el usuario que tiene unas características como pueden ser el nombre, como puede ser la edad, ¿vale? que sería pues 26 años. Y en este caso, si os fijáis, la edad no la he puesto entre paréntesis porque la edad no es un dato de tipo string, no es una cadena de texto, es un dato tipo numérico. Y la forma que tenemos de hacerle entender a la máquina, al ordenador, de que se trata un tipo numérico es con la sintaxis que estáis viendo aquí, que es directamente sin utilizar estas comillas. Si os fijáis, si yo aquí pues pongo todo esto, seguirá siendo una cadena, ¿vale? una cadena de texto y esto de aquí para que siga siendo un valor numérico tendría que estar sin las comillas, ¿vale? Si lo pongo así pasaría a ser un string. De igual forma vamos a dejarlo bien. Hemos comentado que Agustín, que tiene edad de 26 años, estamos hablando de que Agustín es tipo string, la edad son 26 años tipo de numérico. Y ahora vamos a hablar de otro tipo de dato como puede ser el tipo boleano. ¿Qué es el tipo boleano? o bull, que se suele escribir así. El tipo voleano es aquello que se conoce como que tiene dos estados, verdadero o falso. Verdadero o falso, que se representa como true o false. ¿Vale? Em, seguramente que hayáis escuchado del binario, ¿vale?, que son los unos o los ceros. Y esto lo que nos viene a decir es que tiene dos estados y no tienen estados intermedios. O está encendida la bombilla o está apagada. O te gusta cenar en el japonés o no te gusta, no son para cosas que son totalmente dicotómicas, que son o sí o no. Imaginad, por ejemplo, que le gusta pasear, Agustín, pues vamos a decir que true, ¿no? A mí me gusta pasear. Y si os fijáis, exactamente igual que hemos hecho con el dato de tipo numérico, aquí arriba, no es necesario que pongamos las comillas, las comillas dobles aquí abajo. Si os fijáis, veis, esto es muy importante. ¿Vale?
Ahora vamos a introducir otro concepto que serían las listas o los arreys. Hemos dicho que nosotros tenemos esto de aquí, ¿vale? que sería una característica y un atributo, pero una característica puede tener múltiples atributos. Por ejemplo, vamos a decir gustos. ¿Qué le gusta a Agustín? Agustín le pueden gustar muchas cosas, ¿no? Le puede gustar la inteligencia artificial, le puede gustar la música, infinidad de opciones. ¿Qué ocurre? Que nosotros cuando estamos hablando de claves valor, como estamos viendo aquí, no podemos poner múltiples elementos aquí dentro. Yo no puedo decir que el nombre es Agustín y Alberto al mismo tiempo porque esto no sería interpretado correctamente por la máquina. Entonces, lo que tenemos que hacer es en gustos, que es el ejemplo que estamos poniendo, añadimos un nuevo símbolo, que es este que estáis viendo aquí. Este símbolo con esta sintaxis particular que estáis viendo aquí, lo que le dice a la máquina es que tiene una lista de atributos para esa característica, para gustos. Tiene inteligencia artificial, tiene música, tiene todos los que queramos. En este caso, vamos a dejarlo así sin más. Exactamente igual que con todos los claves valor que estamos viendo aquí. Tenemos que poner la coma después de cada uno de ellos. Bien. Y vamos a ver otro concepto que es muy interesante, que son los ítems anidados o los objetos anidados. ¿Qué son los objetos anidados? Nosotros, si ahora cerramos aquí directamente, ¿vale? Y hacemos así, recordar de quitar siempre la última coma, ¿vale?, del del último clave valor que tengáis aquí abajo. Guardamos esto. Lo que vendría a ser es un solo íem, ¿vale? Sería un solo objeto. Si os fijáis en la salida, veis el Jason, tenemos una lista que N8N lo representa así internamente para transmitir o transferir más bien información entre los diferentes nodos. Y por otro lado tenemos aquí la clave de inicio, ¿vale? la llave de inicio y la llave del final, que representa este ítem de aquí, este objeto. Y este objeto tiene todas estas claves y todos estos valores que lo definen, ¿vale? Siendo los gustos, una lista porque tiene varios gustos. ¿Qué ocurre? Que yo puedo tener objetos, ¿vale?, íems dentro de un mismo ítem, que es lo que se conoce como objetos anidados. Para eso podemos hacer lo siguiente. Imaginad que ahora añadimos un una nueva clave, ¿vale?, que sea dirección, ¿no? Por ejemplo, dirección, ¿vale? Aquí directamente abrimos una llave como si fuese otro objeto totalmente distinto. Y podemos decir que tenemos ciudad, ciudad Madrid y país España. Si os fijáis aquí lo que estamos haciendo, como veníamos diciendo, es anidar un objeto dentro de otro, ¿vale? Porque dirección tiene múltiples atributos y características como son Ciudad Madrid, país, España. Es por eso que tiene sentido esto de aquí. ¿Y por qué lo anidamos? Porque nosotros estamos siempre dentro del mismo ítem, que es el ítem de usuario. Y dentro de este ítem de usuario tenemos que tener diferentes representaciones, tanto a nivel de tipo de dato como a nivel de tipo de estructura. ¿Vale? Yo quiero que nos quedemos con eso, que al final es una obligación o que se da de forma natural, que no es algo que nosotros hagamos porque sí o que las diferentes aplicaciones hagan porque sí, es porque es necesario, ¿vale? es el razonamiento que tenemos que entender detrás de todo esto. Si nosotros ahora guardamos, que por cierto aquí me está dando error de sintaxis y este error de sintaxis se debe a que nosotros aquí directamente no hemos puesto aquí una coma. Si os fijáis, que esta coma es muy importante, ¿veis? Y si nosotros ahora nos ponemos en otro tipo de visualización, como puede ser la visualización en forma de esquema, lo que veríamos es que tenemos el nombre Agustín, ¿vale? Ya lo tipa directamente como un dato de tipo string, porque se lo hemos dicho con las comillas, y además le pone este simbolito de aquí que es una a. Por otro lado tenemos el tipo numérico, que como veis aquí lo marca con este simbolito de aquí, ¿vale? e le gusta pasear, como es true o false, lo marca con una casilla y las listas lo marca con este símbolo de aquí. Y como veis es desplegable porque gustos tiene múltiples gustos. Tiene el gusto cero, el gusto uno y la dirección tiene diferentes atributos dentro de esta dirección. tiene ciudad, que es Madrid, y tiene el país, que es España.
Vamos a ver cómo estos datos podemos manipularlos y cómo hay diferentes condiciones o nodos de transformación que nos pueden ayudar a la hora de interpretarlos o manipularlos a nuestro antojo en función de la aplicación. Lo primero que vamos a ver es uno de los nodos de manipulación de datos que vamos a utilizar de forma más constante y que tiene mayor utilidad dentro de N8N, que es el siguiente. En data transformation, que es la sección que estamos comentando en esta parte, si venimos a edit fields, lo que nos permite es modificar, añadir o borrar íem y campos dentro de estos íems. Si lo abrimos, lo que vemos que tenemos en la parte superior, como siempre son los parámetros donde nos permite seleccionar o un mapping manual, que en este mapping manual pues básicamente lo que hacemos es drag and drop directamente aquí y tener una interfaz pues mucho más atractiva y visual donde tenemos tanto la clave como el valor para que podamos modificarlo a nuestro antojo, manipular el tipo de dato y modificar lo que contiene esta clave de aquí, ¿vale? Entonces, yo lo que podría hacer es que en este caso el nombre que es Agustín lo cambio por Alberto y veríamos que en la output directamente el nombre ahora ha cambiado. Yo podría cambiar tanto la clave como el valor, es decir, puedo hacer que el nombre sea apellido, por ejemplo. Realmente no tiene mucha utilidad esto ahora mismo, pero que lo sepáis. Por otro lado, tenemos la opción de hacerlo con un JSON customizado directamente, como estáis viendo aquí en código. Sería exactamente lo mismo. Lo único que, bueno, para aquellos que estén más más familiarizados con este formato, pues probablemente les vaya mejor. Em, hay algo que quisiera comentar y es que hay una opción aquí abajo que básicamente lo que hace es que todos los ítems de entrada que estáis viendo aquí directamente los deje pasar independientemente de que los hayamos mapeado aquí dentro. Porque si os fijáis, cuando le he dado a test, automáticamente solo me ha pasado ese íem, el ítem que contenía en la configuración de seteo. Si yo le doy a test ahora, veréis que no me devuelve ningún ítem. Imaginad que yo aquí sigo programando cosas y no recibo nada. Sería bastante frustrante, ¿verdad? Y es algo que a mí me pasaba al principio y que en lo personal no me gustaba demasiado. Entonces, para que nos devuelva todos los ítems de salida, lo que le tenemos que decir es esta opción de aquí, habilitarla, ¿vale? Aquí nos dice queremos que sean todos, si queremos seleccionarlo o si queremos hacer una excepción. Vale, esto es para para manipular o para más bien tener diferentes opciones en cuanto a la manipulación de los datos, ¿vale? Em, y vamos, por ejemplo, a cambiar este tipo de dato que estáis viendo aquí, que como veis nos marca de color verde porque es de tipo numérico, como hemos visto en la explicación de Jason. Y en este caso vamos a cambiar tanto el tipo de dato como lo que contiene. Vamos a decir que ya no es un tipo number, sino que es tipo string y que ya no son 26 años, sino que son 23. ¿Veis? Automáticamente nos devuelve 23, como estáis viendo aquí. Con esto podríamos hacerlo exactamente igual con cada uno de los atributos que tengamos contenidos dentro de nuestro objeto, ¿vale? y manipularlos como a nosotros nos interese. Imaginad también, y esto es algo que sí que vais a utilizar muchísimo, que vosotros hacéis, por ejemplo, como estábamos viendo en el ejemplo inicial, una petición a través de un http o un webhook donde os llegan muchísimos datos o un trigger donde os llegan muchísimos datos y que vosotros simplemente queréis este elemento de aquí que es ciudad, pues entonces basta con que deshabilitéis esta opción, que le deis a test y simplemente os va a devolver ese íem, ¿vale? con ese clave valor y ya está ese objeto de aquí. E esto va relativamente bien, sobre todo para la parte de tener bien modularizado lo que serían los diferentes nodos o las transiciones y de esta forma tener muy claro los datos que vamos a utilizar dentro de nuestro flujo, porque si no lo que va a ocurrir es que todo se manche de diferentes datos que no tienen ningún tipo de utilidad y que tengamos un una liada increíble, ¿no? con con datos que además añaden carga al flujo, hacen que sea bastante más pesado y le cueste más procesar, que esto también es algo a tener en cuenta.
Em, vamos a ver un ejemplo que es bastante interesante. Vamos a imaginar que no solo tenemos un ítem, como estáis viendo aquí, sino que ahora tenemos tres ítems, tres objetos. Estos tres objetos ya los tengo preparados, ¿vale?, para no haceros perder el tiempo. Y lo que vienen a representar cada uno de estos objetos son un coche, ¿vale? Cada uno de estos coches tiene unas características, ¿vale? con los atributos correspondientes, como puede ser el color que es rojo, la altura es cuatro, la anchura seis, el largo es 12, cupo dos y cada uno de ellos pues tiene unos atributos distintos, lógicamente porque no todos los coches son iguales. Vamos a ver como esto nos ayuda muchísimo a ejemplificar cómo podemos hacer diferentes manipulaciones de datos. Y un segundo, porque esto lo voy a dejar aquí pineado. Y uno de los de las condicionantes o uno de los e nodos de control de flujo más importantes es el if condicional que tenemos aquí abajo. El if condicional básicamente lo que nos dice es si se cumple una determinada condición que nosotros le programamos internamente en el nodo, entonces nos devuelve o un true o un false. ¿Recordáis lo que comentábamos de boleano? O es verdad o es mentira. Entonces, nosotros lo que hacemos internamente en este nodo es definirle unas condiciones. Por ejemplo, si este valor es igual a este otro valor, entonces será true. Y cuando sea true, lo que puedo hacer es poner, por ejemplo, un agente y que hable con ese agente. O si es false, que directamente le pongamos el nodo este de do nothing, que directamente no haga nada y el flujo de N8N se acabe aquí. Bien, vamos a poner un ejemplo. Y como veis, ahora sí que tenemos los tres ítems de entrada muy bien diferenciados aquí. Y vamos a suponer que queremos poner la condición de que el precio sea 100, ¿vale? En el ítem número uno, si el price que nosotros le marcamos aquí como expresión is equal y indicando el tipo de dato, que es tipo numérico, a 100, entonces se va a habilitar la rama, la branch de true. Fijaos, veis, true branch y false branch serían los otros dos, ¿vale? ¿Por qué? Porque los otros dos el precio no es 10000, es en un lado 1800 y en otro 750. Ahora no le vamos a decir que sea igual, sino que le vamos a decir que sea mayor a 10000. Si os fijáis, exactamente igual, se cumple la misma condición, ¿vale? Porque tenemos uno de 750 y uno que es exactamente igual a 10000 y por lo tanto no es mayor, ¿vale? porque tendría que ser igual o mayor para que se cumpliese esta condición de aquí. Por ejemplo, si pongo 1199 sí que se cumplirá en dos, mientras que en uno, ¿no? Bien, vamos a seguir con ejemplos de manipulación y condiciones. Hm, otro ejemplo que podemos poner es si no existe directamente, ¿vale? Si le decimos no existe y si existe en tres casos, es decir, existe tres veces, pues lógicamente me va a decir que esto es falso, ¿vale? Porque sí que existe y le estoy pidiendo que no exista, no le estoy diciendo que si no existe me habilite el true. Si pongo la condición inversa, como podría ser exist, veremos que ahora sí que se habilita en la rama de el true. Bien, vamos a seguir poniendo ejemplos. Fijaos que todo el rato estamos manipulando un dato de tipo numérico. Si yo este dato de tipo numérico lo intento comparar con un dato de tipo string, ¿vale? una cadena de texto, lo que veremos es que nos da un error, lógicamente no nos deja hacerlo. Si le doy a test me da un error. Vamos a preguntarle a la de N8N a ver qué nos responde, a ver si nos soluciona este problema, que también es interesante verlo, ¿no? Fijaos, el error e es debido a que el if está utilizando un string operator y que la estructura de validación es numérica. Básicamente en este caso nos ha ayudado. Vamos a seguir con con ejemplificaciones. Ahora lo que vamos a hacer es decirle que si el color es exactamente igual a rojo, que sería it's equal to rojo. Hm. Vale, veis, solo uno de los tres coches es de color rojo, mientras que los otros dos pues no lo son y por lo tanto los marca por la rama de false. Em, podemos añadir un nuevo atributo aquí que sea true o false para hacer también una comparación boleana. Y para esto, como hemos visto anteriormente, basta con simplemente poner una comita más aquí y poner una nueva condición, ¿no? Que sería, por ejemplo, vamos a decir bonito, bonito. Venga. Y aquí le vamos a decir que es false. Vamos a hacer lo mismo con todos. A este que le vamos a decir que es true. Y por último, a este de aquí le vamos a decir nuevamente que es false. Aquí recordar la la comilla, bueno, la coma más bien. Bien, bien. Ahora volvemos a tener todos los ítems exactamente igual que antes, pero tenemos un nuevo tipo de dato que es boleano o true o false. Fijaos, si yo este boleano de aquí lo arrastro y lo comparo con un string, lógicamente no me va a funcionar. Si lo comparo con un tipo numérico, no me va a funcionar, me va a dar error. Si lo comparo con un voleano, ¿vale? O le pongo la más bien la condición de boleano, lógicamente me va a funcionar, ¿vale? Si existe este boleano, entonces es true. Ahora le voy a decir, hm, que esté vacío. No está vacío y por lo tanto false. Ahora le voy a decir que h sea true, ¿no? Porque hemos dicho que tenemos dos false y un true. Entonces solo este ítem del centro, el coche de color blanco, debería de ir por la rama de true. Fijaos, un íem. ¿Veis? Vamos a seguir. It's equal to. Vale, y aquí, como veis, nos pone un desplegable directamente de true o false. ¿Veis? To true o false. Venga. It's not equal, que sería lo contrario. It's not empty, que sería que no está vacío. Is empty. No existe y existe. Básicamente lo pone repetido, pero pero al contrario todo el rato.
Vamos a ver ahora los ejemplos de array. Como sabéis, y como íbamos diciendo, el array son las listas, ¿vale?, que representan diferentes atributos. Estas listas que ahora mismo no tenemos ninguna aquí, simplemente nos dejan hacer diferentes comparaciones o diferentes condiciones que estarían relacionados a las características que tienen las listas. Por ejemplo, existen, no existen, están vacías, no están vacías, contienen. Pero fijaos que la que nos interesa es la longitud igual a, no igual eh la longitud mayor que y longitud mayor o igual a. Imaginad que estamos buscando una lista de longitud de siete elementos dentro de esa lista, pues podríamos utilizar estas condiciones para volcarlas en un Google Sheets, por ejemplo. Exactamente igual que con los objetos. Fijaos, yo este objeto de aquí, ¿vale? Si lo pongo aquí el esquema o el tabla, como queráis, podemos pillarlo. Yo este objeto de aquí podría decirle que si existe, si no existe, si está vacío o no está vacío. Vale, esto es gracias a este nodo de aquí de if. Exactamente igual que como ocurre con este nodo, existe otro que son múltiples condiciones porque podemos tener más condiciones que no sean true o false, sino que puede ser true, false y si se cumple una determinada, ves por esta otra rama. Si se cumple otra, ves por esta otra. Vamos a verlo, que esto sería el switch. Aquí no lo tenemos. Este, el router, ¿vale? Y este lo tenemos exactamente en flow, ¿vale? Que
sería aquí. ¿Veis bien? Hm, este nuevo de switch, si lo abrimos, veremos que tenemos o rules o expression. Básicamente, vosotros vais a utilizar expression casi siempre porque es la forma más intuitiva de de utilizarlo esto.
Y como veis, por un lado podemos darle nombres a las salidas. Podríamos decirle, por ejemplo, coche rojo. Coche rojo. Añadir otra ruta, ¿vale? Otra ramita, otra salida que sea coche blanco. Y perdonad que esto lo tendría que poner aquí. Eso es otra que sea coche verde.
Si le damos a test, ¿vale? Lo que vamos a hacer es el color de cada uno de ellos. Le vamos a decir is equal a rojo, ¿no? Aquí. Ostras. [Música] Fijaos que en cada una de las ramas nos devuelve cada uno de los coches, ¿vale?, que tienen la característica que nosotros condicionamos dentro de esta condición de aquí. Como este coche es blanco, ¿vale? Como este ítem de aquí contiene esto, nos va por esta ramita de aquí del centro. El otro al ser rojo nos va por esta otra y el otro como es verde pues nos va por esta otra. Bien, este sería otro de los nodos que son interesantes y que se tienen que tener en cuenta, ¿vale? Nos pueden ayudar muchísimo.
Vamos a seguir con otros nodos. Vamos a data transformation. Hm hm hm. Y vamos a hablar de el limit. El limit es un nodo que, como su nombre indica, lo que hace es truncar o limitar la cantidad de ítems que nos da a la salida. Imaginad que nosotros tenemos un listado en Excel o una cantidad de correos desmesuradas. Imaginad 5,000 correos que descargamos directamente de nuestra base de datos y que simplemente queremos las 100 últimas entradas, que no queremos esos 5,000 correos para procesarlos y que nos añadan muchísima complejidad al flujo. Lo que le podemos decir es que solo nos deje pasar cierta cantidad de ítems. En este caso le voy a decir uno porque tenemos tres. ¿Veis? Solo nos deja pasar un ítem. Y además le podemos decir que sean los ítems del principio o del final los que deje pasar. Ahora mismo nos ha pasado el rojo, pero yo le podría decir que pase el verde porque es el del final, exactamente igual. Si pongo aquí un solo dos, que si veis lo que hace es que deja pasar tanto este como este, ¿vale? O sea, este como este. Bien, es un nodo que, bueno, nos puede ayudar en ciertos contextos, ¿vale? Donde tenemos que hacer cosas así un poquito más raras.
Vamos a seguir con los nodos de transformación y vamos a hablar de este, del de AI transform. Este nodo de aquí básicamente en lo que consiste es que nosotros en lenguaje natural le pedimos algo, una inteligencia artificial nativa de N8N y esta inteligencia artificial lo que hace es generar el código en JavaScript para hacer una manipulación que nosotros deseemos. Imaginad, por ejemplo, que quiero que quiero que el o que la clave color pase a llamarse pintura. Le damos a generar código. En generar código automáticamente nos genera el código en JavaScript. Y si le damos a tres step, como veremos aquí, supuestamente nos ha cambiado esto de aquí. ¿Veis que ahora se llama pintura, ya no se llama color? ¿Veis? Bueno, puede servirnos. Esto solo está en la versión cloud de N8N, no está en la versión de en la versión local, pero bueno, no está además, sobre todo porque creo que va mucho con la filosofía de este tipo de de aplicaciones low code o no code y nos puede sacar de algún apuro en un momento puntual.
Exactamente igual tenemos un nodo de código, ¿vale? Si venimos aquí a transformation y seleccionamos este nodo de aquí y como su nombre indica y como supondréis pues básicamente cumple la función de ejecutar código internamente dentro de N8N. ¿Vale? Si yo ahora le doy aquí a test conectando, lógicamente pues va a hacer exactamente lo mismo que teníamos con el nodo anterior, ¿vale? El de AI transform. Aquí pues si tenemos necesidades que requieran de una flexibilidad muy alta y no tenemos de forma nativa una solución, digamos, que que nos pueda solucionar ese caso puntual, pues lógicamente nos puede ayudar. También tenemos una opción de aquí de preguntarle a la IA, ¿vale? E podemos seleccionar el lenguaje, también tienen la opción de codificar en Python. Y lo que te dice aquí es que puedes ejecutar este código para todos los íems. Esto hacerlo con todas las entradas que tenemos aquí o hacerlo individualmente por cada uno de los ítems, es decir, ejecutar este código en este ítem, este código en este ítem y así.
Vamos a seguir. Vamos a ver el de date and time, este de aquí, que básicamente es para manipular fechas. Esto de manipular fechas, sinceramente, creo que tiene más sentido hacerlo en forma de expression. Esto lo veremos en otra parte de la guía, en otra parte más avanzada, pero básicamente quedaos con la esencia que es manipular datos relativos a fechas y horas.
Vamos a ver el de filter, que sí que me parece un nodo muy interesante. Y este nodo de aquí nos puede ayudar muchísimo a la hora de filtrar datos y dejar pasar solo aquellos que a nosotros nos interesen. Imaginad que tenemos una librería con muchísimos libros, 2000 libros, o tenemos un scrapping que lo que hace es descargar todos los vehículos de una página web y queremos saber solo aquellos que estén dentro de nuestro presupuesto, que sería pues 10000 € 800 € y que solo carguemos en una base de datos aquellos que tengan un precio inferior. Entonces, lo que podemos hacer es poner este tag de aquí, ¿vale?, que contiene el precio y decirle que solo deje pasar aquellos que son menores a aquí, perdonad en en number. It's less than aquí y le voy a decir, vamos a decir 1000 y solo nos dejará pasar este de aquí, el de 750, ¿vale? Porque todos los demás valen más.
Vamos a seguir. Tenemos este de aquí de remove duplicates, que también es bastante interesante y que está muy relacionado con el hecho de sanear la información. Vamos a seleccionar este. Imaginad que tenemos varios ítems que son idénticos, que son exactamente iguales y que estos ítems están haciendo que se sobrecargue muchísimo nuestro flujo de trabajo, que está haciendo que consuma muchísimos recursos. Si nosotros accedemos, ¿vale? Vemos que tenemos diferentes operaciones aquí. La que más vais a utilizar es este de aquí, ¿vale? Que es remove items repetidos de la ejecución actual de la input de aquí. Y lo que hace es comparar todos los campos, ¿vale? Compara todos los campos entre sí para ver cuál de ellos puede estar repetidos y eliminarlo.
Vamos a poner un cuarto ítem en Jason aquí dentro. Y este cuarto ítem hm lo vamos a hacer exactamente igual que el tercero. Fijaos, el tercero y el cuarto son exactamente iguales. Esto no tiene ningún tipo de valor para mí, no me aporta nada dentro de mi flujo, ¿vale? Entonces, si le doy a test, lo que veremos es que simplemente nos deja pasar estos tres ítems totalmente saneados y sin tener datos. duplicados. ¿Esto para qué puede servir en la vida real o qué utilidades le le he dado yo en diferentes flujos? Pues imaginad que tenéis una aplicación que de nuevo scrapea o que descarga de LinkedIn diferentes contactos a los que vamos a hacerle prospección en frío. Pues estos contactos muchas veces vienen duplicados y si los tenemos en una base de datos duplicadas, pues vamos a hacer mucho trabajo en vano o vamos a hacer prospección repetida, lo cual por un lado es muy ineficiente y por otro lado pues no aporta ningún tipo de valor tanto para el cliente como para nosotros, ¿no? Entonces tiene mucho sentido que saneemos siempre la información y que utilicemos estos nodos de aquí porque nos van a aportar mucho valor.
Vamos a seguir con los ejemplos de transformación y vamos a hablar de un nodo que suele generar muchísimas dudas, sobre todo al inicio, y que realmente parece más difícil de lo que es porque básicamente con un ejemplo lo vais a ver supercaro. Este nodo de aquí que comentamos es el de Split Out, que básicamente lo que hace es convertir aquellos elementos que estén dentro de una lista, dentro de un array en ítems individuales. Ahora mismo nosotros en el ejemplo que hemos puesto aquí no tenemos ninguna ra si os fijáis, ¿vale? Porque no tenemos la sintaxis que especifique que hay múltiples elementos, ¿vale?, dentro de lo que sería nuestra clave, que es esto de aquí. Entonces, os he preparado un pequeño código modificado, que es exactamente lo mismo, pero hemos añadido unas etiquetas donde ahora ponemos lujo eléctrico, deportivo, nuevo, popular, económico, familiar, etcétera. Vale, básicamente lo que hemos hecho es incluir una pequeña arrey dentro de etiquetas. Em, vamos a decirle que necesito que me separe en ítems individuales estas etiquetas. Entonces, si yo le digo etiquetas y le doy a tres step, si os fijáis, ahora tenemos nueve ítems, mientras que en la entrada tan solo teníamos cuatro ítems. Fijaos, 1 2 3 cu y aquellos que, bueno, que estamos viendo aquí. Imaginad de nuevo, ¿no?, que nos estamos descargando los datos con un tipo de estructura determinada y que necesitamos manipularlos para poder utilizarlos posteriormente en nuestro flujo de trabajo. Pues esto de aquí nos permitiría manipularlos. Esto es si queremos incluir todos los demás campos, ¿vale? Para mantenerlos. Fijaos que nos generan nueve ítems, cada uno de ellos con su etiqueta correspondiente y ya no lo tenemos en forma de array, que es lo que tenemos aquí.
Vamos a poner esto de aquí, que es selected other files, que básicamente lo que le podemos decir es que solo incluya el ID. Y si os fijáis, pues ahora tenemos ID1 deportivo, ID1 popular. Le podemos decir siempre marcándolo con comillas que ahora queremos el color junto con el ID. Y ahora tenemos pues etiquetas ID color, etiquetas ID color en cada uno de ellos. Esto es para modificar la visualización, ¿vale? el destination field name. Podemos cambiar esto de aquí, el tag de de destino, la clave de destino y ponerle, por ejemplo, ejemplo. Fijaos, veis más manipulaciones de datos. Como veis, en lo que consiste este juego, ¿vale?, eh de manipular datos es en digamos que disponer los datos de tal forma que a nosotros nos facilite muchísimo la vida y que nos permita hacer aquello que nosotros necesitamos y que nuestro cliente nos pide. O sea, esto no es manipular datos por gusto, ¿vale? que que es lo que estáis viendo aquí, que puede resultar algo aburrido o abrumador al principio, pero que os aseguro que si domináis todo este tipo de cositas, este tipo de triquiñuelas que le llamo yo, después vais a poder construir cualquier cosa porque todo consiste en manipular y todo consiste en disponer.
Vamos a seguir con el tema de los nodos de transformación aquí dentro y no sé si nos quedan demasiados. Ah, mira, sí nos queda el de aggregate y el de merch. Estos son bastante interesantes. Vamos a poner el de aggregate justo después del de split out porque así lo veremos bastante claro. El de split out lo que hemos visto es que nos permite escoger una lista y separarlo en ítems individuales. Pues con el aggregate podemos hacer lo contrario, ¿vale? Podemos agregar todos estos ítems individuales en una sola lista o en un solo ítem. Por ejemplo, si yo le digo eh color, me va a devolver todos los colores, veis. O si le digo ejemplo, me va a devolver todos los ejemplos, ¿vale? Y esto lo ponemos con rename y le vamos a decir lista ejemplos. Fijaos. Lista ejemplos. Listo. Em podemos decirle el ID. Venga. Fijaos otra lista. dentro de este único ítem con todos los IDs y podemos seguir tantas veces como queramos, ¿vale? De hecho, le podemos decir que nos una las listas y tenerlo todo dentro de una misma. Podemos hacer lo contrario que estábamos haciendo con este de Split Out, ¿vale? y nos sirve para exactamente lo mismo, pero a la inversa, manipular datos a nuestro antojo. Venga, bien.
Vamos a hablar de un nodo que es muy interesante antes de hablar del de merch, que es importantísimo y que este sí que quiero que quede muy claro porque es un nodo de manipulación de datos super importante para combinar íems, es el de summarize, este de aquí, que básicamente lo que nos proporciona es una, digamos que una calculadora o una forma de cuantificar o de disponer ítems y elementos de una forma muy concreta que nosotros deseemos. Por ejemplo, imaginad que nosotros, como vemos aquí tenemos agregation, ¿vale?, en en parámets, lo que queremos hacer es extraer average price, ¿vale? el precio promedio. Esto si nosotros volcamos este campo de aquí y le decimos que queremos extraer el average, nos va a devolver un ítem con el precio promedio, que básicamente lo que está haciendo es sumar 10000 + 1800 + 750 y dividirlo entre 3. Exactamente lo mismo con concatenar, ¿vale? Que básicamente lo que hace es disponer cada uno de estos datos uno detrás de otro. Si os fijáis, 10000, 1800, 750, 750. Em, podemos hacer count, ¿vale? Que lo que hace es contar cuántos elementos hay de price, ¿vale? ¿Cuántas cuántas claves hay de price? Em, contar solo único, ¿vale? Solo aquellos que sean únicos, que no sean repetidos. El máximo, el precio máximo, el precio mínimo, ¿vale? Y la suma, como veis aquí, ¿vale? De todos los precios. Em, esto nos permite también separarlos, ¿vale? Y separarlos por lo que nosotros queramos, ¿veis? Y exactamente lo mismo que teníamos con el nodo de Split Out, podemos hacer aquí diferentes manipulaciones a nuestro antojo. ¿Vale? Seguimos.
Un nodo de control de flujo que me gustaría enseñaros, pese a que no le podamos llegar a encontrar muchísima utilidad en un inicio, N8N gestiona esto de forma nativa y, de hecho, ya te dicen que en principio esto no deberíamos necesitarlo. Em, sí que hay ciertos casos donde nos puede ayudar muchísimo y vamos a ver en qué casos esto es así. Nosotros en N8N cuando tenemos una cierta cantidad de ítems, como estáis viendo aquí, lo que venimos a decir es que el nodo siguiente que viene a esta cantidad determinada de ítems se va a ejecutar tantas veces como ítems de entrada. Si tenemos cinco ítems de entrada en un nodo de Gmail, ese nodo de Gmail se va a ejecutar y va a enviar cinco correos electrónicos, uno para cada uno de los ítems. Esto lo veremos en el ejemplo posterior. Hay un nodo que es este de aquí del loop over items, que de hecho N8N ya nos dice que no deberíamos de necesitarlo, que lo que nos ofrece es precisamente definir la cantidad de ítems que queremos que pasen en nuestro flujo hacia los demás nodos que vienen siguientemente por cada uno de los loops, por cada una de las vueltas que hace nuestro flujo de trabajo.
Vamos a verlo con un ejemplo. Este es un ejemplo educativo que tiene 8N básicamente ponen en forma de ejemplificación una base de datos que nos devuelve cinco ítems y estos cinco ítems son relativos a datos de usuarios que podrían ser pues un CRM o datos de registro, ¿no? Como veis, aquí tenemos el ID, el nombre, el correo, notas, país y cuándo cuándo ha sido creado. Si nosotros no tuviésemos este nodo de aquí del loop over items, pasaríamos estos cinco estos cinco siempre al siguiente nodo, que en este caso sería el de weight. Pero gracias a este nodo podemos tocando este parametrito de aquí modificar la cantidad de ítems que dejamos pasar. Imaginad que simplemente vamos a dejar pasar pues uno, ¿no? Como estaba un ítem por cada vuelta. Fijaos, pasa un ítem. Ponemos un weight, ¿vale? Esto es a modo educativo para que veáis cuánto tarda. Vuelve a pasar el siguiente ítem y así hasta llegar a la máxima cantidad de ítems, que sería la que definimos aquí en el nodo de entrada. ¿Veis? Esperamos. Vuelve a entrar. Así hasta llegar a cinco. ¿Y cómo sabremos que hemos llegado a cinco a la cantidad máxima? Pues básicamente porque aquí ponemos un if, una condición a la cual le decimos que si no quedan con esta expresión de aquí ítems pendientes y esto lo igualamos a true, ¿vale? Es decir, ya no quedan ítems pendiente, ¿correcto? Es así, entonces habilitamos esta otra ramita de aquí que básicamente lo que hace es juntar todos esos ítems de el merch.
En esta parte del vídeo vamos a tratar de integrar todos aquellos conocimientos que venimos adquiriendo hasta ahora en cuanto a manipulación de datos y control de flujo. Y además vamos a hacerlo con un ejemplo real, con un flujo que nos podría solicitar un cliente tranquilamente. Y esto va a consistir en scrapear, que es descargar dinámicamente de páginas web datos sin la necesidad de que nosotros lo hagamos manualmente, precios, analíticas y diferentes métricas que a un posible cliente potencial le podría interesar. Entonces, en este caso, el ejemplo que vamos a poner es a través de una aplicación externa conocida como Firecow, ¿vale?, está ideada específicamente con intención de scrapear webs. Y lo que vamos a hacer primeramente, como siempre, es poner nuestro trigger, que en este caso vamos a hacer que sea un trigger manual. Podríamos hacer que esto se disparase eventualmente, cada cierto tiempo y que le enviase estos insightes directamente a nuestro cliente de forma diaria. Pero para hacer las pruebas creo que es más conveniente que lo pongamos manual directamente.
Ahora incluimos un nodo de http request. este de aquí y vamos a entender en qué consiste este nodo de aquí. Este nodo de aquí de HTTP Request sirve para a través de un protocolo conocido como Hypertext Transfer Protocol solicitar información o determinadas utilidades a servicios externos. ¿A qué me refiero? En N8N nosotros por defecto no tenemos eh aplicaciones o utilidades como podrían ser mapas, no tenemos Google Maps. Sin embargo, sí que existen servicios como los de Google que nos pueden prestar esas utilidades o esas funcionalidades para que nosotros las integremos dentro de nuestro flujo. La idea de esto es que hay ciertas acciones como esta de aquí de Action in Application que sí que están preprogramadas y nos es muchísimo más sencillo porque solo nos piden una serie de credenciales. Mientras que si no están preprogramadas y no están integradas de forma nativa, debemos de utilizar este nodo de aquí. Este nodo de aquí es una forma de solicitar a servicios externos para nosotros emplear sus funcionalidades. Esto lo veremos en mayor profundidad en partes más avanzadas de este curso, pero ahora simplemente quiero que lo entendamos conceptualmente.
Como decíamos, para nosotros poder hacer un scrapeo de una web, por ejemplo, de precios de libros, lo que tenemos que utilizar es un servicio como podría ser Firecrow. Para eso, simplemente accedemos a nuestro buscador, buscamos Firecrow. accedemos a su web, hacemos un registro convencional y una vez accedemos, lo que encontramos es un dashboard donde solemos tener diferentes métricas. ¿Por qué digo solemos tener? Porque quiero que estos conocimientos o esta forma de integrar la extrapolemos a diferentes escenarios o diferentes aplicaciones. Es decir, esto mismo que estamos haciendo aquí, ¿vale?, con Firecrow lo podríamos aplicar como razonamiento a cualquier aplicación externa. Siempre necesitamos una API Key, que sería como nuestro identificador de acceso, la forma que tenemos de autenticarnos en el servicio y que de esta forma nos puedan, digamos que cuantificar tanto el uso como saber qué usuario está accediendo a esto. Y por otro lado, debemos de identificar la documentación. En la documentación es donde nos van a especificar de qué forma debemos hacer una petición a este servicio para realizar la acción o solicitar aquello que nosotros necesitemos de este Endpoint que se conoce. Si os fijáis, siempre solemos tener una sección de Quickstar. Esto es extrapolable de nuevo y solemos tener un pequeño resumen que nos dice cómo utilizarlo. Aquí lo que tenemos son los features, es decir, las posibilidades que nos puede aportar este servicio, ¿vale? Y lo que nosotros queremos hacer en este caso es scrapear, si veis aquí que es scrapear una URL y obtener su contenido en un formato de digerible, digamos, por un large language model, por un modelo de lenguaje.
Entonces, si venimos aquí, veremos que nos dan ciertos ejemplos, ¿vale?, de utilización lo que está esperando que nosotros le enviemos con los diferentes parámetros y la respuesta esperada. Esto de nuevo, que no es de miedo, parecen muchas letras, una sintaxis muy rara para aquellos que no están acostumbrados a la programación, pero de nuevo es muy sencillo, simplemente debéis de ser muy conscientes de lo que necesitamos, ¿vale? Y de la respuesta que nosotros esperamos. Fijaos este ejemplo de aquí de extracción. Eh, nos dice, "Con la extracción del LM puedes extraer eh fácilmente datos estructurados de cualquier URL. Nosotros enviando esto, que ahora os enseñaré cómo cómo lo hacemos, obtenemos esto de aquí, ¿vale? Que sería el título, la descripción, robots, el título de otra otra cosa, ¿vale? Y esto es simplemente ofreciéndole o enviándole lo que sería la URL. Aquí directamente. ¿Lo veis? Esto nosotros lo que queremos hacer es que sea de la forma más sencilla. Y el ejemplo que vamos a poner es este de aquí, que simplemente, como veis aquí, ¿vale?, Vale, no le hagáis caso a todo esto. Enviándole este prom con los datos que nosotros esperamos extraer automáticamente nos devuelve una serie de datos estructurados en JSON que podremos utilizar posteriormente en nuestro flujo para realizar aquellas acciones o modificaciones que necesitemos.
Vamos a copiar directamente el cool este de aquí, que esto de Col básicamente es una forma que tenemos de probarlo directamente desde terminal, pero en N8N es la forma más sencilla que tenemos de configurar nuestros HTTP request, ¿vale? O sea, simplemente copiamos, como habéis visto de aquí el Curl, pegamos e importamos. Esto de nuevo es extrapolable para todas las integraciones. Simplemente necesitáis acceder a la documentación, como habéis visto aquí, y por otro lado necesitáis vuestra API Key. La API Key es la forma de nuevo que tenéis de autenticaros. Copiáis, venís aquí y al final lo que tenemos que hacer, y esto lo veremos más tarde, el tema de los métodos, las URLs y todo esto, lo que tenéis que hacer actualmente es simplemente rellenar aquellos datos que os están solicitando. Veis que os pone aquí your API key. Eso es que os está pidiendo. Esto os está pidiendo la API key. Centraos en eso. Y después, sobre todo, fijaos que respetéis la sintaxis, que aquí no haya más de dos espacios, que esto suele pasar mucho, ¿vale? Esto de bearer también es muy importante mantenerlo. Y si nos fijamos en el body este de aquí, que es lo que nosotros le enviamos a este end point, a este servicio de Firecrow, tenemos un prom, veis, que es lo que le estamos solicitando que extraiga de esa página web, de esa URL que le vamos a proporcionar. Esa URL, como hemos comentado, es esta de aquí de Books to Scrape. La seleccionamos, copiamos y la pegamos aquí en su campo correspondiente. Y al final se trata de sustituir campos, sustituir parámetros, ¿vale? De un tema que está muy estandarizado. Aquí le estamos diciendo que la URL es esta, que el formato de de vuelta es Jason, ¿vale? Y aquí las opciones, pues tendríamos el prom directamente. Y yo le puedo decir extrae de la URL de la librería. un listado de libros con los conceptos siguientes. Dos puntos. Nombre en string. Ya le especifico el tipo de dato. Bueno, mira, vamos a poner un ejemplo. De momento no le voy a especificar el tipo de dato y así vamos a ver qué qué es lo que nos devuelve. Le decimos el nombre e el precio, eh si stock, si está en stock, la URL y la imagen. Venga, vamos a enviarlo así directamente a ver qué ocurre. Le damos a test. Esto lógicamente nos tarda un ratito, ¿vale? Porque debemos de pensar que lo que estamos haciendo ahora mismo con este nodo de aquí es mandar a a trabajar a Firecoll, que tiene una inteligencia artificial que ahora mismo está procesando todos esos datos que le hemos solicitados con el prom y nos lo está enviando en formato estructurado. Es por eso que tarda un poco.
Vale, ya terminado y fijaos, vamos a esquema. Lo que tenemos es por un lado toda la metadata que nos devuelve directamente esta API y por otro lado tenemos un objeto Jason donde tenemos anidada una lista, una array de libros con una serie de objetos con cada uno de los libros y los datos relativos a cada uno de ellos, como es el nombre, el precio, si está en stock, la URL y la imagen. Pero fijaos que aquí ahora mismo tenemos un problema que es el tipo de dato. Yo tengo el precio en string, ¿vale? Lo tengo en un tipo de dato que no me permite, por ejemplo, y un segundo porque pineamos aquí, que no me permite, por ejemplo, hacer algo como esto de aquí. Imaginad que este emprendedor o este cliente nos solicita que le enviemos solo aquellos libros que tengan un precio inferior a $40. Vale, si yo ahora mismo quiero hacer esa comparación, ¿vale? Porque este nodo lo que hace precisamente es filtrar y dejar pasar aquellos que cumplan esa condición, ¿vale? Por lo tanto, estamos comparando y le digo que es numérico y que es less done, o sea, menos d, me va a dar error. ¿Por qué me da error? Porque yo no puedo comparar un string con un o con una operación que solo se puede dar si se trata de un tipo número, ¿vale? Como estáis viendo aquí. Y en string no nos dan esta opción. Fijaos. ¿Veis qué tenemos que hacer? Lo que tenemos que hacer es en este prom de aquí especificarle el tipo de dato, que es lo que estábamos haciendo anteriormente. Entonces, en nombre le decimos en string, en precio, en número o numérico, da igual. Stock, queremos que sea boleano. ¿Por qué? Porque o está en stock o no está en stock, ¿vale? Entonces, le vamos a decir boleano, así en español, tal cual. La URL es un string también y la imagen también es un string porque la imagen en este caso será de igual forma una URL. Vamos a reprocesarlo. Quitamos el pin y le damos. Lógicamente va a volver a tardar un ratito esto. La idea es que cada día se dispare automáticamente con un nodo de eh eh este de aquí de temporalidad, o sea, no, perdona, con este con schedule.
Vale, ahora vamos a ver qué es lo que nos ha devuelto. Ahora sí que estamos viendo que nos devuelve exactamente lo mismo. Sin embargo, los datos o los tipos de datos están correctamente formateados. Veis que tenemos el nombre así, el precio lo tenemos numérico, el stock está en boleano y ahora sí que podemos hacer esa comparación. Si yo le digo que este valor de aquí sea eh menos que 40 y le doy a test, vamos a ver que nos devuelve que nos ha descartado un solo ítem. Y esto vamos a entender por qué es así y qué es lo que tenemos que solucionar en este punto. Si os fijáis, nosotros lo que tenemos es una array, es decir, una lista. Y lo único que estamos seleccionando es el primer ítem de esta lista. Veis que estamos seleccionando el json punto data puntojon. Que sería este de aquí, y estamos seleccionando solo la posición número uno, por lo tanto, estamos seleccionando este de aquí. Si yo ahora selecciono la posición número dos, me dará el segundo elemento, que es este de aquí. Si pongo el cero, nos dará este de aquí, ¿no? Y así con todos y cada uno de los elementos de este array. ¿Qué tenemos que hacer? Pues este array, que es de un solo ítem, separarlo en ítems individuales. Para eso, como hemos visto, existe un nodo que es superinesante de data transformation, que es el de split out, que lo que hace es convertir una lista en ítems separados. Si ahora simplemente arrastramos el la lista directamente aquí como los campos para separar y le damos a test, veremos que nos separa individualmente 20 íems. ¿Vale? Lo que podríamos hacer ahora es directamente comparar el precio y veríamos que nos descarta 10 ítems y que mantiene otros 10 ítems. Estos son los que cumplen esta condición de aquí de ser inferior a 40. Em, ¿qué otra condición podríamos poner? Pues básicamente que tengamos stock de esto. Para ello lo que podemos hacer es decirle que estamos con un boleano y que debe ser true. Esto lo que tenemos que hacer directamente es poner el stock aquí, darle a test y como vemos nos mantiene exactamente estos 10 porque tenemos todos en stock, todos están en true. En este caso en particular, si hubiese alguno que no estuviese en true, como podemos manipular. Mira, fijaos, si yo ahora mismo accedo aquí, manipulo uno de ellos y le digo que es false a este de aquí, guardo y vuelvo a ejecutar este nodo, veremos que hay uno de ellos que me debería descartar. Hm hm hm. Pero justamente coincide que es uno de los que me había descartado por la por la otra condición, ¿vale? Si vamos a poner que sea e menor a 60 y como veis hay uno que nos descarta simplemente porque el stock no está disponible, ¿vale? Es decir, e hay una condición o hay dos condiciones que deben darse por separado y que cada una de ellas hace que esto se descarte como un posible pretendiente para enviarlo por correo. Una de ellas sería que el precio sea menor a lo que nosotros le indiquemos y otra de ella sería que no existiese stock de ese artículo. Si alguna de las dos se cumple, que no tienen que ser las dos simultáneamente, lo que ocurriría es que automáticamente pasaría a la pestañita de descartados y ya no pasaría en el flujo, ¿vale? Ya no lo utilizaríamos como un ítem. En este flujo lo descartamos. Esto podemos cambiar la condición y hacer que en vez de que sea un ant, que sería ambos simultáneamente, podemos hacer es poner un OR. Es decir, si alguno de estos dos no se da, lo que ocurre es que los mantiene, es decir, se tienen que dar los dos simultáneamente, ¿vale? Para que lo descarte. Vamos a seguir con el ANT y vamos a continuar con nuestro flujo.
Ahora tenemos nuestros 10 ítems saneados, que son los que cumplen la condición de tenerlos en stock y además que el precio sea inferior a $40. Y lo siguiente que vamos a hacer es enviarlos por correo, ¿no? Es lo que me parece más lógico ahora mismo. Y vais a ver que tenemos un problema y que quiero que lo veamos porque creo que os va a aportar un valor brutal. Vamos a send message misage. En send message Message le decimos automáticamente nuestro correo. En subject podemos poner listado libros o listado stop actualizado. En el tipo de eh email le decimos que el formato es HTML como veníamos haciendo. Y ahora si nosotros hacemos esto, ¿vale? que es lo que nos saldría intuitivamente, arrastrar cada uno de los elementos y lógicamente formatear nuestro correo electrónico como hemos visto en la primera parte, que sería tal cual así. Lo que veremos es que se da una cosa que es muy curiosa. Vale, vamos a dar a test. nos dice que efectivamente se ha enviado el correo electrónico y vamos a ver qué es lo que ha pasado. Fijaos, tenemos 10 correos electrónicos. Es decir, nosotros lo que estamos haciendo aquí de forma muy errónea es enviar un correo por cada uno de los ítems de entrada. Y esto ocurre porque N8N ejecuta cada nodo por cada ítem que entre. Vale, eso lo debemos de entender y es superimportante. Si entra un ítem se ejecuta una sola vez. Si entran 10 ítems se ejecuta 10 veces. Esto es un problema que lógicamente se tienen que dar manipulaciones de datos para poder subsanarlo. Y vais a ver cómo lo hacemos.
Una forma que tenemos de solucionar esto es con un nodo de AI transform, que creo que va mucho con la filosofía de el low code. Y este nodo de aquí, como decíamos en apartados anteriores, simplemente consiste en que nosotros le especificamos el lenguaje natural, qué es lo que queremos hacer con los datos de entrada y este se encarga de realizar un código en JavaScript para que esa manipulación se dé la forma que le estamos solicitando. Entonces, vamos a conectarlo tal cual. Y vamos a especificarle en el prom qué es lo que queremos hacer. Nosotros, como decíamos, teníamos 10 ítems individuales, pero tan solo queremos un solo ítem. Entonces, lo que le podemos decir es que devuelva devuelve un solo ítem de N8N que muestre listados todos los ítems de entrada. em el nombre, porque así ya lo formateamos en HTML en un formato que a nosotros nos convenga en negrita imagen, ¿vale? para que lo ponga como un source dentro del mismo correo electrónico. Precio y un enlace con el texto ver libro, por ejemplo. Y aquí le decimos que use la siguiente las siguientes clave usando las claves. dos puntos. Name, price, stock, URL, imagínea. Esto va a ser para un correo electrónico en o formateado en HTML. Hm hmm. Asegúrate, asegúrate de que sea estético y funcional. Venga, le damos a generate code, una vez le damos a generate, automáticamente nos carga el código que nos propone y vamos a darle a test a ver qué nos devuelve. Como vemos, nos devuelve esto de aquí, que es todo el HTML en un solo ítem.
Ahora vamos a ver a qué problemas posiblemente nos enfrentemos. Si yo me vuelvo a nuestro correo electrónico y aquí le ponemos esta expresión, ¿vale? Lo que vemos es que tenemos este formato de aquí. Vamos a darle a test porque de esta forma lo veremos super rápido. Vamos al correo electrónico. Actualizamos. Vale, fijaos, la verdad que es increíble. Fijaos, eh, tenemos todas las imágenes con el enlace a el libro, ¿vale? Tenemos el precio, ¿vale? Y lo que estoy viendo es que no nos incluye si está o no está en stock. Vale, esto sería un pequeño fallo y vamos a ver por qué se está dando de esta forma. Si volvemos a nuestro nodo de AI transform, vamos a ver qué es lo que no ha entendido. Nos incluye el precio stock como disponible. no disponible URL y la imagen. Vale, vamos a volver a generar esto. Como sabéis, como estamos pidiéndole algo a una inteligencia artificial, al final es una cuestión de iterar, de seguir intentándolo hasta que hasta que alcancemos el resultado que que estamos buscando, ¿no? Lógicamente, no siempre se va a dar a la primera y va a depender muchísimo de nuestra capacidad de especificar correctamente con un prompt, pero simplemente quiero que veáis como problemas que pueden ser complejos en un inicio y que pueden ser una limitación, sobre todo para aquellas personas que se están iniciando. Si utilizamos las herramientas correctas, como puede ser este nuevo de aquí de AI transform, se nos puede facilitar muchísimo.
Vamos a ver qué nos hace ahora. Vale, nos ha cambiado el código. Vemos que tenemos una nueva línea donde nos incluye esto de aquí. Vamos a darle a test y a ver qué nos devuelve. Directamente vamos a enviarlo por correo electrónico porque creo que es la forma más rápida y intuitiva de verlo. Nos ha mantenido la etiqueta. Vamos a darle a enviar. Volvemos. Bien. Fijaos. Ahora sí que nos pone el precio disponible disponible el enlace al libro, título. Vale, aquí podríamos incluir el símbolo del, bueno, de la moneda que estemos utilizando. Pues lógicamente sí, si vamos al prom y se lo especificamos podemos hacer todo aquello que queramos. Lógicamente la atribución de N8N siempre nos la acaban colando aquí. Vamos a quitarlo en un momento aquí. y lo eliminamos automáticamente. Perfecto.
Pues como veis, esto sería una automatización muy interesante en la cual hemos visto una serie de manipulaciones y hemos enfrentado unos problemáticas que se pueden dar en el día a día y que no son tan raras de ver, las cuales la hemos solucionado pues de una forma relativamente sencilla. Lógicamente esta transformación que hemos hecho aquí lo podemos hacer a través de expresiones. Esto lo veremos en una parte más avanzada del curso, pero de lo que quiero que nos quedemos con esto es cómo con algo super básico, como es este flujo de aquí, podemos llegar a monetizar, podemos llegar a vender y podemos llegar a extraer ideas bestiales. Pensad que esto de aquí actualmente podríamos cargarlo en una base de datos como es un Google Sheets y automáticamente si se dan cambios en el precio de cualquiera de estos artículos que tenemos publicados en esta web, avisar a nuestro cliente, ¿vale? O avisar a nosotros mismos para que hagamos una compra o que estudiemos a nuestra competencia para ver cómo están fluctuando estos precios. Esta es la esencia del scrapping. Es en lo que consiste al final del día, en sacar esa o extraer esa ventaja competitiva de algo que se hace manualmente y que es superengorroso y que requiere mucho tiempo. Hacerlo de forma totalmente automatizada y que esto nos ahorre muchísimo tiempo tanto a nosotros como nuestros clientes.
Hasta ahora hemos estado viendo manipulación de datos directamente con nodos de N8N. Hemos estado también viendo cómo manipulábamos el flujo con nodos de control de flujo. Sin embargo, debo deciros que N8N integra de forma nativa ciertas expresiones de JavaScript que nos permiten realizar estas modificaciones de una forma mucho más sencilla y manipular los datos de entrada a nuestro antojo para que posteriormente en el flujo los dispongamos a nuestro interés. He preparado esta pequeña MOC data que estáis viendo opineada directamente aquí donde tenemos un ítem con diferentes claves valor, ¿vale? con con un JSON donde tenemos contenido, por ejemplo, nombre, edad, correo electrónico, teléfono, LinkedIn, es decir, datos de un usuario. Por otro lado, tenemos un array y como veis aquí también tenéis tenemos un array donde tenemos objetos contenidos dentro de esta array y con sus correspondientes claves valor anidados, ¿vale? Que esto nos va a dar pues una forma muy ejemplificativa de ver casos muy diversos. Hemos utilizado uno de edit fields simplemente para que podamos visualizar cómo se dan estas transformaciones, porque como sabéis, si lo ponemos en modo de expresión, justo a la derecha tenemos el resultado de esta expresión cuando se la sometemos a a los ítems de entrada. E de igual forma hemos estado viendo que si utilizamos esta sintaxis particular de dólar jon lo que nos devuelven es el Jason de el input data, ¿vale?, que tenemos aquí a la izquierda de el nodo actual, ¿vale? Y lo que podemos hacer es acceder a cada uno de los elementos de este input. Para acceder a cada uno de los elementos de este input, basta con pulsar el puntito y veréis que se nos despliegan los fields donde tenemos los diferentes campos, como venimos diciendo, y además tenemos el tipo de dato correspondiente a cada uno de estos campos. Como veis, edad es tipo numérico, eh email es string, empresa es un objeto, es cliente, es tipo voleano, true o false. Bien, y a cada uno de estos elementos los podemos someter a una transformación particular en función de lo que necesitemos o en función de lo que estemos buscando concretamente con ese tipo de dato. Nosotros vamos a empezar con los datos de tipo string y vamos a ver qué es lo que nos recomiendan en N8N como métodos más utilizados. Si nosotros ponemos nombre, ahora damos intro y volvemos a poner el puntito, ¿vale? Vemos que nos aparecen los sugeridos, después nos aparecen los de edición aquí abajo, ¿vale? Y estos serían todos los que adicionalmente de los que nos están sugiriendo aquí arriba existen. ¿Vale? ¿Veis aquí? case, que es para, bueno, manipular mayúsculas o minúsculas, validate, que es para validar, query, vale, tenemos diferentes formas. Nosotros vamos a comentar los más utilizados. Vamos a empezar, por ejemplo, con el de includes. Y este básicamente lo que hace es devolvernos true o false en función de si el string de entrada cumple una determinada condición en cuanto a lo que contiene. Es decir, imaginad que e Daniel Ruiz le ponemos como condición
que debe contener la letra D, ¿vale? De Daniel. En este caso, como Daniel incluye la letra D, nos devuelve un true.
Eh, Daniel de igual forma contiene da de Daniel. Sin embargo, Daniel no contiene RA, ¿vale? Por lo tanto, nos devuelve false.
También debéis de pensar que es Kensitive, que se llama, y es que es sensible a las mayúsculas o las minúsculas para que se devuelva esta condición o para poder verificarla. Entonces, si ponemos una D minúscula, veremos que nos devuelve false, mientras que si es mayúscula, nos devuelve true.
Vamos a seguir comentando. Vamos a hablar ahora del split, que esto lo que hace es cortar ese string, ¿vale?, con la condición que nosotros le indiquemos. Entre paréntesis, si yo, por ejemplo, aquí le pongo la n de Daniel, lo que vais a ver es que va a cortar la n justo aquí, ¿vale? y nos devuelve un array. Además nos va a devolver un array cortando justo por la letra o el elemento más bien o el símbolo, o lo que sea que nosotros le indiquemos entre paréntesis.
Bien, siguiente. E stars with nos va a devolver un true o un false, ¿vale? un 0 o un en función de la condición que nosotros le indiquemos de en con qué o cómo debe de empezar ese string. Por ejemplo, si Daniel empieza con la letra D, nos va a devolver un true. Pero Daniel no empieza con la letra E, pese a que Daniel pues contiene la letra E. ¿Veis? Pero no empieza con la letra E. Entonces, esto puede ser interesante en caso de que queramos, por ejemplo, corroborar en un registro que se nos devuelva un determinado tipo de símbolo o lo que sea. Justo al inicio de un string.
Podemos hacer exactamente lo mismo con e acaba con, ¿vale?, lo que pasa que ya no está en suestet y en replace all, ¿vale? este de aquí, que esto lo que hace es que vamos a ponerle una condición o un parámetro que nosotros le indicamos y le decimos que debe cambiar por otro segundo parámetro. Vamos a verlo porque esto es un poco difícil de explicar, pero de ver muy fácil. Imaginad que queremos sustituir la letra D por otra letra, ¿vale? Dentro de el string de Daniel Ruiz, pues bastaría componer D, ¿vale? como primer parametrito y justo después, seguido de una de una coma, le vamos a decir que lo sustituya por R. Como veis, ahora nos devuelve Raniel Ruiz. Esto lo podríamos hacer, por ejemplo, con da, ¿vale? Le podemos decir da, veis que nos sustituye el da por la r directamente o lo podríamos hacer por reeniel ruiz. Así con todos los elementos que estén constituidos este string y que nosotros queramos manipular.
Bien, seguimos. Em, length. Este de aquí básicamente nos va a devolver la longitud de este string, ¿vale? Con un valor numérico. En este caso, como este string Daniel Ruiz es de una longitud de 11, ¿vale? pues nos devuelve ese valor numérico y ya está.
Bien, otros métodos interesantes, este de aquí de base 64 en code o de code, ¿vale?, que es para codificar en base 64, que esto, bueno, son cosas un poco más complicadas que no vais a utilizar tanto. Ex de extraer dominio y extraer email es bastante interesante. De hecho, vamos a verlo con un ejemplo. Si os fijáis, aquí a la izquierda tenemos el email de Daniel Ruiz e y imaginad que en este email de Daniel Ruiz queremos extraer tan solo el dominio, ¿vale?, que sería translogisticcamaral. Entonces, vamos a acceder primero a ese elemento, ¿vale? dentro de nuestro ítem. Para eso, jon.email punto, ¿vale? Y aquí le decimos extractin intro y como veis nos devuelve tan solo el dominio eliminando todo lo demás. ¿Veis? Aquí podemos hacer lo mismo con extraer el correo electrónico. ¿Por qué? Porque puede ser que el email contenga pues que sea un string y contenga más elementos, ¿no? Como podría ser perro seguido de Daniel Ruiz. Y tan solo queremos que nos devuelva pues el email. De hecho, si queréis vamos a verlo porque considero que puede ser interesante. Vamos a manipular el JSON de entrada que tenemos aquí de Mog data. Un segundo. Bien, lo tenemos aquí. Y aquí en este string vamos a poner, pues, por ejemplo, perro, ¿no? Por poner algo. Guardamos. Está pineado. Correcto. Vamos a ver. Vemos que está correcto y ahora queremos que nos devuelva, como decíamos solo el correo electrónico. ¿Veis aquí? Extract devuelve perro, tan solo nos devuelve daniel.ruiz@translogistics, tal cual.
Bien, vamos a seguir. Otro método interesante que podríamos comentar sería hm el de IS URL, este de aquí, por ejemplo. El de IS URL lo podríamos aplicar a la URL del LinkedIn. Imaginad que queremos comprobar de si es una URL e válida o por el contrario es una URL que no tiene sentido. Y lo podemos comprobar porque esta función de aquí nos devuelve true o false en función de si es una URL con una sintaxis válida o no.
Vale, vamos a ver ejemplos de tipo numérico que también son muy interesantes. Vamos a seleccionar edad y si hacemos el puntito de igual forma nos dan unos recomendados. Este de is od básicamente nos devuelve un true o o un false en función de si es un número par o impar. En este caso, como 42 es un número par, pues nos va a devolver true en este caso, ¿vale? De aquí is nos debería devolver true. ¿Veis? Y si ponemos is nos devuelve false.
Bien, ¿qué más manipulaciones podemos hacer? pues todas las que queramos en cuanto a em digamos que operaciones aritméticas, eso está claro. Podemos hacer que nos devuelva el var absoluto. Imaginad que la edad por algún motivo está en una sintaxis particular o que está en negativo por lo que sea y queremos pasarlo a valor absoluto y que nos devuelva simplemente pues el número sin símbolo. Em, vale, esto lo que hace es redondear hacia arriba, el de formatear. Esto ya son cosas un poco más raras que no vais a utilizar. Esto es para comprobar si es tipo entero. Puedes convertir el valor, es decir, el valor numérico a voleano. Si es cero, nos va a devolver un false. Cualquier otro valor numérico nos va a devolver un true. Podemos convertirlo este valor numérico en una fecha, ¿vale? En caso de que la fecha por algún motivo nos venga en valor numérico, podemos convertirlo en un string. ¿Vale? Si le damos aquí este dato ahora en la salida, si le damos a step, a tres step, aquí veremos que es un dato de tipo string y como veis nos devuelve el dato de tipo string aquí.
Bien, perfecto. Vamos a ver los las manipulaciones que podemos hacer con un array. Y en este caso vamos a ver las más utilizadas porque hay unas que sí o sí vamos a utilizar en nuestro día a día. Y entre ellas está la de last, que nos devuelve el último elemento de este array. Como veis, pues es WhatsApp. La de first, que es exactamente lo mismo con el primer elemento. También tenemos otra que es ciertamente interesante, que es esta de aquí de includes, que básicamente nosotros aquí entre paréntesis le ponemos que debe de incluir este arrey, ¿no? En este caso este array debe de incluir watch app. ¿Veis que es true. De esta manera podemos confirmar que las arrays que nos devuelvan determinados procesos o servicios tengan un elemento que a nosotros nos interese, ¿vale? Y poder hacer una comparación o lo que sea.
¿Qué más podemos hacer? Podemos hacer el de aquí, que es para incluir más elementos dentro de este array. Por ejemplo, imaginad que ahora quiero que haya otro elemento que sea e Telegram, por ejemplo, Telegram. Y si os fijáis, ahora tenemos automatización de procesos, CRMs, WhatsApp y Telegram. Como veis, hay infinidad, ¿vale?, de estos de estos métodos. Está el de chunk, ¿vale?, que sirve para cortar en un determinado lugar que nosotros le indiquemos, el de find que sirve para buscar. Hay muchísimos. Lógicamente, esto podéis acceder directamente desde la documentación de N8N y ahí podéis consultarlos, podéis comprobar, jugar, ¿no?, que al final es de lo que se trata todo esto y ya está. Y simplemente eso, que nos quedemos con la idea de que tenemos muchas formas de hacerlo y que cada una de ellas pues tiene un uso particular.
Bien, ha llegado uno de los momentos más importantes, uno de los momentos clave tanto para el desarrollo de vuestras agencias de inteligencia artificial como para vosotros como usuarios. Y es el momento en el que vamos a aprender qué es un rag. Retrieval aumented generation, generación aumentada por recuperación. ¿Qué significa esta palabreja que es una así tan rara y tan trambólica? No, a veces es muy simple. Vamos a abrir un escalid donde vamos a verlo de una forma muy sencilla.
Em, en la sesión anterior, donde estábamos hablando del sumarizador, el que nos hacía los resúmenes de los diferentes inputs que le dábamos a través de de texto, lo que veíamos es que debíamos de emplear una técnica que era la técnica del chunking, de hacer trocitos pequeños de un texto muy grande porque no cabían en la ventana de contexto. Esto se hace porque, como decíamos, nosotros tenemos una limitación en cuanto a la ventana de contexto, es decir, no podemos procesar todos esos tokens en una sola solicitud. Imaginad de nuevo que estamos en el ejemplo de el documento que tiene 500 páginas, 1000 páginas o lo que sea, ¿vale? como podría ser el ejemplo que me gusta mucho poner, que es la Biblia, ¿no?, que tiene muchísimas páginas y que nosotros queremos hacer que nuestro modelo de inteligencia artificial, por ejemplo, nuestro GPT, vamos a decir, esté alimentado con este documento de aquí de 8,000 páginas. Esto para nosotros lograrlo no basta con que nosotros directamente en el chat window que tenemos le volquemos este documento. ¿Por qué? Porque este GPT de aquí, que puede ser el 3.5, puede ser el 4o, puede ser el 4.1, el que sea, tienen una limitación en cuanto a tokens. Como decíamos anteriormente, estos tokens se pueden traducir en caracteres y nos va a limitar cuánto de este texto puede interpretar en una sola solicitud. Además, todas las respuestas que nos dé este GPT referente a este documento van a tender a ser de la parte final. o la parte inicial, ¿vale? Y esto ocurre por lo que comentábamos, porque están limitados, son perezosos. Para que nos entendamos, pensad que la ventana de contexto no es solo el documento entero este de aquí, ¿vale? Sino que también es la query del usuario. Nosotros tenemos nuestro usuario aquí abajo, ¿vale? y también es la respuesta del modelo a nuestro usuario. Bien, todo esto va a ocupando espacio en esa ventana de contexto y va haciendo que el modelo cada vez sea, por un lado, menos preciso y por otro lado, menos capaz de procesar esta información de aquí.
Y aquí es cuando introducimos el concepto de RAG, retrieval aumentation, ¿vale? Porque ayuda muchísimo pensar en que definitivamente lo que estamos haciendo es aumentar la capacidad de generación del modelo gracias a una recuperación o una sí, una recuperación en definitiva aumentada, está generando más información porque le estamos dando mayor contexto, ¿vale? Y es por eso que se llama RAG. Lo que hacemos es que ese texto de, vamos a decir el mismo ejemplo de antes de 8000 páginas, lo estamos cortando en trocitos muy pequeños denominados chunks, ¿vale? Estos se conocen como chunks y estos chunks los estamos pasando a una base de datos especial que se conoce como base de datos vectorial. Vale, esto es una base de datos datos vectorial. Esta base de datos vectorial puede ser de diferentes formas, ¿vale? suelen tener unas características y actualmente pues hay unas muy reconocidas comercialmente como podrían ser Pinecone, para que os vaya sonando, Pinecone o Cudrant, ¿vale?
Bien. Em, con la técnica de chunking cargamos esta información en una base de datos vectorial y esta base de datos vectorial almacenará en un espacio vectorial, como indica su nombre, estos trocitos de información, pero no los almacenará tal cual, es decir, no almacenará el texto tal cual nosotros se lo trasladamos a la base de datos, sino que aquí en el medio de este proceso hay una cosa que se conoce como modelo de embeding, ¿vale? Que va aquí. modelo de embedding. Este modelo de embeding, básicamente y fundamentalmente lo que hace es convertir estos textos individuales en un formato más digerible y comprensible para poder recuperar la información, ¿vale? Y eso es lo que se conoce como y lo que cargamos nosotros dentro de esta base vectorial son en bets, que son listas numéricas muy largas. ¿Vale? Imaginad que en este párrafo hablamos de que mi perro se llama eh Bobby, pues eso sería algo así. 1,2,81 tal. Normalmente suele ser del entre un número comprendido entre el 0 y el 1 o el -1 y y el 1, pero vaya, para que lo veáis de ejemplo. Y suele ser un una cantidad de números muy largas. ¿Por qué? Porque estos números lo que representan, y esto ya también es un poco para que e lo lo podamos dibujar en nuestra mente, son dimensiones. Si tenemos tres numeritos, pues tendríamos un espacio tridimensional, ¿vale? Aquí, veis, si tenemos el uno, pues sería aquí, el dos aquí y el ocho aquí, ¿vale? Y tendríamos un puntito aquí en el centro. Y este puntito de aquí sería perro y a lo mejor Bobby sería el cer, el tres y el ocho. Y Bobby estaría aquí. ¿Veis que está perro muy lejos de Bobby? ¿Por qué? ¿Por qué sucede de que estén tan lejos y no estén cercas? Porque esto es un espacio que lo que hace es correlacionar semánticamente y asocia la ubicación de estos en función de cuánto se aproximen semánticamente, es decir, de cuánto se aproximen en cuanto a significado. Si perro es similar a gato, es más probable que nosotros aquí como un puntito encontremos a gato.
Bien, entonces por un lado hacemos la carga de nuestro corpus, ¿vale? Esto se conoce como corpus. Por otro lado, pasamos por un modelo de embeding. Veréis que es superfácil esto después traducido a la práctica. Y por otro lado lo cargamos en una base de datos vectorial que puede ser Pinecon, Cudran o la que queramos. Y esto se almacena como unos listados numéricos superraros que básicamente lo que representan son puntitos en el espacio que significan cosas. Ya está, al final del día eso.
Y entonces lo que hacemos con el RAC es que nuestro usuario ahora ya no está hablando directamente con el GPT y el GPT a su vez tiene el documento, sino que ahora mismo lo que nosotros estamos haciendo es este GPT conectarlo a esta base de datos vectorial a través de un agente, por ejemplo. Vale, aquí tendríamos un agente y la query del usuario de igual forma la tendríamos conectada a la agente. Esto lo que haría por un lado es sumar la solicitud del usuario que convertiríamos igualmente en listitas numéricas, ¿vale? De dimensionalidad muy alta junto con lo que nosotros recuperemos de esta base de datos vectorial. Todo esto lo reprocesa nuestro agente gracias a nuestro modelo de lenguaje y nos proporciona una información, ¿vale? que tiene todo el contexto de nuestro corpus referente a la consulta que le hagamos. ¿Vale?
Esto así ahora mismo entiendo que puede parecer un poco abrumador, pero es realmente sencillo. Simplemente después en la práctica se traduce en cuatro nodos bien dispuestos y en comprender la lógica que hay detrás porque es lo que os va a hacer ser buenos en esto.
Después otra cosa importante es que nosotros tenemos los chunks, pero también tenemos otro concepto que se conoce como overlap. Estos chunks nosotros no los podemos cortar así tal cual porque yo a lo mejor aquí estoy contando una historia que va de Ana. Por ejemplo, e Ana está cruzando el río. Está cruzando el río y aquí yo sigo contando que Ana está cruzando el río, ¿vale? Imaginad que por lo que sea el usuario pregunta acerca de Ana cruzando el río y yo simplemente recupero este chunk. No sería lo correcto, ¿verdad? ¿Por qué? Porque lo estoy cortando aquí. Entonces, hay una cosa que es el overlap, que básicamente lo que consiste es en darle un porcentaje de solapamiento entre el final del primer chunk con el principio del segundo chunk. Y esto lo haríamos con todos y cada uno de ellos. Esto e no hay una ciencia cierta al final del día, simplemente debéis de probar, ver que os da mejores resultados, pero la verdad que que dominéis esta tecnología os va a convertir en personas con una habilidad que ahora mismo está muy demandada. y que creedme que no hay mucha gente que sea capaz de suplirla.
Vamos a llevarlo a la práctica. Genial. Ha llegado una de las partes más importantes de este vídeo, al menos para mí lo es, ya que esta creo que es una de las soluciones que con mayor facilidad podréis ofrecer a clientes y con mayor facilidad podréis obtener un beneficio económico de ella. Como sabéis, el RAG, en definitiva, todas las empresas que estén chateando con documentación, que tengan procedimientos, que respondan preguntas frecuentes, lo van a necesitar. es una solución universal y que si realmente nos volvemos expertos en este tipo de soluciones y somos capaces de integrarlo profesionalmente, vamos a tener unas oportunidades verdaderamente increíbles.
Este flujo que vais a ver no es un flujo cualquiera, no es el típico RAG sencillo que vais a ver en mil veces por 20000 canales de YouTube que dudo mucho que seáis capaces de vender a cualquier cliente porque son flujos que cuando los probéis no van a funcionar en condiciones de producción, sino que este flujo es un flujo que yo mismo he vendido, que yo mismo he patentado y que yo mismo he probado en multitud de ocasiones. Vamos a probarlo y vamos a ver cómo lo hacemos en las diferentes fases.
Como sabéis, tenemos dos fases muy diferenciadas a la hora de crear un RAG. Una de ellas sería la carga del Corpus, donde lo que hacemos es introducir todos esos documentos que van a funcionar en forma de base de datos, de conocimiento para nuestro modelo de lenguaje. Y después tenemos otra parte que sería la parte del agente con el que interactuamos y con el que chateamos constantemente para recuperar esa información. Vamos a empezar con la parte de carga de datos. Y esta parte de carga de datos consiste por un lado en un servidor, un servicio donde tenemos que alojar todos esos datos. Posteriormente tenemos que pasarlos a una base de datos vectorial que podemos utilizar Supase, por ejemplo. Y posteriormente esta base de datos vectorial debemos de conectarla con unas ciertas condiciones para que en caso de que se suban duplicados o en caso de que se suban cosas erróneas, no tengamos fallos a largo plazo de duplicidad o no tengamos fallos a largo plazo de información que no debería estar en el RAG.
Vamos a empezar integrando el lugar o el servidor donde vamos a cargar estos datos y nosotros vamos a utilizar Google Drive. ¿Por qué Google Drive? Pues básicamente porque puede ser una solución muy sencilla y que nos permite una integración relativamente rápida. Como sabéis, todo flujo debe de iniciar con un trigger y en este caso vamos a utilizar Google Drive, como veníamos diciendo. Como vemos tenemos dos formas de hacer que Google Drive triggeree nuestro flujo de trabajo. Una de ell sería que detecte cambios en un archivo en específico y otra sería que detecte cambios en una carpeta en específico. Nosotros lo que queremos detectar es que si en una carpeta en específico existe un nuevo documento que hemos subido, pues que automáticamente nuestro flujo de trabajo se dispare y que ese documento se cargue en nuestra base de datos vectorial.
Abrimos nuestro nodo, ¿vale? nuestro nuevo trigger de Google Drive, le damos el nombre y a este le vamos a llamar eh archivo creado. Posteriormente, como en todo nodo que accede a un servicio externo, debemos de darle las credenciales. Y como veis, es una credencial que es algo distinta a la que venimos haciendo hasta ahora, que son un poquito más sencillas y esta es de las primeras que vais a ver que os van a dar un poquito más de problemas y dolores de cabeza porque es un procedimiento un poquito engorroso, que no complicado. Yo como siempre quiero alentaros a que abráis la documentación, que intentéis hacerlo por vuestros propios medios, porque van a haber casos donde no tengáis un videot tutorial, donde no tengáis una ayuda de primera mano a través de YouTube y donde vosotros mismos con la propia documentación de N8N debáis de hacerlo totalmente de cero. Al final, si queremos emprender en esto, no debemos de aprender procedimientos, debemos de aprender cómo hacer esos procedimientos independientemente del contexto. Y es que todos tienen un factor común. El factor común en este caso es que debemos de acceder a la documentación de N8N, seguir una serie de pasos que vamos a ver que muchas veces no están del todo bien detallados y que vamos a tener que buscarnos la vida, ¿vale? Como veis, en este caso, incluso tenéis un pequeño vídeo aquí por parte de N8N y vamos a hacerlo paso a paso, ¿vale? En este caso, e siguiendo esta guía de aquí y vamos a ver cómo lo cómo lo hacemos.
Lo primero que nos dicen es que debemos de acceder al Google Cloud Console, que es la plataforma de desarrolladores de de Google. Después debemos crear un nuevo proyecto, debemos darle una localización al proyecto junto con un nombre y pulsar en crear. ¿Vale? Después debemos de seleccionarlo y a partir de ahí vemos. Venimos a Google Cloud Console, que yo ya lo tengo abierto. Y aquí, cuando os registréis por primera vez, veréis que os solicitan que introduzcáis vuestra tarjeta de crédito. No os van a cobrar nada, de hecho, os regalan $300 de crédito para que lo utilicéis en vuestras integraciones. Sin embargo, os la piden, pues por una cuestión lógica, ¿no? De que no dupliquéis constantemente cuentas y que solo tengáis una. Accedemos a esta parte superior de consola. Aquí tendremos todos nuestros e nuestras configuraciones de Google Cloud Console. Y aquí, como veis y nos indicaba en la guía, tenemos diferentes proyectos. Estos son proyectos que yo he ido creando a lo largo del tiempo para hacer pruebas, tutoriales y tal. Y en este caso venimos aquí a proyecto nuevo para crear uno, le damos un nombre como podría ser RA profesional. Vamos a decirle, venga, rag profesional. Seleccionamos una organización. Realmente ahora mismo no hace demasiada falta, es por un tema de jerarquizar. Y creamos. Esto nos tardará unos segunditos de nada porque tiene que crear como una instancia en sus servidores, parece ser. Seleccionamos desde el mismo desplegable este de aquí arriba, nuestro proyecto. Muy importante. Y ahora vamos a volver a la documentación a ver qué nos dicen.
Como vemos, hm, lo siguiente que nos dice es que debemos de habilitar las APIs, debemos de acceder a la librería y posteriormente API yis servicios y librería. ¿Vale? Es decir, le damos aquí API y servicios y librería. Eso es. Entonces, venimos aquí, APIs y servicios y librería, que en este caso entiendo que es biblioteca, lo que al estar en inglés. Bien, esto qué viene a ser esto vienen a ser los diferentes las diferentes integraciones que nos ofrece Google para que podamos utilizarlas desde nuestro flujo de trabajo o desde cualquier petición, ¿no? Entonces, esto lo que tenemos que hacer es entrar en cada una de ellas y habilitarlas. Si os fijáis, nosotros la que vamos a utilizar ahora es la de Google Drive. Entramos en ella y como veis no viene habilitada por defecto, ¿vale? Entonces tenemos que habilitarla. Esto nos tarda nada, 30 segundos, un poquito, y automáticamente ya se quedará habilitada para siempre. Yo lo que os recomiendo es que habilitéis ya varios servicios que vayáis a utilizar en un futuro y así pues ya lo tenéis hecho, ¿vale? no tenéis que volver a acceder a esta plataforma del demonio, que la verdad yo personalmente odio bastante porque, bueno, me parece que está un poco un poco lioso todo y sobre todo si accedes las primeras veces suele ser bastante bastante problemático.
Volvemos a la documentación. Em, ahora nos dice que lo siguiente que tenemos que hacer es eh habilitar esto. Ya lo tenemos, configurar nuestra pantalla de consentimiento y para eso volvemos a librería. estando asegurado de que estemos en el proyecto correcto y desde APIs y servicios nos vamos a pantalla de consentimiento. Aquí pues simplemente seguir este procedimiento de aquí y ya estaría. Vamos a hacerlo. Venimos aquí API y servicios. Pantalla de consentimiento. Desde pantalla de consentimiento le damos a comenzar. Aquí nos pedirá información de la aplicación, la supuesta aplicación que estamos creando. Le decimos, por ejemplo, test YouTube. Aquí deberemos de darle un correo de electrónico de asistencia de usuario, un supuesto correo electrónico donde un usuario si tuviese un problema con esta aplicación nos contactaría. Aquí debemos seleccionar qué tipo de aplicación es en cuanto a cómo la vamos a poner en producción, si es solo para uso interno o para uso externo, es decir, que la puede utilizar cualquier persona, no solo gente dentro de nuestro dominio. Aquí información de contacto es donde Google enviará las notificaciones sobre el proyecto. Y una vez hemos dado a siguiente, aceptamos, continuar y crear. Sin más, esto nos tarda unos segunditos también. Bien, vamos a volver al procedimiento. Aquí nos dice que le damos a guardar sin más y que volveremos a la página principal.
Bien, lo siguiente que nos dice es que debemos de ir de nuevo a APIs y servicios y en esta ocasión debemos de seleccionar credenciales. En credenciales, como vemos aquí, bueno, no, perdonad, me he saltado un pequeño paso. Fijaos aquí en Developer Contact Information, ¿vale? En dominios autorizados, en en la sección añadir N n8N cloud, esta de aquí, o sea, lo copiáis. Esto de aquí, venimos a desarrollo de la marca nuevamente y en dominios autorizados ponemos eso de ahí, ¿vale? Guardamos. Muy importante esto de hecho. Vale, ahora sí venimos a APIs, credenciales. Le damos a crear credenciales, nos aseguramos de seleccionar ID de cliente porque es lo que vamos a utilizar ahora. En aplicación le decimos aplicación web, el nombre, ¿vale? Yo lo voy a dejar así tal cual. Y lo único que es bastante importante es esto de aquí de URLs de redireccionamiento autorizados, asegurarnos de poner la que tenemos directamente en la pantalla de inicio de sesión que es esta, ¿vale? El codback, lo copiáis y lo pegáis sin más. Vamos a darle a crear. Esto nos dará por un lado el ID de cliente, por otro lado, el secreto del cliente, ¿vale? Simplemente copiamos, pegamos aquí el client ID y por otro lado el secreto. Copiamos y pegamos aquí. Bien, con esto ya podríamos acceder en formato de testeo, ¿no? En producción, desde nuestro N8N a los servicios que tengamos habilitados de Google Cloud Console, siempre con nuestra URL, ¿vale? Con nuestro correo electrónico y nuestra URL. no podremos acceder con otros correos electrónicos a menos que los habilitemos. Bien, cerramos.
Ahora ya tenemos configurado nuestro nuestro Google Drive. Veremos que tenemos el P times, este de aquí, que básicamente es cada cuánto este trigger está inspeccionando esa carpeta para notificarnos de los cambios y dispararse. En este caso le vamos a decir cada minuto. El trigger on es la condición, ¿vale?, Vale, que en este caso sería cambios en un folder en específico. El folder es el folder donde nosotros vamos a detectar esos cambios. Así que lo que tendríamos que hacer primero que nada es crear ese folder, esa carpeta desde Google Drive. Venimos aquí. Aquí. Vale, vamos a crear la carpeta. Yo en este caso ya he creado una aquí de video rack, como veis. H, de hecho, ya tenía un corpus que de momento vamos a eliminar y deberíamos de tener una carpeta totalmente vacía, la cual vamos a seleccionar desde N8N, ¿vale? Como veis aquí, vídeo barra rag. Aquí en watch for es lo que vamos a estar vigilando, ¿vale? Que suceda dentro de esa carpeta, que en este caso sería un file created, ¿vale? Como veis, y aquí nos aseguramos de que ponga all. Aquí lo quitamos porque eso ya está por defecto.
Bien. ¿Qué ocurre? Que puede suceder que no solo se cree un archivo dentro de esa carpeta de Google Drive, sino que también se updatee, es decir, que se actualice un archivo. Y aún manteniendo el mismo nombre, queremos que ese archivo pase dentro de nuestra base de datos vectorial, porque los archivos constantemente se están actualizando. Entonces, vamos a hacer exactamente lo mismo con otro nodo que no sea archivo creado, sino que sea archivo actualizado. Bien. Y en este caso en watch for le vamos a decir file updated sin más. Perfecto.
Lo siguiente que vamos a hacer y es muy importante es por un lado definir la variable con uno de set de el tipo de archivo que estamos subiendo y por otro lado el ID de ese archivo. ¿Por qué hacemos esto del tipo de archivo y el ID del archivo? Porque nosotros debemos de evitar de cargar archivos duplicados, documentos duplicados dentro de nuestra base de datos vectorial. La forma que tenemos de evitar que esto se dé es con el ID detectando qué ID tenemos y si está duplicado dentro de nuestra base de datos lo eliminamos. Entonces, una forma muy fácil que tenemos de hacerla es de la siguiente forma.
Vamos a generar nuestro corpus, que el ejemplo que vamos a utilizar para el vídeo es que vamos a transcribir todo nuestro vídeo de YouTube, el vídeo que estáis viendo actualmente, lo vamos a pasar a un documento y automáticamente ese documento lo vamos a pasar a PDF a su vez para subirlo a nuestra base de datos vectorial y de esta forma ya lo cargamos en nuestro drive para que actúe a forma de trigger. Vamos a seleccionar un vídeo así un poco largo, por ejemplo, este de aquí. Este vídeo es para ti. Bien, si venís aquí abajo y le dais a mostrar transcripción, directamente podéis copiar todo esto de aquí manualmente, ¿vale? Hay unas formas mucho más rápido de de hacerlo, pero deberíais de registraros y tal en ciertas plataformas y ahora mismo no es la intención. Esto es bastante rápido. Copiamos. Vale, sin más hasta el final. Bien, y ya lo tendríamos.
Ahora, ¿qué vamos a hacer? Vamos a ir a Google Hm hm. Aquí Google AI Studio, que esto es como una plataforma donde ellos ponen los últimos modelos que tienen en beta en fase de desarrollo, que no nos han lanzado al gran público. Y la ventaja de esto es que están los modelos de vanguardia, los más potentes y además están de forma gratuita, ¿vale? para que los podamos utilizar y a cambio pues se los probamos, ¿no? Como si actuáramos en forma de beta testers. Esto nada, os registráis y ya está. ¿Vale? Si os registráis, ya os darán acceso. Aquí podéis seleccionar el modelo que queréis utilizar y la gracia y el por qué estamos utilizando Google Google AI Studio, aparte de que como comentábamos es gratuito, es porque tienen una ventana de contexto extremadamente grande y yo le puedo pasar una transcripción larguísima que siempre, siempre, siempre, siempre me la va a respetar y no va a alucinar ni se va a inventar nada. ¿Vale? Si esto se lo pasáramos a GPT toda esta transcripción, muy probablemente lo que pasaría es que acabaría petando y nos acabaría dando problemas. Entonces, la idea es que a nosotros a pasar esta transcripción a una base de datos vectorial podamos hacer consultas del vídeo que estáis viendo actualmente y podéis chatear para cualquier tipo de duda que que os vaya surgiendo, ¿no? Le vamos a decir, "Pásame a limpio esta transcripción. Hm. que voy a cargar en forma de corpus en una base de datos vectorial que servirá como ayudante educativo. Encárgate de sanearlo lo mejor posible, evitando información irrelevante y duplicados. también elimina las marcas de tiempo. Perfecto. Le vamos a decir que solo responde con el texto que te pido. Eso es. Vale, esto lógicamente pues tardará un poco, aparte es un modelo razonador, lo que hace que la respuesta sea un poquito más lenta, pero vaya, merece mucho la pena, sobre todo teniendo en cuenta eso, ¿no? De que es gratis, es extremadamente preciso y funciona muy bien.
Vale, como veis, ya tenemos la respuesta de nuestro modelo. Copiamos el texto. Vamos a venir a un Google Docs directamente desde Google. Iniciamos sesión, creamos un nuevo documento en blanco. A este documento en blanco le damos el nombre que sea, en este caso le voy a decir vídeo rag. y pegamos toda la transcripción saneada que acabamos de generar con nuestro modelo de lenguaje directamente de nuestro vídeo de YouTube. Una vez hacemos esto, lo siguiente que vamos a hacer es en archivo, vamos a descargarlo y lo vamos a poner en formato de PDF. Por ejemplo, este PDF lo vamos a cargar en nuestro servidor, ¿vale?, que estábamos utilizando Google Drive. Lo ponemos tal cual. Bien. Y una vez lo tengamos subido, venimos a nuestro flujo de N8N y le vamos a dar a test workflow. Veis que se nos ha disparado esta condición de aquí y ahora ya tenemos un ítem de entrada. Vamos a pinear siempre. Bien, venimos a nuestro ítem, seleccionamos en mapping manual y aquí lo primero que vamos a hacer es definir un ID, que en este caso lo voy a llamar file ID. Y el valor que va a contener este file ID en expression va a ser el [Música] siguiente. Capabilities, no. Permisos, este de aquí. Vale, perfecto. Jason ID. Bien, este ID es el referente a ese archivo en concreto, ¿vale? Y es único e irrepetible para cada archivo que exista dentro de Drive. Vamos a hacer exactamente lo mismo con el tipo de de archivo. Tipo archivo, ¿no? Tipo documento, perdonar. tipo documento, eso es archivo, ¿no? Y en tipo de archivo, veis esta variable de aquí de mim type, es exactamente eso. Como se trata de un PDF, pues es application gu o sea, barra PDF, ¿vale? Si fuese pues un CSV, pues sería barracsv y así. Listo, ya lo tenemos.
Ahora lo que vamos a hacer es con Supabase, que es la base de datos vectorial que vamos a utilizar, que en realidad es una base de datos normal, simplemente que le instalamos una extensión, un plugin que es Py vector para que funcione a forma de base de datos vectorial. Vale, lo que vamos a hacer con esta base de datos es poner un nodo que evitemos duplicados y que en caso de que existan, pues borramos aquellos duplicados para volver a cargar aquellos documentos que hayamos actualizado. Para eso venimos aquí, seleccionamos supabase. En actions le decimos delete, ¿vale? O sea, para borrar delete y necesitaremos las credenciales que vamos a ir a conseguirlas. Venimos a Google, buscamos Supabase, entramos, le damos a iniciar nuestro proyecto. Iniciamos sesión. En caso de que no estemos registrados, pues es un registro simple, sin más. Y la primera vez que iniciéis sesión os pedirán que creéis una organización, ¿vale? O sea, vosotros os aparecerá esto de aquí. Aquí le dais el nombre a la organización. Yo le voy a decir a oink tutorial sin más. En el tipo le decimos a qué se va a dedicar esta organización. Le voy a decir que es educacional. Y de momento el plan, vamos a seleccionar el plan gratuito. Nos dan un pequeño plan gratuito, ¿vale? que nos dan un hardware ciertamente limitado, pero bueno, para las pruebas que vamos a hacer y no pasar a producción es más que suficiente. Esto tarda nada, un minuto. Y como veis nos pide la password de la base de datos, que por cierto debéis de recordar porque la vamos a necesitar después en breves. Y por otro lado nos dice la región que queremos para o la más cercana para alojar este servicio o esta base de datos. En este caso me selecciona automáticamente London, pero yo he visto que Frankfurt funciona mejor. Vamos a darle a crear nuevo proyecto.
Bien, ya tenemos nuestro proyecto creado. Lo siguiente que tenemos que hacer es venir aquí a Project Settings. En project settings vamos a data API. Y en data API lo que tenemos que hacer es copiar esta URL de aquí de project URL. La copiamos tal cual. Venimos a N8N, entramos en nuestro lápiz, pegamos y aquí en el secret lo que tenemos que poner es esto de aquí. Vamos a revelar, copiar y tal cual lo pegamos. Guardamos bien. Aquí la configuración será el resource, es una columna. La operación que queremos hacer es eliminarla. Bien. Y el ID de esta de esta tabla de momento no lo tenemos, ¿vale? De esa base de datos de momento no lo tenemos. Por lo por lo que vamos a dejarlo así. En el tipo de dato, aquí le seleccionamos string y aquí en el filtro vamos a poner esta expresión, ¿vale? Que es la expresión que vamos a utilizar como filtro a la hora de eliminar aquellos que estén duplicados. Es así, tal cual. file/id em igual like y aquí le decimos el ID que para eso vamos a ejecutar el nodo anterior y así ya lo tenemos aquí perfecto. Bien. Like esto de aquí no. Ahora sí. Bien, con esta expresión, como comentábamos, lo que estamos haciendo es borrar aquellos campos que estén duplicados dentro de nuestra base de datos vectorial.
Siguiente. Lo que tenemos que hacer ahora es, por un lado, hemos descargado aquellos IDs y aquellos identificadores dentro de nuestro Google Drive y lo que tenemos que hacer es utilizar un nodo de descarga de Google Drive para transferir esa información dentro de nuestro N8N y que podamos manipularla. Para eso, eh, si buscamos dentro de el nodo de Google Drive, tenemos una opción que es downloadat. En downloadat iniciamos con nuestras credenciales de igual forma y aquí en resource igualmente debe ser file. En operation le decimos do lo do y en file que estáis viendo aquí es muy importante que seleccionemos esta opción de aquí de by id. ¿Por qué? Porque podemos o bien seleccionarlo directamente de la lista manualmente o bien que sea una variable dinámica, ¿vale? y que esto vaya cambiando constantemente mediante vayan entrando esos datos. Y si os fijáis, es muy importante que en este nodo de aquí, que ahora mismo no nos está dando ninguna salida, configuremos en settings una opción que es esta de aquí de always output data. Esto simplemente lo que hace es dejar que los datos siempre pasen de un lado a otro, aunque no exista un output data, ¿vale? aunque no exista una salida, porque no ha procesado nada, que siempre nos devuelva una salida independientemente de lo que ocurra. Bien. Em, ahora mismo nos está dando error, lógicamente, porque no tenemos la tabla creada dentro de nuestra base de datos vectorial, pero de momento lo que vamos a hacer es en settings le vamos a poner que en error continúe, ¿vale? porque de esta de esta forma nos va a dejar hacer pruebas y ya lo configuraremos más tarde cuando creemos nuestra tabla. Aquí de momento lo que voy a hacer es ponerle un pequeño tag para acordarme de que aquí hay algo que tengo que configurar más tarde. Vamos en rojo. Bien, ahora sí que sí nos entra nuestra variable de entrada de file idamente a arrastrar aquí. Bien, y con esto, como decíamos, ya sabemos que ID es el que tenemos que descargar de nuestra de nuestro Google Drive.
Venimos a propiedades y aquí en propiedades, en este de aquí de conversion le vamos a decir añadir una conversión. ¿Por qué? Porque nosotros queremos que Google Docs, que no lo detecta automáticamente, lo pasemos o le hagamos la conversión a TXT para que no tengamos ese tipo de problemas, ¿vale? de conversión de de tipo de documento. Lo siguiente que tenemos que hacer es añadir unas condiciones de de enrutamiento que se llama y esto lo hacemos con un switch. Estas condiciones de enrutamiento se dan porque, como comentábamos al principio, en función del tipo de archivo que nosotros carguemos, ¿vale?, Vale, como estáis viendo, aquí tendremos o que es PDF o que es un CSV o que es un Excel o que
Es lo que sea. Entonces, necesitamos que en función del tipo de archivo lo enviemos a un nodo para descargar esos datos o lo enviemos a otro nodo para descargar esos otros datos. Vamos a poner las condiciones. Le damos a test de momento para que nos entren los datos. Y como veis, lo primero que tenemos que hacer siempre es, bueno, en este caso no nos deja pinear porque tenemos un binario, como veis, aquí tenemos los datos de salida, pero vaya. Y como veis, podemos poner las condiciones que comentábamos. Una de ellas será pues que sea application/pdf y hm aquí en esquema en edit fields vamos a decirle el tipo de documento. Vale, ahora mismo esta condición se cumple. En rename output le vamos a decir PDF y vamos a seguir añadiendo opciones. Esto copiamos exactamente la misma variable, la pegamos. La misma variable, la misma variable. Y tendríamos PDF. Em, este lo podemos dejar para CSV, por ejemplo, o Docs. Este lo dejamos para Excel y este lo podemos dejar para Docs.
Bien, entonces aquí lo que tenemos que poner es lo siguiente. Vale, yo tengo una pequeña chuleta de cómo es la sintaxis que tenemos que poner para los diferentes tipos de documentos. Por ejemplo, para el doc sería este de aquí. Vale, lo copiáis, lo pegamos. Después para el CSV tendríamos este de aquí. Bien, pegamos tal cual y copiamos también la variable y la pegamos tal cual en Expression. Bien, y por último para Excel tendríamos este de aquí. Sí, este. Perfecto. Vale, documentos. Vamos a darle el nombre a todas las outputs. Este es doc. Este, mm CSV decíamos y este XLSX. Venga, aquí em otras opciones que podemos habilitar es una fallback output, esta de aquí por si hay algún tipo de de fallo o lo que sea. Eh, le vamos a decir que es una salida extra. Bien, perfecto.
Ahora lo siguiente que tenemos que hacer es seleccionar nuestros extractores para pasar esa información de el documento que le hayamos cargado a texto plano, porque como sabéis, lo primero que tenemos que hacer es extraer la información del formato en el que lo estemos aportando. Y hay diferentes nodos y es por eso que lo separamos de esta forma. Entonces, lo que tenemos que hacer es buscar aquí PDF. Y como veis, aquí en extract from file podéis seleccionar este de aquí, extract from PDF. Fijaos, no tenemos que hacer nada, simplemente poniendo el nodo y con esta configuración por defecto ya os debería funcionar. Y como veis, nos devuelve a la salida tanto el texto totalmente plano como diferentes datos, ¿vale?, de metadata. donde, por ejemplo, tenemos el lenguaje, tenemos el título, cosa que está muy bien, etcétera. El siguiente que vamos a poner es el de CSV. Aquí buscamos CSV, tal cual. Extract from CSV. Lo ponemos por aquí. El siguiente que vamos a poner es el de doc, que extract es este de aquí. Mm, no lo veo. Ah, vale, perdonad, es este de aquí. Sí, text file, lo quitamos y lo ponemos por aquí mismo. Bien, vamos a ordenarlos. Perfecto. Y ahora el de Excel. Extract. Extract from file. Este de aquí. Perfecto. Bien.
Esto de foldback lo que vamos a hacer es conectarlo a nuestro nodo de doc, ¿vale?, que decíamos que era este de aquí de text file, ¿vale? Vamos a ordenarlo un poco y vamos a cambiarles el nombre. A este le vamos a decir que es PDF, tal cual, a este que es doc. a este que es CSV CSV y a este que es Excel. Genial. ¿Qué ocurre? Cuando nosotros carguemos algún documento desde un Excel, lo que veremos es que se nos carga en diferentes ítems individuales totalmente separados. Entonces, debemos de poner un aggregate para juntarlos y convertirlo en un solo ítem que podamos cargar correctamente. Vale, ponemos un aggregate aquí, aquí en e aggregate le vamos a decir todos los ítems de entrada. Aquí en data lo dejamos tal cual y que nos incluya todos los campos. Vale, lo siguiente que tenemos que hacer es poner un nodo de sumar para que nos concatene todos esos datos. Aquí sumariz, ¿vale? Y le vamos a decir concatenar. Concatenar básicamente es que ponga uno detrás de otro y que lo haga ordenadamente. Le decimos que el campo es data, que es el que nos va a devolver el el nodo de aggregate y no tenemos que hacer nada más. Vale, lo dejamos así, tal cual. Y ahora sí que sí vamos a seleccionar nuestroabase vector Store. Le decimos añadir documentos a una base de datos vectorial. y conectamos todos los nodos aquí. Genial. Vamos a ponerlo así un poco ordenado. Esto un poco por aquí y por aquí. Perfecto.
Las credenciales para iniciar sesión con nuestra base de datos vectorial son exactamente las mismas que hemos hecho servir en el nodo para borrar aquellos que estén duplicados. Por lo tanto, ya lo tenemos. Lo único que no hemos creado esa base de datos vectorial, no hemos creado dentro esa base de datos. Para ello, lo único que tenemos que hacer es venir a documentación. Como siempre, en documentación nos liarán un poco al principio, pero hay una sección, si no recuerdo mal, que debería de ponernos algo así como ejemplos o quickstar, ¿no? Mira, fijaos aquí. Quickstar. Venimos aquí a Quickstar, veremos que nos referencian directamente a la documentación de Supabase con Langchain. Y lo único que tenéis que hacer es copiar esto de aquí. Lo copiáis tal cual. Venimos a Supase. En Supase venimos a SQL Editor. Pegáis el código y este código lo que va a hacer es crearnos esa base de datos, ¿vale? y con unas características determinadas instalando la extensión de vector store, ¿vale? Porque esto es lo que convierte esta base de datos normal en una base de datos vectorial. Como vemos tenemos 1536 dimensiones. Esto es bastante importante, que lo sepáis. Y aquí tenemos el nombre de la tabla. Si queremos darle otro nombre, se lo cambiamos aquí directamente y ya está. Le damos a run. Vale, yo en este caso ya tengo una tabla que se llama documents. Me está diciendo, ¿no? Error line documents. A ver, run. Vale, no sé por qué me ha lanzado el error, pero vaya, si venís aquí, veréis que ya tenéis vuestra tabla, vuestra base de datos totalmente creada con un ID, un contenido, una metadata y un embeding.
Vamos de nuevo a N8N, seleccionamos documents, que es lo que acabamos de crear. Esto lo dejamos tal cual, no hay que hacer absolutamente nada de momento. Y lo siguiente que vamos a hacer es por un lado, conectar nuestro modelo de embedings, que si recordáis es el que convertía aqu, bueno, es el que convierte el lenguaje humano o el texto escrito en números muy largos que cargábamos en una base de datos. Estos modelos de embeding, pues cada proveedor tienen sus particularidades y funcionan bien para una cosa, pero el que vamos a seleccionar de momento es el de OpenI. Es muy importante que si hemos creado una base de datos vectorial con 1536 dimensiones, que las dimensiones del modelo debet sean exactamente las mismas. Creo que el large por defecto viene con 1536, pero si venís aquí a opciones, podéis seleccionar las dimensiones directamente desde aquí. ¿Veis? 1536 sin más. Ahora aquí en document debéis de seleccionar el default data loader, este de aquí que quiero que lo entendáis como aquel que se encarga de cargar aquello que viene de los nodos previos en nuestra base de datos vectorial. Sería como el que está ahí detrás cortando y y cargando dentro, ¿vale? El que está echando arena dentro con la pala dentro de la base de datos. Vamos a seleccionar el default data loader. Bien, enfault data loader le vamos a decir que el type of data es binario, que cargue todos los datos, que automáticamente detecte el tipo de de documento que sea. Y lo siguiente que vamos a hacer es seleccionar nuestro text splitter, ¿vale? Que el text splitter es aquel que se encarga de trocear esa información, ¿vale? de trocear ese documento en aquella cantidad de caracteres o tokens que nosotros le especifiquemos. En este caso le voy a decir que es recursivo porque el recursivo siempre te mantiene una estructura mínima de palabras, oraciones, párrafos y páginas. Y aquí le decís el chung size, ¿vale? El número de caracteres, pues le vamos a decir aproximadamente 400. Y el chun overlap, como decíamos, era cuánto de el primer, o sea, cuánto del final del primer chunk se solapa con cuánto el del principio del segundo chunk. Le vamos a decir que es un 20% aproximadamente, en torno a 80. Guardamos.
Y en principio si ahora hacemos un test workflow, ¿vale?, veríamos que no sé por qué ahora mismo se ha quedado aquí. Vale, estamos cargando los datos en Jason, ¿vale? Es por eso que no nos ha funcionado. Cambiamos la configuración y ahora sí que sí debería de dejarnos cargar en nuestra base de datos. Fijaos, ha entrado dentro del splitter, el splitter ha troceado la información y automáticamente nos han aparecido 65 ítems de salida. Vamos a venir a nuestra base de datos vectorial. Y ahora, como veis, tenemos muchísimos datos aquí dentro. Tenemos el contenido, ¿vale?, el el texto de nuestro documento. Tenemos la metadata, que en la metadata pues tenemos información relativa a, por ejemplo, el tipo de dato, la línea, desde dónde va, hasta dónde va. Fijaos, este va de la 37, de la 31 a la 37, el source y el application jon que que estamos cargando. Después tenemos estos números super largos que básicamente son los vectores, ¿vale? Fijaos, un montón. Y con esto ya tenemos una base sobre la cual podemos hacer consultas, ¿vale? Y para hacer consultas debemos de configurar nuestra segunda parte que sería la parte de agente RA. Para este agente RAG, el la forma de hacer consultas vamos a intentar que sea lo más sencilla posible y vamos a seleccionar este nodo de aquí que ya seguro que conocéis que es el de enviar un mensaje directamente desde N8N. Vamos a borrar los logs. Esto lo vamos a conectar a un agente de inteligencia artificial. A este agente de inteligencia artificial le vamos a decir que es agente RAG. M. La source of pront le vamos a decir que se la definimos justo abajo. Vamos a poner algo para que no nos dé error. Y ahora vamos a enviar un mensaje. Hm. Vale, vamos a conectar el modelo porque si no se queda en error automáticamente. Siempre guardamos, borramos loss y ahora sí, probamos. Ahora sí. Bien, el chat input es este de aquí, ¿vale? Que es el user misage. Y ahora en system message le vamos a indicar cómo debe de interaccionar con esa base de datos vectorial que le vamos a conectar. Vamos a decir, eres un agente inteligente cuyo pro cuyo propósito fundamental consiste en la resolución de dudas relacionadas con una transcripción de un vídeo de YouTube contenido en una base de datos. Hm. Siempre ofreces respuestas que estén incluidas dentro de esta base de datos y jamás te inventarás información. ¿Por qué es importante que le pongamos esto de que jamás te inventarás información? Porque el problema o una de las soluciones que nos aporta este tipo de sistemas, este, estos sistemas RAG, es precisamente eso, de que podamos darle información de un dominio personalizado como puede ser una empresa y que el modelo no se invente información ni nos ofrezca información fuera de este dominio. Entonces, por eso es muy importante que lo acotemos y que le pongamos en el PROM este tipo de restricciones. Ahora le indicamos cómo se llama esta base de datos vectorial, que yo le voy a decir que se llama en base de datos y le voy a decir que es una herramienta disponible. ¿Cómo utilizar herramienta? Dos puntos. Base de datos siempre se utilizará. Hm. para toda interacción. Aquello que se encuentre fuera de esta base de datos no será respondido sin rigor. Ejemplo, usuarium. Ponemos aquí abajo usuario dos puntos. ¿Cómo configuro la API de Telegram? System información de la herramienta base de datos. Y ahora, hm, lo que le vamos a decir es lo siguiente. Hm. Excepciones, dos puntos. Usuario, dos puntos consulta fuera de la base de conocimiento. ¿Vale? Y vamos a decirle que en estos casos de fuera de la base de conocimientos le responda de la siguiente forma. System dos puntos. Lo siento, actualmente no contamos con este tipo de información en nuestra base de conocimientos. Listo, ya tendríamos un prom base que sobre el cual podemos ir trabajando, sobre el cual podemos ir refinando todo esto, pero creo que es una buena base sobre la que podemos empezar.
Genial. Em, vamos a conectar nuestro modelo de lenguaje. Como veis, ya lo tenemos configurado, pero quiero que sea el 4o, no el 4 mini de momento. Vamos a ver si es esta versión. Genial, me funciona. Le vamos a conectar la tool, que es donde tenemos que seleccionar la base de datos vectorial, que en este caso existe una tool en concreto, que es esta de aquí. Ah, esto lo borras Santi, que es esta de aquí, ¿vale? de aquí abajo. Y esto sirve para, como indica su nombre, e hacerle preguntas y chatear con una base de datos vectorial, pero también debemos de conectar por un lado la base de datos vectorial de Supabase y por otro lado un modelo. Aquí dentro le vamos a decir que se llama, como le hemos indicado, base de datos. Base de datos. Le damos una pequeña descripción, como por ejemplo consulta aquí para todo lo relativo a consultas de usuarios. Como veis, este es el límite de Chunks que recuperará como contexto, pero vaya, lo vamos a dejar en cuatro de momento. Conectamos un modelo. Yo como siempre conecto el de Openi. Dejamos el 4 mini. Aquí está bien. Y vamos a buscar Supabase, que está aquí. Perfecto. Aquí en Supabase le decimos que recupere documentos para una base de datos vectorial para un agente. Vale, esta opción que nos viene por defecto. Aquí ya hemos iniciado sesión, en teoría ya lo tenemos de la otra del otro nodo de carga. Y en el table name seleccionamos nuestra tabla, ¿vale? Aquí en metadata filter podríamos filtrar por metadata si asociamos una metadata al corpus que cargamos, pero de momento no quiero hacerlo demasiado complejo. Bien, ahora debemos de seleccionar un modelo de embeding. ¿Por qué debemos de seleccionar un modelo de embeding? Porque aquí abajo, como veis, estamos traduciendo de lenguaje a vectores y aquí debemos traducir de vectores a lenguaje, debemos de hacer lo contrario. Bien, es por eso que tenemos otro modelo de embeding aquí y es muy importante que las dimensiones de todos los modelos de embeding, de la base de datos y de todo coincidan porque si no tenemos discrepancias y se lía. Seleccionamos aquí, guardamos de nuevo y vamos a hacer una consulta a ver qué tal. Em, cómo configuro, configuro la API de Telegram. Vale, nos dice que hay un error y es seguramente porque exactamente este modelo actualmente no está disponible. Entonces, vamos a seleccionar por ejemplo por ejemplo este de aquí, el cuatro. Guardamos ahora bien, accede a nuestra base de datos vectorial y nos dice información de la herramienta base de datos. Vamos a ver por qué ha ocurrido esto. Volvemos a nuestros logs. Aquí abajo vemos que accede a nuestra base de datos vectorial, que la output de nuestra base de datos vectorial es esta de aquí, que esto simplemente es toda la metadata. Venimos a nuestros embedings y aquí sí que deberíamos tener todos los embeddings de la respuesta. Bien, tenemos la query, tenemos la respuesta. Bien, información de la herramienta base de datos. Bien, vamos a ver, vamos a volver. Vale, lo siento, actualmente no tengo esta información en nuestra base de conocimientos. No ha accedido, lógicamente, porque la ha descategorizado la pregunta. Le voy a decir, por ejemplo, qué diferencia hay entre N8N Cloud y eh local. Lo siento, actualmente no contamos con información sobre esto en nuestra base de conocimientos. Bien, vamos a preguntarle cómo instalo la API de Telegram. Y de nuevo nos vuelve a decir esto, ¿vale? Aquí ponemos match documents, como decíamos, y lo último que tenemos que hacer es poner una memoria, pero en este caso ya nos vamos a dejar de la memoria simple esta de aquí y vamos a instalar algo un poquito más profesionalizado para tener una memoria remanente a largo plazo, trazable, que podamos tener todos los logs, todas las interacciones y que además sea muy escalable. Selectoramos esta de aquí de Postgress, que podemos integrar directamente en nuestra base de datos vectorial, ¿vale? Con suabase y simplemente le damos al lápiz. Para esto, estas configuraciones de aquí o estas credenciales de aquí, venimos a Supabase directamente. Aquí veréis que si le damos a conectar arriba junto con nuestro proyecto tenemos una sección que es transaction puller. Y en transaction puller le damos a mostrar parámetros. en mostrar parámetros. Copiamos el host, lo pegamos aquí, ¿vale? Copiamos el puerto, lo pegamos allí también, que yo en mi caso, eh, vale, no nos lo solicita necesariamente el puerto, como veis. Y por último, copiamos eh eh el usuario. También veis, tenemos el usuario, la password y el host. Y la password es exactamente la que habíamos puesto anteriormente cuando nos hemos registrado y hemos creado el proyecto y que os decía que debíamos de memorizar, ¿vale? porque nos la pedirían más tarde. Aquí la tenéis. Aquí no tenéis que hacer nada más si queréis poner el ID del usuario, aunque en principio ya viene configurado por defecto aquí, como veis, y ya nos creará él mismo esa base de datos dentro de su pabe. Vamos a verlo. Si yo ahora le pregunto cómo instalo la API de Telegram a nuestro agente RAG, veremos que accede a nuestra memoria. En nuestra memoria accede posteriormente a la base de datos vectorial y por último accede a nuestro modelo de lenguaje. Vamos a ver. Porque en teoría esto si actualizamos, esperamos un poco, ¿vale? Como veis ahora si venimos a el historial de chats, nos ha creado automáticamente esta base de datos, ¿vale? Gracias a el nodo este de Postgress. Y esto nos volcará todas las interacciones y todas las preguntas que le hagamos a este agente estará relacionada con nuestra base de datos vectorial, ¿vale?, Vale, que tenemos toda esta información. Entonces, si le decimos cosas como hm qué día hará mañana, ¿no? Una pregunta que esté fuera del dominio, que lógicamente no nos puede responder. Como veis, nos dice que actualmente no tiene ese tipo de información. solo nos puede responder con información relacionada con el vídeo enriquecida en caso de que nosotros se lo solicitemos, ¿no? Como por ejemplo, ¿qué diferencia hay entre N8N Cloud y local? Accede a nuestra base de datos. El modelo lo procesa, lo vuelve a procesar por parte del modelo de la gente y como vemos nos ofrece toda esta respuesta. Bien, e nos había quedado pendiente algo aquí en Supabase y era precisamente el hecho de seleccionar la tabla en la que debíamos de eliminar aquellos duplicados, como veis aquí. ¿Vale? Si nosotros lo ponemos así, le damos a test, ¿vale? Documents metadata, bien, debemos de seleccionamos en documents, le damos a test. nos dice que documents meta y eso es porque esto está mal. Esto es metadata. Metadata. Metadata. Aquí. Ahora sí. ¿Veis? Ahora todo aquello que esté duplicado en nuestra base de datos, automáticamente lo debería eliminar. Y nada, esto sería un flujo de N8N algo más profesionalizado, algo con más sentido en el mundo real, dejándonos un poco de ese tipo de flujos que realmente son muy naí y que creo que son ciertamente vulnerables porque no comprenden todas las casuísticas. Y creo que este flujo os va a aportar un valor bestial porque tenéis la posibilidad de cargar todo tipo de documentos estos vectorizarlos y hacer con ellos las aplicaciones que os podáis llegar a imaginar. Em, existen otras bases de datos vectoriales, como comentábamos, yo recomiendo muchísimo Cudrant. En lo personal me gusta más. Sin embargo, no está mal Supabase para aplicaciones pequeñitas que tampoco requieran muchísima, muchísima carga en cuanto a cantidad de documentos.
Perfecto. Todo lo que debéis saber de Webhooks en N8N. Lo primero que tenemos que abordar es qué es un webhook en esencia. Un webhook en N8N es un disparador que inicia un flujo. Como sabéis, los flujos son secuencias lógicas que se van dando de forma consecutiva, cuyo propósito o objetivo es automatizar una tarea que nosotros realizamos de forma rutinaria. Bien, cuando nosotros realizamos esta petición a través de un webhook, lo que estamos haciendo es conectar sistemas en tiempo real, sistemas que aparentemente no podrían conectarse de forma intuitiva. Por ejemplo, imaginaos que tenéis una aplicación externa, como sería una pasarela de pago como Stripe, formularios externos como Typeeform y que cuando este formulario se rellene, cuando un usuario nuevo se registre o cuando recibáis un nuevo pago, automáticamente vuestro N8N, vuestra programación se dispare enviando los datos requeridos para que funcione correctamente. Eso es todo lo que tenéis que saber en esencia de lo que se encarga esta herramienta.
Historia y contexto breve de los webhooks. Los webhooks no es nada nuevo, no es algo particular de N8N, es algo muy estandarizado en la industria, en la programación en general y lleva existiendo entre nosotros desde hace muchísimos años. Como comentábamos anteriormente, se utiliza en gran cantidad de servicios como los que veis aquí, GitHub, Zapier, N8N, Make, todas las herramientas Low Code que os podéis llegar a imaginar. están integrados los webhooks y la gracia es que son mucho más ligeros y rápidos que los convencionales o los sistemas que se utilizaban anteriormente que se hacía conocer como polling, que básicamente es realizar consultas de forma repetida hasta que se diese evento. Recordad que comentábamos que cuando alguien se registraba automáticamente enviábamos esa señal a N8N justo en ese preciso instante y tan solo hacíamos esa solicitud. Sin embargo, si estamos hablando de polling, lo que estamos haciendo es constantemente preguntarle, ¿se ha registrado alguien? ¿Se ha registrado alguien? ¿Se ha registrado alguien? Tengo un nuevo pago, "Tengo un nuevo pago." Eso generaba saturación y era un sistema extremadamente ineficiente, sobre todo cuando estamos hablando de tiempo real.
Vamos a hablar de cómo se compone la URL de un webhook, ¿de acuerdo? Porque ahora pasaremos a la parte práctica donde veremos todo esto en NN. Pero antes quiero que tengamos claro cómo esta URL está jerarquizada y cómo cada una de sus partes tiene una función en concreto. Quiero que imaginéis el dominio, ¿vale?, como estáis viendo aquí, que sería Ailink Application N8N Cloud, como la dirección de casa, ¿vale? Es como decir, ¿a qué edificio voy? Que es el lugar de internet. Vale, esto sería como lo más genérico. Después tendríamos la ruta base. La ruta base quiero que lo imaginemos como la puerta del edificio. Tenemos el edificio y la ruta es la puerta. Y el paz único sería pues como la habitación directamente, ¿no?, que ya vamos mucho más a lo concreto y dentro de esa entrada es donde tendríamos el lugar específico que es donde llegamos y los query parameters que es la solicitud que nosotros estamos haciendo a través de ese webhook, serían como las instrucciones o una nota pegada con un postit que tendríamos justo en esa puerta. Es una analogía que creo que ayuda mucho al entendimiento. Esto cuando lo veáis en funcionamiento veréis que es sersencillo.
Em, en todo esto, en los métodos HTTP, ¿vale?, que http todo funciona gracias a esto. Es un protocolo que utilizamos de cliente servidor. Básicamente todo en la red funciona gracias a esto. Todas las comunicaciones de cliente servidor funcionan gracias a esto y es básicamente como se dan las comunicaciones entre diferentes ordenadores. Para que os hagáis una idea aquellos que no están familiarizados con esto. Estos métodos HTTP se utilizan también en los WHbooks, ya que está acuñado bajo este mismo protocolo. y tendríamos el método get, que se utiliza para la consulta, el método post para enviar datos y después tendríamos otros métodos como el put, patch, etcétera. Pero a la hora de la verdad, prácticamente cuando vais a desarrollar aplicaciones en el día a día, vais a utilizar get y post y poco más, aplicaciones muy raras, al menos en mi caso vais a utilizar otras cosas. Seguimos.
Después, e cuando estamos hablando de webhooks, como estamos llamando a una puerta, como estamos yendo a un edificio, como estamos entrando en una ruta muy concreta, no podemos dejar eso a libre alberdrío para que cualquier persona pueda llamar a nuestra puerta, entrar a nuestra casa y desatar esa acción que se tiene que dar ahí dentro. Entonces, debemos de reforzarlo gracias a la autenticación. La autenticación es básicamente para protegernos, como indica su nombre, de ataques externos. proteger datos sensibles y sobre todo evitar sobrecargas del sistema como los ataques de dos que hacen peticiones masivas. Existen diferentes tipos de autenticación como el basic authentication, header authentication, etcétera. ¿Vale? Esto simplemente quiero que entendáis que son diferentes formas de entender y diferentes formas de estandarizar estos protocolos, pero que en esencia todos ellos cumplen el mismo propósito, que es reforzar la seguridad.
Y ahora vamos a ir a la parte práctica directamente. Nos vamos a dejar de teoría, no quiero tampoco abrumaros y vamos directamente a N8N. Bien, pues en N8N supongo que todos conocemos ya el nodo como tal. Simplemente lo que tenemos que hacer es seleccionarlo desde el simbolito de más. Como veis, directamente se nos pone como un trigger, no puede darse de otra forma dentro de N8N este nodo. Y nosotros cuando lo abrimos, lo que nos encontramos por un lado es la URL de pruebas, como veis aquí, y después tendríamos la URL de producción. Estas se diferencian, como indica su nombre, en que una está indicada para hacer pruebas cuando estamos haciendo testeos de nuestra aplicación y la otra ya es cuando la pasamos a producción, que ya pues buscaríamos esa robustez del día a día. Como veis aquí y como comentábamos antes, tenemos los métodos get e delete, head, patch, post, put. En el día a día vais a utilizar eh get y post, poco más. Tenemos el path, ¿vale? Que esto sería como la ubicación exacta, la puerta que comentábamos antes y que es única e irrepetible, ¿vale? Esto se hace para que no hayan dos webhooks con el mismo nombre. Entonces yo esta a este path le puedo llamar link eh YouTube, por ejemplo, para hacer las pruebas. Y como veis, automáticamente en mi URL esto ha cambiado. Como comentábamos, la URL estaba jerarquizada de una cierta forma. Y aquí lo que estaríamos cambiando es el path. ¿Veis la parte final? Después tendríamos la autenticación donde podemos seleccionar diferentes opciones y tendríamos la opción de responder, que esto lo vamos a ver justo después. Os he preparado una pequeña demo interactiva para que podamos hacer pruebas y podamos ver cómo esto funciona en el día a día, ¿vale? Cómo llamamos desde este front, desde esta página web, a nuestro flujo de N8N gracias a esa URL. Y lo primero que vamos a hacer es con el método get y directamente con esta URL de prueba hacer una petición. Vale, vamos a ponerlo en test directamente. Desde aquí lo pegamos. Bien. Eh, debéis de tener muy en cuenta que si el método que hemos configurado en el flujo es get, debe coincidir siempre con el que tenemos configurado en nuestra aplicación. ¿Vale? Si yo ahora le diese a enviar el Webhook, lógicamente me daría un error porque hay una una discrepancia. Vamos a ponerlo en get y veréis que ahora funciona correctamente. Solicitud exitosa. La respuesta que nos devuelve este webhook es la siguiente. Misage Workhook. El workflow ha empezado y aquí, como veis, nos da detalles de la solicitud, ¿vale? Con el método que hemos empleado, la URL y sin body.
Ahora vamos a ver qué es esto del body. Vamos a nuestro flujo de N8N y como vemos lo que nos devuelve son los headers donde tenemos toda la información de nuestro navegador. Como veis, esto sería el host que sería la nuestro N8N. Tenemos datos acerca de nuestro navegador, tenemos que hemos utilizado en el body application Jason, tenemos una serie de información que es ciertamente interesante y que en función de la aplicación podríamos llegarle a encontrar utilidad. Por otro lado, tenemos los parámetros y la query, ¿vale? Los query parámeters, que posteriormente vamos a ver que qué hacen estos. Como veis, están totalmente vacíos de momento. Y por otro lado tenemos en Execation, en execution mode test. Esto vamos ahora a cambiarlo y vamos a hacer una prueba para que veáis cómo funciona esto de la sintaxis en las URLs. Nosotros si ahora pusiésemos eh interrogante YouTube igual a Aink, lo que le estaría diciendo aquí en Jason es en clave valor esto de aquí. Ahora lo veréis. Enviar al webhook. Perdonad que no lo he puesto en producción. Ahora sí, enviar. Veis que nos devuelve la misma respuesta, pero en esta ocasión si nos vamos a la query tenemos que YouTube eink, ¿vale? Si nos venimos aquí al Jason lo veremos de forma mucho más clara aquí en table, perdonar. YouTube Ailink. ¿Veis? Aquí esto ha viajado en la URL, es decir, lo que hemos hecho está directamente implícito en la propia URL, ¿vale? Esto podrían ser datos de la petición y que podrían ser relativos a lo que nosotros le estamos solicitando a ese flujo, ¿vale? relativos a lo que nosotros necesitaríamos justo en ese momento. Imaginad que yo ahora en este flujo de trabajo pongo un condicionante como podría ser un if, y le digo que si el valor de YouTube it's equal a Aink, ¿vale? En este caso, ¿cómo será? True, pues que llame a la gente, ¿no? Bien, vamos a hacerlo aquí de prueba. Aquí le ponemos algo así. testimonial y en el chat modelo de open directamente y ya está. Hacemos save, lo ponemos en test y volvemos a hacer una petición. Como veis, como nosotros tenemos en true la condición de que el query parámeter sea ese en concreto, hemos activado esta rama de aquí. De lo contrario, imaginad que nosotros ahora lo cambiamos y no le llamamos Ailink, sino que le llamamos ilong, ¿no? La versión la versión falsa de de Aink, pues veríamos, vamos a ponerlo en test, que en este caso como es false la condición, no tenemos esta condición de aquí, pues no lo activaríamos a nuestro agente. Como veis, es la idea de esto, ¿vale? es es la esencia, es el el objetivo de todo esto.
Bien, también decir que no es necesario que nosotros utilicemos el programa este interactivo para poder interaccionar, ¿no?, con nuestros webhooks. Lo podríamos hacer directamente con esta URL, ¿vale? Vamos a ponerlo en producción y pegándola directamente en nuestro navegador. Como veis, nos devuelve esto de aquí, ¿vale? De que nuestro flujo ha empezado, que ha arrancado y automáticamente nos ha disparado el flujo, ¿vale? exactamente igual que estábamos haciendo con la aplicación, simplemente era para que para que lo vieseis un poco más claro. Entonces, vamos a hacer lo mismo desde el navegador. Si os fijáis, copio, pego aquí mismo y aquí le digo em interrogante. Ah, bueno, podríamos hacer exactamente lo mismo desde el navegador. Y como veis aquí puedo [ __ ] y aquí, ¿no? Aquí pego y pongo YouTube igual Aink, ¿no? En este caso no lo tenía en test, ahora sí. Y vamos a resetear. Como veis, ha ocurrido exactamente lo mismo que estábamos haciendo con nuestra aplicación. ¿Vale? ¿Qué más podemos hacer? Podemos hacer que haya múltiples queries dentro de esa URL, es decir, que no haya una sola query, sino que, por ejemplo, en la query parámeter que yo quiero añadir ahora sea YouTube 2 = eink 3. Vamos a ponerlo en en test, ¿veis? Y si venimos ahora a querer tenemos tanto Aink como Aink 3. Tenemos dos query parámetres. Aquí podríamos concatenar tantos como nosotros quisiéramos, ¿no? E más cosas que podemos hacer, por ejemplo, es generar espacios dentro de este texto que tenemos nosotros aquí. Y esto lo podemos hacer gracias a esta sintaxis de aquí, que sería 20%. O sea, porcentaje 20, más bien. Vamos a ponerlo en prueba. Y ahora veréis que justo detrás del tres deberíamos de tener un espacio. Veis aquí que hay un pequeño espacio? Esto nos puede venir muy bien, sobre todo cuando no queremos reprocesar estos datos, ¿no? Y queremos tenerlos pues mucho más saneados ya directamente.
Em, bien. Ahora me gustaría que viésemos algo que es superinesante y es que automáticamente este webhook nos responda de una forma determinada. Este, de momento vamos a eliminarlo. Para esto lo que tenemos que hacer es en esta sección de aquí de respond podemos cambiarlo y decirle que nos responda cuando el último nodo se haya ejecutado, es decir, cuando el flujo haya terminado su secuencia o que por otro lado nos responda utilizando un nodo de respond to webhook, que sería una forma muy específica y creo que la más elegante de hacerlo. Vamos a hacerlo de momento con el de respond to webhook, que yo creo que es el que más vamos a utilizar en el día a día. Y lo que estábamos viendo ahora es que automáticamente cuando nosotros llamábamos a este webhook, esto se disparaba, ¿vale? Y era instantáneo, pero ahora vais a ver que no es tan así. Vamos a ponerlo utilizando el este nodo de aquí. Esto ahora nos habilita un nuevo nodo, que es este de aquí, respond to webhook. Y en este respond to webhook, nosotros podemos hacer que responda de múltiples formas, ¿no? Una de ellas sería que responda con todos los elementos de entrada que tenemos aquí, todos los ítems que tenemos aquí. Em, otra sería responder con el binario, que sería una ristra de ceros y unos que, bueno, que sería una ristra de datos numéricos que, bueno, no tiene ningún tipo de valor en cuanto información, ¿no? Esto sería para casos muy específicos. Después tendríamos la opción de el first eh, bueno, el primer elemento de entrada básicamente que sería en caso de que tengamos muchísimos elementos de entrada, muchísimos ítems, seleccionar solo el primero y pasar solo el primero. Lo podemos ver si queréis para que lo veamos directamente en nuestra URL. Esto lo copiamos, lo pegamos aquí tal cual. Y como vemos nos devuelve el primer ítem, ¿vale?, que sería el de headers. Esto es una forma muy rápida de testear nuestros webhooks y darnos cuenta de si funcionan correctamente. Como veis, esto sería el output, que es lo que hemos enviado nosotros a esta página que tengo aquí abierta, ¿vale? Esta página de mi de mi navegador, eh, bien, no a esta, perdona, esta es la que tenía antes, esta la cerramos. Bien.
Em, este de aquí, el de respond with custom Jason, sería el más interesante, ¿vale? porque aquí lo que podemos hacer es customizar con variables, con datos variables, la respuesta que nosotros le vamos a dar a esa a esa a esa petición, ¿no?, de de esa de esa URL. Entonces, aquí, por ejemplo, lo que podríamos hacer es ponerle Alink, ¿vale? Vamos a darle a test eh test workflow y aquí automáticamente nos va a responder con esto de aquí, ¿vale? Recordar que esto es Jason. Vale, que es una un que es Java Object Notation, que es una forma o una sintaxis particular de tratar la información, ¿vale? De comunicar aplicaciones entre sí y es muy extendido, se utiliza universalmente para este tipo de aplicaciones. Y como veis aquí pues tenemos esta respuesta. ¿Por qué es tan interesante esto? Pues podría ser muy interesante, por ejemplo, vamos a poner un ejemplo así que sea eh chulo de ver. Em, imaginad que nosotros tenemos una variable de entrada, que es cuando un usuario se da de alta en un CRM y lo que queremos hacer es enviar un correo electrónico automáticamente, pero que sea un correo electrónico personalizado. Entonces, lo que podríamos hacer, por ejemplo, es poner un agente de inteligencia artificial conectado a el nodo de webhook de entrada y al de salida. Y en este caso, como nosotros de entrada en la URL, en los query parameters teníamos e ALink, ahora vamos a hacer el ejemplo de que vamos a hacerlo con mi nombre directamente. Em, vamos a decirle nombre, va nombre igual a Agustín. Ahora lo ahora lo arrancamos, ¿eh? Hm, perdonad que esto le ponemos teste aquí y el chat móvil le ponemos el de Open directamente. Bien. Bien, esto lógicamente, como comentábamos, este webhook se ha desatado. Ahora tendríamos todos estos parámetros de entrada y en estos parámetros de entrada tengo un ítem que es el de Agustín, ¿vale? Entonces, yo le podría pedir, por ejemplo, que crea una historia personalizada acerca de dos puntos. mi nombre, eh, asegúrate de que sea muy breve y no más de 100 caracteres, ¿vale? Por ejemplo, no vamos a hacer un test a ver qué nos devuelve. Bien, como veis, de salida nos ha dicho que Agustín encontró un viejo mapa en el ático y se embarcó una aventura inesperada. Y ahora con este ítem de salida, que sería la historia personalizada, imaginad que no es una historia, que es un correo electrónico, podría automáticamente enviar la respuesta con este tag dinámico, que un segundo vamos a ponerlo en expression porque si no no acaba de funcionar bien, a nuestro webhook. Aquí veis, vamos a hacer la prueba. Ponemos test y lo hacemos. ¿Veis? Myfield, esto lo podríamos llamar historia. Agustín encontró un viejo mapa que lo llevó a un tesoro escondido en el bosque y su aventura apenas comenzaba, ¿no? Un ejemplo.
¿Por qué también puede llegar a ser muy interesante esto? Imaginad que nosotros tenemos el código HTML de una página web. Vamos a poner el ejemplo de una página web muy simple que tengo aquí preparado. Y en esta página web tenemos datos dinámicos, como es exactamente el ejemplo que estamos poniendo. Y lo que queremos hacer es precisamente devolver esa respuesta, ¿no? Em, para eso, perdonad porque ahora lo estaba haciendo yo mal. Lo que tendríamos que hacer es en texto, ¿vale? en responder directamente contexto, contexto plano. Pegamos nuestro código HTML y aquí ponemos el tag con nuestro nombre, que el tag con nuestro nombre sería ah. Bueno, podemos hacerlo. Bueno, no vamos a hacerlo bien. Iba a decirlo con la historia, pero pero no, vamos a hacerlo con el tag de nuestro nombre. Mi nombre sería Agustín. aquí. Vale, vamos a eliminar el agente porque ahora no nos haría falta. Guardamos. Hm hmm. Le damos a test y como veis automáticamente con ese HTML nos ha generado el interfaz de esta página web. vamos a llamarla y con un tag variable que sería el de mi nombre. ¿Vale? Imaginad que un usuario quiere tener pues un enlace particular para una aplicación particular, por ejemplo, un registro de una aplicación o una pasarela de pago o lo que sea y nosotros queremos que tengamos pues esos variables o esos tags variables dentro de esta interfaz, ¿no?, que es lo realmente interesante de todo esto. Pues esto de aquí nos lo permitiría. Yo, por ejemplo, ahora lo que podría hacer aquí es en vez de poner Agustín, podría poner Alberto y vamos a copiarlo porque tenemos que poner en producción, bueno, en prueba más bien. Veríamos que nos cambia automáticamente Alberto. ¿Veis? Directamente. Y esto estamos hablando todo el rato del método get, ¿vale? Si nosotros ahora lo cambiamos al método post, veréis que vosotros no podéis acceder directamente desde esa URL. Vale, vamos a ponerlo en test. ¿Veis? Código 404. Este webhom no está registrado para las peticiones GET. Em, ¿estás seguro de que no quieres hacerlo con un con un método post? No. Y vamos a ver por qué ocurre esto. Hasta ahora habíamos visto los query parameters, ¿vale? que son los parámetros de consulta que viajan dentro de la URL, pero no habíamos visto los parámetros del body, del cuerpo, del mensaje, que esto no serían que viajan dentro de la URL, sino que viajan aparte, vamos a decir, y es información que está codificada en Jason y esto viaja entre las dos aplicaciones. Vamos a verlo directamente con el front que hemos preparado para el ejemplo. Y como veis aquí, ahora tenemos esto que comentábamos del body. Bien. Si nosotros pegamos la URL y le damos a enviar el webhook, el webhook, ahora sí, veis, automáticamente nos envía esta respuesta de que el flujo ha comenzado exactamente igual que como veíamos en el método get, pero ahora no lo tenemos en
Los query parameters, que no sé si recordáis que lo teníamos aquí arriba, sino que lo tenemos en el body, lo tenemos en el cuerpo, donde ya podemos enviar grandes volúmenes de información, salvando las distancias, pero ya podemos enviar más información y ahora no está explícita en la URL, ¿vale? No está directamente visible en lo que nosotros utilizamos como acceso a este webhook.
Entonces, em imaginad durante un instante, ¿vale?, Vale, que por ejemplo queréis registrar un nuevo usuario en una base de datos, imaginad que esto es un registro y que en este caso este usuario, como veníamos diciendo antes, se llama Alberto, por ejemplo, ¿no? Alberto, perdonad, y que Alberto pues tiene otra serie de parámetros que son relevantes, ¿no? para darlo de alta en la base de datos, como podría ser, vamos a decir que edad. La edad en este caso, vamos a decir que son 25 años. 25 años. Aquí faltaría una coma y ya está. Vamos a dejarlo así de momento. Ahora no solo enviaríamos el nombre, sino que también estaríamos enviando la edad de Alberto. Y si venimos aquí, vemos que tenemos tanto Alberto como 25 años. Esto directamente podríamos ponerlo en un Google Sheets. Hm. Eh, vamos a decir en open Roba directamente. A ver si tengo alguno que esté vacío, porque esto lo tengo de de pruebas y seguramente tengo alguno así que esté sin utilizar. Hm hm hm. Pues mira, justamente este lo estoy lo estoy utilizando, pero vaya, los borro bien y directamente ponemos en ID el nombre del usuario y en edad, ¿vale?, lo ponemos en en el nombre. Bien, vamos a ir a nuestro Google Sheets. Bien, vamos a modificarlo. Aquí le pondré nombre y aquí le vamos a poner edad. Todo lo demás lo borramos. Ahora mismo no recuerdo para qué estuve utilizando este Excel. Seguramente algún experimento raro. Em, vamos a darle a refrescar porque ahora debe volver a indexar lo que serían estas columnas y lo volvemos a poner. Vale, vamos a darle a testear. Y como veis, ya nos lo ha volcado, ¿no? Que esto no tiene nada nada de sorprendente, es lo que venimos haciendo siempre. Pero como veis, hemos registrado el la entrada más bien de un nuevo usuario en un CRM, porque en definitiva lo que estáis viendo aquí no es muy distinto de un CRM, sino que simplemente pues estaría desgranado, ¿no? Lo estáis viendo tal cual, o sea, estáis viendo las entrañas. Imaginad que no es solo un usuario, sino que son varios usuarios o que de hecho hay más parámetros. Y podríamos hacer exactamente lo mismo, porque como sabéis podemos hacer tanto arrays, podemos hacer tanto tantos usuarios como nosotros queramos, podemos añadir tantos parámetros, tantos claves valor como nosotros queramos y podemos hacer todo aquello que nosotros necesitemos para esa aplicación en concreto. Y la gracia de todo esto y la esencia, ¿vale?, sería que no necesariamente teniéndolo todo en N8N podemos aprovechar todas las arquitecturas preexistentes como pueden ser sistemas de escraeo, como pueden ser CRMs que veníamos comentando antes, como pueden ser todas las aplicaciones que veis aquí dentro y que aunque no lo parezcan son exactamente webs con la única diferencia que simplemente ya vienen preconfigurados por parte de N8N. Entonces, esto es como eh la pegatina o lo que engancha lo potente con lo que nos permite customizar eso potente ya existente. Y eso es lo verdaderamente increíble de este tipo de de arquitecturas o de tecnologías o del como lo queráis llamar, ¿no? Porque de nuevo, imaginad que yo ahora con estos datos de entrada los proceso con un agente de inteligencia artificial. Digo, extrae insights de este tipo de usuario, por ejemplo, datos demográficos. Imaginad que Alberto se llama Alberto, tiene 25 años, es de Barcelona y además hemos recopilado sus gustos. Esto lo podemos pasar por un nuevo de inteligencia artificial, extraer insightes y considerar qué tipo de perfil tiene este cliente para sea cual sea nuestra intención, ¿vale? No no no estoy aquí para para descifrar posibles aplicaciones concretas, pero como veis em es extremadamente poderoso. Yo lo que os recomiendo es que testeéis, que probéis, que juguéis. Al final es como vais a aprender, que desarrolléis cosas como la que estáis viendo aquí. Esto lo he hecho prácticamente en 10 minutos con Replit. Replit es una aplicación de estas de coding que se llaman ahora, que simplemente con lenguaje natural a través de un de un prompt, perdonad, puedes e crear este tipo de interfaces interactivas, ¿no? Estos fronts que la verdad que son sorprendentes.
Otra cosa que quisiera que viéramos, que me parece que es muy interesante que tengáis en cuenta y es que en todos los nodos, ahora ya no os hablo de los webhooks como tal, vosotros cuando le dais aquí añadir opciones, normalmente tenéis cosas que no os vienen por defecto y que muchas veces son muy útiles. En este caso, en concreto de los Webhooks, una que tiene cierto sentido utilizar, sobre todo por temas de seguridad, sería esta de ignore boots, ¿vale? que sería para protegernos ante determinados ataques. Después, otra bastante interesante que quiero que tengáis en cuenta es esta de aquí de código de respuesta. Cada uno de los códigos que estáis viendo aquí, esto obedece a un estándar y cada uno de ellos significa algo. Como veis, el número 200 es que la solicitud se ha procesado correctamente. Em, la 204 se ha procesado, pero no hay retorno de ningún tipo de contenido. Y así, pues, como veis, con todas estas que estamos viendo aquí. Eso sería un poco todo. ¿Vale? Seguramente que podríamos comentar acerca de esto durante horas. Sin embargo, os digo que para hacer dinero, que al final es para lo que está enfocado este tipo de aplicaciones, para que les podamos sacar potencial y para que podamos hacer que tengamos muchísimo más tiempo y ser muchísimo más libres, ya os aseguro que muy probablemente no vais a utilizar todas las que estáis viendo.
En este caso vamos a utilizar Railway porque considero que para iniciarnos es una de las formas más sencillas y que nos van a causar menos fricción, sobre todo para que empecemos a familiarizarnos con este tipo de arquitecturas. Y además vamos a aprovechar para introducir los nodos comunitarios, introduciendo uno de los más importantes según mi punto de vista que es el de Evolution Appi. Evolution App nos permite integrar WhatsApp directamente en N8N de una forma muy sencilla y saltándonos todas las restricciones y toda la burocracia asociada a hacerlo directamente con Meta for Developers, cosa que no recomendamos para pasar a producción, lógicamente en aplicaciones grandes. Pero si estáis probando o sois una tienda pequeña o vais a ofrecerlo a un cliente que no tiene muchísimas interacciones, pues lógicamente que Evolution Appi puede ser una solución de primera línea.
Lo primero que tenemos que hacer es registrarnos en Railway. Y una vez nos registramos lo que veremos es que tenemos la opción de crear un nuevo proyecto. En este proyecto veremos que tenemos diferentes plantillas aquí en esta sección y entre ellas veréis que una de las primeras que os aparecen es la de N8N. La seleccionamos y le decimos deploy. Vale, esto lo que hará es pasarlo directamente a producción para que podamos acceder directamente desde una URL a nuestro N8N en local supuestamente en un VPS, que en este caso pues sería un VPS que nos proporciona Railway, que por cierto Railway tiene diferentes planes, ¿vale? Uno de ellos, el más económico son $5 mensuales, si no recuerdo mal. Y este nos ofrece un hardware que, bueno, es limitado, pero para hacer eso, nuestras primeras pruebas creo que es más que suficiente.
Bien, para Evolution Appi deberéis de acceder a través de esta URL que estáis viendo aquí, ¿vale?, Vale, que es una plantilla que directamente ha publicado alguien y que me ha parecido que está muy bien porque ya nos configura todas las variables de entorno. Tenemos acceso directamente desde una URL para que podamos configurarlo en nuestro N8N sin ningún tipo de problema. Y lo único que vamos a hacer de igual forma es darle a deploy y nuevamente le volvemos a dar. Esto empezará, tardará un rato, lógicamente. Aquí, como vemos, si accedemos a cada una de las partes que componen a esta plantilla, una sería Redis, que es una memoria más rápida, ¿vale? que esta se utiliza para sobre todo temas de registros de usuarios, IDs e verificaciones, todo este tipo de de cosas que requiere un acceso muy rápido. Mientras que Postgress sería más para toda la parte de memoria a largo plazo, de flujos, autenticaciones, etcétera. Vale, como sabéis, N8N nos viene con SQLite por defecto. Seculite es muy limitada, no estaría recomendada para la mayoría de de casos, así que en esta imagen ya directamente nos la sustituyen por postgres. Después tenemos el primary de N8N y el worker. Un worker es básicamente una forma de paralelizar ese proceso en N8N y que podamos tramitar una mayor cantidad de solicitudes por unidad de tiempo. Vamos a verir a nuestro primary y una vez está en el deployment successful este de aquí, veremos que podemos acceder directamente a través de esta URL. Eh, esto nos requiere un registro convencional. Iniciamos con nuestras credenciales. Bueno, el típico formulario que vamos a ignorar. Y ahora ya estamos dentro de nuestra versión de N8N hospedada en nuestro VPS. Aquí veréis que exactamente igual que como teníamos en la versión Cloud, pues tenemos todas estas configuraciones que ya hemos visto en profundidad. Sin embargo, ahora ya no tenemos el adminel, ¿vale? Que esto es algo que es exclusivo de de la versión cloud, ¿vale? Porque son configuraciones relativas a lo que serían versiones, relativas a lo que serían mantenimiento, que ya nos proporciona directamente por parte en este caso, de N8N. No tenemos tampoco el tema de las ejecuciones directamente ya nos lo proporcionan ellos también, o sea, está todo integrado dentro del VPS y podemos hacer tantas ejecuciones como queramos, no está limitado.
Bien, vamos a ir a los tres puntitos estos de aquí a settings. Y en settings veremos que tenemos una opción aquí abajo que es nodos comunitarios. En nodos comunitarios vamos a darle a instalar y veremos que podemos instalar paquetes npm aquí. Esto, si nosotros venimos a Brow, veremos que tenemos más de 1000 paquetes de nodos comunitarios, ¿vale? Nodos comunitarios que son verdaderamente increíbles muchos de ellos y entre ellos uno de los más curiosos, como decíamos está el evolution API. Vamos a acceder a este y lo único que tendremos que hacer para configurar Evolution API como un nodo comunitario dentro de nuestra instancia de N8N es pegar esto aquí tal que así. Vale, decimos stunt. Esperamos nada, un minuto, no suele tardar demasiado. Y una vez termine, ya veremos que si accedemos a nuestro panel de N8N en cualquier proyecto que creemos y buscamos ese nodo comunitario que acabamos de instalar, podremos seleccionarlo y directamente ya podremos configurar lo que sea con este nodo de aquí.
Bien, vamos a irnos a la otra instancia que estábamos creando, Devolution Appi. Vamos a acceder a ella. Lo que vamos a hacer es iniciar con esta URL. Vamos a acceder al panel de manager. Aquí nos solicita la APIC Global, que esto lo encontraremos en las variables de entorno dentro de nuestra instancia de Evolution Appi. Para eso venimos a Evolution Appi, dentro de Railway. Seleccionamos esto de aquí, este nodito de aquí. Vamos a variables y en variables vemos que tenemos una de authentication API key. La copiamos, volvemos, pegamos y login. Bien, una vez hemos accedido, ya estaríamos como en nuestro panel de administrador. Vamos a darle a instancia para crear una nueva instancia. Le damos un nombre, decir evolution test. El channel le vamos a dejar este de aquí. Y el number de momento no vamos a poner nada. Esto de igual forma es importante que lo tengamos a mano. Guardamos.
Bien, ahora lo que tendríamos que hacer es por un lado, con esto de aquí, con esta ruedecita de aquí, le vamos a dar a get QR code. Este código QR deberemos de escanearlo con nuestro número de teléfono de de WhatsApp, ¿vale? Eso es sencillo. Cuando queremos acceder a WhatsApp web, vamos a ajustes dentro de nuestro WhatsApp, dispositivos vinculados, debemos de darle a vincular dispositivo. Si tenemos más de cuatro dispositivos vinculados, nos dará error, ¿vale? O sea, es como el límite. Y lo que vamos a hacer es simplemente pues eso, escanear ese código QR, ¿vale?, que es lo que estoy haciendo yo ahora mismo. Lo escaneamos. Esto tarda nada, muy poco, unos segunditos, no hará nada. Se quedará así tal cual. Diréis, "Hostia, me ha funcionado." Sí, os ha funcionado. Esperáis eso unos segunditos a que acabe de configurarse. Cerramos. Y ahora, como veis, se han sincronizado nuestros contactos, los chats que tenemos y la cantidad de mensajes que tenemos. Y por lo tanto, como vemos, ya se ha, digamos que vinculado correctamente nuestro número de teléfono. Debéis de pensar que Evolution AppI lo que hace es que utiliza este servidor web como intermediario entre nuestro número de teléfono y los nodos de N8N, ¿vale? hace así como una pequeña triquiñuela para que podamos tener esta posibilidad de hacer una integración mucho más rápida y sencilla.
Vamos a volver eh a nuestro flujo y aquí para configurar nuestro nodo Devolution API lo que tenemos que hacer por un lado es acceder al nodo. En credencial le decimos crear nueva credencial y como veis nos pide la URL del servidor y por otro lado nos pide la API Key. La API Key la copiamos directamente de aquí, la pegamos y la URL del servidor la podemos encontrar directamente en nuestro railway, ¿vale? Simplemente debemos de copiar esto de aquí, control C tal cual y lo pegamos, ¿vale? Una vez le damos a save, veremos que no sé, ahora nos ha dado error. Vale, bueno, aquí falta el https este de aquí. Vale, recordad no copiarlo de ahí directamente porque si no nos pondrá el HTTP. Copiamos y ahora sí. Bien, se nos pondrá de color verde. Esto es buena señal, ya lo sabéis. Ahora ya estamos conectados a nuestro Evolution API, ¿vale? ya estaríamos conectado con nuestras credenciales. Como veis, tenemos diferentes recursos, que esto sería pues el medio que vamos a utilizar para las acciones. En este caso, lo que nosotros queremos hacer es enviar un mensaje, enviar texto y el nombre de la instancia sería la instancia que nosotros tenemos aquí dentro, ¿vale? Que sería la de Evolution Test. Después deberíamos de configurar el número de teléfono del destinatario y por otro lado el mensaje que podemos poner directamente como expresión. ¿Vale? Si yo ahora pongo esto aquí, aquí pongo el número del destinatario y automáticamente debería de enviar ese mensaje. Bien, esto lógicamente lo veréis censurado, tanto el número del destinatario como toda esta sección de aquí, pero para que veáis que ya estamos chateando directamente desde nuestro nodo Devolution Appi. Esto lo ponemos en Expression, la parte de mensaje y automáticamente podremos enviar mensajes desde nuestro nodo sin ningún tipo de problema.
Bien, ¿qué ocurre? que nosotros para recibir mensajes, ahora ya los estamos enviando, debemos de hacer una pequeña triquiñuela, ya que Evolution Appi no cuenta con un nodo de trigger por defecto. Para esto deberemos de utilizar un nodo de webhook. Lo seleccionamos. Eh, podemos probar directamente en test o en producción, ya si queréis, si os notáis confiados, yo lo voy a hacer directamente en producción. Configuramos el método HTTP como post. En este caso, aquí podríamos cambiarle el path. Yo le voy a decir evolution barra test. Autenticación, nada. Y vamos a copiar la URL. Lo conectamos con nuestro nodo de respuesta. Guardamos. Volvemos a Evolution Manager. En Evolution Manager vamos a Webhook. Y dentro de Webhook deberíamos de pegar nuestro nuestra URL de webhook, ¿vale? donde tenemos nuestro N8N configurado. Aquí, como veis, en eventos debemos de habilitar aquellos eventos que queremos que nuestro webhook sea notificado o que dispare a nuestro webhook, que en este caso sería Misage Upser. Este de aquí lo habilitamos, guardamos y ahora todo lo que nos llegue a nuestro número de teléfono debería de llegarnos a nuestro flujo de trabajo. Vamos a darle en producción y le voy a decir a un amigo que tengo por aquí me envío un momento un mensaje. Y por cierto, recordad de habilitar aquí arriba esta opción si no el webhook no lo considera. Vale, volvemos a ponerlo de Misage Absert aquí. Guardamos.
Bien, ahora bien. Como veis, ya se nos ha disparado aquí una ejecución con un ítem, que es el ítem de entrada que nos ha llegado. Lógicamente no lo voy a abrir porque se nos liquearía tanto mi número de teléfono como el número de teléfono de mi de mi amigo, ¿vale? Y en este caso no me apetece estar censurando 20,000 sitios distintos, pero para que veáis que es sers sencillo que hagamos este tipo de integraciones, ¿vale? sobre todo para, digamos que aplicaciones más de uso personal a pequeña escala o pequeños negocios que no van a tener una gran cantidad de peticiones y que no nos podemos llegar a meter en problemas legales serios, ¿no? Con esto bien, em vamos a aprovechar para hacer una integración interesante. Vamos a crear, por ejemplo, un agente de inteligencia artificial que nos gestione lo que serían todo nuestro calendario y que además cuente con una pequeña base de datos a través de la cual le podamos hacer consultas a través de WhatsApp. preguntándole, por ejemplo, por el stock de una tienda. Para esto, como hemos visto a lo largo de todo el curso, lo ideal es que utilicemos lógicas secuenciales, aunque los agentes en este tipo de casos pueden llegar a funcionarnos relativamente bien y es lo que os quiero enseñar. En esta ocasión vamos a decirle que vamos a poner abajo el prom del usuario. Cambiamos de momento el webhook para hacer pruebas. Ponemos un trigger de chat, después lo cambiaremos, ¿vale? por el de Evolution Appi, pero de momento para hacer pruebas quiero que sea así y así no tengo que estar constantemente censurando toda la parte de de los números de teléfono.
Bien, aquí vamos a poner algo para que no nos dé error. Ponemos nuestro nodo de openi. Tened en cuenta que como ahora estáis en una nueva instancia, no tenéis configurado nada, ni las API Keys que teníais anteriormente, ni nada de vuestro Google Cloud Console, ni nada que hemos hecho durante el curso, entonces es muy importante que volváis a introducir esas credenciales, que por cierto ya las tenéis creadas, simplemente es introducirlas. Entonces yo voy a hacerlo. Nueva credencial, me vengo a PIS de Open y lo pegamos por aquí sin más. Vale, vamos a dejar el cuatro mini, ya me parece bien. Cambiamos el nombre. Agente calendario rename. Vale, el session ID se lo pasamos. Vale. Hm hm hm. Y vamos a darle el system misage. De momento vamos a conectar las herramientas, que en este caso, como decíamos, vamos a conectarle el calendario. Calendar por un lado, el de crear evento porque queremos crear eventos directamente en el calendario. Y por otro lado vamos a también conectar el la operación de recuperar, ¿vale? para preguntarle directamente a nuestra gente qué eventos tenemos para un día determinado. ¿Vale? Esto puede ser interesante. Lógicamente, tal y como hicimos con Google Drive, debemos de iniciar sesión con nuestras credenciales. Y recordad que ahora el callback ha cambiado porque ya no estamos en nuestro N8N Cloud, ahora estamos en otra instancia que es nuestro N8N en Railway. Es por eso que tanto el N8N. cloud que ponemos en dominios autorizados como el callback, la URL de redireccionamiento, debemos de cambiarlas. Vale, vamos a hacerlo.
Bien, estamos en nuestro Google Cloud. Yo, por ejemplo, estoy en este de test aing en este proyecto. Venimos a APIs y servicios. Vamos a ir a pantallas de consentimiento. Si no recuerdo mal, aquí podíamos cambiar las URLs de redireccionamiento. Y esto lo podemos hacer directamente desde desarrollo de la marca. Aquí, como veis, en dominios autorizados debemos de cambiar este dominio aquí, ¿vale? O o agregar otro directamente. Vamos a ir a nuestro N8N en Railway. Y si os fijáis, el dominio que teníamos en nuestro N8N en versión cloud era el siguiente, para que veáis la diferencia, eh, con con la versión en Railway. Fijaos, veis, tenéis alink.n8n.cloud home workflows. Vale, vamos a compararlo con lo que tenemos en Railway. Aquí tenemos primary production, no sé que no sé cuántos punrailway. Vale, entonces es esto lo que tenemos que copiar y poner en nuestro Google Cloud Console. Lo ponemos aquí. Guardamos. Vale, perfecto. Ahora venimos de nuevo aquí. Vamos a APIs y servicios. Credenciales. Crear credenciales. ID de cliente. Tipo de aplicación. Una aplicación web exactamente igual que hemos hecho antes. Aquí le podéis dar el nombre que queráis. Y en URL de redireccionamiento vamos a darle la que tenemos. Mm hm. Hm. Aquí está de aquí. Bien, creamos, copiamos la ID de cliente. Pegamos, copiamos el secreto, pegamos. Iniciamos sesión con una cuenta que tenga acceso. Vale, veremos que nos sale una ventana emergente. Esto nada, simplemente le decís seleccionar todo, continuar y connection successful, ¿vale? O sea, todo correcto. Perfecto. Ahora ya tenemos acceso a nuestro Google Calendar directamente desde nuestra instancia local, ¿vale? De N8N. Y para comprobar que esto sea así, vamos a ver. Vale, fijaos, esto es algo que os puede pasar. Fijaos que nos dice que la API de Google Calendar no la hemos habilitado para este proyecto. Esto ocurre porque no sé si recordáis que nosotros desde biblioteca, si venimos a Google Cloud Console y vamos a biblioteca en APIs y servicios, no habíamos llegado a habilitar esto de Google Calendar, si no recuerdo mal. Fijaos, veis, lo vamos a habilitar. Perfecto, como veis, ya lo tenemos totalmente habilitado. Venimos de nuevo a N8N y ahora en principio, como veis, sí que nos aparece el calendario asociado a este correo electrónico y el event ID, ¿vale? Que esto ahora veremos de qué trata. Vamos a conectar ambas herramientas, les vamos a dar un nombre. A esta, por ejemplo, les voy a le voy a decir crear eventos. Y a esta otra le voy a decir recuperar eventos. Perfecto. Las dejamos por aquí. Guardamos.
Vamos a nuestro Google Calendar. Vale, fijaos que esto sería nuestro Google Calendar por por defecto. No tenemos nada. Esto es una cuenta que está totalmente virgen en esto. Vamos a de nuevo a N8N. Vamos a cerrar esto de aquí que no tengamos tantas cosas. Perfecto. Y lo primero que vamos a hacer es crear un nuevo evento, ¿vale? Seleccionamos el calendario donde queremos hacer los cambios, exactamente igual, cuando queremos que sea el inicio de ese evento, ¿vale? ¿Veis? Now, y el final de ese evento. Es decir, cuando nosotros llamemos a esta herramienta, lo que va a ocurrir es que siempre lo va a programar con esta marca de aquí. ¿Veis? Y esta marca lo que hace es definir la fecha actual. Sin más, esto nosotros no queremos que sea así, ¿vale? Aquí veis que hace una operación para que sea una hora más sin más. Y esto del default reminders es para que configuremos los recordatorios por defecto dentro de nuestro Google Calendar, ¿vale? La configuración. Aquí, como veis, tenemos diferentes configuraciones adicionales como invitados, si queremos que sea todo el día, el color, ¿vale? incluso del evento, la descripción, el ID, la localización, el máximo número de invitados, la frecuencia, enviar eh updates, actualizaciones, un resumen, visibilidad, bueno, una serie de configuraciones que nos pueden servir para ciertos casos de de uso, pero nosotros lo que queremos hacer es que cuando le solicitemos a este agente de aquí que queremos agendar con Agustín, que imaginad que Agustín tiene un pequeño negocio, un negocio informático y vende pues ordenadores y también los arregla y queremos saber si podemos agendar con él en caso de que haya disponibilidad pues que podamos agendar un día a una hora determinada dentro de una franja. Entonces vamos a decirle aquí eres un agente h especialista en gestionar un negocio de comercio electrónico. Electrónico. Sí, gestionas tanto la parte relacionada con eh las citas de clientes en calendario y como mm consultas relacionadas con stock de productos de la tienda. Bien, vamos a ponerlo un poquito grande, ¿vale? Que a mí me gusta verlo así. ¿Qué le podemos decir? Le podemos decir que tienes primero le vamos a decir las herramientas que tiene disponible. Tienes las siguientes herramientas disponibles dos puntos. Una era hm crear evento y la otra era recuperar evento, si no recuerdo mal, ¿verdad? Vamos a verlo. Crear eventos y recuperar eventos en plural. Eventos y eventos. Bien. Tareas. Cuando un cliente te solicite reservar cita para reparar un PC o cualquier cuestión relacionada con el comercio, lo primero que deberás solicitar será su nombre. Hm. El día que quiere realizar la cita y por último la hora. Bien. Después, hm, siempre ofreces disponibilidades en y en caso de que no existan, ofreces alternativas. para agendar. Empleas empleas la herramienta la herramienta crear barra baja eventos y para hm ver o comprobar disponibilidad empleas recuperar eventos. Perfecto. Hmm hmm hmm hmm. En principio con esto debería de tener suficiente, aunque fijaos que aquí hay un problema que seguramente ya estéis viendo. Ese problema es que ahora mismo la gente está totalmente perdido porque no sabe ni la hora que es, ni el minuto que es, ni nada de eso. Es por eso que debemos de especificarle la marca de tiempo, ¿vale? Esto lo podemos hacer tanto en el PROM como en el en System Misage. Realmente no creo que haya demasiada diferencia, al menos yo no he podido verla, pero yo ahora mismo lo voy a hacer directamente en el prom. Vo a decir la hora o la fecha actual es y aquí le decimos now. Perfecto, vamos a probarlo. Guardamos aquí en crear evento nos faltará definir esto de aquí del inicio y el final. Para eso lo que vamos a hacer es borrarlo, lógicamente le vamos a dar a que lo define automáticamente el modelo y en descripción le vamos a dar una breve descripción de qué queremos que haga exactamente con la fecha de inicio y con la fecha del final. Aquí será el inicio de la franja solicitada por el usuario para la cita con el servicio técnico. El final siempre queremos que sea una hora, ¿vale? porque vamos a suponer que todas las franjas de cita que nosotros agendamos por defecto serán de una hora. Y con esto, en principio deberíamos de tener suficiente, aunque me gustaría darle también una franja de disponibilidad que sea la siguiente. La franja de disponibilidad del negocio es de lunes a viernes de 09 00 a 17 00. No se agenda agendarán citas más allá de las 16. Perfecto, vamos a probarlo aquí. Le vamos a quitar el pequeño error. Este ahora lo seguiremos configurando. Hola. Como vemos, de momento no ha accedido a nuestro nodo de de crear evento, lógicamente. Hola, ¿en qué puedo ayudarte? Si deseas reservar cita para reparar un PC o cualquier otra cuestión relacionada con el comercio, por favor, indícame tu nombre, el día que deseas hacer la cita y la hora. Mi nombre es Agustín. El día me gustaría que fuese mañana. ¿Por qué he dicho mañana? Pues porque es ambiguo. La inteligencia artificial tiene muchos problemas a la hora de interpretar este tipo de expresiones como mañana, pasado, de aquí dos días, la semana que viene. No son cosas raras porque no son precisas y esto es muy contextual y los seres humanos pues lo entendemos muy bien porque estamos muy habituados a eso, pero las máquinas suelen tener problemas para esto y es por eso que va muy bien que lo pongamos a prueba con este tipo de expresiones. Me gustaría que fuese mañana a las 10, bueno, a las 14 va. a las 14. ¿Ves? Aquí nos ha dicho tu nombre, el día que deseas realizar la cita y estamos viendo que por algún motivo no ha accedido a la herramienta. Como veis, le he dicho, "Mi nombre es Agustín, el día me gustaría que fuese mañana a las 14 y como veis no ha accedido a la herramienta." ¿Por qué ocurre esto? Pues lógicamente ocurre porque como no tenemos memoria contextual, ¿vale?, va totalmente perdido porque no sabe que hemos hablado con él en la interacción pasada. Le ponemos la memoria, guardamos y ahora veréis que si le vuelvo a preguntar lo mismo, ¿vale? Vamos a decirle así algo un poco aleatorio. Nos vuelve a pedir los mismos datos. Y ahora sí, copiamos, los pegamos aquí directamente. Fijaos, aquí estamos viendo una cosa y es que no está accediendo correctamente a la herramienta. Esto es algo que puede pasar y que os pasará muchísimo. Y lo primero que suelo hacer yo cuando ocurren este tipo de problemas es cambiar por un lado el modelo. Aquí tenemos el 4o mini. Vamos a ponerle el 4o directamente este de aquí que suele ser un poquito más avanzado. Guardamos y vamos a volver a intentarlo. Vale, parece que estás enviando un código repetidamente. Si deseas agendar una cita o necesitas ayuda con algo en específico, estás enviando un código repetidamente. Vale, perdonad porque tenía el session ID como chat input, lógicamente no nos iba a funcionar. Ahora sí, vamos a guardar. Volvemos. Vale, ha hecho lo que tiene que hacer, que es intentar recuperar el evento, pero como no lo tenemos configurado, veis, nos dice que hubo un error al intentar verificar la disponibilidad para agendar la cita. Y, sin embargo, si tienes alguna preferencia en específico, pues nos da una respuesta así un poco tal. Vamos a aprovechar para configurar directamente este nodo y así ya lo dejamos totalmente hecho. Esto para acabar de configurarlo, simplemente vamos a cambiar el resource, le ponemos que es el calendar, ¿vale? Y en calendar la operación le decimos disponibilidad. Aquí en start time lo vamos a quitar el now y le vamos a dar aquí para ponerle una pequeña descripción de disponible. Bueno, recupera información relacionada con la disponibilidad solicitada por el usuario. Vale, esto lo vamos a poner así de igual forma. Hm. Vale, eliminamos, guardamos y lo vamos a volver a intentar.
Vamos a volver a intentarlo. [Música] Hm. Hola. Vale, perfecto. Aquí le vamos a decir que lo queremos tal cual como lo hemos dicho antes. Accede para recuperar disponibilidad. Creamos el evento. Bien, nos dice que lo ha hecho satisfactoriamente y vamos a comprobarlo. Se lo hemos solicitado exactamente mañana, o sea, aquí. Vale, y como veis, automáticamente nos lo ha generado. Esto es una prueba que he hecho antes porque, como veréis aquí en crear evento, por algún motivo e la fecha de finalización no te permite poner esa expresión, ya que por lo que parece no lo entiende o no acaba de portarse bien con lo que sería nuestro Google Calendar. ¿Vale? Entonces, bueno, así parece que funciona correctamente. Ahora, imaginad que lo que queremos es que en el evento, lógicamente, nos aparezca un título relacionado con el nombre del usuario, por decir algo, y que en todos los detalles de ese evento nos aparezca, por un lado lo que le hemos pedido, ¿no?, que sería el la hora a la que quiere que vengamos y ciertos detalles adicionales como por ejemplo pues el el problema que tiene, ¿no?, en en su en su ordenador o la vería que tiene o lo que sea o el motivo de la consulta en general. Lo que podemos hacer es en crear eventos añadimos un nuevo cambio, un nuevo campo que sea sumari. Este campo le damos igualmente a que lo defina automáticamente el modelo y aquí le decimos motivo. Bueno, de momento no lo hemos no le vamos a especificar el motivo porque no se lo solicitamos al usuario, pero por ejemplo nombre del cliente, ¿vale? Y eh eh eh en descripción le vamos a decir nombre y otros datos como motivo de la cita. Venga, vamos a pedir la la el motivo de la cita también en el prom aquí directamente. Y como veis, siempre que ofreces posibilidades y por último la hora el motivo de la cita y por último la hora. Bien, ahora sí guardamos. Vamos a decirle, "Hola, ¿en qué puedo ayudarte hoy?" Le voy a decir que quiero pues eso, ¿no? Agendar cita para reparar mi PC. Nos pide el nombre, el día y la hora a la que queremos acudir. Vale, vamos a decirle el nombre. Agustín. Agustín. el día mañana y la hora 16 para reparar tu PC. Vale. Vale, nos dice que lo ha programado correctamente, sin embargo, no me ha dado la información que le estoy pidiendo. El día que quiero la cita, el motivo de la cita y por último la hora. Vale. Y aquí le voy a poner que es indispensable. que solicites todos los datos requeridos para poder agendar siempre. Vamos a volver a intentarlo. Eliminamos. Vamos a decirle esto. Hola. Me gustaría agendar cita. Vale, nombre, el día que me gustaría agendar la cita, el motivo de la cita y la hora a la que prefiero acudir. Mi nombre es Agustín mañana. El motivo, mi PC está roto, no funciona la hora a las 16. Vale, recupera disponibilidad y nos crea el evento. Vale, cita para Agustín, reparación de PC. El PC está roto, no funciona. Perfecto. Vamos a ir a la parte de verificar disponibilidad, ¿vale? En recuperar eventos y vamos a ver cómo lo podemos solucionar esto de aquí. Como vemos, nos devuelve que ciertamente hay disponibilidad en el momento que le estamos consultando. Aquí recuperamos información relacionada con la disponibilidad solicitada por el usuario. Y hm hmm esto no le vamos a decir absolutamente nada. Esto en principio ya estaría bien. Venimos a el agente nuevamente. Hm hm hm. Vale, solo agendarás agendarás con crear eventos si existe disponibilidad en la fecha consultada por el usuario. En caso de que no. No será posible realizar una reserva. Bien, vamos a probar de nuevo.
Vale, como veis, nos dice que no hay disponibilidad porque ahora sí que hemos acotado bien el prom y si queremos realizar una reserva, pues debemos de ofrecerle otra alternativa de otro horario o otro día. Perfecto. Ahora imaginad que queremos conectar una base de datos donde tengamos, por ejemplo, la disponibilidad de estoaje de un determinado producto. Esto lo podemos hacer con Google Sheets, como hemos estado viendo, con una base de datos vectorial también, como lo hemos visto anteriormente. Y bueno, de hecho, vamos a dejarlo con dos nodos. Uno de ellos lo vamos a indicar para crear y el otro lo vamos a indicar solo para consultar. Realmente los usuarios no deberían de crear nada en nuestra base de datos, pero quiero que veáis un caso en el que un agente puede servirnos para interactuar con una base de datos, incluso creando y no solo a nivel de consulta. Damos acceso como hacemos siempre, nos dice que la conexión se ha realizado correctamente. Aquí podremos seleccionar como siempre nuestros documentos. Vale, vamos a ir a Google Sheets, iniciamos sesión, creamos una nueva hoja de cálculo que se puede llamar pues stock barra bajenda. Aquí vamos a crear dos columnas, como por ejemplo nombre, producto y la otra precio y la otra cantidad. Venga, vamos a ponerlo así un poco más complicado. Perfecto, lo ponemos en negrita centrado, que me gusta más. Y vamos a inventarnos unos nombres del laptop. Laptop. El precio son $50 y la cantidad son dos. MAC M4. El precio son $2,300 y la cantidad son tres. Y cargador de cargador de iPhone, pues $ y la cantidad es uno.
Bien, vamos a N8N nuevamente. Vamos a este nodo de aquí, por ejemplo. A este le vamos a llamar, este es el de get, es decir, el de recuperar. Hm hm hm. Y a este vamos a decirle entonces que o cree opate una nueva fila. Vamos a darle un nombre. Hm hm hm crear productos. Le damos el nombre, el Vale, Vale, ahora ya nos da la opción. Ya sabéis que esto tarda un poco. Hm hm hm. Vale, como veis, de nuevo nos vuelve a dar el pequeño error este de que no lo hemos activado en nuestro Google Cloud Console. Vamos a hacerlo. Venimos a la biblioteca Hug Sheets App, le damos a habilitar y cuando pasen unos segundos ya lo tendremos totalmente disponible. [Música] Bien, por aquí lo tenemos. Aquí en mapear las columnas le vamos a decir que lo haga manualmente. Las columnas to match on es la que va a utilizar, por ejemplo, cuando tenemos un ID que debemos de actualizar y tiene que ser siempre sobre ese ID en concreto, ¿vale? Para que haga esa correspondencia. Pero en este caso lo que queremos hacer siempre no es updatear, sino que es crear, ¿vale? Y por lo tanto vamos a cambiarlo eso aquí en expression vamos a ponerlo a definir automáticamente por el modelo y le vamos a decir nombre definido por el usuario o dueño de la tienda. nombre del producto, ¿vale? el precio precio del producto y la cantidad la cantidad del producto. Vale, esto ya lo tendríamos y ahora vamos a hacer exactamente lo mismo con recuperar mm productos. Seleccionamos stop tienda de igual forma la hoja número uno y aquí lo podemos dejar tal cual.
Vale, vamos a modificar nuestro prom para añadir estas dos nuevas herramientas y le vamos a decir que tenemos recuperar productos. Crear productos. Bien, vamos a indicarle cómo tiene que utilizarlas. En caso de que el usuario o dueño tengan una consulta relacionada con el precio barra disponibilidad de un producto determinado, ofrecerás información o alternativas. Por ejemplo, user dos puntos. ¿Cuánto vale el nuevo Mac system? Si te refieres a el Mac M4, el precio es de X. ¿Vale? Y por otro lado, hm hm hm, vamos a decirle el nombre de la herramienta para esta acción. empleas recuperar productos. En caso de que el usuario quiera crear un nuevo artículo dentro de la base de datos, le solicitarás siempre los siguientes datos antes de realizar cualquier acción. Nombre del producto. Vamos a ponerlo así. Nombre producto. Nombre del producto. Así. Mm. Precio y número de artículos. Perfecto. Hm. Vale. Y ahora le vamos a decir que para esto emplearás la herramienta crear barra baj productos. Perfecto. Lógicamente que este prom se puede mejorar muchísimo. Lo estamos haciendo aquí en directo de una forma superrápida. Y quiero que no os vayáis con la idea de que crear productos en una base de datos y más por parte de clientes es una buena práctica. Lógicamente que no lo es. Esto simplemente lo estamos haciendo para demostrar las posibilidades y las capacidades que tienen este tipo de sistemas, ¿vale? Esta funcionalidad si la quitásemos estaríamos haciéndole un bien a esta aplicación. Sin embargo, quiero que veáis lo que podemos llegar a hacer. Vamos a darle a guardar y le vamos a decir borrando todos los logs, hola. Hola, ¿en qué puedo ayudarte hoy? Si necesitas agendar una cita o tienes una consulta sobre productos, estaré encantado de asistirte. Sí, sí. Me gustaría saber si disponéis de mmeración. Vale, recupera el producto. Vamos a ver si nos ofrece una buena respuesta. Y nos dice, "Sí, tenemos disponible el Mac M4 que es de última generación. El precio es de 2,300 € y contamos con tres unidades en stock. Bien, quiero modificar el número de unidades de este Mac. Para modificar el número de unidades del Mac M4, necesites que me indiques el número de artículos que deseas establecer. Por favor, proporcióname esta información. Vamos a decirle OC. El número de max en stock es de CCO actualmente. Vamos a ver. Ahora accede a crear producto. He actualizado a cinco unidades. Y si veis aquí, pues tal cual nos pone que la cantidad es cinco. Bien, perfecto.
Vale, pues esto sería un poco las capacidades que tenemos con este tipo de de sistemas. Lógicamente, esto se puede hacer, como decíamos, muchísimo mejor. No soy muy partidario de los agentes. Si pusiésemos exactamente el mismo sistema, pero secuencial, como lo hemos ido viendo a lo largo de todo el curso, estoy seguro de que nos funcionaría algo más consistente. Y además quiero hablaros de otra cosa y es que cuando nosotros asociamos muchísimas herramientas a un mismo modelo, a un mismo agente de inteligencia artificial, lo que acaba ocurriendo es que tiende en mayor medida a las alucinaciones y tiende a equivocarse con mayor probabilidad. Entonces, quiero introduciros un nuevo concepto, que es el concepto de MCP, algo de lo que se está hablando muchísimo y que me gustaría desmitificar. Es una tecnología que la verdad que tiene una un potencial increíble, una tecnología que es
verdaderamente revolucionaria, pero que sin embargo creo que se encuentra unas fases muy primar muy primigéenias, no está lo suficientemente desarrollada como para hablar de ello en un contexto de producción real.
Esta tecnología de MCP Protocol básicamente consiste en que todas las comunicaciones que estamos haciendo convencionalmente con sistemas externos como podrían ser Google Sheets, como podría ser Google Calendar, como podría ser todos los que estáis viendo aquí y que definíamos unas determinadas acciones bajo un determinado protocolo que era el protocolo HTTP. Ahora lo que hacemos es que creamos una capa intermedia que es la capa de MCP Protocol que se encarga de que todas esas comunicaciones, todas esas acciones se estandaricen bajo un mismo funcionamiento que es totalmente homogéneo.
Esto que nos permite, nos permite, por un lado, tener agentes muchísimo más flexibles que puedan realizar una cantidad de acciones ilimitadas dentro de las posibilidades de ese servicio y que por otro lado tengamos la posibilidad de vincular una cantidad de herramientas inferior.
¿Cómo hacemos esto desde N8N? Pues de forma muy sencilla, N8N hasta hace poco no tenía esta posibilidad de forma nativa, pero ahora en una de sus últimas versiones ya nos instalaron esto de MCP Client Tool. Lo seleccionamos. ¿Veis? Actúa a forma de herramienta, exactamente igual que cualquier otro nodo que conectemos, cualquier otro nodo de acción. Y como vemos debemos de darle el end point. Para darle el end point tenemos que crear otro flujo de trabajo en nuestro misma instancia de N8N. Por lo tanto, yo voy a abrir otro N8N por aquí. Creamos un Wordflow y debemos de poner un MCP server trigger, ¿vale? Este server trigger modalidades, una de producción y otra de trest. Para eso seleccionamos la URL de lo que queramos hacer, ¿vale? En este caso, yo quiero probarlo en producción, ¿vale? La copiamos, la pegamos y ahora mismo cuando le demos a save veremos que ya tenemos totalmente configurado siempre y cuando pasemos a producción, ¿vale? Porque como decíamos esto en producción.
Bien, y ahora lo que podríamos hacer es que todos estos eventos que tenemos por aquí los podemos conectar directamente en nuestra herramienta de MCP Server Trigger. como podrían ser estos dos de crear eventos y recuperar eventos. Veis que aquí no estamos haciendo nada y que en vez de tener dos nodos o cuatro nodos o seis nodos, los que sean, tan solo tenemos uno conectado, ¿vale? Y aquí podemos decirle que se llama gestión barra baja calendario. Le cambiamos el nombre, vamos a cambiar el prom. Mm. Tienes las siguientes herramientas disponibles y será simplemente gestión barra baja calendario. Con esta herramienta creas eventos, pero antes consultas disponibilidades. Vale, lo he hecho así super rápido. A ver si funciona para hacer la demo. Vamos a darle a save. Vamos a decirle hola. Bien. Hola. ¿En qué puedo asistirte hoy? Me gustaría realizar una cita. Agendar más bien. Me gustaría agendar una cita. Bien. Hm. Me gustaría agendar a las 16 del hm día del día 23 de mayo. Y como veis accede a nuestro gestión calendario. Esto llama a este subworkflow si venimos a ejecuciones y veremos que ha recuperado el evento. ¿Ves? Está disponible para agendar cita. Ahora nos pide el nombre y el motivo de la cita. Vamos a decirle el nombre Agustín y motivo de la cita, reparar el PC. Vamos a ejecuciones. Recordar para ver las ejecuciones siempre desde esta ventana de aquí porque lo tenemos en producción. Crea el evento. Vamos a ir a el día 23. Vale, nos ha creado el evento. Como veis, la hora está mal. Y esto seguramente sea porque aquí en este en este canvas de aquí, si me voy a settings, como veis, la hora que tengo es la de Nueva York, ¿vale? Tendría que poner mi hora local y automáticamente ya nos pondría la hora correctamente.
Perfecto. La gracia de este tipo de MCP server trigger es que exactamente igual que he hecho con este agente, yo podría tener todos estos nodos ya creados, ¿vale? como productizados para no tener que hacerlos constantemente siempre que me soliciten una nueva, digamos, un nuevo proyecto. Y automáticamente cuando un cliente me solicita un proyecto que ya lleva la parte de agendar con calendario, pues yo sé que con esta herramienta de aquí de gestión de calendario ya voy a llamar a mi NCP server trigger, que siempre va a hacer lo mismo y que siempre puedo duplicar y replicar y triplicar las veces que yo quiera, manteniendo el mismo resultado con la mitad de esfuerzo, reduciendo la cantidad de alucinaciones, pero aumentándola en otro sentido. Entonces, bueno, no está de más, no es una revolución en el momento presente, es una revolución tecnológica, pero no es una revolución en cuanto a negocio.
Otra cosa que podemos ver es el nodo de Think, este de aquí, ¿vale? que básicamente si os vais aquí a la documentación lo que nos dicen es que cualquier modelo que nosotros conectemos, independientemente de si es un modelo razonador o no, se va a convertir en un modelo razonador automáticamente. Básicamente lo que hace es aumentar el tiempo de inferencia. Va a estar pensando más rato el modelo, ¿vale? Antes de ofrecernos la respuesta más rato quiere decir que va a iterar más sobre la respuesta que nos va a ofrecer para mirar de mejorarla. Lógicamente, esto va a aumentar la latencia, va a hacer que responda más lento, sacrificando, eh, claro está, a cambio de una mejor precisión.
Y todo esto que hemos hecho hasta ahora, podríamos hacerlo, como habéis visto, a través de Evolution Appi, conectándolo con nuestro número de teléfono y que automáticamente podamos interaccionar con este agente, con el que queramos, con nuestro cliente, con todas las aplicaciones que queramos directamente vinculadas en nuestro N8N con WhatsApp. Genial. Y como veis, pues ahora todo lo que nosotros le enviemos desde nuestro WhatsApp, esto nos va a llegar a N8N. Aquí veis, veis, si le enviamos, por ejemplo, esto, parece que continúas enviando un texto aleatorio. Me lo envía a mí mismo desde mi mismo número de teléfono, dando la respuesta en este caso porque es el que tengo configurado en ambos lados, ¿vale? Aunque esté Luis aquí, pero fijaos que es como si escribiese desde mi propio número de teléfono. ¿Veis? Quiero agendar. ¿Veis aquí? Entiendo que quieres agendar una cita, sin embargo, las citas solo pueden programarse. Bla, bla, bla. Vale, porque he estado haciendo pruebas y le he quitado la memoria. Y esto sería un poco la demostración. Espero que os guste.
En esta parte del vídeo vamos a aprovechar para introducir conceptos fundamentales, sobre todo de cara a ofrecer esto a clientes reales, poder cuantificar los precios y tener un control de qué es lo que estamos ofreciendo, tanto técnicamente como a nivel de precios. Como vemos, lo primero que tenemos que saber es que la forma que tenemos actualmente de cuantificar o saber el precio del coste de las APIs de nuestros modelos de inteligencia artificial es el precio por millón de tokens. Cada uno de los eh proveedores como Open, Cloude, Deepsic nos lo ofrecen en una base distinta. En el caso de Open pues nos dan el precio por millón de tokens. Si nos vamos a Deepsic, pues tal vez nos dan el precio por 10,000 tokens y así. Simplemente e hay diferentes benchmarks que nos dan las comparaciones de el precio de los tokens, ¿vale?, Vale, de los diferentes modelos. Y debéis de saber que los input tokens son más baratos que los output tokens, porque lógicamente la salida requiere de procesamiento y es más pesada para el modelo. Entonces, es por eso que los output tokens son más caros. Como veis, la tendencia es que los tokens se vayan volviendo cada vez más y más baratos con el tiempo y es lo que estamos viendo cada vez con modelos más potentes y más baratos.
Imaginad, por ejemplo, que hacemos un cálculo de que en un cliente por interacción le hemos instalado un chatbot y por interacción en promedio consume unas unos 500 tokens, ¿vale? Y vamos a asumir que ese cliente pues realiza unas 600 interacciones al día. Deberíais de multiplicar 5* 6, ¿vale? O sea, 3, ya tendríamos 30.000 aquí. 30.000 1000 lo multiplicamos por, bueno, en este caso lo dividimos por el precio por millón de tokens y esto nos daría un precio aproximado de cuánto nos costaría por día y por cliente. Esto de aquí le podemos decir cuánto sería mensualmente aproximadamente y a su vez le podríamos decir que nos encargamos nosotros cobrándole un coste asociado a la gestión de este servicio o que bien se lo gestione él directamente, pero que entonces no queremos saber nada de lo que es el mantenimiento de lo que serían las APIs de inteligencia artificial.
De nuevo, debemos de saber que la alucinación es una de las cosas más importantes dentro de todo esto de la inteligencia artificial. aplicada y si tenemos alucinaciones, ratios de alucinaciones muy altos, no vamos a tener buenas aplicaciones, no vamos a tener aplicaciones contundentes. La forma que tenemos actualmente de reducir el ratio de alucinación sería con la temperatura. E hay otros parámetros, ¿vale? Pero de momento no quiero liaros demasiado. Con la temperatura sería más que suficiente inicialmente con una ventana de contexto controlada. Como sabéis, la ventana de contexto es la cantidad de texto que el modelo puede recordar procesar en una sola solicitud, ¿vale? Si excedemos la ventana de contexto, lo que va a ocurrir es que el modelo no va a poder procesar correctamente y además, mediante nos vamos acercando al máximo, lo que ocurre es que el modelo va perdiendo precisión y cada vez se vuelve más tendiente a las alucinaciones y menos preciso en general. E hay modelos que tienen limitaciones muy restrictivas, sobre todo modelos en local como fi 4, que está muy pensado por tema de protección de datos. Debemos de saber también que hay modelos que están muy especificados para un idioma en concreto. Debemos de buscar modelos que sean multilinguals.
La latencia es muy importante, que es el tiempo que tarda el modelo en responder, en darnos una respuesta ante una petición a una consulta. Hay modelos, como por ejemplo los modelos razonadores, los cuales tienen un tiempo de inferencia muy alto. Y este tiempo de inferencia es básicamente cuánto tiempo se dedican a razonar y a iterar sobre sus propias conclusiones y esto hace que sean muy lentos. Entonces, imaginad que tenemos, pues, no sé, un agente telefónico o un chatbot que tiene que dar una respuesta al instante y tenemos una latencia muy alta, pues ahí tenemos un problema, lógicamente.
Vale, debemos entender la arquitectura de querer y respuesta. Básicamente en la arquitectura de Query respuesta debemos de entender que tenemos al usuario la base de datos de contexto que le aportamos a nuestro modelo. Esto se junta para procesar una respuesta, que es lo que nosotros vemos aquí. Y esta respuesta a su vez retroalimenta el historial que vuelve a alimentar al modelo en la interacción posterior. Todo esto va sumando dentro de la ventana de contexto, así que tened cuidado con esto del historial. Y por eso teníamos lo del el window context length, ¿vale? que era un poco la longitud de las últimas interacciones que teníamos en cuenta a la hora de procesar la salida.
Em, ¿cómo sabemos cuál es el mejor modelo? Pues básicamente para saber cuál es el mejor modelo actualmente no hay una forma definitiva. Hay diferentes benchmarks. Cada uno de los modelos tiene una cualidad distinta, cada uno de ellos está especificado para un uso distinto y destaca en cada uno de ellos. debéis de conocer estas empresas. Una de ellas es Huginface, que es una plataforma, bueno, en este caso no es una no es una empresa Open Source, que es para compartir, usar y entrenar modelos de una forma totalmente libre y pues sería como el GitHub, ¿no?, de la inteligencia artificial. Después tenemos Anthropic con Cloue. Estos son muy rigurosos, me gusta muchísimo cómo trabajan, la precisión la tienen como bandera y además son bastante buenos en cuanto a modelos. Deep se que recientemente se han disparado, lo están haciendo verdaderamente bien. A mí personalmente no me gustan demasiado para aplicaciones que requieran mucha precisión, son modelos que tienden a la alucinación. Deep Mind, que sería como la filial o la sí, la filial de Google, ¿no? Que que tienen dedicada exclusivamente a la parte de inteligencia artificial. Open bien que estos todos los conocemos con CH GPT, se han quedado un poco más atrás en los últimos tiempos, poco a poco están recuperando espacio y meta con sus modelos que, bueno, sobre todo destacan el local con con las versiones que podemos descargarnos y utilizar directamente en nuestro ordenador.
Em, podemos hablar también de la estructura del prom perfecta cuando hablamos de agentes de inteligencia artificial y la estructura debería seguir este orden. Primero le decimos qué personalidad debe adoptar este agente de inteligencia artificial. Posteriormente le damos las herramientas que tiene disponibles, se las listamos, le definimos una serie de objetivos que debe hacer con estas herramientas y posteriormente le damos instrucciones, ¿vale? Primero objetivos y después instrucciones. O sea, esto es lo que debe lograr y esta es la forma que tiene de lograrlo. Y aquí le especificamos las herramientas. Esto apuntadlo porque es muy importante.
Hm. Después tenemos, bueno, diferentes sistemas, sistemas multiagente, sistema que son multiagentes, pero que tienden más a la seguridad. Tenemos agentes de inteligencia artificial, que como sabéis los hemos visto en la parte práctica, pero que considero que tienen muchísima más complejidad de la que entrañan en un principio y que después los beneficios que nos amortan no son tantos como parecen. Tenemos sistemas de agentes autónomos totalmente completos como lo son Manus y Operator y después tenemos frameworks para construir agentes como hemos visto con N8N, QAI, Panting o Linechain.
Bueno, esto es un poco el macrores resesumen. Quería que estuviese en la parte final en cuanto un poco contexto general y cultura para poder aportar estas soluciones y de forma muy sintetizada. Igualmente tengo un vídeo donde explico todo esto, ¿vale? podéis ir a mi canal y en ese vídeo vais a aprender todo lo relativo a teoría y todo lo relativo a los fundamentos, fundamentos, fundamentos de tecnología que son importantes si os queréis dedicar verdaderamente a esto y ser buenos profesionales.
Me gustaría hacer una pequeña reflexión con respecto a todo lo que hemos visto hasta ahora en este curso, en el cual hemos condensado una cantidad de información que verdaderamente cuesta muchísimo conseguir y más ha sido organizada. Y la reflexión que me gustaría hacer es en torno a las ventas. Estoy viendo que muchísima gente tiene una capacidad técnica verdaderamente buena. Estoy viendo que son capaces de desarrollar soluciones que son sorprendentes, muchas veces mejor que las mías propias y han entrado hace relativamente poco a la comunidad. Sin embargo, lo que estamos encontrando es que estas personas en muchas ocasiones tienen problemas en la parte de la venta, en la parte de llevar ese producto al mercado, de ser aceptado y de poder monetizar, que al final es el objetivo de todo esto. La pasión está genial, pero también debemos de vivir de ello.
La reflexión que me gustaría hacer en torno a todo esto es la siguiente. Estoy viendo que, sobre todo a esas personas que les ocurre este problema se enfocan muchísimo en la tecnología. Se enfocan en hablar de N8N, en hablar de inteligencia artificial y en venderle al cliente cosas que el cliente no entiende. Debemos de pensar que el cliente no sabe lo que es la inteligencia artificial, ya me entendéis, lógicamente sí que lo sabe, pero no es capaz de comprender cómo estas soluciones pueden revolucionar su negocio y cómo lo puede medir de forma tangible. Por lo tanto, no debemos de hablarle de inteligencia artificial, no debemos de hablarle de N8N, no debemos de hablarles de flujos, debemos de hablarles de procesos automatizados que ahorran tiempo, liberan a personas y hacen que tengan una vida muchísimo más provechosa, en la cual pues tienen acceso a más riquezas, que al final es lo que quieren la mayoría de personas.
Enfoquemos nuestro discurso correctamente. Utilicemos los sistemas de prospección que hemos visto en otros vídeos, que en definitiva se traducen en prospección en frío. Esta consiste en simplemente escoger un correo electrónico, hacer un proceso de warmap, que es de calentamiento para que no nos lo baneen. Y con este correo electrónico, gracias a ciertos sistemas que nos permiten conseguir leads, es decir, potenciales clientes, ser capaces de sacar una lista de contactos a los cuales vamos a enviar propuestas de valor y estas propuestas de valor van a tener una conversión asegurada. Creedme que se trata de un tema probabilístico. Si tú envías 100 correos y tienes una conversión del 1%, vas a cerrar un cliente. Y este juego va de lo de siempre, va de el más insistente, no va ni del mejor, ni del más listo, ni de nada de eso. Va del que más se esfuerza y del que más pone las ganas sobre la mesa.
Recomendación que os hago con todos los conocimientos que hemos visto en este curso. Primeramente, que los apliquéis, que no se quede en un vídeo, que no se quede en una idea, sino que llevéis a término todo lo que acabáis de aprender, que creéis vuestro propio chatbot, que creéis vuestra página web, que creéis vuestros primeros flujos, que creéis vuestros formularios, que vayáis a vuestro círculo cercano, a vuestros familiares, a quien sea, y que le ofrezcáis estas automatizaciones. Si tiene que ser gratis, lo hacemos gratis. Creedme que merece muchísimo la pena, muchísimo la pena, porque vamos a tener un caso de éxito, el cual vamos a publicar y ese caso de éxito va a hacer que florezcan una serie de oportunidades que nos van a catapultar. Todo se trata del boca a boca. Muchas veces todo se traduce a eso. Es la forma más primitiva y esencial que tenemos de vender. Al final en el bueno, en el paleolítico con nuestros ancestros ellos vendían de esta forma. Decían a través de sistemas de referidos, mira, pues aquella persona era muy hábil en este tipo de herramientas o era muy hábil en este tipo de caza y todo el mundo recurría a ellos para este tipo de de cosas. nos transmite muchísima confianza este tipo de de recomendaciones y es en lo que nos tenemos que centrar y es en lo que tenemos que trabajar y poner el esfuerzo en perder el miedo, en ganar confianza, en no hablar de tecnología, hablar de resultados tangibles y sobre todo, sobre todo, sobre todo aplicar metodologías que sí o sí nos van a dar resultados tarde o temprano.
Solo eso, lógicamente, nos podemos extender muchísimo, pero no creía conveniente cerrar un vídeo de tantísimo valor sin dar esta pequeña reflexión o sin dar esta pequeña pincelada que creo que puede aportar mucho valor, sobre todo para aquellos que se están iniciando. Espero que os haya gustado enormemente este vídeo. Este vídeo que verdaderamente nos ha costado mucho tiempo, esfuerzo y dedicación grabar. Como entenderéis, todas estas horas y además hacerlo de forma libre y gratuita, pues requiere de una pasión y un esfuerzo descomunal, un esfuerzo que estamos dispuestos a dar y a darlo de forma totalmente desinteresada, porque nuestro objetivo principalmente es revolucionar la vida de las personas, cambiar el futuro de la humanidad y las personas en general y simplemente agradeceros, agradecer a mi equipo, sobre todo a Santi y a César, que nos han dado un soporte increíble durante toda la creación de este vídeo. Han estado a pie de cañón.
Si os ha gustado el contenido, si creéis que os ha cambiado la forma de ver la inteligencia artificial y las automatizaciones en general, os recomiendo muchísimo uniros a Ailin Bip, la comunidad líder para emprendedores de agencias de inteligencia artificial de habla hispana, donde tendréis acceso a recursos totalmente exclusivos, mentorías grupales semanalmente, tendréis acceso a plantillas listas para usar y además a un grupo selecto de personas que os van a ofrecer soporte al momento y en menos de 24 horas. Si os interesa la inteligencia artificial y emprender con esta, suscribiros de igual forma porque os aseguro que el valor que se viene a este canal es una completa locura. Muchísimas gracias por todo y nos vemos en el próximo vídeo. Gracias. M.