1. Introduzione
Lo stack di agenti moderni
La creazione di un agente AI di livello di produzione richiede più di un semplice modello linguistico di grandi dimensioni (LLM). Mentre un LLM fornisce le capacità di ragionamento, un agente solido deve interagire con il mondo esterno, gestire lo stato della conversazione e ricordare le preferenze dell'utente nel tempo.


In questo workshop imparerai a progettare e creare un sistema agentico completo utilizzando tre tecnologie fondamentali:
- Connettività (MCP): per consentire all'agente di accedere a strumenti e dati locali.
- Orchestrazione (ADK): per gestire il ciclo di ragionamento e lo stato dell'agente.
- Memoria (Memory Bank): per fornire un contesto personalizzato a lungo termine.

Concetti principali
Componente | Funzione |
Model Context Protocol (MCP) | Uno standard universale che collega i modelli di AI a sistemi esterni (database, file system, API) senza integrazioni personalizzate. |
Agent Development Kit (ADK) | Un framework che fornisce l'ambiente di runtime per gli agenti, gestendo il ciclo degli eventi, le transizioni di stato e l'esecuzione degli strumenti. |
Session Service | Gli handle memorizzano a breve termine. Conserva il contesto immediato della conversazione (ad es. "Cosa ha appena chiesto l'utente?") ma viene cancellata al termine della sessione. |
Vertex AI Memory Bank | Gestisce la memoria a lungo termine. Conserva fatti e preferenze specifici dell'utente (ad es. "User prefers Python") indefinitely, allowing the agent to personalize future interactions. |
Vertex AI Agent Engine | Il servizio di infrastruttura gestita che ospita i componenti di logica e memoria dell'agente su larga scala. |
Cosa creerai
Per dimostrare questi concetti, creerai un assistente per la progettazione di decorazioni per le festività. Questo agente sarà in grado di accettare richieste utente di alto livello e orchestrare autonomamente gli strumenti Python locali per generare codice e immagini personalizzati.
Avanzerai in tre fasi:
- Livello di strumentazione: crea un server MCP per esporre le funzioni Python locali all'AI.
- Livello dell'agente: utilizza ADK per creare un agente che pianifichi ed esegua workflow in più passaggi.
- Livello di memoria: integra Memory Bank per consentire all'agente di apprendere e ricordare le preferenze di stile dell'utente.
2. Configura
Per alimentare i nostri agenti AI, abbiamo bisogno di due cose: un progetto Google Cloud per fornire le basi.
Parte 1: abilita l'account di fatturazione
- Per richiedere il tuo account di fatturazione con un credito di 5 $, ti servirà per il deployment. Assicurati di accedere al tuo account Gmail.
Parte 2: Open Environment
- 👉 Fai clic su questo link per passare direttamente all'editor di Cloud Shell
- 👉 Se ti viene richiesto di concedere l'autorizzazione in qualsiasi momento della giornata, fai clic su Autorizza per continuare.

- 👉 Se il terminale non viene visualizzato nella parte inferiore dello schermo, aprilo:
- Fai clic su Visualizza.
- Fai clic su Terminale
.
- 👉💻 Nel terminale, verifica di aver già eseguito l'autenticazione e che il progetto sia impostato sul tuo ID progetto utilizzando il seguente comando:
gcloud auth list - 👉💻 Clona il progetto di bootstrap da GitHub:
git clone https://github.com/cuppibla/holiday_workshop - 👉💻 Esegui lo script di configurazione dalla directory del progetto.
Lo script gestirà automaticamente il resto della procedura di configurazione.cd ~/holiday_workshop ./init.sh - 👉💻 Imposta l'ID progetto necessario:
gcloud config set project $(cat ~/project_id.txt) --quiet
Parte 3: configurare l'autorizzazione
- 👉💻 Abilita le API richieste utilizzando il seguente comando. L'operazione potrebbe richiedere alcuni minuti.
gcloud services enable \ cloudresourcemanager.googleapis.com \ servicenetworking.googleapis.com \ run.googleapis.com \ aiplatform.googleapis.com \ compute.googleapis.com - 👉💻 Concedi le autorizzazioni necessarie eseguendo questi comandi nel terminale:
. ~/holiday_workshop/set_env.sh
Nota che viene creato un file .env. Vengono visualizzate le informazioni del progetto.
3. Potenziarsi con MCP
Il momento "USB-C" per l'AI
Immagina se ogni volta che acquisti un nuovo mouse, dovessi saldarlo alla scheda madre. Questo era lo stato degli strumenti di AI fino a poco tempo fa. Gli sviluppatori dovevano scrivere un "codice di collegamento" personalizzato per connettere gli LLM a database, filesystem o API.
Inserisci il Model Context Protocol (MCP). Pensa a MCP come alla porta USB-C per le applicazioni AI. Fornisce un modo standardizzato per connettere i modelli di AI a origini dati e strumenti.
Se crei un server MCP per i tuoi strumenti una sola volta, puoi collegarlo a Gemini CLI, a un IDE o a qualsiasi altro client conforme a MCP senza modificare una sola riga di codice.
Cosa creerai

