Conteúdo

Aprenda a criar seu primeiro agente de IA com Google ADK. Tutorial completo com anatomia do agent.py, parâmetros essenciais, execução e depuração de eventos.

Insights

  • O nome da variável do agente em agent.py deve corresponder exatamente ao nome da pasta do agente, caso contrário o ADK não encontra o agente
  • O parâmetro instruction é onde você define a personalidade e comportamento do agente, funcionando como um system prompt persistente
  • Eventos são a unidade fundamental de comunicação no ADK, cada ação do agente gera eventos que podem ser inspecionados para debugging
  • O Runner é o orquestrador central que conecta agente, sessão e modelo, gerenciando todo o ciclo de vida da execução
  • O parâmetro description é usado por outros agentes em sistemas multi-agentes para decidir quando delegar tarefas

Criar um agente de IA com o Google ADK é surpreendentemente simples quando você entende a anatomia do arquivo agent.py. O framework foi projetado para que desenvolvedores Python se sintam em casa desde o primeiro momento. Quatro parâmetros são suficientes para um agente funcional: name identifica o agente, model define qual LLM será usado, description resume o propósito e instruction estabelece o comportamento. Com esses elementos configurados corretamente, você tem um agente pronto para interagir.

A execução pode acontecer de duas formas complementares. O comando adk web oferece interface visual para desenvolvimento e testes rápidos, permitindo conversar com o agente e inspecionar eventos em tempo real. Para integração em aplicações, o Runner executa o agente programaticamente, emitindo eventos assíncronos que você processa conforme necessário. Entender esse fluxo de eventos é fundamental para debugging e para construir experiências de usuário responsivas.

A Estrutura mínima já está pronta

No artigo anterior, configuramos o ambiente e criamos a estrutura de pastas obrigatória. Vamos recapitular rapidamente o que temos:

O arquivo .env já contém sua API Key do Google AI Studio. O arquivo __init__.py existe e está vazio. O arquivo agent.py é onde vamos trabalhar agora.

Se você ainda não tem essa estrutura, volte ao artigo anterior e configure o ambiente primeiro. Todo o código deste artigo assume que a configuração está completa.

A anatomia do agent.py

O arquivo agent.py é o coração do seu agente. Ele contém a definição que o ADK carrega e executa. Vamos construí-lo passo a passo.

A importação essencial

A classe Agent (também conhecida como LlmAgent na documentação) é o componente central. Ela representa um agente que utiliza um Large Language Model para raciocínio e geração de respostas.

A definição mínima

Esse é um agente funcional. Quatro linhas de configuração e você tem um assistente que conversa.

A correspondência de nomes é obrigatória

Observe que a variável se chama greeting_agent e a pasta também se chama greeting_agent. Isso não é coincidência. O ADK procura uma variável com o mesmo nome da pasta dentro do arquivo agent.py.

Se a pasta é meu_agente, o código deve ter:

Se os nomes não corresponderem, o ADK não encontrará o agente e você verá erro na interface web.

Os Parâmetros essenciais em profundidade

Cada parâmetro do Agent tem propósito específico. Entendê-los é fundamental para criar agentes efetivos.

name: O identificador único

O parâmetro name é o identificador único do agente. Ele é usado internamente pelo ADK para:

  • Identificar o autor de eventos no histórico
  • Referenciar agentes em sistemas multi-agentes
  • Delegar tarefas entre agentes
  • Logging e debugging

Boas práticas para nomes:

  • Use snake_case (palavras separadas por underscore)
  • Seja descritivo: customer_support_agent é melhor que agent1
  • Mantenha consistência: o nome deve corresponder à pasta e à variável

model: O cérebro do agente

O parâmetro model define qual Large Language Model o agente utilizará para raciocínio. O ADK é otimizado para modelos Gemini, mas suporta outros via LiteLLM.

Modelos Gemini disponíveis:

ModeloCaracterísticas
gemini-2.0-flashRápido, econômico, ideal para maioria dos casos
gemini-2.0-flash-liteAinda mais rápido e econômico
gemini-1.5-proMaior capacidade de raciocínio
gemini-1.5-flashVersão anterior, ainda suportada

