Crea un agente AI con Google ADK

1. Introduzione

In questo codelab, creerai il tuo primo agente AI passo dopo passo utilizzando l'Agent Development Kit (ADK) e Gemini di Google. Creerai un agente di scrittura di blog di base che pianifica e scrive contenuti, mostrando i concetti fondamentali di ragionamento e azione.

In questo lab proverai a:

  • Configura l'ambiente di sviluppo per l'ADK.
  • Crea un sistema multi-agente con un pianificatore e un writer.
  • Esegui l'agente localmente e interagisci con lui tramite l'interfaccia utente web ADK.

Che cosa ti serve

  • Un browser web come Chrome.
  • Python 3.10 o versioni successive installato sulla macchina.
  • Una chiave API di Google AI Studio.

Questo codelab è rivolto a sviluppatori di tutti i livelli, inclusi i principianti.

Durata stimata: 30 minuti.

2. Guida visiva: che cosa sono gli agenti AI?

Prima di iniziare a creare, vediamo rapidamente cosa sono gli agenti AI e i pattern comuni che seguono.

Che cos'è un agente AI?

what-are-ai-agents.png

Al livello più semplice, un agente è un software che non si limita a rispondere, ma può decidere e agire. Anziché generare una singola risposta come un chatbot tradizionale, esamina la tua richiesta, determina i passaggi da seguire, chiama un'API, esegue il codice, esamina il risultato e poi decide cosa fare.

foundation-reasoning-acting.png

Una delle spiegazioni più chiare proviene dall'articolo di ricerca ReAct: Synergizing Reasoning and Acting in Language Models. L'idea alla base di questo articolo è semplice ma potente: i modelli linguistici non devono solo generare testo in una sola volta. Possono ragionare passo dopo passo, intraprendere un'azione come chiamare uno strumento o un'API, osservare il risultato e poi decidere cosa fare dopo.

Questo ciclo di ragionamento, azione, osservazione e aggiustamento è alla base del funzionamento dei moderni agenti di AI. E corrisponde alla definizione di Google Cloud: sistemi con ragionamento, pianificazione e memoria, con autonomia sufficiente per adattarsi e prendere decisioni per conto dell'utente.

Tre pattern di comportamento degli agenti

Non tutti gli agenti si comportano allo stesso modo. Un modo utile per pensarci è suddividerli in tre ampi schemi:

three-agent-behaviour-patterns.png

  1. Agenti sequenziali: vengono eseguiti passo dopo passo come una catena di montaggio: passaggio 1, poi passaggio 2, poi passaggio 3. Sono prevedibili, ma rigidi.
  2. Agenti reattivi: prendono decisioni in tempo reale. Analizzano lo stato attuale e si chiedono: "Cosa devo fare dopo?". Magari una volta utilizzano lo strumento A e la volta successiva lo strumento B. Sono flessibili, ma non pianificano in anticipo.
  3. Agenti deliberativi o di pianificazione: questi si fermano per abbozzare un piano, quindi lo eseguono. Pensa alla prenotazione di un viaggio: non acquisti un volo a caso, scegli le date, gli hotel, ordini i passaggi e poi li segui.

Quale di questi è quello "giusto"? Dipende dal problema. Per flussi semplici e prevedibili, la sequenza è sufficiente. Per attività dinamiche, la reazione funziona meglio. Per obiettivi in più passaggi con dipendenze, sono necessari agenti di pianificazione.

In questo lab, creeremo un agente deliberativo/di pianificazione che prima crea una struttura e poi scrive il post del blog.

3. Prima di iniziare

Crea un account e un progetto Google Cloud

Per eseguire il deployment dell'agente su Google Cloud Run più avanti in questo lab, devi disporre di un account Google Cloud e di un progetto con la fatturazione abilitata.

  1. Accedi alla console Google Cloud. Crea un nuovo progetto o riutilizzane uno esistente. Se non hai ancora un Account Google, devi crearne uno.
  2. Successivamente, dovrai attivare la fatturazione in Cloud Console per utilizzare le risorse cloud. L'esecuzione di questo codelab dovrebbe costare meno di pochi centesimi. I nuovi utenti di Google Cloud potrebbero anche avere diritto al programma prova senza costi di 300$.
  3. Prendi nota dell'ID progetto (un nome univoco tra tutti i progetti Google Cloud). Ti servirà per configurare e implementare l'agente.