In questo codelab, creerai un assistente per la progettazione di biglietti di auguri che:
- Si connette al tuo ambiente locale (strumenti di Studio) utilizzando MCP.
- Gestisce il contesto della conversazione in modo affidabile utilizzando l'Agent Development Kit (ADK).
- Memorizza le tue preferenze (ad es. "Preferisco il codice Python") in diverse sessioni utilizzando Vertex AI Memory Bank.
Creazione della logica del server
Abbiamo preparato l'ambiente, ma la logica del server è incompleta. Dobbiamo implementare i quattro strumenti specifici che il nostro Agente utilizzerà per creare il biglietto di auguri.
Parte 1: apri lo scheletro del server
Lavoreremo nella directory 01-MCP-Files-Testing/01-starter.
- Nel terminale Cloud Shell, assicurati di trovarti nella directory corretta:
cd ~/holiday_workshop/01-MCP-Files-Testing/01-starter/ - Apri il file nell'editor di Cloud Shell eseguendo:
cloudshell edit ~/holiday_workshop/01-MCP-Files-Testing/01-starter/mcp_server.py
Noterai che il codice boilerplate (configurazione del server MCP, gestione delle connessioni e inizializzazione del client Vertex AI) è già stato eseguito. Tuttavia, le quattro funzioni principali sono attualmente segnaposto vuoti.
Parte 2: implementa il generatore di scene delle festività
Innanzitutto, abbiamo bisogno di uno strumento che tenga conto degli interessi di un utente (ad es. "uccelli") e lo trasforma in un prompt ricco e dettagliato ottimizzato per la generazione di immagini.
Individua il commento #REPLACE_GENERATE_HOLIDAY_SCENE all'interno della funzione generate_holiday_scene.
Sostituisci l'intera riga con il seguente codice:
prompt = (
f"""
Create a cozy, high-fidelity 3D render of a winter holiday scene.
The scene should be warm and inviting with soft cinematic lighting.
Seamlessly integrate the following specific theme/interest into the
holiday decor or landscape: {interest}.
The style should be whimsical but detailed.
Aspect Ratio: 16:9 Landscape.
"""
)
generate_image(prompt, "16:9", "static/generated_scene.png")
return "Done! Saved at generated_scene.png"
Parte tre: implementa il risultato della foto finale
Infine, vogliamo assicurarci che l'illuminazione e lo stile siano fotorealistici e festivi.
Individua il commento #REPLACE_GENERATE_FINAL_PHOTO.
Sostituisci l'intera riga con il seguente codice per eseguire il trasferimento e il rendering dello stile finale:
prompt = (
"""
Generate a photorealistic close-up shot of a rustic wooden fireplace mantle.
Lighting: Warm, glowing ambient light from a fire below (out of frame).
Background: Softly blurred (bokeh) pine garland and twinkling lights.
Foreground Composition:
1. A wooden picture frame containing the [attached selfie image].
The face in the photo must be clearly visible.
2. A folded holiday greeting card standing upright next to the frame.
The front of the card displays the [attached holiday scene image] as a print.
Ensure the perspective is grounded and realistic, as if taken with a 50mm lens.
"""
)
generate_image(prompt, "16:9", "static/generated_final_photo.png", ["static/generated_selfie.png", "static/generated_scene.png"])
return "Done! Saved at generated_final_photo.png"
Configurazione dell'ambiente
Ora che il codice è a posto, dobbiamo assicurarci che le dipendenze siano installate. Utilizzeremo uv, un gestore di progetti e pacchetti Python veloce.
👉💻 Nel terminale, esegui questo comando per aggiungere FastMCP come dipendenza del progetto:
cd ~/holiday_workshop/01-MCP-Files-Testing/01-starter/
uv add fastmcp
Vedrai che al file ~/holiday_workshop/01-MCP-Files-Testing/01-starter/pyproject.toml è stata aggiunta una nuova dipendenza fastmcp>=2.13.3.
4. Test con Gemini CLI per il server MCP
Ora che il codice del server è completo, come lo testiamo?
In genere, il test di un server di backend richiede la creazione di un'interfaccia utente frontend o la scrittura di richieste curl complesse. Tuttavia, qui possiamo utilizzare la CLI Gemini.
Questa funzionalità è incredibilmente utile per lo sviluppo perché isola la logica. Puoi verificare che il modello comprenda i tuoi strumenti e li chiami correttamente prima di preoccuparti di creare un'interfaccia web o un framework di agenti.

