Como criar com o Google Antigravity

1. Introdução

O Google Antigravity é um IDE agêntico do Google. No codelab Introdução ao Antigravity, você pode aprender os conceitos básicos do Antigravity. Neste codelab, vamos usar o Antigravity para criar aplicativos reais. Vamos passar de uma pesquisa simples na Web para gerar aplicativos full stack e testes de unidade de nível empresarial.

Pré-requisitos :

2. Sobre os casos de uso

Como você tem um conhecimento básico do Antigravity, vamos analisar alguns casos de uso para entender como funciona. O Antigravity é uma plataforma focada em agentes. Isso significa que, na maioria dos casos, estamos apenas uma instrução ao agente, que então faz a tarefa, pede permissões, se necessário, produz os artefatos e nos notifica quando a tarefa é concluída. Como resultado, não podemos produzir todas as saídas da conversa do agente em cada um dos casos de uso a seguir. Vamos compartilhar as instruções e algumas capturas de tela necessárias dos resultados esperados, mas seus resultados podem ser um pouco diferentes.

Os casos de uso que vamos abordar variam desde a automação de algumas tarefas com sites externos até a geração e verificação de casos de teste de unidade para um projeto, passando pelo desenvolvimento completo de um site. Vamos lá.

3. Destaques de notícias

Este é um caso de uso simples, mas pode ser a base para usar o navegador da Web para visitar sites, extrair informações, realizar algumas ações e retornar dados ao usuário.

Neste caso, vamos visitar o site do Google Notícias e extrair algumas informações de lá. No entanto, você pode experimentar facilmente um site de sua escolha e ver como ele funciona.

Primeiro, crie uma pasta chamada news-hightlights para começar do zero. No Antigravity, mude para o Agent Manager e importe a pasta recém-criada como um espaço de trabalho com o botão Add Workspace:

3935bb43b5112f71.png

Inicie uma nova conversa no espaço de trabalho news-highlights recém-importado:

840c9d014bd4b8d8.png

Em seguida, dê a seguinte instrução: "visit news.google.com and get me the highlights at the moment."

8513d489eea0b014.png

Isso vai iniciar o processo do agente, que vai determinar que precisa iniciar o navegador etc. Preste atenção ao processo de Raciocínio e veja como o agente realiza o trabalho. Se tudo correr bem, ele vai iniciar o navegador do Antigravity e visitar o site, conforme mostrado abaixo. A borda azul ao redor do site mostra que o agente agora está controlando o navegador e navegando pelo site para receber as informações.

9d594588f2ffe6bc.png

Quando terminar o trabalho, você também vai ver os artefatos sendo gerados, conforme mostrado abaixo:

dc6cf4e7d8425df8.png

Confira abaixo uma execução de amostra do agente:

fb7397cd2cce0682.png

À esquerda, temos o processo de pensamento. Você também pode rolar pelos pontos e visualizar a reprodução e outros dados.

O que testar

  • Depois de entender isso, escolha um site disponível e do qual você gostaria que o agente acessasse e resumisse alguns dados. Considere um site que você sabe que tem painéis e gráficos e peça para ele escolher alguns valores.
  • Tente o seguinte comando: Visit https://docs.cloud.google.com/release-notes and get me a summary of the release notes, categorized by product.

4. Gerar um site dinâmico com Python + Flask

Vamos agora gerar um aplicativo da Web completo. O aplicativo da Web que vamos criar é um site que fornece informações sobre um evento técnico de um dia, com palestras ao longo do dia de vários palestrantes.

Mais uma vez, crie uma nova pasta chamada conference-website. Verifique se você está no Agent Manager e importou e selecionou o espaço de trabalho conference-website. Adicione também o modo Planning para garantir que o agente planeje antes de executar.

Dê o seguinte comando:

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. 

Você pode iniciar a conversa com o comando acima:

À medida que o agente realiza a tarefa, ele vai criar os artefatos:

  • Artefato de tarefa
  • Artefato de implementação
  • Artefato de tutorial

O artefato de tarefa abaixo era a sequência inicial de tarefas que o agente decifrou que deveria fazer com base na tarefa atribuída a ele. Confira abaixo uma captura de tela de exemplo da execução:

c95d82e1c040698f.png

Em seguida, clique no artefato Implementation Plan. Confira abaixo uma captura de tela de exemplo:

632169a236bc62cc.png

Por fim, há o artefato Walkthrough. Ele contém tudo o que o agente fez, conforme mostrado abaixo:

e3f6152d6f54d4f9.png

Ele iniciou o servidor e me forneceu o URL, que cliquei e tenho o aplicativo. Confira abaixo uma captura de tela de exemplo:

abf879f2ce53d055.png

Se eu mudar para o Editor, observe na tela que ele contém a pasta em que o aplicativo Python Flask é gerado. Você também vai notar que o Agent mode está marcado à direita e você pode continuar a conversa por lá também.

b0fea8aa65c3a1c5.png

Agora, digamos que queremos adicionar mais palestras ao evento. Podemos permanecer no editor e, no painel do agente, dar uma instrução como Add two more talks to the schedule.

