Transcript
00:00:00이것은 Astro 팀이 만든 AI 에이전트 구축을 위한 오픈 소스 프레임워크인 Flu입니다.
00:00:04기본적으로 Claude Code를 하네스로 사용하여 100% 프로그래밍이 가능하게 만듭니다.
00:00:09따라서 기술, 도구, 샌드박스와 같은 기능들이 기본적으로 지원되며,
00:00:13단 몇 줄의 TypeScript 코드만으로 완전한 기능을 갖춘 에이전트 하네스를 만들고 어디에나 배포할 수 있습니다.
00:00:19그런데 Astro 팀은 왜 애초에 에이전트 하네스 프레임워크를 만들기로 결정했을까요?
00:00:23그리고 샌드박스로 에이전트를 훨씬 저렴하게 실행할 수 있는 멋진 비결은 무엇일까요?
00:00:28구독 버튼을 누르고 함께 알아봅시다.
00:00:33Flu는 Astro의 공동 창립자가 만들었는데, 재미있게도,
00:00:36처음부터 에이전트 하네스 프레임워크를 만들려고 했던 것은 아니었습니다.
00:00:39Fred과 팀은 Astro의 자체 GitHub 저장소 안에서 AI 워크플로우를 실행하기 위해 Flu를 만들었습니다.
00:00:44하지만 Amplitude의 다른 엔지니어가 이를 접하게 되면서,
00:00:47팀은 이것이 모든 에이전트가 사용할 수 있는 도구라는 것을 깨달았습니다.
00:00:51생각해보면 당연한 일이죠.
00:00:53예를 들어 Claude Code를 살펴보겠습니다.
00:00:55터미널이나 UI 채팅 인터페이스 아래에는 하네스가 있어서,
00:00:58MCP 서버의 커스텀 도구를 지원하고, Cloud MD 파일을 읽으며,
00:01:02샌드박스 지원 및 재사용 가능한 기술을 지원합니다.
00:01:05이러한 기능과 그 외 많은 것들이 모델이 실제 작업을 수행할 수 있게 해주는데,
00:01:08Flu를 사용하면 단 몇 줄의 코드로 이 모든 것을 얻을 수 있습니다.
00:01:11Flu는 그 자체로 최소한의 에이전트 하네스인 Pi를 기반으로 구축되었으며,
00:01:16OpenClaw가 구축된 것과 같은 기반 위에,
00:01:18Pi의 에이전트 코어를 감싸는 실제 프레임워크를 제공합니다.
00:01:21Flu는 실제로 샌드박스를 이용해 훨씬 저렴하게 실행할 수 있는 영리한 기능을 가지고 있는데,
00:01:25이에 대해서는 나중에 이야기하겠습니다.
00:01:26하지만 다시 Claude Code의 예시로 돌아가서,
00:01:28그것은 에이전트를 조종하는 사람이 배후에 있다고 가정하는데,
00:01:31보통은 그렇습니다.
00:01:33하지만 Flu는 그런 제한이 없습니다.
00:01:35Flu를 사용하면 Claude Code처럼 사람의 입력이 필요한 에이전트를 만들 수도 있고,
00:01:38사람이 전혀 필요 없는 워크플로우를 만들 수도 있는데,
00:01:42이는 매우 구체적이고
00:01:44자주 변경할 필요가 없는 에이전트 프로세스에 유용합니다.
00:01:46이제 여러분은 이렇게 생각하실지도 모릅니다.
00:01:47이것은 Mastra나 Vercel AI SDK와 매우 비슷하게 들리는데,
00:01:52그 차이점에 대해서는 나중에 이야기하겠습니다.
00:01:54사실 간단한 데모를 진행하면 그 차이가 훨씬 명확해질 것입니다.
00:01:57그러니 시작해보겠습니다.
00:01:58먼저 Flu 런타임을 설치해야 하는데,
00:02:01이것은 여러분의 에이전트가 가져와서 실행하는 기반입니다.
00:02:04그리고 Flu CLI를 설치해야 하는데,
00:02:06이것이 여러분의 에이전트를 컴파일하고 서비스합니다.
00:02:08또한 Pi가 지원하는 많은 제공업체 중 하나에서 API 키를 설정해야 합니다.
00:02:13하지만 이 데모에서는 Anthropic을 사용할 예정이며,
00:02:15그런 다음 대상과 함께 flu init을 실행해야 합니다.
00:02:18그러면 CLI가 프로젝트를 패키징하는 방법을 알 수 있도록 flu 설정 파일이 생성됩니다.
00:02:22Node와 Cloudflare 중에서 선택할 수 있는데,
00:02:24그 차이에 대해서는 곧 설명해 드리겠습니다.
00:02:26이미 이 단계들을 마쳤으므로,
00:02:27이 파일들이 어떻게 생겼는지 살펴보겠습니다.
00:02:30빈 bun 프로젝트에서 나오는 일반적인 파일들은 다음과 같습니다.
00:02:33이 파일들 중 일부는 사용되지도 않습니다.
00:02:35index.ts 파일을 보면, 이것은 전혀 사용되지 않을 것입니다.
00:02:38readme 파일도 마찬가지입니다.
00:02:39하지만 실제로 사용될 파일은 flu config.ts 파일인데,
00:02:42이 파일은 내부적으로 V를 사용합니다.
00:02:45Cloudflare 대신 Node를 사용하도록 CLI를 설정했습니다.
00:02:47Node는 HONO 위에 HTTP 서버를 사용하고,
00:02:51Cloudflare는 프로젝트를 워커에 배포하며,
00:02:53지속성을 위해 Durable Object를 사용합니다.
00:02:55자, 그 단계를 마친 후에는,
00:02:56새 디렉터리를 만들어야 합니다.
00:02:57에이전트용 하나, 워크플로우용 하나를 만듭니다.
00:03:00워크플로우는 나중에 조금 더 자세히 살펴보겠지만,
00:03:01지금은 간단한 에이전트로 시작했습니다.
00:03:03여기에는 문서에 있는 코드가 포함되어 있습니다.
00:03:05기본적으로 모델을 설정하고
00:03:06몇 가지 지침을 추가하는데,
00:03:08이것이 시스템 프롬프트에 추가됩니다.
00:03:09그게 다입니다.
00:03:10기본 Flu 에이전트를 만드는 데 필요한 것은 그뿐입니다.
00:03:13실제로 작동하는지 봅시다.
00:03:14실행하려면 flu connect를 사용하면 되는데,
00:03:15이것이 에이전트를 빌드하고 실행합니다.
00:03:17그리고 TS 파일의 이름과 일치시켜서,
00:03:20hello world라고 적고,
00:03:21인스턴스 ID를 부여합니다.
00:03:22무엇이든 될 수 있습니다.
00:03:24로컬 1, 2, 3이 될 수도 있죠.
00:03:25하지만 많은 에이전트를 실행할 때는 유용하며,
00:03:27각 에이전트는 고유한 ID를 가질 수 있습니다.
00:03:29이것은 또한 Cloudflare에 배포할 때 유용한데,
00:03:31이 ID가 자체적인 Durable Object 인스턴스에 매핑되기 때문입니다.
00:03:35자 이제 엔터를 누르면,
00:03:36설정이 로드되고,
00:03:38대상을 읽고 발견된 에이전트를 실행하는 것을 볼 수 있습니다.
00:03:40agent MD 파일은 없지만,
00:03:42있다면 그것을 사용할 것입니다.
00:03:43이제 에이전트가 server.mjs 파일로 빌드되었고
00:03:46프롬프트를 입력할 수 있는 기능이 제공되었습니다.
00:03:48그래서 예를 들어 “재미있는 농담 하나 해줘”라고 할 수 있습니다.
00:03:50여기 에이전트가 생각하기 시작하는 것을 볼 수 있고,
00:03:52응답하며 수명 주기를 스트리밍합니다.
00:03:54그런 다음 농담을 해주고, 또 다른 것을 요청합니다.
00:03:57하지만 아래를 보면 최종 JSON을 출력하는데,
00:03:59이는 텍스트와
00:04:00입력 및 출력 토큰,
00:04:02전체 프롬프트 비용,
00:04:03그리고 사용된 모델로 구성됩니다.
00:04:05물론 이 에이전트와 계속 대화할 수 있지만,
00:04:06지금은 종료하겠습니다.
00:04:08이것이 Flu로 간단한 에이전트를 구축하는 예시입니다.
00:04:11조금 더 복잡한 것을 해보겠습니다.
00:04:13이 YouTube 비디오를 위한 제목을 생성하는 워크플로우를 만들어봅시다.
00:04:15그렇게 하기 위해 다시 한번,
00:04:16더 복잡한 지침을 가진 에이전트를 만듭니다.
00:04:18이번에는 실제로 기술(skill)이 하나 있습니다.
00:04:20그래서 기술은 skill import 속성으로 가져옵니다.
00:04:23여기서 에이전트 자체가 아니라,
00:04:26이번에는 run이라는 함수를 내보냅니다.
00:04:29이것이 하는 일은 워크플로우를 위해 에이전트를 초기화하고
00:04:31하네스에서 세션을 여는 것입니다.
00:04:34자, 그 다음 무슨 일이 일어나는지 상당히 흥미롭습니다.
00:04:36여기서 무슨 일이 일어나고 있냐면,
00:04:38이 flux 컨텍스트 타입에 설정된
00:04:41페이로드에서 경로를 가져오는 것입니다.
00:04:43이름을 file로 바꾸면,
00:04:44타입 에러가 발생할 것입니다.
00:04:46그리고 여기에서 파일을 가져오는데,
00:04:47저는 script라고 불렀고,
00:04:49그것을 프롬프트로 전달합니다.
00:04:50여기 있는 지침을 보면 이해가 갈 텐데,
00:04:52스크립트를 연구해서,
00:04:53타이틀 스코어 기술을 사용하여 순위를 매기고
00:04:5510개의 클릭베이트 YouTube 제목을 달라고 말하고 있습니다.
00:04:57자, 이게 되는지 봅시다.
00:04:59하지만 그 전에,
00:05:01워크플로우가 워크플로우 디렉터리에 있고,
00:05:02기술들이 프로젝트 루트의
00:05:03기술 디렉터리에 있다는 것을 분명히 하고 싶습니다.
00:05:04이 워크플로우를 실행하려면,
00:05:06워크플로우 이름과 함께 flu run을 실행해야 합니다.
00:05:08제 경우에는 YT titles이고,
00:05:09대상과 JSON 페이로드를 뒤에 붙이는데,
00:05:10그것이 이 스크립트의 경로입니다.
00:05:13자, 엔터를 누르면,
00:05:14워크플로우 ID를 얻게 됩니다.
00:05:16그리고 여기 이상한 일이 일어나고 있습니다.
00:05:18조금 전에 명시했는데도,
00:05:19기술을 찾으러 다니고 있습니다.
00:05:21그리고 이제 이 추론 과정에서,
00:05:23파일 시스템에 파일이 없다고 말합니다.
00:05:25분명 미리 명시했는데도 말이죠.
00:05:27이제 이 추론 과정에서,
00:05:27Flu는 샌드박스에서 bash만 사용하여 에이전트를 실행합니다.
00:05:30접근할 수 있는 것은
00:05:31여기에 등록된 기술 설명뿐이며,
00:05:32기술과 관련된 어떤 파일에도 접근할 수 없습니다.
00:05:35그리고 기술 자체를 보면,
00:05:37YouTube 제목에 대한 vidIQ 스타일의 정확한 점수를
00:05:39구하기 위해 bash를 사용하여 Python 스크립트를 실행합니다.
00:05:42그래서 해결하려면,
00:05:43flu runtime node에서 local을 가져올 예정인데,
00:05:44이는 Flu에게 에이전트를 로컬 시스템에서
00:05:47실행하도록 지시하여 모든 파일에 접근하고
00:05:50유튜브 제목을 위한 거죠.
00:05:51보안에 민감하시다면,
00:05:52나중에 영상에서 이 문제를 해결하는 방법을 설명하겠습니다.
00:05:54하지만 또한 프로젝트 기술 디렉터리 내의
00:05:57기술 위치로 현재 작업 디렉터리를 변경할 것입니다.
00:05:59Flu가 필요한 정확한 파일을 찾으러 다닐 필요가 없도록 말이죠.
00:06:01자 이제 이 워크플로우를 실행하면,
00:06:02Flu가 즉시 기술 MD 파일을 읽고
00:06:03각각의 점수가 포함된
00:06:0410개의 클릭베이트 제목을 생성할 수 있습니다.
00:06:05이제, 에이전트 워크플로우에
00:06:07로컬 시스템 접근 권한을 주고 싶지 않다면,
00:06:10대신할 수 있는 방법은
00:06:11Python 파일로부터 커스텀 도구를 만드는 것입니다.
00:06:13여기서 기술에 있는 Python 파일을 로드하고
00:06:15score title이라는 도구를 만듭니다.
00:06:17이는 파라미터를 검증하기 위해 value bots를 사용하고
00:06:20그 다음 Python 스크립트를 실행합니다.
00:06:21그런 다음 이 도구를 에이전트 내에 등록할 수 있으며,
00:06:22모든 것이 예상대로 작동할 것입니다.
00:06:25이제 이전 프로젝트로 돌아가서
00:06:26HTTP POST 호출을 기반으로 트리거하고 싶다고 가정해봅시다.
00:06:28이를 활성화하기 위해 해야 할 일은 단 하나뿐입니다.
00:06:30루트 미들웨어를 추가하는 것입니다.
00:06:33이제 Flu 프로젝트를 빌드하고,
00:06:35대상과 옵션인 포트를 지정하고,
00:06:37서버 파일을 실행하기만 하면 됩니다.
00:06:40이제 지정한 포트에서 수신 대기 중입니다.
00:06:42server.js 파일은
00:06:44우리가 가진 에이전트나 워크플로우를 인라인화한다는 점을 참고하세요.
00:06:47그러니 Node.js를 지원하는 곳이라면 어디든 배포하고 싶을 때
00:06:50이 파일만 있으면 됩니다.
00:06:52이제 POST 메서드를 사용하여 curl을 실행하고,
00:06:54지정된 포트로 보내고,
00:06:56워크플로우를 선택하고 데이터를 제공하면,
00:06:58워크플로우 ID를 얻게 됩니다.
00:07:00그리고 워크플로우에 대해 curl을 실행하면,
00:07:01특정 워크플로우 ID를 지정하고,
00:07:03읽기 쉽게 JQ로 파이프하면,
00:07:05워크플로우에 대한 정보와 결과 요약을 볼 수 있습니다.
00:07:07물론 Flu는 워크플로우 정보를 스트리밍하고 싶다면
00:07:09HTTP 대신 WebSocket을 지원합니다.
00:07:11자, 평소처럼 Flu에는 제가 다루지 못한 많은 기능들이 있는데,
00:07:13예를 들어 재사용 가능한 에이전트를 위한 에이전트 프로필,
00:07:14Daytona, Cloudflare 샌드박스 지원,
00:07:16또는 URL만 사용하여 다른 샌드박스를 지원하는 기능,
00:07:18인증이나 상태 확인을 위한 커스텀 경로 추가,
00:07:21심지어 하위 에이전트 지원까지 있습니다.
00:07:23그런데 이것은
00:07:25Mastra와 같은 다른 오픈 소스 AI 에이전트 프레임워크와 어떻게 비교될까요?
00:07:27음, 제가 마지막으로 Mastra를 사용했을 때는
00:07:29이 영상을 만들 때였는데,
00:07:31Mastra가 무엇인지 복습하고 싶다면
00:07:33영상을 일시 정지하고 보고 오셔도 됩니다.
00:07:35하지만 제가 사용했을 때는,
00:07:37세션, 메모리, 샌드박스, 도구 로딩을
00:07:40직접 수동으로 설정해야 했습니다.
00:07:42훨씬 더 세밀한 단계별 과정이었는데,
00:07:44더 간단해졌는지는 모르겠지만,
00:07:45Flu가 취하는 접근 방식은
00:07:48완전히 다르다고 생각합니다.
00:07:49더 하네스 우선(harness-first) 접근 방식이며,
00:07:50처음부터 이러한 기능을 사용할 것이라고 가정합니다.
00:07:52샌드박스 이야기가 나와서 말인데,
00:07:54Flu는 샌드박스로 정말 영리한 일을 합니다.
00:07:55각 에이전트는 기본적으로 자체 샌드박스를 가지는데,
00:07:58이는 데모에서 설명한 것과 같습니다.
00:08:01하지만 이 샌드박스는 Vercel의 just Bash로 구동되는데,
00:08:03이것은 Bash를 TypeScript로 재구현한 것입니다.
00:08:05그래서 실제 컨테이너 대신
00:08:06이 샌드박스를 메모리에서 실행하므로,
00:08:08grep, glob, read 도구에 대한 접근 권한을 얻지만,
00:08:10무언가를 하기 직전에 전체 Linux 머신을
00:08:11부팅해야 하는 컨테이너 비용을
00:08:13매번 지불할 필요가 없습니다.
00:08:14즉, Flu는 수천 개의 에이전트를
00:08:16거의 비용 없이 실행할 수 있으며,
00:08:18정말 필요할 때만
00:08:21실제 컨테이너를 선택적으로 사용할 수 있습니다.
00:08:22하지만 이 샌드박스는 Vercel의 just Bash로 구동되는데,
00:08:25이는 Bash를 TypeScript로 재구현한 것입니다.
00:08:27그래서 실제 컨테이너 대신
00:08:29이 샌드박스를 메모리에서 실행하므로,
00:08:31grep, glob, read 도구에 대한 접근 권한을 얻게 됩니다.
00:08:34매번 컨테이너 비용을 지불할 필요 없이 말이죠.
00:08:35컨테이너는 무언가를 하기 전에
00:08:38전체 Linux 머신을 부팅해야 하거든요.
00:08:40즉, Flu는 수천 개의 에이전트를
00:08:41거의 비용 없이 실행하며,
00:08:43정말 필요할 때만
00:08:44실제 컨테이너를 선택할 수 있습니다.
Community Posts
No posts yet. Be the first to write about this video!
Write about this video