Ottieni una chiave API Google AI Studio

Per utilizzare i modelli Gemini, devi avere una chiave API da Google AI Studio.

  1. Vai a Google AI Studio.
  2. Fai clic su Ottieni chiave API.
  3. Crea una nuova chiave o utilizzane una esistente. Copia la chiave per utilizzarla in un secondo momento.

4. Crea la struttura del progetto dell'agente di scrittura di blog

In questo passaggio, configurerai la directory e i file per ospitare il codice dell'agente di scrittura di blog sul tuo computer locale.

1. Crea il workspace dell'agente di scrittura di blog

Apri il terminale ed esegui i seguenti comandi per creare una directory dedicata all'agente di scrittura del blog e accedervi:

mkdir bloggeragent
cd bloggeragent

2. Inizializza i file dell'agente

Il framework Google ADK carica i workflow degli agenti direttamente dalla directory del progetto. Crea i file necessari direttamente nella radice di bloggeragent:

touch requirements.txt .env __init__.py agent.py

5. Installa le dipendenze e configura l'ambiente

In questo passaggio configurerai un ambiente virtuale Python, installerai il framework Google ADK e configurerai le variabili di ambiente per autenticare l'agente del blog con il modello Gemini.

1. Configura i requisiti dell'agente

Apri il file requirements.txt nella directory bloggeragent e specifica i pacchetti necessari per l'agente di scrittura del blog aggiungendo quanto segue:

google-adk==2.2.0
python-dotenv

2. Crea un ambiente virtuale per l'agente

Dalla directory bloggeragent, crea e attiva un ambiente virtuale Python per isolare i pacchetti dell'agente:

python3 -m venv .venv
source .venv/bin/activate

3. Installa il framework ADK

Installa le dipendenze definite in requirements.txt per dotare il tuo spazio di lavoro locale di Google ADK:

pip install -r requirements.txt

4. Configurare le credenziali API dell'agente

Apri il file .env che hai creato nella radice del progetto e aggiungi la chiave API Gemini:

GOOGLE_API_KEY=your_api_key

Sostituisci your_api_key con la chiave che hai copiato da Google AI Studio.

6. Crea lo strumento di scrittura di blog multi-agente

In questo passaggio, implementerai il workflow principale del sistema dell'agente di scrittura di blog.

Invece di un semplice chatbot con un solo prompt, creerai un complesso sistema multi-agente che utilizza cicli di autocorrezione e verifica della struttura per scrivere post tecnici di alta qualità. Questo segue il pattern Deliberativo/Pianificazione di cui abbiamo parlato in precedenza.

Panoramica dell'architettura

img/agent-architecture.png

Ecco come interagiscono gli agenti specializzati nel tuo sistema:

Configura init.py

Apri __init__.py nell'editor di testo e aggiungi la seguente importazione per esporre il flusso di lavoro dell'agente al runner:

from . import agent

Scrivi il flusso di lavoro dell'agente di scrittura del blog

Apri agent.py nell'editor di codice e aggiungi il seguente codice che definisce Planner, Writer, Validation Checkers e l'agente Blogger principale:

import os
import sys
from pathlib import Path
import datetime

from dotenv import load_dotenv
from google.adk.agents import Agent, LoopAgent
from google.adk.tools import agent_tool

# env config
load_dotenv()

MODEL = os.getenv("MODEL", "gemini-flash-latest")

# Sub-Agent: Planner
blog_planner = Agent(
   name="BlogPlanner",
   model=MODEL,
   description="Creates a practical, skimmable outline in Markdown.",
   instruction="""
You are a technical content strategist. Produce a clear Markdown outline with:
- Title
- Short intro
- 4–6 main sections (each with 2–3 bullets)
- Conclusion

If `codebase_context` exists in state, weave in specific sections/snippets.
Return only the outline in Markdown.
""",
   output_key="blog_outline",
)

