「AIエージェントキャッチアップ #7 - Bolt.new」を開催しました

ジェネラティブエージェンツの大嶋です。

「AIエージェントキャッチアップ #7 - Bolt.new」という勉強会を開催しました。

generative-agents.connpass.com

アーカイブ動画はこちらです。

youtube.com

Bolt.new

今回は、ブラウザで動作するフルスタックWeb開発エージェント「Bolt.new」を動かしたり、READMEやソースコードを読んだりしてみました。

Bolt.newのGitHubリポジトリはこちらです。

github.com

Bolt.newのサービス版はこちらです。

bolt.new

今回のポイント

Bolt.newの概要

Bolt.newは、ブラウザで動作するフルスタックWeb開発エージェントです。

ユーザーの指示をもとに、JavaScriptの各種フレームワークを使ったWebアプリケーションを実装してくれます。

一度の指示で1ファイルだけ実装されるのではなく、複数のファイルが次々実装されていきます。

WebContainersでの動作

Bolt.newの大きな特徴としては、WebContainersによりブラウザ上でNode.jsが実行されることが挙げられます。

たとえば以下の画面キャプチャでは、npm installとnpm run devを実行してAstroのアプリケーションをプレビューしています。

WebContainersは、Bolt.newの開発元のStackBlitz社が提供している、ブラウザ上でNode.jsのコードを実行できるランタイムです。

詳細は分かりませんが、WebAssemblyを使って動作するようです。

webcontainers.io

AWS Cloud9やVisual Studio Code Serverといったブラウザ上で使うことができる開発環境では、実際の処理はサーバー上で行われます。 それに対して、Bolt.newは本当にブラウザ上で動いているというのが特徴です。

デプロイ

Bolt.newは、デプロイにも対応しています。

画面右上の「Deploy」をクリックすると、自動的にNetlifyでアプリケーションが公開されます。

(これは生成AIとは特に関係ない機能だと思われます)

StackBlitzとの連携

Bolt.newの画面右上の「Open in StackBlitz」をクリックすると、StackBlitzというWeb開発環境のサービス上で同じコードを編集したりできるようになります。

逆に、StackBlitzの画面左上の「Open in bolt.new | AI」をクリックすると、今度はBolt.newが開いて同じコードを編集できます。

StackBlitzはGitHubとも連携できるようなので、Bolt.newで実装したコードをGitHubにアップロードすることもできるかもしれません。

OSS

今回はOSS版も起動できるか試してみました。

CONTRIBUTING.md に記載の手順を実行したところ、とくにエラーなく起動しました。

サービス版とは少しUIが異なりますが、同じようにブラウザ上でコードを書かせて実行することができました。

Bolt.newのREADMEには以下のように書かれています。

For developers interested in building their own AI-powered development tools with WebContainers, check out the open-source Bolt codebase in this repo!

WebContainersを使ってAIを組み込んだ開発ツールを実装する際にこのOSSリポジトリを見てください、ということのようです。

Enhance prompt

Bolt.newで面白いと思った機能の1つが「Enhance prompt」というボタンです。

チャット欄に表示されている「Enhance prompt」というボタンをクリックすると、ユーザーが入力したプロンプトが改善されます。

たとえば日本語での入力が英語に書き換えられるため、実際に生成されるコードがよくなる効果があるかもしれません。

ちなみに、このときの内部動作としては、以下のシンプルなプロンプトでLLMが呼び出されているだけです。

I want you to improve the user prompt that is wrapped in \`<original_prompt>\` tags.

IMPORTANT: Only respond with the improved prompt and nothing else!

<original_prompt>
  ${message}
</original_prompt>

プロンプトの引用元:https://github.com/stackblitz/bolt.new/blob/cecbc55380313004d4abcc1105b73d52255cbe46/app/routes/api.enhancer.ts#L22-L28

プロンプトと動作の概要

最後に、Bolt.newのプロンプトとコード生成の動作の概要を紹介します。

Bolt.newのソースコードを読むと、主に1つのシステムプロンプトで動作しているようです。

ソースコードの該当箇所はこちら:https://github.com/stackblitz/bolt.new/blob/main/app/lib/.server/llm/prompts.ts

システムプロンプトの中では、出力の形式の例を与えている以下の箇所が分かりやすいです。

<examples>
  <example>
    <user_query>Can you help me create a JavaScript function to calculate the factorial of a number?</user_query>

    <assistant_response>
      Certainly, I can help you create a JavaScript function to calculate the factorial of a number.

      <boltArtifact id="factorial-function" title="JavaScript Factorial Function">
        <boltAction type="file" filePath="index.js">
          function factorial(n) {
           ...
          }

          ...
        </boltAction>

        <boltAction type="shell">
          node index.js
        </boltAction>
      </boltArtifact>
    </assistant_response>
  </example>

<assistant_response>というタグの中でCertainly, I can help you create a JavaScript function to calculate the factorial of a number.のようにチャットに表示すべきメッセージを出力させ、<boltAction type="file" filePath="index.js">のタグで出力された内容はファイルに記述し、<boltAction type="shell">というタグで出力された内容はシェルコマンドとして実行する、という動作をしているようです。

一度のLLMの呼び出しで複数のファイル・コマンドを生成させようとしていることが分かります。

ちなみに、LLMが生成したXMLのパースには、既存のライブラリを使わず、自前でパーサーを実装しているようでした。

パーサーの実装はこちら:https://github.com/stackblitz/bolt.new/blob/main/app/lib/runtime/message-parser.ts

次回のご案内

以上、今回はBolt.newをキャッチアップしました。

次回は「AIエージェントキャッチアップ #8 - Anthropic Claude Computer use」ということで、Anthropic Claudeの「Computer use」がテーマです。

www.anthropic.com

docs.anthropic.com

generative-agents.connpass.com

ご興味・お時間ある方はぜひご参加ください!

また、その次の回以降のテーマも募集しているので、気になるエージェントのOSSなどあれば教えてください!