Para desenvolvimento e aprendizado, gemini-2.0-flash oferece excelente equilíbrio entre capacidade e custo. É o modelo recomendado para começar.

description: O cartão de visita

O parâmetro description é uma descrição concisa do que o agente faz. Pode parecer apenas documentação, mas tem função crítica em sistemas multi-agentes.

Quando você tem múltiplos agentes e um agente coordenador precisa decidir para qual especialista delegar uma tarefa, ele lê as descrições de cada agente disponível. Uma descrição clara e específica ajuda o coordenador a fazer a escolha correta.

Descrições efetivas:

  • “Responde perguntas sobre políticas de devolução e reembolso”
  • “Analisa dados de vendas e gera relatórios em formato tabular”
  • “Agenda reuniões verificando disponibilidade no calendário”

Descrições fracas:

  • “Um agente útil” (vago demais)
  • “Faz várias coisas” (não ajuda na delegação)

instruction: A personalidade e o comportamento

O parâmetro instruction é o mais poderoso. Ele define como o agente se comporta, funcionando como um system prompt que persiste durante toda a conversa.

O que incluir nas instruções:

  • Persona ou personalidade do agente
  • Tarefa principal ou objetivo
  • Restrições e limitações
  • Formato de resposta esperado
  • Diretrizes de uso de ferramentas

Exemplo de instrução elaborada:

Instruções dinâmicas com variáveis de estado

As instruções suportam variáveis dinâmicas que são substituídas em tempo de execução:

As variáveis entre chaves ({user_name}{user_language}) são substituídas por valores do estado da sessão. Isso permite personalização sem modificar o código do agente.

O Código completo do primeiro agente

Vamos criar um agente mais elaborado que demonstra boas práticas:

Executando com adk web

A interface web é a forma mais rápida de testar seu agente durante o desenvolvimento.

Iniciando a Interface

Navegue até a pasta pai do agente e execute:

O terminal exibirá:

Abra http://localhost:8000 no navegador. A interface apresenta:

Seletor de Agente: Dropdown no topo listando todos os agentes encontrados. Selecione greeting_agent.

Área de Chat: Campo de entrada na parte inferior e histórico de mensagens acima.

Painel de Eventos: Lado direito (ou aba separada) mostrando eventos em tempo real.

Inspetor de Estado: Visualização do estado atual da sessão.

Primeira interação

Com greeting_agent selecionado:

  1. Digite “Olá!” no campo de mensagem
  2. Pressione Enter ou clique no botão de enviar
  3. Observe a resposta aparecer no chat

Se tudo estiver configurado corretamente, você verá uma saudação amigável do agente.

Inspecionando eventos na interface

O painel de eventos mostra cada passo da execução:

  1. Evento de entrada: Sua mensagem “Olá!” com author “user”
  2. Evento de resposta: Resposta do agente com author “greeting_agent”

Clique em cada evento para expandir detalhes como timestamp, invocation_id e conteúdo completo.

Executando programaticamente com runner

Para integrar agentes em aplicações, você precisa executá-los via código. O Runner é o componente que orquestra essa execução.

O script completo

Crie um arquivo run_agent.py na raiz do projeto:

Executando o Script

Output esperado:

Entendendo Cada Componente

InMemorySessionService: Armazena sessões na memória RAM. Dados são perdidos quando o programa termina. Adequado para desenvolvimento e testes.

Session: Representa uma conversa individual. Mantém histórico de mensagens e estado.

Runner: O motor de execução. Conecta agente, sessão e modelo.

Content: Estrutura de mensagem do Gemini. Contém role (quem está falando) e parts (conteúdo).

run_async: Método assíncrono que executa o agente e retorna gerador de eventos.

Depuração e Inspeção de Eventos

Eventos são a unidade fundamental de informação no ADK. Cada ação gera eventos que podem ser inspecionados para entender o que está acontecendo.

Estrutura de um Evento

Um evento contém:

CampoDescrição
authorQuem gerou o evento: “user” ou nome do agente
contentConteúdo da mensagem (texto, chamadas de função, etc.)
invocation_idID único da interação completa
idID único do evento específico
timestampMomento de criação
partialSe True, é chunk de streaming (incompleto)
actionsMudanças de estado, artifacts, sinais de controle

Script de Depuração Completo

Executando a depuração