class OutlineValidationChecker(Agent):
   def __init__(self):
       super().__init__(
           name="OutlineValidationChecker",
           model=MODEL,
           description="Validates that the outline is usable.",
           instruction="""
Check the outline in state `blog_outline`. If it has a title, intro, 4–6 sections, and a conclusion, respond exactly "ok".
Otherwise respond exactly "retry" and list missing pieces.
""",
           output_key="validation_result",
       )

robust_blog_planner = LoopAgent(
   name="RobustBlogPlanner",
   description="Retries planning if validation fails.",
   sub_agents=[blog_planner, OutlineValidationChecker()],
   max_iterations=3,
)

# Sub-Agent: Writer
blog_writer = Agent(
   name="BlogWriter",
   model=MODEL,
   description="Writes a technical blog post from the outline.",
   instruction="""
Write a complete Markdown article from the outline in `blog_outline`.

Guidelines:
- Audience: software engineers; skip basics and focus on practical insight.
- Explain both the 'how' and 'why'.
- Include concise code snippets when helpful.
- Follow the outline's structure (H2/H3).
- Output only the final article in Markdown (no fence around the whole post).
""",
   output_key="blog_post",
)

class BlogPostValidationChecker(Agent):
   def __init__(self):
       super().__init__(
           name="BlogPostValidationChecker",
           model=MODEL,
           description="Validates the final post.",
           instruction="""
Check `blog_post` for: intro, clear sections matching the outline, conclusion, and technical clarity.
If passes, respond "ok". Else respond "retry" with the specific fixes.
""",
           output_key="validation_result",
       )

robust_blog_writer = LoopAgent(
   name="RobustBlogWriter",
   description="Retries writing if validation fails.",
   sub_agents=[blog_writer, BlogPostValidationChecker()],
   max_iterations=3,
)

# Expose planner/writer as tools so the root agent can call them explicitly
planner_tool = agent_tool.AgentTool(agent=robust_blog_planner)
writer_tool  = agent_tool.AgentTool(agent=robust_blog_writer)

# Root Agent: Plan → Write 
root_agent = Agent(
   name="Blogger",
   model=MODEL,
   description="Minimal multi-agent blogger that plans and writes.",
   instruction=f"""
If the user gives a topic:
1) Call the planner tool to generate the outline.
2) Call the writer tool to produce the full draft.
3) End with 3 alternate titles and 2 tweet-length hooks.

Date: {datetime.datetime.now().strftime("%Y-%m-%d")}
""",
   tools=[
       planner_tool, # calls RobustBlogPlanner
       writer_tool,  # calls RobustBlogWriter
   ],
)

Informazioni sull'architettura dell'agente

Analizziamo i componenti principali del codice appena aggiunto in agent.py per capire come implementa il flusso di lavoro di pianificazione e scrittura multi-agente:

1. Il sub-agente BlogPlanner

L'agente blog_planner è responsabile della pianificazione dei contenuti. Prende l'argomento fornito dall'utente e produce una struttura in Markdown (con un titolo, un'introduzione, 4-6 sezioni e una conclusione). La struttura viene salvata nel dizionario dello stato condiviso con la chiave "blog_outline".

2. The OutlineValidationChecker

L'agente OutlineValidationChecker funge da controllo qualità. Esamina il "blog_outline" generato nello stato. Se la struttura è valida, risponde con "ok". In caso contrario, restituisce "retry" insieme a un elenco di ciò che manca.

3. The RobustBlogPlanner Loop

Per impedire all'agente di produrre brutti schemi, racchiudiamo il pianificatore e il controllo della convalida all'interno di un LoopAgent chiamato robust_blog_planner. Se la convalida non riesce e restituisce "retry", il ciclo esegue automaticamente di nuovo il pianificatore, fino a tre volte, garantendo l'autocorrezione prima di passare alla fase successiva.

4. Il sub-agente BlogWriter

Una volta finalizzato lo schema, l'agente blog_writer legge "blog_outline" dallo stato e genera l'articolo tecnico completo in Markdown, in modo che corrisponda alla struttura dello schema e lo adatti agli ingegneri software.

5. Il ciclo BlogPostValidationChecker e RobustBlogWriter

