Google Antigravity を使用して構築する

1. はじめに

この Codelab では、エージェントの時代に開発を支援するために設計されたエージェント型開発プラットフォームである Google Antigravity について学習します。Antigravity は AI エージェントの中央コマンド センターとして機能し、アクティビティの起動、モニタリング、オーケストレーションを行うための統合プラットフォームを提供します。

この Codelab では、Antigravity を使用して実際のアプリケーションを構築します。簡単なウェブ検索から、フルスタック アプリケーションとエンタープライズ グレードの単体テストの生成までを行います。

前提条件:

  • Antigravity と Antigravity IDE がインストールされ、構成されている。
  • Google Antigravity の基本的な知識。Codelab: Google Antigravity を使ってみるを完了することをおすすめします。

2. ユースケースについて

Antigravity の基本的な理解ができたので、いくつかのユースケースを見て、実際に動作する様子を確認しましょう。Antigravity はエージェント ファーストのプラットフォームです。つまり、ほとんどの場合、エージェントに指示を出すだけで、エージェントは単独でタスクを実行し、必要に応じて権限を要求し、アーティファクトを生成し、タスクが完了したら通知します。そのため、次の各ユースケースでエージェントの会話のすべての出力を生成することはできません。指示と、期待される結果の必要なスクリーンショットをいくつか共有しますが、結果は多少異なる場合があります。

このガイドでは、外部サイトを使用したいくつかのタスクの自動化から、プロジェクトの単体テストケースの生成と検証、完全なウェブサイトの開発まで、さまざまなユースケースについて説明します。始める

3. ニュース ハイライト

これはシンプルなユースケースですが、ウェブブラウザを使用してウェブサイトにアクセスし、情報を抽出してアクションを実行し、データをユーザーに返すための基盤となります。

この例では、Google ニュース サイトにアクセスして情報を抽出しますが、任意のサイトで簡単に試して、結果を確認できます。

この Codelab で説明するさまざまなプロジェクトを作成するルート フォルダがあることを前提とします。このマシン上のルートフォルダの名前は agy2-pprojects です。

まず、上記のフォルダに news-highlights という名前のフォルダを作成して、最初から始めます。

Antigravity を起動して新しいプロジェクトを作成し、news-highlights フォルダを追加します。

新しくインポートした news-highlights ワークスペースで新しい会話を開始します。

58c4419125240f8f.png

次に、「news.google.com にアクセスして、最新のハイライトを取得して。」と指示します。

69859175cdace3c2.png

これにより、エージェント プロセスが開始され、news.google.com サイトにアクセスして権限を求める必要があると判断されます。URL の読み取りを複数回求められることがあります。このプロジェクトに対する権限を付与するかどうかなどを選択できます。

85f14eddde22704c.png

思考プロセスに注意して、エージェントがどのように作業を進めているかを確認してください。エージェントによる実行の例を以下に示します。

7be51d200fb1296f.png

試してみたいこと

  • このことを理解したら、エージェントにアクセスしてデータを取得/要約させたいウェブサイトを選択します。ダッシュボードやグラフがあるウェブサイトをいくつか選び、いくつかの値を選択するように指示します。
  • 次のプロンプトを試してください。Visit https://docs.cloud.google.com/release-notes and get me a summary of the release notes, categorized by product.

4. Python + Flask で動的ウェブサイトを生成する

次に、完全なウェブ アプリケーションを生成しましょう。作成するウェブ アプリケーションは、複数の講演者が 1 日を通して講演する 1 日の技術イベントに関する情報を提供するサイトです。

もう一度、conference-website という新しいフォルダを作成します。Antigravity Agent インターフェースで新しいプロジェクトを作成し、そのプロジェクトに conference-website フォルダを追加したことを確認します。

会話を開始するには、次のプロンプトを指定します。

I would like to generate a website that is a 1-day technical conference informational site.

The website should have the following functionality:
        1. A home page that shows the current date, location, schedule and time table.
        2. The 1-day event is a list of 8 talks in total.
        3. Each talk has 1 or 2 max. speakers. 
        4. A talk has an ID, Title, Speakers, Category (1 or 2), Description and time of the talk.
        5. Each speaker has a First Name, Last Name and LinkedIn url.
        6. Allow for users to search by category, speaker, title.
        7. Give a lunch break of 60 minutes.
        8. Use dummy data for events and speakers, come up with a schedule, the event is about Google Cloud Technologies.
        9. Tech Stack: Python and Flask framework on server side. Front-end is basic HTML, CSS and JavaScript. 
        10. Test out the site on your own for all functionality and provide a detailed README on how to setup, run and make any further changes. 
11. Launch the web application for me to review. 

