Astroチームが密かに開発した最高のAIエージェントフレームワーク

BBetter Stack
컴퓨터/소프트웨어창업/스타트업AI/미래기술

Transcript

00:00:00これはFlu。Astroのチームが作ったAIエージェント構築用のオープンソースフレームワークです。
00:00:04Claude Codeのハーネス機能を活用し、100%プログラム可能にしたものです。
00:00:09スキル、ツール、サンドボックスといった機能を標準でサポートしており、
00:00:13TypeScriptを数行書くだけで、本格的なエージェントハーネスを作成・デプロイできます。
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サーバーからのカスタムツールやClaude MDファイルの読み込み、
00:01:02サンドボックスや再利用可能なスキルのサポートなどがあります。
00:01:05これらのおかげでモデルは実際の作業が可能になるのですが、
00:01:08Fluを使えば、同じことが数行のコードで実現できます。
00:01:11Fluは最小限のエージェントハーネスである「Pi」の上に構築されており、
00:01:16これはOpenClawと同じベースです。
00:01:18FluはPiのエージェントコアを本格的なフレームワークで包み込んでいます。
00:01:21また、サンドボックスを活用してコストを大幅に抑える賢い仕組みがあります。
00:01:25それについては後ほどお話しします。
00:01:26Claude 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:47Mastraや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:08PiがサポートするいずれかのプロバイダーのAPIキーも設定してください。
00:02:13このデモではAnthropicを使用します。
00:02:15そして「flu init」をターゲット指定して実行すると、
00:02:18CLIがプロジェクトをパッケージ化するための設定ファイルが作成されます。
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内部でViteを使っており、
00:02:45今回はCloudflareではなくNodeを使用する設定にしています。
00:02:47NodeはHonoの上でHTTPサーバーとして動作し、
00:02:51Cloudflareの場合は永続化のためのDurable Object付きで
00:02:53ワーカーとしてデプロイされます。
00:02:55準備ができたら、
00:02:56新しいディレクトリを作ります。
00:02:57「agents」か「workflows」のどちらかです。
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:17TSファイル名と合わせて、
00:03:20「hello world」を指定し、
00:03:21インスタンスIDを渡します。
00:03:22IDは何でも構いません。
00:03:24「local-123」などですね。
00:03:25これは複数のエージェントを動かす際に便利で、
00:03:27それぞれに固有のIDを持たせることができます。
00:03:29Cloudflareへのデプロイ時も、
00:03:31このIDがDurable Objectのインスタンスにマップされるので役立ちます。
00:03:35Enterキーを押すと、
00:03:36設定を読み込み、
00:03:38ターゲットを特定してエージェントが実行されます。
00:03:40agent.mdファイルはありませんが、
00:03:42あればそれを使います。
00:03:43server.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:13YouTube動画のタイトルを生成するワークフローを作ります。
00:04:15今回も同様にエージェントを作成し、
00:04:16少し複雑な指示を与えます。
00:04:18今回は「スキル」も使用します。
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コンテキスト型で定義したものがここで使われます。
00:04:41もし名前を「file」に変えれば、
00:04:43型エラーになります。
00:04:44スクリプトという名前でファイルを取得し、
00:04:46それをプロンプトとして渡しています。
00:04:47指示を見れば納得できるはずです。
00:04:49スクリプトを分析させ、
00:04:50クリックしたくなるYouTubeタイトルを10個挙げ、
00:04:52タイトルスコアのスキルを使って
00:04:53ランキングするよう指示しています。
00:04:55うまくいくか試してみましょう。
00:04:57スクリプトを読み込ませて、クリックしたくなるYouTubeタイトルを10個作成する
00:04:59ワークフローは「workflows」ディレクトリ、
00:05:01スキルは「skills」ディレクトリに置きます。
00:05:02実行するには、
00:05:03「flu run」に続けて
00:05:04ワークフロー名、ターゲット、
00:05:06JSONペイロード(スクリプトパス)を指定します。
00:05:08実行してみると…
00:05:09ワークフローIDが返ってきましたが、
00:05:10何か変ですね。
00:05:13スキルを探そうとしていますが、
00:05:14ファイルシステム上にファイルがないと言っています。
00:05:16なぜでしょう?
00:05:18デフォルトでは、
00:05:19FluはBashを使ったサンドボックスで動きます。
00:05:21スキル定義にはアクセスできますが、
00:05:23ファイルシステム内の実際のファイルにはアクセスできません。
00:05:25スキルはPythonスクリプトを呼び出して
00:05:27YouTubeタイトルのスコアを算出しているので、
00:05:27これが問題です。
00:05:30修正するには、
00:05:31「flu runtime node」から
00:05:32「local」をインポートします。
00:05:35これでローカルシステム上で実行され、
00:05:37Pythonファイルにもアクセス可能になります。
00:05:39セキュリティが心配な場合は、
00:05:42後ほど別の方法を解説します。
00:05:43また、作業ディレクトリを
00:05:44skillsディレクトリに設定しておけば、
00:05:47Fluがファイルを見つけやすくなります。
00:05:50YouTubeタイトルのためのものです。
00:05:51今度は無事に読み込まれ、
00:05:52スコア付きのタイトルが生成されました。
00:05:54ローカルシステムへのアクセスを許可したくないなら、
00:05:57Pythonファイルからカスタムツールを作ればいいのです。
00:05:59「scoreTitle」というツールを定義し、
00:06:01Valibotでパラメータを検証して
00:06:02Pythonスクリプトを実行するようにします。
00:06:03あとはエージェントに登録するだけです。
00:06:04さて、前のプロジェクトに戻り、
00:06:05HTTP POSTでトリガーできるようにしましょう。
00:06:07必要なのは「root middleware」の追加だけです。
00:06:10プロジェクトをビルドし、
00:06:11ターゲットとポートを指定して実行します。
00:06:13指定したポートで待機します。
00:06:15server.jsには全てがインライン化されているので、
00:06:17Node.js環境ならどこへでもデプロイ可能です。
00:06:20curlでPOSTリクエストを送り、
00:06:21ワークフローを選択してデータを渡すと、
00:06:22ワークフローIDが返ってきます。
00:06:25最後にIDを指定して
00:06:26jqで整形して表示すると、
00:06:28結果のサマリーを確認できます。
00:06:30もちろんWebSocketもサポートしています。
00:06:33他にもエージェントプロファイルや
00:06:35様々なサンドボックス、カスタムルート、
00:06:37サブエージェントなど多くの機能がありますが、
00:06:40Mastraのような他のフレームワークとはどう違うのか?
00:06:42以前Mastraを使った際は、
00:06:44セッション、メモリ、サンドボックス、ツール読み込みを
00:06:47全て手動で設定する必要がありました。
00:06:50かなりステップの多いプロセスでしたが、
00:06:52Fluの「ハーネスファースト」というアプローチは
00:06:54全く異なります。
00:06:56最初から機能を使うことを前提としています。
00:06:58サンドボックスについては、
00:07:00Vercelの「Just Bash」を使い、
00:07:01TypeScriptでBashを再実装しています。
00:07:03コンテナを立ち上げずにメモリ内で動くため、
00:07:05grepやglobといったツールを
00:07:07コンテナ起動コストなしで高速に使えます。
00:07:09何千ものエージェントを格安で実行でき、
00:07:11必要な時だけ実コンテナに切り替えることも可能です。
00:07:13するとワークフローIDが発行されます。
00:07:14次にcurlでワークフローを取得し、
00:07:16特定のワークフローIDを指定して、
00:07:18読みやすくするためにjqにパイプで渡すと、
00:07:21ワークフローに関する情報と、
00:07:23結果の要約を確認できます。
00:07:25もちろんFluは、HTTPだけでなくWebSocketもサポートしており、
00:07:27ワークフロー情報をストリーミングすることも可能です。
00:07:29いつも通り、Fluには紹介しきれなかった機能が山ほどあります。
00:07:31例えば、再利用可能なエージェント用のプロファイルや、
00:07:33DaytonaやCloudflareサンドボックスのサポート、
00:07:35あるいはURLを指定するだけの任意のサンドボックス利用、
00:07:37認証やヘルスチェック用のカスタムルート追加、
00:07:40さらにはサブエージェントのサポートなどです。
00:07:42では、Mastraのような他のオープンソース
00:07:44AIエージェントフレームワークと
00:07:45比較するとどうでしょうか。
00:07:48以前Mastraを使ったのは、
00:07:49この動画を作った時でした。
00:07:50Mastraが何なのか復習したい場合は、
00:07:52動画を一時停止して、ぜひ見てみてください。
00:07:54当時使ったときは、
00:07:55セッションやメモリ、サンドボックス、ツールの読み込みを、
00:07:58すべて手動で設定する必要がありました。
00:08:01かなり細かくステップを踏むプロセスでしたが、
00:08:03それがよりシンプルになったかどうかは
00:08:05定かではありません。
00:08:06しかし、Fluのアプローチは
00:08:08全く異なると考えています。
00:08:10「ハーネス第一」のアプローチであり、
00:08:11最初からこうした機能を活用することを
00:08:13前提としているからです。
00:08:14サンドボックスといえば、
00:08:16Fluは非常に賢い仕組みを採用しています。
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コンテナだと、何かをするたびにLinuxマシン全体を
00:08:38起動しなければなりませんからね。
00:08:40つまり、Fluなら何千ものエージェントを
00:08:41ほぼコストゼロで実行でき、
00:08:43必要なときだけ本物のコンテナに
00:08:44切り替えることができるのです。