Proprio come la struttura, l'articolo finale viene convalidato dal BlogPostValidationChecker per garantire che tutte le sezioni chiave siano presenti e chiare. Lo scrittore e il revisore sono inclusi nel ciclo robust_blog_writer, il che consente di correggere automaticamente l'articolo fino a tre volte se il revisore rileva problemi.

6. Esporre i loop come strumenti

Racchiudiamo il ciclo di pianificazione (robust_blog_planner) e il ciclo di scrittura (robust_blog_writer) come strumenti (planner_tool e writer_tool) utilizzando AgentTool. In questo modo, gli altri agenti possono chiamare questi workflow complessi come se fossero semplici strumenti.

7. L'agente principale di Blogger

root_agent (denominato Blogger) orchestra l'intero flusso di lavoro. Quando riceve un argomento, le istruzioni lo guidano a:

  1. Chiama il numero planner_tool per generare la bozza convalidata.
  2. Chiama writer_tool per scrivere la bozza in base a questa struttura.
  3. Termina generando tre titoli alternativi e due agganci per tweet.

Questa architettura a loop multi-agente garantisce l'affidabilità rilevando e correggendo gli errori di formattazione o strutturali dell'LLM prima di mostrare l'output all'utente.

7. Esegui e testa l'agente

Ora è il momento di vedere il tuo agente in azione.

1. Avviare l'interfaccia utente web dell'ADK

Assicurati di trovarti nella directory principale del progetto bloggeragent nel terminale e che l'ambiente virtuale sia attivo (source .venv/bin/activate), quindi avvia l'interfaccia web:

adk web

2. Interagire con l'agente

  1. Apri il browser e vai all'indirizzo http://127.0.0.1:8000 (o alla porta che hai specificato).
  2. Dovresti visualizzare la GUI web di ADK con l'agente Blogger caricato e il suo layout grafico (che mostra l'agente principale di Blogger che punta agli strumenti RobustBlogPlanner e RobustBlogWriter):ADK Web UI Blogger Agent Graph
  3. Digita un argomento tecnico nella casella del messaggio e premi Invio. Ecco alcuni prompt di test interessanti che puoi utilizzare per valutare il tuo agente:
    • How to build an AI agent using planning loops
    • Explain the difference between REST and gRPC in microservices
    • A guide to using Python's asyncio for backend concurrency
    • Why developers should use Docker for local database setups
  4. Guarda la traccia di esecuzione nella UI. Vedrai BlogPlanner creare la struttura, OutlineValidationChecker convalidarla e BlogWriter scrivere la bozza finale in base alla struttura:Traccia e output della conversazione dell'interfaccia utente web dell'ADK

8. Esegui il deployment in Cloud Run

Ora che hai verificato che l'agente funzioni localmente, esegui il deployment in Google Cloud Run in modo che altri possano utilizzarlo.

Google Cloud Run è una piattaforma di computing gestita che consente di eseguire container stateless richiamabili tramite richieste web o eventi Pub/Sub.

1. Prerequisiti per il deployment

Per eseguire il deployment dell'agente di scrittura di blog su Cloud Run, devi installare e autenticare Google Cloud CLI (gcloud) sulla tua macchina locale:

  1. Installa Google Cloud CLI: se non l'hai installata, segui la guida all'installazione di Google Cloud CLI per il tuo sistema operativo (macOS, Windows o Linux).
  2. Autentica il terminale locale: una volta installato, esegui questo comando nel terminale per accedere al tuo account Google Cloud:
    gcloud auth login
    
  3. Verifica l'autenticazione: conferma che l'accesso al tuo account è stato eseguito correttamente e che puoi accedere alle tue risorse Google Cloud:
    gcloud auth list
    

2. Configura il progetto Google Cloud

Imposta il progetto attivo nel terminale:

gcloud config set project <YOUR_PROJECT_ID>

Abilita i servizi Google Cloud necessari per creare e implementare l'agente containerizzato:

gcloud services enable \
  run.googleapis.com \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com

Poiché il comando di deployment dell'ADK utilizza Google Cloud Build per automatizzare il processo di compilazione, devi concedere all'account di servizio Compute predefinito l'autorizzazione per utilizzare Cloud Build.

