00:00:00Cloudflow는 Artifacts라는 것을 작업 중인데, 이는 분산 파일 시스템으로
00:00:05Git과 호환되며 에이전트를 위해 설계되었습니다. 프로그래밍 방식으로 생성, 포크
00:00:10또는 삭제할 수 있으며, 크기에 상관없이 수천 개의 저장소를 다룰 수 있습니다. 예를 들어 병렬
00:00:15PR 검토, 대규모 코드베이스의 자동 리팩토링, 세션별 에이전트 작업 공간 등을 위한 것입니다.
00:00:20하지만 이게 Durable Objects 위에 구축되었다면, JavaScript만 사용해야 하고
00:00:25Git을 실행하기 위한 셸 명령에 접근할 수 없다는 의미일까요?
00:00:28구독하고 함께 알아봅시다!
00:00:33GitHub은 인간을 위해 만들어졌지, 에이전트를 위해 만들어진 것이 아닙니다. 즉, 그들은 어떤 사회적
00:00:37측면이나 팔로워 기능, 토론 시작 기능이 필요 없습니다. 하지만 에이전트는 Git에 매우 능숙하며, 이는 그들의
00:00:42학습 데이터에 포함되어 있습니다.
00:00:43그래서 Cloudflare는 Zig로 기본적인 Git 구현을 만들고, Wasm으로 컴파일하여
00:00:49Git 서버 역할을 하도록 Durable Object에 넣었습니다.
00:00:52한편 클라이언트 자체는 원하는 무엇이든 될 수 있습니다. 예를 들어 Isomorphic Git을 사용하는 워커를
00:00:57워커 내부에서 사용하거나 Git 프로토콜, 심지어 HTTP 클라이언트를 사용하여
00:01:03JavaScript를 사용하지 않는 환경에서도 연결할 수 있습니다.
00:01:05현재 녹화 시점에서는 안타깝게도 Artifacts가 비공개 베타 상태라
00:01:10직접 접근할 수는 없지만, 관련 문서가 많이 나와 있어서 그
00:01:15문서의 코드로 데모를 만들 수 있습니다. 나중에 공개 베타로 출시되면
00:01:19제 코드가 실제로 작동하는지 확인해 보실 수 있을 겁니다.
00:01:20이제 할 일은 특정 저장소에 대한 작업 목록을 가져와서
00:01:24해당 저장소를 여러 번 포크하여 모든 작업을 병렬로 실행하고
00:01:29Durable Object의 Cloud 저장소에 있는 각 아티팩트에서 각 작업을 실행하는 도구를 만드는 것입니다.
00:01:34어떻게 작동하는지 살펴봅시다.
00:01:35우선 워커를 위한 Artifacts 시작하기 문서를 따라 시작했습니다.
00:01:39이 명령어를 사용했고, 명령어 뒤의 텍스트는 프로젝트 이름으로
00:01:44원하는 대로 정할 수 있습니다.
00:01:45모든 단계를 따랐더니 기본적인 워커 코드가 생성되었습니다.
00:01:49Artifacts용 워커는 REST API를 사용하는 것보다 라운드 트립이 적어서
00:01:53약간 더 성능이 좋습니다.
00:01:55그다음, wrangler.jsonc 또는 toml 파일에 Artifacts 바인딩을 추가하고
00:02:00타입을 다시 실행해야 합니다.
00:02:02문서에서는 새 저장소 생성에 초점을 맞추고 있으므로, Artifacts 바인딩의
00:02:07create 메서드와 저장소 이름을 사용합니다.
00:02:09이름을 생성하면 토큰과 원격 주소를 제공합니다.
00:02:13원격 주소는 아티팩트의 위치이고, 토큰이나 인증 토큰 또한
00:02:17접근 권한을 얻는 데 필요합니다.
00:02:18물론 원격 주소와 토큰을 사용하여 Git 프로토콜로
00:02:22아티팩트와 상호 작용할 수 있습니다.
00:02:23하지만 우리는 다르게 해볼 겁니다.
00:02:25Artifacts Durable Object에 새 저장소를 만드는 대신, 먼저
00:02:29baseline이라는 저장소가 존재하는지 확인하겠습니다.
00:02:31만약 존재하지 않는다면, Git 저장소를 가져온 다음
00:02:35baseline이라는 이름을 부여하고 그 값을 반환합니다.
00:02:39물론 워커 바인딩을 위한 API 문서를 확인하면 import 메서드에
00:02:43추가할 수 있는 매개변수들이 더 있다는 것을 알 수 있습니다.
00:02:45기존 저장소를 반환한 후에는 아주 멋진 일들을
00:02:49할 수 있습니다.
00:02:50여기 저장소에 수행하고 싶은 작업들이 있습니다. 물론 하드코딩해 두었지만,
00:02:53입력값이나 UI를 통해 추가할 수도 있습니다.
00:02:56워커 기본 내보내기 내부에는 Anthropic SDK와
00:03:00baseline 저장소가 있습니다.
00:03:02모든 작업을 순회하면서 이 이름으로
00:03:06저장소를 포크합니다.
00:03:07나중에 자세히 설명할 함수가 있는데, 이것이
00:03:10포크된 저장소 안에서 작업을 실행하고 에이전트가 변경을 수행하도록 하며 에이전트의 요약을 반환합니다.
00:03:15즉 에이전트가 마지막으로 한 말입니다. 포 루프가 끝날 때마다 이
00:03:19정보를 반환합니다.
00:03:20작업 이름, 포크 이름, 원격 주소, 토큰을 반환하여
00:03:23언제든지 변경 사항이 괜찮은지 확인할 수 있도록 하고, 수행된
00:03:27작업에 대한 요약도 함께 반환합니다.
00:03:28현재로서는 워커 바인딩이 풀(pull), 커밋, 푸시(push) 기능을 제공하지 않습니다.
00:03:33그래서 코드를 보면 Isomorphic Fetch를 사용했고, 변경 사항을 일시적으로 저장하기 위해
00:03:38인메모리 저장 시스템을 사용했습니다.
00:03:39에이전트 코드에서 인메모리 파일 시스템을 생성하고, 에이전트에게
00:03:43관련 변경 사항을 만들고 코드를 커밋하도록
00:03:47지시하는 시스템 프롬프트를 가지고 있습니다.
00:03:48제공된 원격 주소와 토큰을 사용하여 포크된 저장소를 클론합니다.
00:03:51그리고 읽기, 쓰기, 커밋이라는 도구들을 정의합니다.
00:03:52모델을 선택하고 시스템 프롬프트를 전달한 다음, 작업을
00:03:55사용자 메시지로 전달합니다.
00:03:59나머지 코드는 표준적인 에이전트 루프입니다.
00:04:00도구 호출이 있으면 추론을 멈추고 도구 호출을 실행합니다. 여기서는 읽기, 쓰기
00:04:02또는 커밋을 수행하며, 커밋 후에는 코드 푸시까지 실행됩니다.
00:04:07아티팩트를 사용하면 모든 코드가 Durable Object 안에 존재하며
00:04:10객체의 SQLite 데이터베이스에 저장된다는 장점이 있습니다. Durable Object가 다운되어도
00:04:14다시 살아나면 언제든지 SQLite 데이터베이스에서 정보를 검색할 수 있습니다.
00:04:20도구 호출 후에 모델의 추론을 계속하고 모델의
00:04:23최신 메시지를 반환합니다.
00:04:27코드를 직접 실행할 수 없어서 이 모든 과정이 일어나는 것을 시각화하기가 매우 어렵다는 것을 잘 알지만,
00:04:29아티팩트로 무엇을 할 수 있는지, 그리고 그 잠재력을
00:04:32어느 정도 이해하셨기를 바랍니다.
00:04:37아티팩트에서 일어나는 모든 변경 사항을 볼 수 있는 UI가 있고,
00:04:38개별 에이전트나 단일 오케스트레이터 에이전트와 통신하여
00:04:42다른 저장소들에 변경 사항을 적용할 수 있다고 상상해 보세요.
00:04:46오케스트레이터 에이전트 이야기가 나와서 말인데, 모든 변경 사항을 조율하고
00:04:48검토자 에이전트가 코드를 확인한 후 메인 저장소에 병합하는
00:04:52단일 워커를 둘 수도 있습니다.
00:04:56아티팩트와 동적 워커를 결합하여 에이전트가 변경한 코드를 실행해 보고
00:04:57작동 여부를 확인할 수도 있습니다.
00:05:02JavaScript 코드가 아니라면 Cloudflare 샌드박스를 사용하여 원하는 언어로 실행하고
00:05:03셸 명령까지 실행할 수 있습니다.
00:05:07프런트엔드 변경 사항이 올바르게 구현되었는지 모델이 Puppeteer 브라우저로
00:05:09확인할 수 있는 Cloudflare 브라우저 옵션도 있습니다.
00:05:13아직 실행해 볼 수는 없지만, 아티팩트의 가능성에 대해 생각하는 것만으로도 정말 즐거웠습니다.
00:05:18하지만 한 가지 눈에 띄는 점은 'git diff' 명령이 없다는 것입니다.
00:05:21워커 바인딩 API나 Isomorphic Git에도 노출되어 있지 않습니다.
00:05:22아마도 유일한 방법은 Git 프로토콜을 통하는 것일 테고, 나중에 추가될 수도 있겠죠.
00:05:25어쨌든 지금 당장은 Git 프로토콜을 사용하지 않고 하려면
00:05:30Isomorphic Git의 'git log'를 사용하여 Git 트리를 찾고, 트리를 내려가면서
00:05:35차이점을 비교하는 방식을 써야 할 것 같습니다.
00:05:36어쨌든, 이것은 Cloudflare의 매우 멋진 릴리스라고 생각합니다.
00:05:40S3 파일, ZeroFS, JuiceFS 같은 파일 시스템 도구들이
00:05:45이미 존재하지만, Git과 호환되지 않는다는 점에서 아티팩트는 매우 멋진 기능이며
00:05:46에이전트 친화적입니다.
00:05:50S3 이야기가 나와서 말인데, 로컬 기기에서 S3를 실행하고 싶다면
00:05:55그 방법을 정확히 알려주는 Josh의 영상을 확인해 보세요.
00:05:59더 에이전트 친화적입니다.
00:06:01S3 이야기가 나와서 말인데, 만약 S3를 로컬 기기에서 실행해 보고 싶었다면,
00:06:05정확한 방법을 알려주는 Josh의 이 영상을 확인해 보세요.