Key Takeaway

FluはClaude Codeの仕組みをTypeScriptで軽量化した「ハーネス第一」のフレームワークであり、メモリ上での高速なBash実行により、コストを抑えながら数千単位のAIエージェントやワークフローを効率的に展開可能にする。

Highlights

  • FluはClaude Codeのハーネス機能をベースに、TypeScriptの数行で本格的なAIエージェントを構築・デプロイできるオープンソースフレームワークである。

  • メモリ上で動作するTypeScriptベースのBash実装(Vercelの「Just Bash」)を活用することで、コンテナ起動コストなしでgrepやglobなどのツールを高速かつ格安に実行できる。

  • FluはNode.jsおよびCloudflare Durable Objectの両方の環境に対応し、HTTPおよびWebSocket経由でのエージェント呼び出しをサポートする。

  • 人間が操作するエージェントだけでなく、人間が介在しない完全自動化されたAIワークフローの構築に最適化されている。

  • ローカル実行用のFluランタイム(flu runtime node)を使用することで、ローカルシステム上のファイルやPythonスクリプトへのアクセス権限を細かく制御できる。

Timeline

Fluの概要と誕生の経緯

  • Astroチームが自社のGitHubリポジトリ内のAIワークフロー自動化のためにFluを開発した。
  • Claude Codeが持つハーネス機能(ツール、サンドボックス、スキル読み込みなど)を数行のTypeScriptで再現可能にする。

