Video Summary and Transcription
Esta charla discute la construcción de un asistente AI activado por voz utilizando Web APIs y JavaScript. Cubre el uso de la API de reconocimiento de voz de Web Speech y la API de síntesis de voz para texto a voz. El orador demuestra cómo comunicarse con la API de Open AI y manejar la respuesta. La charla también explora la habilitación del reconocimiento de voz y cómo dirigirse al usuario. El orador concluye mencionando la posibilidad de crear un producto a partir del proyecto y utilizar Tauri para experiencias similares a las de un escritorio nativo.
1. Introducción a DevRel y AI
Hola, soy Tejas Kumar, y dirijo una pequeña pero efectiva consultoría de relaciones con desarrolladores. Ayudamos a otras empresas orientadas a desarrolladores a tener excelentes relaciones con los desarrolladores a través de discusiones estratégicas, mentoría y ejecución práctica. Hoy, vamos a construir un asistente de IA activado por voz utilizando APIs web y JavaScript. El propósito es divertirse mientras aprendemos y celebramos JavaScript y AI.
Hola, soy Tejas Kumar, y dirijo una pequeña pero efectiva consultoría de relaciones con desarrolladores. Lo que significa es que ayudamos a otras empresas orientadas a desarrolladores a tener excelentes relaciones con los desarrolladores. Y lo hacemos a través de discusiones estratégicas de alto nivel, y mentoría, y hiring. O lo hacemos a través de una ejecución práctica de bajo nivel, como literalmente a veces escribimos la docs, hacemos las charlas, etc. En ese espíritu, es importante para nosotros, ya sabes, mantenernos en el bucle, y ser relevantes y relacionables con los desarrolladores para tener excelentes relaciones con los desarrolladores de DevRel. Y a veces para hacer eso, simplemente tienes que construir cosas. Verás, muchas conferencias en estos días, son un montón de gente de DevRel tratando de venderte cosas, y eso no nos gusta. Es DevRel, no DevSell. Y en ese espíritu, no vamos a venderte nada aquí, simplemente vamos a hackear juntos. El propósito es divertirnos un poco, aprender un poco, y así sucesivamente. Lo que vamos a hacer en nuestro tiempo juntos es vamos a construir un asistente de AI activado por voz, como Jarvis de Ironman, usando solo APIs web, solo JavaScript. Usaremos VEET para un servidor de desarrollo, pero eso es todo, esto funciona. Vamos a usar algunas APIs no estándar que requieren prefijos y cosas así, pero si realmente quisieras, podrías usarlo en producción. Podrías proporcionar tus propias gramáticas y así sucesivamente. El punto hoy, sin embargo, no es ese, es divertirse mientras aprendemos un poco
2. Plan para Construir el Asistente de IA
Vamos a utilizar la API de Web Speech para el reconocimiento de voz a texto y la API de síntesis de voz para el texto a voz. Daremos el texto al modelo GPT 3.5 Turbo de OpenAI y luego hablaremos la respuesta. Es un proceso sencillo utilizando las APIs del navegador que han estado disponibles durante un tiempo.
y también vibrando un poco. Todo en el espíritu de celebrar JavaScript y AI. Así que con eso, vamos a entrar en ello dibujando un plan en tldraw. Vamos a ir a tldraw, y ¿qué queremos hacer? Bueno, primero queremos tener voz a texto. Esto es utilizando la API de Web Speech. A partir de ahí, queremos tomar este texto y dárselo a OpenAI, el modelo GPT 3.5 Turbo. A partir de ahí, queremos hablar. Así que texto a voz desde OpenAI. Este es el plan. Queremos hacer esto con las APIs del navegador. Queremos reabrir el micrófono después de que GPT 4 hable y tener que vuelva aquí. Esto es lo que queremos hacer. Vamos a dibujar algunas líneas. Así que es realmente solo voz a texto, una solicitud AJAX y texto a voz. Esto es lo que queremos hacer. No necesariamente difícil. Hay algunas funciones aquí. Esto se llama reconocimiento de voz que vamos a utilizar. Eso es en realidad algo introducido en 2013. Ha estado alrededor de un tiempo. Esta es la API de síntesis de voz. Así que ambas existen en JavaScript en tu tiempo de ejecución del navegador. Están listas para usar. Lo que vamos a hacer es usarlas para cumplir
3. Construyendo la Funcionalidad de Reconocimiento de Voz
Para construir nuestro asistente, utilizaremos el reconocedor de voz de Chrome. Crearemos un nuevo objeto de reconocimiento de voz y añadiremos un detector de eventos para el evento de resultado. Cuando obtengamos un resultado, extraeremos la transcripción del primer intento. Esta API puede proporcionar múltiples suposiciones, pero nos quedaremos con la primera.
este diagrama. Ahora, para hacer eso, vamos a usar Chrome porque esto realmente funciona en Chrome pero hay formas de hacerlo funcionar en otros navegadores. Vamos a abrir el DS code y empezar. Tenemos una página en blanco con un botón que dice hola. Si queremos ver el code, index.html es HTML, algo de cabecera, eliminando el margen por defecto. Hay en realidad una pequeña cosa aquí que mi cara está cubriendo, una pequeña caja negra. Puedes ver si bajo esto un poco. Ahí es donde va mi cara. En fin. Y luego tenemos esta caja negra, el botón que literalmente no hace nada en index.tsx.
Empecemos reconociendo mi voz. Chrome tiene un reconocedor de voz incorporado. Lo tiene desde 2013 y simplemente funciona. Otros navegadores tienen diferentes implementaciones y así sucesivamente. Pero el objetivo es construirnos un asistente. No estamos construyendo un producto para vender, estamos simplemente aprendiendo, divirtiéndonos para construirnos un asistente. Así que en ese espíritu, lo que haremos es decir const recognition es new speech recognition, speech recognition. Y esto previsiblemente fallará porque necesitas un prefijo de vendedor en Chrome, pero Chrome no usa WebKit, Safari usa WebKit. ¿Cuál es el prefijo para usar esto en Chrome? Es WebKit. No sé por qué, pero ahí está. Y esto ahora debería darnos ningún error. Así que está ahí. Entonces, ¿qué queremos hacer? Necesitamos un detector de eventos. Así que añadiremos un detector de eventos a esto llamado resultado, más bien escuchar en el evento de resultado. Y cuando obtengamos un resultado, vamos a const text es los resultados. Oops, deberíamos quizás obtener evento. Los resultados del evento, el primer resultado y el primer intento del primer resultado. Así que esta API hará si la dejamos, hará muchas suposiciones sobre lo que dije. Y siento que es lo suficientemente bueno que simplemente nos quedamos con el primero. Así que iteraremos si necesitamos, pero obtenemos el primer resultado y luego
4. Comunicándose con la API de Open AI
Y vamos a registrar en consola y decir que dijiste texto. Tenemos voz a texto. Ahora, hablemos con Open AI y veamos qué dice. Nos comunicaremos con la API de Open AI siguiendo la documentación de la API y utilizando una solicitud curl. Convertiremos el comando curl en una solicitud de búsqueda de JavaScript utilizando la extensión de los laboratorios de Github copilot. Es como copilot pero en esteroides y permite conversiones de código. Funciona bastante bien.
el primer intento de ese resultado. Transcripción. Y vamos a console ese registro y decir que dijiste texto. También necesitamos empezar a reconocer recognition dot start. Hola. Mi nombre es Tejas y dirijo una agencia Deverell. Oh, fantástico. Hola. Mi nombre es Tejas y dirijo Deverell. Lo suficientemente cerca. Está funcionando. Tenemos voz a texto. ¿Qué hacemos ahora? Hablemos con Open AI. Dale el texto y luego veamos qué dice. Para hacer eso vamos a comunicarnos con la API de Open AI. Así que para hacer eso vamos a abrir la documentation de la API. Vamos a obtener una solicitud curl aquí mismo. Esta es una edición de imagen. Quiero una finalización de chat.
Así que voy a venir aquí, copiar este fragmento de curl, abrir Visual Studio code y crear una función const askOpenAI y esta es probablemente una función asíncrona aquí. Y lo que haremos es que tenemos un curl. Quiero convertir esto en un fetch. Y hay una extensión poderosa llamada Github copilot labs. Y esto es nuevo. Es como copilot pero en esteroides y permite como conversiones de code y cosas. No funciona muy confiablemente pero pensé que podríamos intentarlo. Así que para intentarlo, vamos aquí. Copilot labs. Voy a abrir eso y voy a resaltar este texto y decir usando el pincel personalizado, voy a decir convierte este comando curl en una solicitud de búsqueda de JavaScript. Y va a girar un poco. Bueno, wow. No está mal.
5. Autorización, Cuerpo y Registro
Necesitamos una autorización, un token de portador y un cuerpo de solicitud. El cuerpo debe ser una cadena JSON con un modelo y mensajes. Usaremos el modelo Turbo0301 y comenzaremos con un mensaje del sistema que presenta a Jarvis, el asistente personal de IA de Tony Stark. Mantendremos las respuestas concisas. Registraremos todo lo dicho en una lista y lo mapearemos como contenido del usuario.
Necesitamos una autorización, que contiene un token de portador. Y por supuesto también necesitamos un cuerpo. ¿Cuál es el problema aquí, verdad? Necesitamos otro rizado. Necesitamos un cuerpo de solicitud. Eso es muy importante. Así que haremos coma cuerpo. Y ¿qué espera esta cosa era una cadena JSON en primer lugar. Y necesita un modelo y mensajes. Así que haremos eso. Simplemente le daremos este objeto aquí. Voy a usar Turbo0301 simplemente porque a menudo está bajo menos carga. Y diremos, comenzaremos con un mensaje del sistema. Así que sistema, y le diremos quién es. Le daremos una declaración de identidad. De acuerdo. Eres Jarvis, Jarvis, Tony Stark, el asistente personal de IA de Tony Stark. Tony Stark, por supuesto, también es Iron Man. Mantén tus respuestas tan breves y concisas como sea posible. De acuerdo. Así que eso es una instrucción. Ahora, lo que necesitamos hacer es todo lo que se dice necesitamos mantenerlo en un registro porque ya sabes, el chat GPT es conversacional. Así que cada vez que reconocemos el habla, necesitamos agregar eso a una lista. De acuerdo. Así que hagamos eso. Así diremos const cosas dichas es un array vacío. Y no solo vamos a console registrar esto, sino que, en cambio, diremos cosas dichas dot push texto, que es una cadena, pero esto es una cadena. De acuerdo, perfecto. Ahora, solo mapearemos. Así que diremos cosas dichas dot map role es contenido del usuario.
6. Preguntando a Open AI y Manejando la Respuesta
Y ahora estamos preguntando a Open AI. Lo estamos empujando allí. Vamos a registrar en consola la respuesta y ver qué obtenemos. Es 401 porque no tengo un token de oso. Hola, necesito un traje inmediatamente. Probablemente hablando con el modelo equivocado. Error, error de solicitud inválido. Rol, usuario, contenido. Propagar la solicitud. Obtuvimos indefinido, pero las contraseñas de solicitud, opciones, cero, mensaje, contenido.
Esto es perfecto. Y ahora estamos preguntando a Open AI. Así que lo estamos empujando allí. Y luego haremos o otra constante respuesta es esperar, preguntar a Open AI. Esta no es una función asíncrona. Y ahora eso se ve bien. Así que simplemente registraremos en console la respuesta y veremos qué obtenemos. Bueno, echemos un vistazo. Hasta ahora, todo bien. Espera, hola. Necesito un traje inmediatamente. Bueno, nada. Es 401. Y eso es porque no tengo un token de oso. Estoy a punto de mostrarte mi clave API, por favor no la copies. Sé una buena persona. Bueno, puede ser costoso si lo abusas. En fin, lo tengo. No viste nada, no viste nada, no viste nada. Hola, necesito una nueva armadura inmediatamente. ¿Cómo lo hago? 400. Probablemente porque estoy hablando con el modelo equivocado. Echemos un vistazo aquí. ¿Cuál es el problema? Error, error de solicitud inválido. Rol, usuario, contenido. Bueno, no es de tipo objeto. Correcto, necesito propagar eso. Gracias. Hola, necesito una armadura inmediatamente. Bueno, obtuvimos indefinido, pero las contraseñas de solicitud, opciones, cero, mensaje, contenido.
7. Hablando la Respuesta Usando la API de Síntesis de Voz
Primero, serializar a JSON. Obtener la respuesta y hablarla usando la API de Síntesis de Voz. Usar la función speakStringOfText y establecer la voz en la deseada.
Y eso es lo que queremos console.log, respuesta. Primero que nada, devolvamos esto. Serializar esto a JSON. Y ahora necesitamos response.choices, zero.message.content. Bien, esta será nuestra respuesta, y luego solo console.log esta respuesta solo para estar seguro. Correcto, respuesta. Bien, intentemos esto de nuevo. Necesito un traje de armadura alrededor del mundo. ¿Cómo debería llamarlo? Iniciativa Avengers. Oooh, está sucediendo. Así que tenemos voz a texto. Estamos hablando con OpenAI. Ahora necesitamos texto a voz, ¿verdad? ¿Cómo podemos hacer esto? Podemos hacer esto usando la API de Síntesis de Voz. Esto también es solo una API web nativa. Tenga en cuenta, estamos escribiendo TypeScript pero no hay ninguna herramienta de compilación o algo así. Esto es solo directamente en el navegador. Así que usemos la Síntesis de Voz. Así que obtenemos la respuesta, necesitamos hablar la respuesta. ¿Cómo hacemos esto? Tendremos una función llamada speakStringOfText, y lo que queremos hacer es const utterance. Exactamente, debería haber dejado que CoPilot escribiera esto. Utterance. Así que una SpeechSynthesis utterance es una expresión de una cadena. Y lo que queremos hacer es, bueno, eso es bastante básico, pero también queremos hacer algunas voces. Así que diremos const voice es SpeechSynthesis.getVoices, y simplemente obtendremos la primera voz. Que generalmente es la británica, la que quiero. Y diremos que utterance.voice es esta voz. Y luego hablamos. Y luego, en realidad, simplemente lo dejamos allí. Y lo que haremos es que diremos, ya sabes, hablar respuesta. ¿Cuánto dinero necesito para construir la torre de los Avengers?
8. Habilitando el Reconocimiento de Voz y Dirigiéndose al Usuario
Para habilitar el reconocimiento de voz, se necesita agregar un evento de clic al botón. Esto asegura que el navegador no hable al azar sin la interacción del usuario. Al asignar un ID al botón y usar oyentes de eventos, podemos iniciar el proceso de reconocimiento. Sin embargo, el asistente de IA todavía puede dirigirse al usuario como Sr. Stark a menos que se especifique lo contrario a través del indicador del sistema.
Eso es genial. Pero no lo pronunció. No lo pronunció porque necesita un evento. Entonces, lo que vamos a hacer es, esto es una consideración de seguridad. No puedes simplemente tener cosas que te hablen sin una interacción del usuario. Necesitas un evento de clic o algo así.
Entonces, para empezar a escuchar, añadiremos un evento de clic al botón que existe. Solo para que el navegador no proteja la computadora simplemente hablando al azar. Lo cual puede ser una experiencia un poco aterradora.
Bien. Entonces, lo que haremos es, en lugar de recognition.start, volveremos a nuestro botón en el HTML. ¿Cuál es el ID? Vamos a darle un ID. El ID es start. Y esto ahora lo convertirá en una variable global. ¿No es ridículo? Entonces, lo que haremos es, en lugar de recognition.start, haremos start.add event listener. Clic y luego recognition.start. Haremos esto, guardar. Así que ahora, no está escuchando por defecto, pero haré clic en esto y luego hablaré y entonces debería funcionar.
Oye Jarvis, ¿cuánto dinero va a costar construir un coche nuevo? Lo siento, el Sr. Stark no me ha proporcionado suficientes detalles para estimar el costo de construir un coche nuevo. Por favor, proporciona más información. ¿Por qué habló al Sr. Stark y dijo Sr. Stark, a menos que sepa que no soy el Sr. Stark. Tal vez podemos, a través del indicador del sistema, decirle, soy el Sr. Stark. Bien, hagamos eso. Indicador del sistema, tú eres Jarvis, Tony Stark, por supuesto, también es Iron Man. Tu usuario es Iron Man o Tony. Intentemos esto de nuevo. Jarvis, ¿cuál es mi color favorito en mi sopa?
9. Cerrando el Bucle y Habilitando la Conversación
Tenemos voz a texto, estamos hablando con OpenAI, y ahora necesitamos texto a voz. Quiero que esté encendido para siempre y tener una larga conversación. Vamos a cerrar el bucle y resumir todo lo que hicimos. Cuando terminemos de hablar, resolveremos la promesa. Ahora, podemos iniciar de nuevo el reconocimiento y tener una conversación real.
Lo siento, Tony. No puedo determinar tu color de sopa favorito ya que no es una preferencia estándar. Piensa en Tony. Bueno, está bien. Tenemos voz a texto, estamos hablando con OpenAI y ahora necesitamos texto a voz. O más bien, tenemos texto a voz, pero no es una conversación, como que simplemente se detiene y luego se acaba. Y luego tengo que hacer clic en el botón para empezar a hablar de nuevo. Quiero que esté encendido para siempre y simplemente tener una larga conversación. ¿Vale? Vamos a cerrar el bucle y luego resumir todo lo que hicimos. Entonces, ¿cómo vamos a hacer esto? Cuando terminemos de hablar, aquí, lo que queremos hacer es, utterance.onEnd, queremos, vamos a devolver una nueva promesa. Promesa, resolver, y noten cómo no estamos manejando errores, eso es porque a veces me gusta el caos. Cuando terminamos, cuando termina de hablar, resolveremos la promesa. Ahora, podemos esperar a speak y cuando speak termine, podemos iniciar de nuevo el reconocimiento, y ahora podemos tener una conversación real.
10. Conferencia de JavaScript y Vuelo a Ámsterdam
Hola, Jarvis, ¿cuál es la mejor conferencia de JavaScript? Algunas conferencias populares incluyen JSConf, ReactConf y Node Summit. ¿Puedo volar a Ámsterdam en mi traje? Sí, te llevaría aproximadamente de 7 a 8 horas volar de Nueva York a Ámsterdam a velocidades supersónicas. Gracias, Jarvis. Voy a cerrar la pestaña ahora. Acabamos de crear un Jarvis similar a la IA comandada por voz utilizando las APIs de JavaScript basadas en el navegador. La API de reconocimiento de voz varía entre los navegadores y aún no es estándar. La API de síntesis de voz utiliza voces del sistema operativo del usuario. Vamos a revisar el código final e identificar cualquier error o mejora. Tenemos un nuevo reconocimiento de voz de WebKit que comienza cuando se hace clic en el botón.
Entonces, comencemos. Hola, Jarvis, ¿cuál es la mejor conferencia de JavaScript en la Tierra? Lo siento, Tony, como asistente de AI, estoy programado para proporcionar respuestas factuales. No hay una conferencia objetivamente mejor ya que puede variar dependiendo de las preferencias individuales. Sin embargo, algunas conferencias populares para JavaScript incluyen JSConf, ReactConf y Node Summit.
Bien, alrededor del 1 de junio en Ámsterdam, ¿cuál es la mejor conferencia? La mejor conferencia de JavaScript en Ámsterdam alrededor del 1 de junio es la Conferencia de JavaScript. Jarvis, esa no es una conferencia real. Pido disculpas. Tony, no hay una conferencia alrededor del 1 de junio en Ámsterdam que coincida con tus criterios para ser la mejor.
Bien, ¿puedo volar a Ámsterdam en mi traje? ¿Qué tan rápido? ¿Cuánto tiempo me llevará llegar a Ámsterdam desde Estados Unidos? Sí, puedes volar a Ámsterdam en tu traje. Te llevaría aproximadamente de 7 a 8 horas volar de Nueva York a Ámsterdam, viajando a velocidades supersónicas. Muchas gracias, Jarvis. Voy a cerrar la pestaña ahora, ¿de acuerdo? Porque no creé un mecanismo de parada. Entendido, usuario. ¡Mantente seguro! Acabamos de hacer eso. Acabamos de crear un Jarvis similar a la AI comandada por voz utilizando solo las APIs nativas de JavaScript basadas en el navegador. La API de reconocimiento de voz utiliza cualquier reconocedor de navegador disponible. Por eso usamos Chrome. Varía de un navegador a otro. Aún no es estándar. Probablemente lo será, aunque ha estado 10 años en el navegador y aún no es estándar. Así que, tu experiencia puede variar. La API de síntesis de voz utiliza solo las voces del sistema operativo del usuario. Puedes darle voces personalizadas, aunque hay otras soluciones para hacer eso. Te invitaría a experimentar y jugar. Vamos a revisar el código una última vez, el código final, identificar tal vez los errores que cometimos o las cosas que podríamos hacer mejor, y luego terminar. Bien, vamos. Tengo Google aquí. Vamos a abrir la cosa de nuevo, está bien. ¿Qué hicimos? Tenemos un nuevo reconocimiento de voz de WebKit. Cuando hacemos clic en el evento, cuando hacemos clic en el botón más bien, comenzamos el reconocimiento.
11. Conversaciones Finales y Conclusión
El evento de usuario es importante ya que evita que el navegador escuche y espíe a las personas de manera aleatoria. Mantenemos un array de cosas dichas y lo alimentamos a OpenAI para más contexto. Tenemos un bucle para escuchar, hablar y resolver la promesa. Hacemos una solicitud fetch a la API de completions de OpenAI. Este proyecto es de menos de 50 líneas de código y utiliza solo APIs web nativas. Puedes crear un producto a partir de esto y considerar el uso de Tauri, una herramienta para crear experiencias similares a las de escritorio nativo utilizando lenguajes web y Rust. Gracias por unirte a la sesión y apoyar nuestro trabajo de DevRel.
Este evento de usuario es importante porque no quieres que tu navegador, más bien tu navegador no quiere simplemente empezar a escuchar cosas y, ya sabes, espiar a la gente. Mantenemos un array de cosas dichas y alimentamos esto a OpenAI. Nota, estamos cometiendo un poco de un error porque cuando obtenemos una respuesta deberíamos realmente añadir esto, así que cosas dichas.push, y esto le dará a la AI más contexto.
Esto se ve bien y luego podemos tal vez eliminar algunos console.logs y tenemos este bucle donde empezamos a escuchar y luego una vez que dices algo y la máquina responde, entonces empiezas a escuchar de nuevo. Para hablar, estamos usando la síntesis de voz que simplemente pronuncia algún texto y establecemos la voz a una voz del sistema. Esta es la predeterminada, tal vez incluso podríamos cambiar esto y ver qué pasa. Y esto se ve bien y luego cuando termina resolvemos la promesa para que podamos volver y empezar. Por último tenemos un fetch a la API de completions de OpenAI. Esto es solo un copiar y pegar y enviamos todas las cosas dichas. Así que esto realmente no es tan difícil, son menos de 50 líneas de code y tenemos un asistente al estilo Jarvis activado por voz usando solo APIs web nativas.
Vamos a tener una última conversación con él, de una manera optimizada, con una voz diferente y luego terminamos. Ok, hagámoslo. Entonces, hey Jarvis, ¿qué es lo más cool de Ámsterdam, el 1 de junio? Lo siento, no estoy programado para proporcionar opiniones subjetivas. ¿Te gustaría que busque algunos eventos interesantes que suceden en Ámsterdam el primero de junio? Claro, eso suena bien. A veces tarda un poco. Basado en mi búsqueda, aquí hay algunos eventos que suceden en Ámsterdam el 1 de junio. Un evento es el festival de danza Exly, music festival que organizamos con varios DJs. Otro festival, el Festival de Artes y Cultura de Apple con una variedad de actuaciones y eventos. También puedes crear un producto a partir de esto, con las advertencias de compatibilidad del navegador y así sucesivamente. Podrías convertirlo en un proyecto de código abierto, invitar a contribuciones, y realmente tener algo. Dos, me gustaría recomendar el uso de una aplicación, o un sistema, o herramienta, como Tauri. Para aquellos que no han oído hablar de Tauri, es una forma de crear experiencias similares a las de escritorio nativo usando lenguajes web, HTML, JS, JavaScript, y el back end es entonces Rust, donde puedes pasar mensajes entre tu front-end con tecnologías basadas en navegador y Rust para crear cosas de alto rendimiento. De hecho, todo el mundo está reescribiendo cosas en Rust, y piensan que son geniales por ello. Y de hecho, Rust es muy genial. Así que realmente podrías hacer una aplicación de escritorio nativa usando Tauri y esto y simplemente dar a la gente su propio JavaScript. Creo que eso es realmente genial, especialmente si está conectado a su propia cuenta abierta de AI que realmente los conoce. Hay muchas formas en las que puedes llevar esto adelante, pero lo voy a dejar aquí. Una última cosa para Tauri.app, si querías investigar eso. Pero lo voy a dejar aquí. Muchas gracias por entretener esta divertida pequeña sesión, y espero que haya sido significativa y valiosa para el resto de ustedes. Si te gustaría apoyarme, nuestro trabajo de DevRel, no dudes en seguirme. Y con eso, quiero agradecerte mucho por tenerme, y espero que disfrutes el resto de la conferencia. ¡Adiós!
Comments