Antigravity はリクエストを分析し、まず実装計画を作成します。implementation_plan.md という鍵アーティファクトが作成されます。このアーティファクトで、プロンプトで指定した要件の作成と満たす方法を確認できます。出力例を以下に示します。

8f516fd94f4ad57.png

続行する前に、実装計画を確認してください。上記にある implementation_plan.md ファイルへのリンクをクリックするか、右上の補助ペインを切り替えることで、実装計画を確認できます。アーティファクト ビューが表示され、実装計画を確認できるようになります。

e12b6e1270405137.png

実行用に生成された実装プランの例を次に示します。

5069ec7ab1ae6310.png

プランにコメントを追加してエージェントに再度プロンプトを送信するか、現時点では実装プランをそのまま承認して、会話インターフェースの [続行] ボタンをクリックして先に進むことができます。

エージェントはソースコード ファイルの生成を続行します。また、Task という別のアーティファクトも更新されます。これは、最終結果を達成するために実行する必要があると特定されたアクションまたはタスクのリストです。

タスクはいつでもクリックできます。アーティファクトのリストにアクセスしてタスクを表示することもできます。リストの例を次に示します。

caf136694efc222f.png

最終タスクのどこかで、アプリケーションの実行と検証を試みる際に、Antigravity が Python 環境をセットアップします。環境のセットアップ、依存関係のインストールなどを行うには、ユーザーの権限が必要になります。必要に応じて権限を付与してください。

検証が成功すると、詳細がハイライト表示されます。また、完了した機能、技術スタック、検証結果、手順の詳細を示す別のアーティファクトである Walkthrough も表示されます。

d0f61eb85d348030.png

ウォークスルーのサンプルを以下に示します。

fb18995f34c286ae.png

URL にアクセスしたときに表示される最終的なウェブサイトは次のとおりです。

2b2ee3149d59da7a.png

生成されたコードを確認する場合は、右上にある [IDE を開く] をクリックします。Antigravity IDE が開き、生成されたコードを表示できます。以下に、スクリーンショットの例を示します。

12798431169dd8cf.png

試してみたいこと

  • アプリケーションに追加したい機能を追加します。エージェントに詳細を提供し、タスクリスト、実装計画などを最初に変更して、タスクの実行方法を確認します。
  • イベント スケジュールにデータを追加します(例: Add two more talks to the schedule)。
  • エージェントに、アプリの README やその他のドキュメントを生成するよう依頼します。

5. シンプルな生産性向上アプリを生成する

ここでは、簡単なポモドーロ タイマー ウェブ アプリケーションを生成します。

pomodoro-timer フォルダを作成します。Agent Manager に移動し、pomodoro-timer ワークスペースをインポートして選択していることを確認します。次のプロンプトで始めましょう。

Create a productivity app that features a Pomodoro timer. Give a calm and aesthetic look to the application.

実装計画とタスクリストを作成し、それらに取り組む方法について説明します。フローに注意してください。レビューを求めるメッセージが表示される場合があります。

ウォークスルー メッセージとタスクを含むサンプル実行を以下に示します。

df0db367ba475db2.png

完成したアプリは次のようになり、かなり見栄えがよくなりました。

ef8ac58d0677e56.png

試してみたいこと

  • アプリケーションに画像を追加します。たとえば、タイマーの画像をアプリケーションに追加します。
  • 生成するアプリケーションのバリエーションをいくつか試してみます。スタイルや画像を試したり、変更をリクエストしたりします。

6. 単体テスト、モックスタブの生成、テストの検証

ここで試す最後のユースケースは、特定のコードファイルに対して単体テストを生成し、エージェントがテストを実行して検証するというものです。

このため、次のように 1 つの Python ファイルを含むワークスペースを作成します。

from typing import Dict

# --- Custom Exceptions ---
class InventoryShortageError(Exception):
    """Raised when there is not enough item stock."""
    pass

class PaymentFailedError(Exception):
    """Raised when the payment gateway rejects the transaction."""
    pass

class InvalidOrderError(Exception):
    """Raised when the order violates business rules."""
    pass

# --- External Service Interfaces (To be Mocked) ---
class InventoryService:
    def get_stock(self, product_id: str) -> int:
        """Connects to DB to check stock."""
        raise NotImplementedError("Real connection required")

    def decrement_stock(self, product_id: str, quantity: int):
        """Connects to DB to reduce stock."""
        raise NotImplementedError("Real connection required")

class PaymentGateway:
    def charge(self, amount: float, currency: str) -> bool:
        """Connects to Stripe/PayPal."""
        raise NotImplementedError("Real connection required")