もともとは社内の効率化ツールとして誕生したが、Amplitudeのエンジニアの評価を経て汎用フレームワークとして公開された。Claude Codeが人間による操作を前提としているのに対し、Fluは人間が介入しない自動化プロセスにも対応している。

Fluのセットアップと基本操作

  • CLIツール(flu init)を使用してプロジェクトを初期化し、NodeまたはCloudflareのデプロイ先を選択する。
  • flu connectコマンドでエージェントをビルド・実行し、インスタンスIDを使用して固有の動作環境を割り当てる。

設定ファイル(flu config.ts)でViteを用いて環境を制御する。エージェントはシステムプロンプトを定義するだけで動作し、実行時にはトークン使用量やコストがリアルタイムでJSON出力される。

スキルの活用とワークフロー構築

  • skill import属性で外部ツールをインポートし、複雑なタスクをワークフローとして定義できる。
  • デフォルトでは安全のためにサンドボックス化されているが、必要に応じてローカルシステムアクセスを許可できる。

YouTubeタイトルのスコア算出のようなタスクを実行する場合、ワークフロー内にスキルを組み込む。ローカルファイルへのアクセスが制限されている際は、Pythonスクリプトを実行するカスタムツールを作成することで安全に実装できる。

デプロイと他フレームワークとの違い

  • Mastraなどのフレームワークとは異なり、機能の統合を前提とした「ハーネス第一」のアプローチを採用している。
  • Vercelの「Just Bash」をTypeScriptで再実装し、メモリ上での操作によりコンテナ起動コストを排除する。
  • HTTP POSTやWebSocket経由でワークフローのトリガーや結果取得が可能である。

メモリ内でBashツールを動かす仕組みにより、大規模なエージェント群を低コストで実行できる。実務上の必要に応じて、適宜本物のLinuxコンテナ環境へ切り替える設計となっている。

Community Posts

No posts yet. Be the first to write about this video!

Write about this video