00:00:00Итак, Cloudflare работает над чем-то под названием Artifacts — это распределенная файловая система, которая
00:00:05совместима с Git, создана специально для агентов и позволяет программно создавать, форкать
00:00:10или удалять тысячи репозиториев, независимо от их размера, для таких задач, как параллельные
00:00:15PR-ревью, автоматизированный рефакторинг больших кодовых баз и агентские рабочие области для каждой сессии.
00:00:20Но если это построено на базе Durable Objects, означает ли это, что нужно использовать JavaScript
00:00:25и нельзя получить доступ к командной оболочке для запуска Git?
00:00:28Подписывайтесь, и давайте узнаем!
00:00:33GitHub был создан для людей, а не для агентов, а это значит, что им не нужны никакие социальные
00:00:37аспекты, вроде фолловеров или дискуссий, но агенты очень хорошо разбираются в Git, это есть в их
00:00:42обучающих данных.
00:00:43Поэтому Cloudflare реализовали базовую версию Git на языке Zig, скомпилировали её в Wasm и поместили в
00:00:49Durable Object, чтобы он выполнял роль Git-сервера.
00:00:52В то же время, клиентом может быть что угодно, например, воркер, использующий isomorphic-git
00:00:57внутри, или использующий протокол Git и даже HTTP-клиент, чтобы вы могли подключаться
00:01:03к нему, даже если не используете JavaScript.
00:01:05К сожалению, на момент записи у меня нет доступа к Artifacts, так как проект
00:01:10находится в закрытой бета-версии, но по нему много документации, что означает, что я могу создать демо
00:01:15с кодом из этой документации, и, возможно, когда выйдет публичная бета-версия, вы сможете проверить,
00:01:19работает ли мой код на самом деле.
00:01:20Итак, мы собираемся построить инструмент, который берет список задач для конкретного
00:01:24репозитория и выполняет все эти задачи параллельно, форкая репозиторий множество раз и запуская
00:01:29каждую задачу в отдельном артефакте в облачном репозитории на базе Durable Object.
00:01:34Давайте посмотрим, как это работает.
00:01:35Я начал с того, что следовал документации по Artifacts в разделе "начало работы для воркеров",
00:01:39поэтому я использовал эту команду, а текст после неё — это просто имя проекта,
00:01:44оно может быть любым.
00:01:45Я выполнил все эти шаги, что в итоге дало мне базовый код воркера.
00:01:49Воркеры для Artifacts немного производительнее, чем использование REST API, так как они
00:01:53делают меньше обращений к серверу.
00:01:55После этого вам нужно добавить привязки Artifacts в ваш файл wrangler.jsonc или toml,
00:02:00а затем повторно сгенерировать типы.
00:02:02Документация здесь фокусируется на создании нового репозитория, поэтому используется привязка Artifacts
00:02:07с методом "create" и именем репозитория.
00:02:09Это создает имя, предоставляя токен и удаленный адрес (remote).
00:02:13Удаленный адрес — это местоположение артефакта, а токен или токен авторизации также необходим,
00:02:17чтобы дать вам доступ к нему.
00:02:18И, конечно, вы можете использовать протокол Git, применяя этот адрес и токен для взаимодействия
00:02:22с вашим артефактом.
00:02:23Но мы поступим иначе.
00:02:25Вместо создания абсолютно нового репозитория в Durable Object с Artifacts, мы сначала
00:02:29проверим, существует ли уже репозиторий с названием "baseline".
00:02:31Если его нет, мы импортируем Git-репозиторий, дадим ему имя "baseline"
00:02:35и вернем это значение.
00:02:39Конечно, если вы посмотрите API документацию для привязок воркеров, вы увидите больше
00:02:43параметров, которые можно добавить к методу "import".
00:02:45Но после того, как мы получили существующий репозиторий, мы можем делать с ним очень крутые вещи.
00:02:49Итак,
00:02:50вот задачи, которые я хочу выполнить с репозиторием. Я, конечно, захардкодил
00:02:53их, но они могут подаваться на вход или через какой-нибудь интерфейс.
00:02:56Здесь, внутри дефолтного экспорта воркера, у меня есть SDK Anthropic, а также мой
00:03:00репозиторий baseline.
00:03:02Я собираюсь пройтись циклом по всем задачам, и здесь я форкаю репозиторий с
00:03:06этим именем.
00:03:07Затем у нас есть эта функция (я разберу её позже), которая запускает задачу внутри
00:03:10форкнутого репозитория, заставляет агента внести изменения и возвращает его резюме.
00:03:15То есть, последнее, что сказал агент, а затем, после каждого цикла for, я возвращаю эту
00:03:19информацию.
00:03:20Я возвращаю имя задачи, имя форка, удаленный адрес и токен,
00:03:23чтобы мы могли получить доступ к нему в любое время, проверить, хороши ли изменения, и увидеть резюме
00:03:27того, что было сделано.
00:03:28Прямо сейчас привязки воркеров не дают вам возможности делать "pull", "commit" и "push".
00:03:33Поэтому в моем коде мне пришлось делать это с помощью isomorphic-git, а затем использовать систему хранения в оперативной памяти,
00:03:38чтобы временно хранить изменения.
00:03:39Итак, в агентском коде мы создаем файловую систему в памяти, а затем у нас есть
00:03:43системный промпт, который говорит агенту внести соответствующие изменения, а затем закоммитить их.
00:03:47код.
00:03:48Мы клонируем форкнутый репозиторий, используя предоставленный удаленный адрес, а также
00:03:51токен.
00:03:52И затем мы определяем инструменты: "read", "write" и "commit".
00:03:55Здесь мы выбираем модель, даем ей системный промпт и передаем задачу
00:03:59как пользовательское сообщение.
00:04:00Остальной код — это стандартный агентский цикл.
00:04:02Итак, если есть вызов инструмента, прекращаем рассуждения и выполняем вызов, в нашем случае — "read", "write"
00:04:07или "commit", который также выполняет "push" кода после коммита.
00:04:10Преимущество артефакта в том, что весь этот код будет существовать в Durable Object,
00:04:14храниться в базе данных SQLite этого объекта, и если Durable Object упадет, информация
00:04:20может быть извлечена из базы SQLite в любой момент, когда он вернется в работу.
00:04:23А ниже мы продолжаем рассуждения модели после вызова инструмента перед возвращением
00:04:27последнего сообщения от модели.
00:04:29Я знаю, очень сложно представить, как всё это происходит, раз я не могу
00:04:32запустить этот код, но надеюсь, вы можете увидеть, что можно сделать с артефактами и
00:04:37каков их полный потенциал.
00:04:38Представьте, если бы у вас был интерфейс для просмотра всех изменений, происходящих в этих артефактах,
00:04:42и вы могли бы общаться с отдельными агентами или с единым агентом-оркестратором, чтобы вносить изменения
00:04:46в разные репозитории.
00:04:48Кстати об агенте-оркестраторе: мы могли бы иметь одного воркера, который координировал бы
00:04:52все эти изменения и объединял их в основной репозиторий после того, как агент-ревьюер
00:04:56проверит код.
00:04:57Мы можем даже комбинировать артефакты с динамическими воркерами, чтобы агенты могли запускать измененный ими код
00:05:02и проверять, работает ли он.
00:05:03А если это не JavaScript, мы можем использовать песочницы Cloudflare для запуска любого языка,
00:05:07какого захотим, и даже выполнять shell-команды.
00:05:09Не говоря уже о браузере Cloudflare, который запускает браузер на базе Puppeteer, чтобы
00:05:13модель могла посмотреть и увидеть, корректно ли реализован код, если это фронтенд-изменение.
00:05:18Честно говоря, я получил много удовольствия, размышляя о возможностях артефактов, даже несмотря на то, что
00:05:21пока не могу их запустить.
00:05:22Но одна вещь, которую я заметил: нет команды "git diff".
00:05:25Она не представлена в API привязок воркера или в isomorphic-git.
00:05:30Так что, возможно, единственный способ сделать "git diff" — через протокол Git, или они могут добавить это
00:05:35в будущем.
00:05:36В любом случае, прямо сейчас, если вы хотите сделать это без использования протокола Git, полагаю, можно использовать
00:05:40isomorphic-git, применяя "git log", чтобы найти Git-дерево, пройтись по нему и сравнить
00:05:45различия.
00:05:46В любом случае, я думаю, что это очень крутой релиз от Cloudflare.
00:05:50И хотя существуют другие инструменты для файловых систем, такие как S3 Files, ZeroFS и JuiceFS, которые
00:05:55уже существуют, я не думаю, что эти варианты совместимы с Git, что является очень крутой функцией
00:05:59и делает их более дружелюбными к агентам.
00:06:01Кстати об S3, если вы когда-нибудь хотели запустить его локально на своей машине, то посмотрите
00:06:05это видео от Джоша, которое в точности рассказывает, как это сделать.