Trova il numero di progetto eseguendo:

gcloud projects describe <YOUR_PROJECT_ID> --format="value(projectNumber)"

Esegui i seguenti comandi per associare i ruoli IAM richiesti (sostituisci con il tuo ID progetto e con il numero restituito dal comando precedente).

  1. Concedi l'autorizzazione a Cloud Build per creare il container:
gcloud projects add-iam-policy-binding <YOUR_PROJECT_ID> \
  --member="serviceAccount:<PROJECT_NUMBER>-compute@developer.gserviceaccount.com" \
  --role="roles/cloudbuild.builds.builder"
  1. Concedi l'autorizzazione di accesso a Gemini Enterprise in modo che l'agente di cui è stato eseguito il deployment possa richiamare i modelli Gemini senza richiedere una chiave API:
gcloud projects add-iam-policy-binding <YOUR_PROJECT_ID> \
  --member="serviceAccount:<PROJECT_NUMBER>-compute@developer.gserviceaccount.com" \
  --role="roles/aiplatform.user"

3. Configura le variabili di ambiente locali

Per semplificare il comando di deployment ed evitare errori di battitura, imposta l'ID progetto come variabile di ambiente nella sessione del terminale:

export PROJECT_ID="<YOUR_PROJECT_ID>"

4. Esegui il deployment utilizzando ADK CLI

La CLI ADK fornisce un comando semplificato per il deployment dell'agente su Cloud Run.

Assicurati che l'ambiente virtuale sia attivo e di trovarti nella directory del progetto bloggeragent, poi esegui il comando di deployment:

# Deploy using ADK
adk deploy cloud_run \
  --project=$PROJECT_ID \
  --region=us-east1 \
  --service_name=bloggeragent \
  --with_ui \
  . \
  -- \
  --set-env-vars GOOGLE_GENAI_USE_VERTEXAI=TRUE,MODEL=gemini-3.5-flash,GOOGLE_CLOUD_LOCATION=global

Durante il processo di deployment, nel terminale ti verranno poste le seguenti due domande:

  1. Conferma la creazione del repository:
    Deploying from source requires an Artifact Registry Docker repository to store built containers. A repository named [cloud-run-source-deploy] in region [us-east1] will be created.
    
    Do you want to continue (Y/n)?
    
    Digita Y e premi Invio.
  2. Consenti accesso non autenticato:
    Allow unauthenticated invocations to [bloggeragent] (y/N)?
    
    Digita y e premi Invio (in questo modo puoi accedere pubblicamente alla GUI web dell'ADK nel browser).

5. Accedere all'agente di cui è stato eseguito il deployment

Una volta completato il deployment, il comando restituirà un URL. Apri l'URL nel browser per accedere alla GUI web dell'ADK live e accessibile pubblicamente.

9. Esegui la pulizia

Per evitare addebiti continui al tuo account Google Cloud, elimina le risorse create durante questo codelab.

1. Elimina servizio Cloud Run

Elimina il servizio bloggeragent di cui hai eseguito il deployment:

gcloud run services delete bloggeragent --region=us-east1 --quiet

2. Elimina il repository Artifact Registry

Elimina il repository Docker creato per archiviare le immagini container create:

gcloud artifacts repositories delete cloud-run-source-deploy --location=us-east1 --quiet

3. Arrestare il server locale

Per arrestare il server ADK locale, premi CTRL+C nel terminale in cui è in esecuzione e disattiva l'ambiente virtuale:

deactivate

10. Complimenti

Complimenti! Hai creato il tuo primo agente AI utilizzando l'ADK e Gemini di Google.

Cosa hai imparato

  • I concetti fondamentali degli agenti AI (ragionamento e azione).
  • Come utilizzare Google ADK per creare un sistema multi-agente.
  • Come eseguire e testare l'agente utilizzando l'interfaccia utente web.

Passaggi successivi

  • Prova ad aggiungere strumenti al tuo agente (come la ricerca sul web o le chiamate API).
  • Continua a seguirci per il video 2, in cui integreremo un server MCP.

Documenti di riferimento