Connetti ed esegui
Chiediamo a Gemini CLI di gestire il nostro server utilizzando il comando mcp add.
Nel terminale, esegui:
gemini mcp add holidays uv run ~/holiday_workshop/01-MCP-Files-Testing/01-starter/mcp_server.py
add holidays: abbiamo dato al nostro server un soprannome ("vacanze").uv run ...: abbiamo fornito il comando esplicito per avviare il server Python che abbiamo appena modificato.
Creiamo contenuti fantastici!
Ora avvia la sessione di chat:
gemini
Prova il seguente prompt per verificare se Gemini riesce a "vedere" i tuoi nuovi strumenti. Tieni presente che potresti dover consentire all'interfaccia a riga di comando di Gemini di utilizzare il nostro strumento per le festività.
- 👉 Utente:
"I want to create a festive holiday photo. I like birds a lot." - Gemini:
*Thinking...* *Calling tool: generate_holiday_scene(interest='birds')* Done! Saved at generated_scene.png - 👉 Utente:
"Great! Now generate a knitting pattern for a sweater with reindeer on it." - Gemini:
Poiché hai utilizzato MCP, l'AI ha capito esattamente quale funzione Python chiamare per soddisfare la tua richiesta.*Thinking...* *Calling tool: generate_sweater_pattern(motif='reindeer')* Done! Saved at generated_pattern.png
Rivedi l'immagine
- Termina Gemini CLI premendo
Control+C. - Controlla l'immagine generata nella cartella:
~/holiday_workshop/01-MCP-Files-Testing/01-starter/static.
Controlla la tua foto qui: 
Conclusione e passaggi successivi
Complimenti! Hai creato un server MCP funzionante. Ora hai un insieme funzionale di "strumenti AI" che possono generare pattern, immagini composite e perfezionare le scene.
Tuttavia, hai notato qualcosa nel test riportato sopra? Tu hai dovuto guidare la procedura. Dovevi chiedere la scena, poi chiedere il pattern, poi chiedere di combinarli.
Anche se Gemini è intelligente, per un flusso di lavoro di produzione complesso, in cui dobbiamo generare un pattern prima di poterlo applicare a un maglione e gestire gli errori in caso di mancata generazione dell'immagine, vogliamo un maggiore controllo. Vogliamo un sistema dedicato che possa pianificare, criticare il proprio lavoro e gestire lo stato del nostro biglietto di auguri senza che noi lo guidiamo passo dopo passo.
Nella sezione successiva, metteremo ordine in questo caos creativo. Implementeremo l'Agent Development Kit (ADK) per creare un agente strutturato che coordini questi strumenti MCP in una pipeline di produzione perfetta.
5. Vibe-Coding di un agente ADK
Abbiamo un insieme di strumenti funzionanti (il nostro server MCP), ma al momento siamo noi a fare tutto il lavoro pesante, dicendo a Gemini esattamente quale strumento chiamare e quando.
In questa sezione creeremo un agente AI: un sistema in grado di ragionare, pianificare ed eseguire autonomamente attività in più passaggi. A questo scopo, utilizzeremo l'Agent Development Kit (ADK).