Output típico:

Identificando tipos de eventos

Para agentes simples sem ferramentas, você verá principalmente eventos de texto. Quando adicionarmos ferramentas nos próximos artigos, veremos:

Evento de chamada de função:

Evento de resposta de função:

Evento de mudança de estado:

Usando is_final_response()

O método is_final_response() identifica quando um evento é a resposta final que deve ser mostrada ao usuário:

Retorna True quando:

  • É uma mensagem completa (não parcial)
  • Não contém chamadas de função pendentes
  • Não é apenas resultado de ferramenta

Parâmetros Adicionais do Agent

Além dos quatro parâmetros essenciais, o Agent aceita configurações adicionais para casos avançados. Vamos conhecer os mais úteis.

output_key: Salvando Resposta no Estado

Com output_key="summary", a resposta final do agente é automaticamente salva no estado da sessão sob a chave “summary”. Útil para passar dados entre agentes em workflows.

generate_content_config: Ajustando a Geração

Parâmetros de geração disponíveis:

  • temperature: Controla aleatoriedade (0.0 = determinístico, 1.0 = mais criativo)
  • max_output_tokens: Limite máximo de tokens na resposta
  • top_p: Nucleus sampling
  • top_k: Limita vocabulário considerado

include_contents: Controlando Contexto

Valores possíveis:

  • "default": Recebe histórico completo da conversa
  • "none": Opera apenas com a mensagem atual (stateless)

Tratamento de Erros

Agentes podem falhar por diversos motivos: API indisponível, limite de tokens excedido, erro de rede. É importante tratar essas situações.

Script com Tratamento de Erros

Erros Comuns e Soluções

“API key not valid”: API Key incorreta ou expirada.

  • Solução: Verifique o arquivo .env e gere nova chave se necessário.

“Resource exhausted”: Limite de requisições excedido.

  • Solução: Aguarde alguns segundos e tente novamente. Considere implementar retry com backoff.

“Agent not found”: ADK não encontrou o agente.

  • Solução: Verifique se nome da variável corresponde ao nome da pasta.

“Model not found”: Modelo especificado não existe.

  • Solução: Verifique a grafia do modelo. Use gemini-2.0-flash em vez de variações.

Conversação real com Agentes de IA

Uma conversa real envolve múltiplas trocas de mensagens. O ADK mantém contexto automaticamente através das sessões.

Exemplo de conversa completa

O agente mantém contexto entre as mensagens. Se você perguntar “qual é seu nome?” e depois “você pode repetir?”, ele entenderá que deve repetir o nome mencionado anteriormente.

FAQ: Perguntas Frequentes

1. Por que meu agente não aparece na lista do adk web?

Verifique três coisas: (1) a pasta do agente contém agent.py e __init__.py, (2) o nome da variável no agent.py corresponde exatamente ao nome da pasta, (3) você está executando adk web da pasta pai correta (a pasta que contém a pasta do agente).

2. Qual a diferença entre instruction e description?

instruction define como o agente se comporta internamente, é o system prompt que guia todas as respostas. description é usado externamente por outros agentes para entender o que este agente faz e decidir quando delegar tarefas para ele.

3. Posso usar português nas instruções do agente?

Sim. Os modelos Gemini entendem português fluentemente. Você pode escrever instruções, descrições e interagir completamente em português. O agente responderá no idioma das instruções ou no idioma que o usuário usar.

4. O que acontece com a sessão quando o programa termina?

Com InMemorySessionService, todos os dados são perdidos quando o programa termina. Para persistência, use DatabaseSessionService com SQLite ou outro banco de dados. Isso será coberto em artigos futuros sobre estado e persistência.

5. Como faço para o agente responder de forma mais criativa ou mais precisa?

Use o parâmetro generate_content_config com temperature. Valores baixos (0.1-0.3) produzem respostas mais determinísticas e focadas. Valores altos (0.7-0.9) produzem respostas mais variadas e criativas. O padrão é geralmente em torno de 0.7.

Compartilhe:

Tiago Tartari

Tiago Tartari

Eu ajudo e capacito pessoas e organizações a transformar problemas complexos em soluções práticas usando a tecnologia para atingir resultados extraordinários.

Qual é o desafio
que você tem hoje?