00:00:00(ритмичная музыка)
00:00:01Cloudflare недавно анонсировали динамические воркеры —
00:00:04низкоуровневый примитив Worker,
00:00:06который может программно создаваться существующим воркером.
00:00:09Они в сто раз быстрее и эффективнее по памяти,
00:00:12чем традиционные контейнеры, так как работают на изолятах V8.
00:00:16И поскольку они такие дешевые,
00:00:18вы можете запускать их сколько угодно
00:00:20для выполнения кода, созданного ИИ, превью разработок,
00:00:23кастомной автоматизации и многого другого.
00:00:25Они даже заявили, что можно запускать миллион воркеров
00:00:29в секунду, если возникнет такая необходимость.
00:00:31Но не ограничивает ли их использование тот факт,
00:00:33что на них можно запускать только JavaScript?
00:00:36Подписывайтесь, и давайте выясним.
00:00:37(ритмичная музыка)
00:00:40В прошлом году я делал видео о песочницах Cloudflare,
00:00:44которые, по сути, являются эфемерными Linux-контейнерами,
00:00:47работающими на Durable Object.
00:00:49Если для вас это звучит как абракадабра,
00:00:50то обязательно посмотрите то видео.
00:00:52Они идеальны, если вам нужен полноценный контейнер ОС
00:00:55с файловой системой и возможностью запускать почти любой язык
00:00:59и любые бинарные файлы.
00:01:01Но если вам нужно что-то более быстрое,
00:01:03точнее, гораздо более быстрое и легкое,
00:01:06с возможностью запускать неограниченное число песочниц
00:01:09с теми же лимитами, что и у обычного воркера,
00:01:12то вам стоит присмотреться к динамическим воркерам.
00:01:15Давайте разберемся, как их настроить.
00:01:16Вот базовый воркер, который я только что создал через Wrangler,
00:01:19полный ошибок TypeScript,
00:01:21возможно, потому что я забыл запустить "wrangler types".
00:01:23Но в нашем конфигурационном файле Wrangler
00:01:26я добавил массив "worker_loaders"
00:01:28с привязкой под названием "loader".
00:01:30Назвать её можно как угодно,
00:01:32но я выбрал "loader", так как это более стандартно.
00:01:34И эта привязка позволяет нам создавать
00:01:37и контролировать другие воркеры.
00:01:38Итак, в обновленном коде у нас есть константа "new worker",
00:01:42которая использует привязку "loader" с этими значениями.
00:01:45Это можно представить как файл конфигурации Wrangler
00:01:49для вложенного воркера,
00:01:50где дата совместимости (compatibility_date) указывает,
00:01:53какую версию рантайма ему следует использовать.
00:01:55А вот и код, который он будет выполнять.
00:01:57Как видите, код очень похож
00:01:59на код самого воркера.
00:02:00В нем есть функция fetch
00:02:02с аргументами request, env и context.
00:02:05И всё, что он делает здесь, — это отвечает
00:02:06"hello world from the sandbox".
00:02:08Затем мы запретили любой доступ к сети,
00:02:10запускаем функцию fetch с аргументами запроса
00:02:13из исходного воркера и возвращаем результат.
00:02:16Если мы запустим воркер локально и выполним curl localhost,
00:02:19мы должны увидеть приветствие из песочницы.
00:02:21Но если мы выполним тот же curl-запрос снова,
00:02:24то получим ошибку.
00:02:24Это происходит потому, что в данный момент
00:02:26мы загружаем абсолютно новый воркер.
00:02:28Но вместо этого мы можем вызвать существующий воркер,
00:02:31которому дадим имя "worker-1",
00:02:33и запустить код как асинхронную функцию.
00:02:35Теперь при запуске curl мы получаем ответ из песочницы.
00:02:38И при повторном запуске он берет информацию
00:02:41из уже существующей песочницы "worker-1".
00:02:43То, что я только что показал,
00:02:45был, конечно, очень простой пример,
00:02:47но с динамическими воркерами можно делать крутые вещи,
00:02:50например, определять кастомные привязки,
00:02:52как этот метод POST для чат-комнаты, чтобы создать стаб,
00:02:55с которым воркер общается через Cap'n Proto over Web,
00:02:57о котором — да, мы уже делали видео,
00:02:59так что посмотрите его, если интересно.
00:03:00Вы можете использовать NPM-зависимости, такие как Hono,
00:03:03и бандлить их с помощью функции "create worker".
00:03:05И вы даже можете перехватывать исходящие запросы,
00:03:08чтобы, например, подставлять учетные данные.
00:03:10Но одна из главных причин использовать динамические воркеры —
00:03:13это выполнение кода, сгенерированного ИИ-агентами.
00:03:17Давайте попробуем это сделать.
00:03:18Вот код из сборника рецептов E2B,
00:03:21использующий Anthropic SDK для запуска Sonnet 3.5
00:03:25с этим системным промптом и кастомным инструментом
00:03:28для выполнения Python в Jupyter Notebook.
00:03:31Это работает так: система обнаруживает,
00:03:33когда используется кастомный инструмент,
00:03:34и запускает его внутри песочницы E2B,
00:03:38код которой мы видим вот здесь.
00:03:40Она запускает его со специфическим промптом:
00:03:42вычислить значение числа Пи методом Монте-Карло
00:03:46за тысячу итераций.
00:03:47И так как у неё есть доступ к файловой системе,
00:03:50она может создать файл image.png
00:03:52и сохранить его для скачивания пользователем
00:03:54или для любых других целей.
00:03:56К сожалению, у динамических воркеров нет доступа
00:03:58к реальной файловой системе,
00:04:00хотя они могут создать виртуальную
00:04:02с помощью этой библиотеки оболочки.
00:04:04Но поскольку они работают через Worker,
00:04:06мы можем предоставить им такие ресурсы, как бакет R2 —
00:04:08версию S3 от Cloudflare —
00:04:11в котором можно сохранить изображение.
00:04:12Посмотрим на код,
00:04:14который похож на пример от E2B.
00:04:16Сначала мы видим системный промпт.
00:04:19Затем кастомный инструмент выполнения Python,
00:04:22который в данном случае не использует Jupyter,
00:04:25но генерирует SVG-визуализацию.
00:04:28А вот код воркера,
00:04:30который помимо JavaScript может запускать и Python.
00:04:33Здесь видно, что используется Sonnet 3.5 (зачеркнуто) — 4.6.
00:04:35Вот используемый промпт.
00:04:37Здесь код агента выполняется в песочнице.
00:04:41Ответ из песочницы
00:04:43возвращается в основной воркер,
00:04:45который ищет в нем код SVG
00:04:47и сохраняет его в R2.
00:04:49Если мы перейдем по URL — это займет время,
00:04:51но страница действительно генерируется
00:04:53с соответствующей информацией от Claude.
00:04:55И если прокрутить вниз,
00:04:56мы увидим этот SVG, загружаемый из R2.
00:05:01Он выглядит иначе, чем в примере E2B,
00:05:03но я верю, что Claude Sonnet
00:05:04выдал корректную информацию.
00:05:06И, конечно, я упоминал, что можно
00:05:09программно запускать сколько угодно динамических воркеров,
00:05:13что делается с помощью такого кода.
00:05:16Это цикл for, который создает новые воркеры
00:05:19на основе данных из API.
00:05:21Он также проверяет, существует ли уже воркер,
00:05:23и использует его повторно, если да.
00:05:25Запускаемый код — это просто console.log
00:05:27и ответ от воркера
00:05:29с конкретным ID воркера,
00:05:31основанным на индексе цикла.
00:05:32Итак, запустив этот код,
00:05:34я смог мгновенно создать 50 новых
00:05:36динамических воркеров.
00:05:40Это было очень быстро.
00:05:41Теперь попробуем с 10 000,
00:05:43но я не буду делать это локально,
00:05:44чтобы мой компьютер не взорвался.
00:05:46Поэтому я развернул родительский воркер в Cloudflare,
00:05:49чтобы использовать их инфраструктуру.
00:05:50Итак, я собираюсь запустить 10 000 разных воркеров.
00:05:53Нажимаю Enter, и все они создаются безумно быстро.
00:05:56Здесь мы видим страницу с 30 воркерами,
00:05:59и я могу листать дальше, чтобы увидеть все ID.
00:06:03И чем дальше я листаю, тем больше страниц появляется.
00:06:05Я могу обратиться к конкретному воркеру,
00:06:07например, к воркеру 1156,
00:06:09который отвечает: "hello from worker 1156".
00:06:12Это был краткий обзор динамических воркеров,
00:06:15которые уже используются Cloudflare для Code Mode
00:06:18и Zite для запуска приложений, созданных LLM.
00:06:21Но стоит упомянуть: хотя сейчас они бесплатны,
00:06:24так будет не всегда.
00:06:25Так что, хотя вы и можете запускать миллион воркеров
00:06:28в секунду, лучше попридержать коней,
00:06:30если только у вас не бездонные карманы.
00:06:32И раз уж мы заговорили о Cloudflare,
00:06:34если хотите узнать больше об их открытом Vibe SDK,
00:06:38который позволяет создавать генераторы вроде v0 или Lovable,
00:06:42то смотрите следующее видео.