Isso vai resultar na análise do requisito pelo agente, na atualização da tarefa, do plano de implementação e na validação da funcionalidade atualizada. Confira abaixo uma conversa de exemplo:

ba8455e6f68973e9.png

Você pode voltar ao Agent Manager, se quiser. Esse processo ajuda a entender o processo de mudança do Agent Manager para o editor, fazer mudanças de acordo e assim por diante.

O que testar

  • Adicione outras funcionalidades que você gostaria ao aplicativo. Forneça os detalhes ao agente e observe como ele realiza a tarefa modificando primeiro a lista de tarefas, depois o plano de implementação e assim por diante.
  • Peça ao agente para gerar um arquivo README ou mais documentação para o aplicativo.

5. Gerar um app de produtividade simples

Agora vamos gerar um aplicativo da Web simples de timer Pomodoro.

Crie uma pasta pomodoro-timer. Verifique se você está no Agent Manager, importou e selecionou o espaço de trabalho pomodoro-timer. Comece com este comando:

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

Observe como ele cria a lista de tarefas, o plano de implementação e, em seguida, realiza a tarefa. Continue prestando atenção ao fluxo. Pode haver situações em que ele vai solicitar sua revisão. Confira abaixo uma execução de exemplo.

5be0a668e5a67d85.png

Nesse caso, ele também vai iniciar o navegador do Antigravity, fazer os próprios testes e confirmar que os testes foram bem-sucedidos. Uma das coisas que ele gerou foi um artefato de mídia que contém o vídeo da verificação. Essa é uma ótima maneira de ver o que foi testado. Também sugeri algumas mudanças de estilo, já que elas não entraram em vigor, e ele conseguiu fazer isso.

O app final era parecido com o abaixo e parece muito bom.

c9ab6bca97a51a8c.png

Que tal adicionar uma imagem de timer ao aplicativo? Tudo o que precisamos fazer é emitir uma instrução de acompanhamento, conforme mostrado abaixo:

Add an image to the application that displays a timer.

Isso resultou na adição de uma nova tarefa ao artefato de tarefa pelo agente:

498dd946d4e9ae55.png

Em seguida, ele gerou uma imagem ao realizar a tarefa:

c291da9bdb37ff96.png

Por fim, o app tinha a imagem conforme solicitamos:

de8f418ba8e4600d.png

O que testar

  • Observe que o plano de fundo do ícone de ampulheta no aplicativo não é transparente. Tente dizer ao agente para torná-lo transparente.
  • Teste algumas variações de qualquer aplicativo que você gostaria de gerar. Brinque com os estilos, imagens, peça mudanças etc.

6. Gerar testes de unidade, stubs de simulação e validar testes

O caso de uso final que vamos tentar aqui é o de gerar testes de unidade para um arquivo de código específico que temos e para o agente também executar os testes e validá-los.

Para isso, vamos ter um espaço de trabalho com um único arquivo Python, conforme mostrado abaixo:

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}

Verifique se você tem o arquivo Python acima localmente em uma nova pasta e carregue-o como um espaço de trabalho no Antigravity.

Esse é um serviço de pedidos simples que tem a seguinte funcionalidade principal na função checkout:

  1. Valida se o carrinho não está vazio.
  2. Verifica o estoque de todos os itens.
  3. Calcula o preço final.
  4. Cobra o pagamento.
  5. Atualiza o inventário.

Vamos atribuir ao agente a tarefa de gerar casos de teste de unidade, fornecer implementações de simulação e executar os testes para garantir que eles sejam bem-sucedidos.

Vamos abrir nossa pasta de espaço de trabalho específica e você vai notar que agora também podemos usar o símbolo @ para referenciar o arquivo. Por exemplo, podemos fazer o seguinte:

8368856e51a7561a.png

Isso apresenta uma explicação do que é esse arquivo:

b69c217d3372d802.png

Podemos pedir que ele gere uma visualização melhor usando o comando:

Can you visually show this class for better understanding

da5bd701323818d4.png

A próxima etapa é gerar os testes de unidade e pedir ao agente para testá-los. Eu dou o seguinte comando:

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

Ele gerou o seguinte artefato de tarefa e realizou a tarefa.

21425379db336dc6.png

Você também pode conferir os detalhes dos testes que ele executou:

48f3320cd76b5cd8.png

Um dos arquivos que ele gerou também era o arquivo de teste. Confira abaixo uma captura de tela dele:

f962061f115c040f.png

O que testar

Pegue seu próprio código e veja o que você pode pedir ao agente para fazer, desde adicionar mais funcionalidades até refatorar partes do código.

7. Parabéns

Parabéns! Você usou o Google Antigravity com sucesso para:

  • Pesquisar na Web de forma autônoma.
  • Criar e iterar aplicativos da Web full stack.
  • Gerar recursos e refinar a estética da interface.
  • Escrever e validar testes de unidade complexos com simulações.

Agora você está pronto para deixar o Antigravity cuidar do trabalho pesado nos seus próprios projetos.

Documentos de referência