Che cos'è un agente?
Se gli strumenti MCP sono le "mani" (che svolgono il lavoro), l'agente è il "cervello". Un agente utilizza un LLM per comprendere l'intent di un utente ("Crea un biglietto di auguri"), lo suddivide in passaggi ("Prima mi serve una scena, poi un pattern…") e decide quali strumenti utilizzare per raggiungere l'obiettivo.
Che cos'è ADK?
Agent Development Kit (ADK) è un framework di Google che semplifica la creazione di questi agenti. Gestisce le complesse "tubature", come la gestione della cronologia della chat, la connessione agli strumenti e il passaggio da un modello all'altro, in modo che tu possa concentrarti sulla personalità e sulla logica della tua app.
Vibe Coding basato sul contesto
È una pratica comune utilizzare un unico prompt di grandi dimensioni per generare codice. Tuttavia, quando crei applicazioni complesse, spesso è meglio trattare l'AI come un partner che mantiene il contesto nel tempo.
Utilizzeremo le funzionalità di Memoria di Gemini CLI per preparare il terreno prima di scrivere una sola riga di codice.
1. Prepara l'ambiente
Apri il terminale e vai alla directory iniziale:
cd ~/holiday_workshop/02-Vibe-Coding-ADK-Agent/01-starter
Avvia Gemini CLI:
gemini
2. Gestione del contesto e della memoria
Quando esegue il vibe coding, l'AI deve sapere chi è e cosa sa. Gemini CLI ci consente di gestire questo aspetto in modo esplicito.
/memory show: digita questo comando per vedere cosa sa attualmente l'AI del tuo progetto e della tua sessione./memory add: utilizza questo campo per inserire le conoscenze di base che l'AI deve ricordare durante la conversazione.
Iniziamo definendo la persona del nostro partner di programmazione. Esegui questo comando all'interno di Gemini CLI:
/memory add "You are an expert Python developer specialized in the Google Agent Development Kit (ADK). You write clean, modular code and prefer using the latest ADK patterns."
Gemini ora comprende il suo ruolo. Questo contesto influenzerà ogni risposta successiva, garantendo un codice di alta qualità conforme all'ADK.
3. Passaggio 1: codifica delle vibrazioni dell'agente di base
Invece di provare a generare l'intero sistema contemporaneamente, iniziamo con la struttura. Vogliamo stabilire la struttura dei file e la personalità di base dell'agente.
Inserisci il seguente prompt in Gemini CLI:
Let's start by building the basic agent structure.
Please create a file structure for a `root_agent`.
1. Create `root_agent/__init__.py` that imports `agent`.
2. Create `root_agent/agent.py` by following exactly how this file is doing import and agent creation @~/holiday_workshop/02-Vibe-Coding-ADK-Agent/01-starter/agent_reference.py
In `agent.py`:
- Create an `Agent` named "root_agent" using the model "gemini-2.5-flash".
- The instruction string should define a "Holiday Magic Assistant".
- The personality should be enthusiastic (`🎄✨`) and prefer "cute, kawaii, cartoon" styles for any visual tasks.
Gemini genererà la struttura dei file e il codice Python iniziale. Esaminalo per assicurarti che sia corretto, quindi applica/accetta le modifiche.
4. Passaggio 2: aggiungi il server MCP (gli strumenti)
Ora che abbiamo un agente di base, dobbiamo dargli delle "mani". Dobbiamo connettere l'agente al server MCP che abbiamo creato nel lab precedente.
Inserisci il seguente prompt in Gemini CLI:
Now, let's give the agent access to tools. Update `agent.py` to include our local MCP server. By following exactly how this agent is connecting to mcp tool @~/holiday_workshop/02-Vibe-Coding-ADK-Agent/01-starter/agent_reference.py
In `agent.py`:
- Import `McpToolset` to define our STDIO MCP server. as @~/holiday_workshop/02-Vibe-Coding-ADK-Agent/01-starter/agent_reference.py
- Connect to the python file located at `../mcp_server.py` relative to agent.py.
Gemini ora eseguirà il refactoring del tuo agent.py esistente per includere le definizioni degli strumenti e la logica di connessione.
Nota:se vuoi controllare il tuo lavoro o se il codice generato non funziona come previsto, puoi confrontare i tuoi file con la soluzione di riferimento che si trova in: ~/holiday_workshop/02-Vibe-Coding-ADK-Agent/solution
6. Esegui l'interfaccia web dell'agente
L'ADK è dotato di un'interfaccia di test integrata chiamata adk web. In questo modo si apre una UI di chat leggera per poter parlare immediatamente con il nostro agente.
- Se GeminiCLI è ancora aperto, premi
control+Cper chiuderlo. Ora nel terminale(nella cartellasolution, puoi andare astarterper testare il codice eseguendouv run adk webnella cartellastarter), esegui:cd ~/holiday_workshop/02-Vibe-Coding-ADK-Agent/02-solution uv run adk web --port 8000 - Cloud Shell ti avviserà che un servizio è in esecuzione sulla porta 8000. Fai clic su "Anteprima web" -> "Anteprima sulla porta 8000".
Testare l'agente
Ora dovresti vedere un'interfaccia di chat. Vediamo se il nostro agente segue le nuove istruzioni e accede correttamente agli strumenti MCP.
Prova questi prompt:
- "Ciao! Chi sei?"
- (Aspettati una risposta festosa ed entusiasta).
- "Ho bisogno di uno sfondo per il mio biglietto di auguri. Crea un villaggio innevato".
- (L'agente deve chiamare
generate_holiday_scene. Nota come applichi automaticamente lo stile "carino/cartone animato" definito nelle istruzioni di sistema.
- (L'agente deve chiamare
- "Genera un modello per un maglione con piccole fette di pizza."
- (L'agente deve chiamare
generate_sweater_pattern).
- (L'agente deve chiamare

Puoi visualizzare l'immagine generata qui:

Premi Control+C per uscire al termine del test.
Conclusione e passaggi successivi
Ora hai codificato correttamente un agente Google ADK utilizzando un approccio sensibile al contesto.
- Abbiamo stabilito il contesto:abbiamo utilizzato
/memory addper definire una persona esperta. - Abbiamo creato Iterativamente:abbiamo creato prima la struttura e poi aggiunto le connessioni agli strumenti.
L'anteprima web dell'ADK integrato è ideale per i test, ma per il nostro prodotto finale vogliamo un'esperienza personalizzata e brandizzata. Nella sezione successiva, integreremo questo agente in un frontend web personalizzato.
7. Connessione di ADK con l'interfaccia utente

Ora che abbiamo una definizione dell'agente, dobbiamo eseguirla. È qui che entrano in gioco Runner e Session Service.
Implementazione
- 👉 Digita quanto segue nel comando:
Si aprecloudshell edit ~/holiday_workshop/03-Connect-ADK-MCP-UI/01-starter/backend/main.py~/holiday_workshop/03-Connect-ADK-MCP-UI/01-starter/backend/main.pynell'editor. - Sostituisci
# TODO: Create Session Servicecon quanto segue:from google.adk.sessions import InMemorySessionService from google.adk.memory import InMemoryMemoryService session_service = InMemorySessionService() memory_service = InMemoryMemoryService() - Sostituisci
# TODO: Initialize Runnercon quanto segue:runner = Runner( app_name="agents", agent=christmas_agent, session_service=session_service, memory_service=memory_service, )
- Rivedi la riga 158 a questo
~/holiday_workshop/03-Connect-ADK-MCP-UI/01-starter/backend/main.py(non è necessaria alcuna azione): se ti chiedi come l'applicazione ottiene la risposta finale. Di seguito è riportato il ciclo di eventi basato su runner:async for event in runner.run_async( user_id=user_id, session_id=session_id, new_message=content )
Approfondimento: architettura e deployment
Utilizziamo FastAPI per pubblicare questo agente.
- Perché FastAPI?: Gli agenti sono spesso vincolati all'I/O (in attesa di LLM). La natura asincrona di FastAPI gestisce perfettamente questa situazione.
- Condizione stateless: nota che il nostro endpoint API è stateless. Non salviamo le variabili nell'ambito globale. Ci basiamo su
session_ideSessionServiceper ricostruire lo stato di ogni singola richiesta. Ciò significa che puoi eseguire il deployment in Cloud Run (serverless) e scalare a zero.
8. Prova l'applicazione con la magia dell'agente
- 👉💻 Digita quanto segue nel comando:
Si aprecd ~/holiday_workshop/03-Connect-ADK-MCP-UI/01-starter ./start_app.sh~/holiday_workshop/03-Connect-ADK-MCP-UI/01-starter/backend/main.pynell'editor. - Vedrai il risultato come di seguito:
👉👉 Assicurati di fare clic su http://localhost:5173/o di aprire una nuova finestra e digitarehttp://localhost:5173/. - Poi vedrai il sito web con l'interfaccia di chat:

- Esegui il test caricando un'immagine(puoi caricare una tua foto o quella del tuo animale domestico)

- 👉 Poi chiedi
Qui vedrai l'immagine generata:Can you generate a picture my cat wearing snowflake pattern sweater?
- 👉💻 Al termine del test, premi
control+Cnel terminale per terminare la procedura.
Se non vedi le cose funzionare come previsto, puoi andare su ~/holiday_workshop/03-Connect-ADK-MCP-UI/02-solution, eseguire ./start_app.sh e poi ripetere i passaggi precedenti.
9. Vertex AI Memory Bank

Memoria a breve termine e memoria a lungo termine
- Contesto a breve termine: "Che cosa ho appena detto?" (Cronologia delle sessioni). Queste informazioni vengono perse quando la finestra della chat si chiude.
- Memoria a lungo termine: "Qual è il mio linguaggio di programmazione preferito?" (Preferenze utente). Questo dovrebbe persistere per sempre.
Vertex AI Memory Bank fornisce questo spazio di archiviazione a lungo termine. Consente all'agente di memorizzare e recuperare informazioni personalizzate sull'utente.
Sessioni e Memory Bank
- Sessioni (
VertexAiSessionService): questo è il log. Memorizza la sequenza cronologica non elaborata di ogni messaggio, chiamata allo strumento ed evento (AppendEvent,ListEvents). Fornisce la verità di base su cosa è successo. - Banca della memoria (
VertexAiMemoryBankService): si tratta della conoscenza. Memorizza fatti sintetizzati a lungo termine (GenerateMemories,RetrieveMemories). È limitato a unuser_idspecifico, garantendo privacy e isolamento.
- 👉💻 Digita quanto segue nel comando:
Si aprecloudshell edit ~/holiday_workshop/04-Adding-Memory-Bank/01-starter/backend/main.py~/holiday_workshop/04-Adding-Memory-Bank/01-starter/backend/main.pynell'editor. - Trova
# TODO: Create Vertex AI Session Service & Memory Bank Service, sostituisci l'intera riga con la seguente:session_service = VertexAiSessionService( project=PROJECT_ID, location=LOCATION, agent_engine_id=AGENT_ENGINE_ID ) memory_service = VertexAiMemoryBankService( project=PROJECT_ID, location=LOCATION, agent_engine_id=AGENT_ENGINE_ID )

- 👉💻 Digita quanto segue nel comando:
Si aprecloudshell edit ~/holiday_workshop/04-Adding-Memory-Bank/01-starter/backend/deploy_agent.py~/holiday_workshop/04-Adding-Memory-Bank/01-starter/backend/deploy_agent.pynell'editor. - Sostituisci
# TODO: Set Up Configurationcon quanto segue:# Basic configuration types MemoryBankConfig = types.ReasoningEngineContextSpecMemoryBankConfig SimilaritySearchConfig = ( types.ReasoningEngineContextSpecMemoryBankConfigSimilaritySearchConfig ) GenerationConfig = types.ReasoningEngineContextSpecMemoryBankConfigGenerationConfig # Advanced configuration types CustomizationConfig = types.MemoryBankCustomizationConfig MemoryTopic = types.MemoryBankCustomizationConfigMemoryTopic CustomMemoryTopic = types.MemoryBankCustomizationConfigMemoryTopicCustomMemoryTopic GenerateMemoriesExample = types.MemoryBankCustomizationConfigGenerateMemoriesExample ConversationSource = ( types.MemoryBankCustomizationConfigGenerateMemoriesExampleConversationSource ) ConversationSourceEvent = ( types.MemoryBankCustomizationConfigGenerateMemoriesExampleConversationSourceEvent ) ExampleGeneratedMemory = ( types.MemoryBankCustomizationConfigGenerateMemoriesExampleGeneratedMemory )

- 👉 Nello stesso file:
04-Adding-Memory-Bank/01-starter/backend/deploy_agent.py. Cerca# TODO: Set up topic, sostituisci l'intera riga con quanto segue:custom_topics = [ # Topic 1: Sweater Preference MemoryTopic( custom_memory_topic=CustomMemoryTopic( label="sweater_preference", description="""Extract the user's preferences for sweater styles, patterns, and designs. Include: - Specific patterns (snowflake, reindeer, geometric, fair isle, solid, etc.) - Style preferences (chunky knit, cardigan, pullover, turtleneck, oversized, fitted) - Color preferences (red, green, navy, pastel, etc.) - Material preferences if mentioned (wool, cotton, cashmere, itchy/soft) - Themes (retro, modern, ugly christmas sweater, elegant) Example: "User wants a retro style sweater with a pixelated reindeer pattern." Example: "User prefers dark blue colors and hates itchy wool." """, ) ), # Topic 2: Personal Context MemoryTopic( custom_memory_topic=CustomMemoryTopic( label="personal_context", description="""Extract the user's personal context including hobbies, pets, interests, job, and preferred scenes. Include: - Hobbies and activities (skiing, reading, gaming, cooking, etc.) - Pets (type, breed, name, color) - Job or profession if relevant to their style - General interests (sci-fi, nature, vintage, tech) - Preferred scenes or vibes (cozy fireplace, snowy mountain, cyberpunk city, beach) Example: "User has a golden retriever named Max." Example: "User loves skiing and wants a snowy mountain background." Example: "User is a software engineer who likes cyberpunk aesthetics." """, ) ) ] - 👉 Nello stesso file:
04-Adding-Memory-Bank/01-starter/backend/deploy_agent.py. Cerca# TODO: Create Agent Engine, sostituisci l'intera riga con quanto segue:agent_engine = client.agent_engines.create( config={ "display_name": AGENT_DISPLAY_NAME, "context_spec": { "memory_bank_config": { "generation_config": { "model": f"projects/{PROJECT_ID}/locations/{LOCATION}/publishers/google/models/gemini-2.5-flash" }, "customization_configs": [customization_config] } }, } )
Perché non utilizzare semplicemente il prompt?
Potresti chiederti: "Perché non incolliamo semplicemente la cronologia dell'utente nel prompt?"
- Limiti di dimensione: le finestre contestuali sono grandi, ma non infinite. Non puoi inserire 5 anni di cronologia.
- Costo: l'elaborazione di 1 milione di token per ogni "Hello" è proibitiva.
- Focus: Memory Bank funge da motore di ricerca per il tuo agente. Recupera solo i fatti pertinenti.
- 👉💻 Digita quanto segue nel comando:
Si aprecloudshell edit ~/holiday_workshop/04-Adding-Memory-Bank/01-starter/backend/agent.py~/holiday_workshop/04-Adding-Memory-Bank/01-starter/backend/agent.pynell'editor. - Nel file
~/holiday_workshop/04-Adding-Memory-Bank/01-starter/backend/agent.py, sostituisci# TODO: Add PreloadMemoryToolcon quanto segue:if USE_MEMORY_BANK: agent_tools.append(PreloadMemoryTool())
PreloadMemoryTool e add_session_to_memory
In agent.py, vedrai due componenti chiave:
PreloadMemoryTool: si tratta di uno strumento che consente all'agente di "cercare su Google". Se l'utente chiede qualcosa di vago come "Preparami il mio solito caffè", l'agente può utilizzare questo strumento per interrogare la Banca della memoria in merito alle "preferenze per il caffè" prima di rispondere.add_session_to_memory: Questo è un callback in background.- Perché Async? Il salvataggio della memoria richiede tempo (riepilogo della chat, estrazione dei fatti). Non vogliamo che l'utente aspetti. Lo eseguiamo in background (
add_session_to_memory) utilizzandoafter_agent_callback.
- Perché Async? Il salvataggio della memoria richiede tempo (riepilogo della chat, estrazione dei fatti). Non vogliamo che l'utente aspetti. Lo eseguiamo in background (
10. Memory Bank In Action
- 👉💻 Digita quanto segue nel comando:
Vedrai il risultato come di seguito:cd ~/holiday_workshop/04-Adding-Memory-Bank/01-starter ./use_memory_bank.sh
Controlla il file ~/holiday_workshop/.env, vedrai (nessuna azione necessaria)USE_MEMORY_BANK=TRUE AGENT_ENGINE_ID={agent_engine_id} - 👉💻 Testa la memoria con l'interfaccia utente dell'applicazione. Digita quanto segue nel comando:
Assicurati di fare clic sucd ~/holiday_workshop/04-Adding-Memory-Bank/01-starter ./start_app.shhttp://localhost:5173/o di aprire una nuova finestra e digitarehttp://localhost:5173/. Tieni presente cheUvicorn running on http://0.0.0.0:8000è solo il server di backend, non il link effettivo su cui vogliamo fare clic. Ora l'interfaccia di chat nel sito web è diventata il tuo agente personalizzato.
- 👉 Prova la memoria. Se digiti nell'interfaccia utente:
I want a sweater that matches my dog. He's a golden retriever.I'm a programmer, so I want something geeky. Maybe a matrix style?I like snowflake sweater pattern
L'agente lo identificherà come preferenza e lo memorizzerà nel Memory Bank.
La settimana successiva(o ogni volta che riavvii l'applicazione entro le Control+C e le ./start_app.sh), se chiedi:
what is my preference on sweater pattern?
L'agente eseguirà una query sul Memory Bank, visualizzerà le tue preferenze e genererà il modello del maglione senza che tu glielo chieda. 
- Verifica in Vertex AI Agent Engine andando alla console Google Cloud Agent Engine
- Assicurati di selezionare il progetto dal selettore di progetti in alto a sinistra:

- Verifica il motore dell'agente che hai appena eseguito il deployment dal comando precedente
use_memory_bank.sh
Fai clic sul motore dell'agente che hai appena creato.
- Assicurati di selezionare il progetto dal selettore di progetti in alto a sinistra:
- Fai clic sulla scheda
Memoriesin questo agente di cui è stato eseguito il deployment per visualizzare tutte le memorie.
Complimenti! Hai appena collegato la banca della memoria al tuo agente.
11. Conclusione
Riepilogo
Hai progettato e creato correttamente un sistema agentico completo.
- Connettività: hai utilizzato MCP per standardizzare il modo in cui l'agente accede agli strumenti locali.
- Orchestrazione: hai utilizzato l'ADK per gestire il complesso ciclo di ragionamento richiesto per le attività in più passaggi.
- Personalizzazione: hai utilizzato Memory Bank per creare un livello di apprendimento persistente che memorizza il contesto dell'utente.
Passaggi successivi
- Crea il tuo server MCP: crea un server per il tuo database o la tua API interna.
- Esplora i pattern dell'ADK: scopri di più su "Cicli di ragionamento" e "Orchestrazione" nella documentazione dell'ADK.
- Deployment: trasferisci l'agente da uno script locale a un servizio di produzione su Cloud Run.