# --- Main Business Logic ---
class Order:
    def __init__(self, 
                 inventory_service: InventoryService, 
                 payment_gateway: PaymentGateway,
                 customer_email: str,
                 is_vip: bool = False):
        
        self.inventory = inventory_service
        self.payment = payment_gateway
        self.customer_email = customer_email
        self.is_vip = is_vip
        self.items: Dict[str, Dict] = {} # {product_id: {'price': float, 'qty': int}}
        self.is_paid = False
        self.status = "DRAFT"

    def add_item(self, product_id: str, price: float, quantity: int = 1):
        """Adds items to the cart. Rejects invalid prices or quantities."""
        if price < 0:
            raise ValueError("Price cannot be negative")
        if quantity <= 0:
            raise ValueError("Quantity must be greater than zero")

        if product_id in self.items:
            self.items[product_id]['qty'] += quantity
        else:
            self.items[product_id] = {'price': price, 'qty': quantity}

    def remove_item(self, product_id: str):
        """Removes an item entirely from the cart."""
        if product_id in self.items:
            del self.items[product_id]

    @property
    def total_price(self) -> float:
        """Calculates raw total before discounts."""
        return sum(item['price'] * item['qty'] for item in self.items.values())

    def apply_discount(self) -> float:
        """
        Applies business logic:
        1. VIPs get flat 20% off.
        2. Regulars get 10% off if total > 100.
        3. No discount otherwise.
        """
        total = self.total_price
        
        if self.is_vip:
            return round(total * 0.8, 2)
        elif total > 100:
            return round(total * 0.9, 2)
        
        return round(total, 2)

    def checkout(self):
        """
        Orchestrates the checkout process:
        1. Validates cart is not empty.
        2. Checks stock for all items.
        3. Calculates final price.
        4. Charges payment.
        5. Updates inventory.
        """
        if not self.items:
            raise InvalidOrderError("Cannot checkout an empty cart")

        # 1. Check Inventory Logic
        for product_id, data in self.items.items():
            available_stock = self.inventory.get_stock(product_id)
            if available_stock < data['qty']:
                raise InventoryShortageError(f"Not enough stock for {product_id}")

        # 2. Calculate Final Price
        final_amount = self.apply_discount()

        # 3. Process Payment
        try:
            success = self.payment.charge(final_amount, "USD")
            if not success:
                raise PaymentFailedError("Transaction declined by gateway")
        except Exception as e:
            # Catching generic network errors from the gateway
            raise PaymentFailedError(f"Payment gateway error: {str(e)}")

        # 4. Decrement Stock (Only occurs if payment succeeded)
        for product_id, data in self.items.items():
            self.inventory.decrement_stock(product_id, data['qty'])

        self.is_paid = True
        self.status = "COMPLETED"
        
        return {"status": "success", "charged_amount": final_amount}

上記の Python ファイル(order_service.py)が新しいフォルダにローカルで保存されており、そのプロジェクトが Antigravity で会話用に開かれていることを確認します。

これは、checkout 関数に次の主な機能があるシンプルな Order サービスです。

  1. カートが空でないことを検証します。
  2. すべての商品の在庫を確認します。
  3. 最終価格を計算します。
  4. お支払いの請求。
  5. 在庫を更新します。

エージェントに単体テストケースの生成、モック実装の提供、テストの実行を割り当てて、テストが成功することを確認します。

特定のワークスペース フォルダを開くと、@ 記号を使用してファイルを参照できるようになっていることがわかります。たとえば、@order と入力すると、order_service.py ファイルが表示されます。

c4331bee03c5512c.png

このファイルを理解するのに役立つタスクを付与できます。次のプロンプトを入力します。

Explain the @order_service.py file

このファイルの説明が表示されます。

269ff8450d813970.png

プロンプトを使用して、より優れた可視化を生成するように指示できます。

Can you visually show this class for better understanding

Antigravity は、タスクが完了し、可視化を含むアーティファクトが生成されたことを示しています。

ea389f494786a9ad.png

以下のように、可視化を確認できます。

70e6822a86f74de9.png

次のとおりです。

3ebd94221655a03f.png

次のステップでは、単体テストを生成し、エージェントにテストを依頼します。次のプロンプトを入力します。

generate unit tests for this module and test it out with mock implementations.

タスクを実行し、テストを生成して実行し、バグも修正しました。出力は次のとおりです。

788cd07aadd09a4b.png

生成されたファイルの一つはテストファイルでした。そのスクリーンショットを以下に示します。

7a79d27eb34f0530.png

試してみたいこと

自分のコードを使って、機能の追加からコードの一部のリファクタリングまで、エージェントに何ができるかを確認します。

7. 完了

おめでとうございます!Google Antigravity を使用して、次の操作を行いました。

  • ウェブを自律的に調査します。
  • フルスタックのウェブ アプリケーションを構築して反復処理します。
  • モックを使用して複雑な単体テストを作成し、検証します。

これで、独自のプロジェクトで Antigravity を活用できるようになりました。

リファレンス ドキュメント