00:00:00(música animada)
00:00:01Cloudflare ha anunciado recientemente los "dynamic workers",
00:00:04una primitiva de worker de bajo nivel
00:00:06que un worker ya existente puede crear mediante programación.
00:00:09Son cien veces más rápidos y eficientes en memoria
00:00:12que un contenedor tradicional, ya que se ejecutan en V8 isolates.
00:00:16Y como son tan baratos,
00:00:18puedes generar tantos como quieras
00:00:20para ejecutar código generado por IA, vistas previas de desarrollo,
00:00:23automatizaciones personalizadas y mucho más.
00:00:25Incluso dijeron que puedes ejecutar un millón de dynamic workers
00:00:29por segundo si quisieras.
00:00:31Pero, ¿el hecho de que solo se pueda ejecutar
00:00:33JavaScript en ellos limita su uso?
00:00:36Suscríbete y vamos a descubrirlo.
00:00:37(música animada)
00:00:40El año pasado hice un video sobre los sandboxes de Cloudflare,
00:00:44que son básicamente contenedores Linux de corta duración
00:00:47que se ejecutan sobre un "durable object".
00:00:49Si eso no te ha dicho nada,
00:00:50entonces ve a echarle un vistazo al video.
00:00:52Pero son perfectos si quieres un contenedor de SO completo
00:00:55con sistema de archivos y la capacidad de ejecutar casi cualquier lenguaje
00:00:59y cualquier binario.
00:01:01Pero si quieres algo un poco más rápido,
00:01:03en realidad mucho más rápido y mucho más ligero,
00:01:06con la capacidad de ejecutar sandboxes concurrentes ilimitados
00:01:09en algo que tiene los mismos límites que un worker normal,
00:01:12entonces quizás prefieras un dynamic worker.
00:01:15Veamos cómo configurar uno.
00:01:16Aquí hay un worker básico que acabo de crear con Wrangler,
00:01:19lleno de algunos errores de TypeScript,
00:01:21tal vez porque olvidé ejecutar los tipos de Wrangler.
00:01:23Pero en nuestro archivo de configuración de Wrangler,
00:01:26he añadido este array "worker_loaders"
00:01:28con un binding llamado "loader".
00:01:30Puedes llamarlo como quieras,
00:01:32pero elegí "loader" porque es más convencional.
00:01:34Y este binding nos permite crear
00:01:37y controlar otros workers.
00:01:38En el código actualizado, tenemos una nueva constante de worker,
00:01:42que utiliza el binding del loader con estos valores.
00:01:45Puedes imaginar esto como un archivo de configuración de Wrangler
00:01:49para el worker anidado,
00:01:50donde la fecha de compatibilidad le indica al worker
00:01:53qué versión del entorno de ejecución debe usar.
00:01:55Y aquí está el código que va a ejecutar.
00:01:57Como puedes ver, el código es muy similar
00:01:59al de un propio worker.
00:02:00Tiene una función fetch
00:02:02con los argumentos request, env y context.
00:02:05Y todo lo que hace aquí es responder
00:02:06con "hello world from the sandbox".
00:02:08Luego hemos impedido todo acceso a la red,
00:02:10ejecutando la función fetch con los argumentos de la solicitud
00:02:13del worker inicial y devolviendo los resultados.
00:02:16Si ejecutamos nuestro worker localmente y hacemos curl a localhost,
00:02:19deberíamos ver "hello from the sandbox".
00:02:21Pero si volvemos a ejecutar esa misma solicitud curl,
00:02:24obtendremos un error.
00:02:24Y esto se debe a que ahora mismo
00:02:26estamos cargando un worker totalmente nuevo.
00:02:28Pero lo que podemos hacer en su lugar es obtener un worker existente,
00:02:31al que daremos el nombre de "worker one",
00:02:33y luego ejecutar el código como una función asíncrona.
00:02:35Esto significa que ahora si ejecutamos curl, obtenemos "hello from the sandbox".
00:02:38Pero si lo ejecutamos de nuevo, obtiene la información
00:02:41del sandbox de "worker one" ya existente.
00:02:43Lo que acabo de mostrar
00:02:45ha sido, por supuesto, un ejemplo muy sencillo,
00:02:47pero se pueden hacer cosas geniales con los dynamic workers
00:02:50como definir bindings personalizados,
00:02:52como este método post de chatroom para crear un stub,
00:02:55con el que el worker se comunica usando cap'n proto,
00:02:57sobre el cual, sí, ya hemos hecho un video,
00:02:59así que ve a verlo si te interesa.
00:03:00Puedes usar dependencias de NPM como Hono
00:03:03y empaquetarlas usando la función "create worker".
00:03:05E incluso puedes interceptar solicitudes salientes
00:03:08para hacer cosas como inyectar credenciales.
00:03:10Pero uno de los grandes motivos para usar dynamic workers
00:03:13es ejecutar código generado por agentes de IA.
00:03:17Así que vamos a intentar hacerlo.
00:03:18Aquí hay algo de código del recetario de E2B
00:03:21que utiliza el SDK de Anthropic para ejecutar Sonnet 3.5
00:03:25con este prompt de sistema y una herramienta personalizada
00:03:28para ejecutar algo de Python en un cuaderno Jupyter.
00:03:31La forma en que esto funciona es que detectará
00:03:33cuándo se utiliza la herramienta personalizada
00:03:34y luego la ejecutará dentro del sandbox de E2B,
00:03:38cuyo código podemos ver por aquí.
00:03:40Ahora lo ejecuta con este prompt muy específico
00:03:42para calcular el valor de pi usando el método de Montecarlo
00:03:46en mil iteraciones.
00:03:47Y como tiene acceso al sistema de archivos,
00:03:50puede crear este archivo image.png
00:03:52y guardarlo para que el usuario lo descargue
00:03:54o para lo que el usuario quiera.
00:03:56Desafortunadamente, los dynamic workers no tienen acceso
00:03:58a un sistema de archivos,
00:04:00aunque pueden crear uno virtual
00:04:02con esta librería de shell.
00:04:04Pero debido a que se ejecutan a través de un worker,
00:04:06podemos proporcionarle detalles como un bucket R2,
00:04:08que es la versión de S3 de Cloudflare,
00:04:11en el que se puede guardar la imagen.
00:04:12Si miramos el código,
00:04:14que es similar al de E2B,
00:04:16primero podemos ver el prompt de sistema que se está utilizando.
00:04:19Y la herramienta personalizada de ejecución de Python
00:04:22que en este caso no utiliza un cuaderno Jupyter,
00:04:25pero sí genera un SVG de los visuales.
00:04:28Y aquí tenemos el código para el worker
00:04:30que, además de ejecutar JavaScript, también puede ejecutar Python.
00:04:33Podemos ver aquí que está usando Sonnet 3.5.
00:04:35Aquí está el prompt que se utiliza.
00:04:37Aquí el código del agente se ejecuta en el sandbox.
00:04:41Y la respuesta del sandbox
00:04:43vuelve al worker principal,
00:04:45que busca en ella el código SVG
00:04:47y luego lo guarda en R2.
00:04:49Si visitamos esa URL, tarda un poco,
00:04:51pero sí genera la página
00:04:53con la información relevante de Claude.
00:04:55Y si bajamos,
00:04:56podemos ver este SVG que se está cargando desde R2.
00:05:01Se ve muy diferente al de E2B,
00:05:03pero confío en que Claude Sonnet
00:05:04ha producido la información correcta.
00:05:06Y por supuesto mencioné que también es posible
00:05:09generar mediante programación tantos dynamic workers como quieras,
00:05:13lo cual puedes hacer con un código como este.
00:05:16Ese es un bucle for que crea nuevos workers
00:05:19basados en el valor de la API.
00:05:21Y también comprueba si un worker ya existe
00:05:23y lo reutiliza si es así.
00:05:25El código que ejecuta es básicamente un console log
00:05:27y una respuesta del worker
00:05:29con el ID específico del worker
00:05:31basado en el índice del bucle for.
00:05:32Así que con el código en marcha,
00:05:34podría generar 50 dynamic workers nuevos
00:05:36y podemos ver que todos se crean al instante.
00:05:40Eso fue muy rápido.
00:05:41Ahora intentémoslo con 10.000,
00:05:43pero no lo voy a hacer localmente
00:05:44porque no quiero que mi máquina explote.
00:05:46Así que he desplegado mi worker padre en Cloudflare
00:05:49para poder usar su infraestructura.
00:05:50Aquí voy a generar 10.000 workers diferentes.
00:05:53Y si pulso enter, todos se crean increíblemente rápido.
00:05:56Podemos ver que hay una página de 30 de ellos por aquí,
00:05:59así que puedo seguir avanzando para ver todos los diferentes IDs de los workers.
00:06:03Y de hecho, cuanto más avanzo, más páginas muestra.
00:06:05Y puedo comunicarme con un worker específico
00:06:07como el worker 1156,
00:06:09que responde con "hello from worker 1156".
00:06:12Así que esa es una rápida visión general de los dynamic workers
00:06:15que ya están siendo utilizados por Cloudflare para el modo código
00:06:18y por Zite para ejecutar aplicaciones generadas por LLM.
00:06:21Pero debo mencionar que aunque ahora son gratis,
00:06:24no lo serán para siempre.
00:06:25Así que, aunque puedas ejecutar un millón de dynamic workers
00:06:28por segundo, quizás prefieras esperar
00:06:30a menos que tengas los bolsillos llenos.
00:06:32Y ya que estamos con el tema de Cloudflare,
00:06:34si quieres saber más sobre su SDK de código abierto VIVE,
00:06:38que te permite crear generadores de apps como v0 y Lovable,
00:06:42entonces echa un vistazo al siguiente video.