Como criar com o Google Antigravity

1. Introdução

O Google Antigravity (chamado de Antigravity no restante do documento) é um IDE agêntico do Google. No codelab de 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 pesquisas simples na Web para gerar aplicativos full-stack e testes de unidade de nível empresarial.

Pré-requisitos:

  • O Google Antigravity está instalado e configurado.
  • Noções básicas sobre o Google Antigravity. Recomendamos que você conclua o codelab: Introdução ao Google Antigravity.

2. Sobre os casos de uso

Como você já tem um entendimento básico do Antigravity, vamos analisar alguns casos de uso para entender como ele 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 realiza a tarefa, pede permissões se necessário, produz os artefatos e nos notifica quando a tarefa é concluída. Por isso, não podemos produzir todas as respostas 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 e o 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 acessar o site do Google Notícias e extrair algumas informações de lá. Mas você pode testar um site da sua escolha e ver como funciona.

Verifique se você está em Agent Manager e selecionou Playground, conforme mostrado abaixo:

cffa12c98a68cb6c.png

Em seguida, dê a seguinte instrução:

8513d489eea0b014.png

Isso vai iniciar o processo do agente e determinar que ele precisa iniciar o navegador etc. Preste atenção ao processo de pensamento e veja como o agente realiza o trabalho. Se tudo der certo, o navegador Antigravity será aberto e vai acessar 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, você também vai ver os artefatos sendo gerados, conforme mostrado abaixo:

dc6cf4e7d8425df8.png

Confira abaixo um exemplo de execução pelo agente:

fb7397cd2cce0682.png

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

O que testar

  • Depois de entender isso, escolha um site disponível e de onde você quer que o agente acesse e resuma alguns dados. Pense em 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 e Flask

Agora vamos 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 de vários palestrantes ao longo do dia.

Mais uma vez, verifique se você está em Agent Manager e selecionou Playground.

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 começar a conversa com o comando acima:

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

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

O artefato de tarefa abaixo foi 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 Plano de implementação. Confira abaixo uma captura de tela de exemplo:

632169a236bc62cc.png

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

e3f6152d6f54d4f9.png

Ele iniciou o servidor e me forneceu o URL. Clique nele para acessar 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 ficar no Editor e no painel do agente e dar um comando como Add two more talks to the schedule.

Isso vai fazer com que o agente analise o requisito, atualize a tarefa, o plano de implementação e valide a funcionalidade atualizada também. Confira um exemplo de conversa abaixo:

ba8455e6f68973e9.png

Se quiser, você pode voltar para o Gerenciador de agentes. Esse processo ajuda você a entender a transição do Gerente de agente para o Editor, fazer as mudanças necessárias e assim por diante.

O que testar

  • Adicione outras funcionalidades que você quer ao aplicativo. Forneça os detalhes ao agente e observe como ele realiza a tarefa, primeiro modificando a lista de tarefas, depois o plano de implementação e assim por diante.
  • Peça ao agente para gerar um 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.

Verifique se você está no Agent Manager e selecionou o Playground. Dê o seguinte comando:

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

Perceba como ele cria a lista de tarefas, o plano de implementação e depois segue em frente. Continue prestando atenção ao fluxo. Em algumas situações, ele vai pedir sua revisão. Confira abaixo um exemplo de execução.

5be0a668e5a67d85.png

Nesse caso, ele também precisa iniciar o navegador Antigravity, fazer os próprios testes e confirmar que eles foram concluídos. 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 não surtiram efeito, e o Gemini conseguiu fazer isso.

O app final ficou parecido com o abaixo e ficou muito bom.

c9ab6bca97a51a8c.png

Que tal adicionar uma imagem de timer legal ao aplicativo? Basta emitir uma instrução de acompanhamento, conforme mostrado abaixo:

Add an image to the application that displays a timer.

Isso fez com que o agente adicionasse uma nova tarefa ao artefato de tarefa:

498dd946d4e9ae55.png

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

c291da9bdb37ff96.png

Por fim, o app tinha a imagem conforme solicitado:

de8f418ba8e4600d.png

O que testar

  • O plano de fundo do ícone de ampulheta no aplicativo não é transparente. Tente pedir para o agente deixar transparente.
  • Teste algumas variações de qualquer aplicativo que você queira gerar. Teste os estilos, imagens, peça mudanças etc.

6. Gerar testes de unidade, stubs simulados e validar testes

O último caso de uso que vamos testar aqui é a geração de testes de unidade para um arquivo de código específico que temos e para o agente executar e validar os testes.

Para isso, vamos ter um espaço de trabalho com um único arquivo Python, como 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 pasta e carregue-o como um espaço de trabalho no Antigravity.

Este é 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. Verifique o estoque de todos os itens.
  3. Calcula o preço final.
  4. Cobranças de 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 a pasta específica do espaço de trabalho. 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 aparece com alguma explicação sobre o que é esse arquivo:

b69c217d3372d802.png

Podemos pedir para gerar 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. 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 seguiu com a tarefa.

21425379db336dc6.png

Você também pode conferir os detalhes dos testes executados:

48f3320cd76b5cd8.png

Um dos arquivos gerados também era o arquivo de teste. Confira uma captura de tela abaixo:

f962061f115c040f.png

O que testar

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

7. Parabéns

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

  • Pesquise na Web de forma autônoma.
  • Crie e itere aplicativos da Web de pilha completa.
  • Gere recursos e refine a estética da interface.
  • Escrever e validar testes de unidade complexos com simulações.

Agora você pode deixar o Antigravity cuidar do trabalho pesado nos seus próprios projetos.

Documentos de referência