1. Prima di iniziare
Che cos'è Gemini Enterprise?
Gemini Enterprise è una piattaforma agentica avanzata che offre il meglio di Google AI a ogni dipendente, per ogni workflow. Consente ai team di scoprire, creare, condividere ed eseguire agenti AI in un unico ambiente sicuro.
- Accedi a modelli avanzati:gli utenti ottengono l'accesso immediato all'AI multimodale più potente di Google, tra cui Gemini, per affrontare sfide aziendali complesse.
- Utilizza agenti specializzati: la suite include agenti Google pronti all'uso per la ricerca, la programmazione e la creazione di note per fornire un valore immediato.
- Offri nuove opportunità a ogni dipendente:le opzioni no-code e pro-code consentono al personale di tutti i reparti di creare e gestire i propri agenti personalizzati per l'automazione dei workflow.
- Basare le risposte sui dati: gli agenti possono essere collegati in modo sicuro ai dati aziendali interni e alle applicazioni di terze parti per garantire che le loro risposte siano accurate dal punto di vista contestuale.
- Governance centralizzata:gli amministratori possono visualizzare e controllare tutte le attività degli agenti per garantire che l'organizzazione soddisfi rigorosi standard di sicurezza e conformità.
- Espansione con gli ecosistemi: la piattaforma si integra con un'ampia rete di applicazioni partner e fornitori di servizi per estendere l'automazione a diversi sistemi.
Cos'è Google Workspace?
Google Workspace è una raccolta di soluzioni di produttività e collaborazione basate su cloud progettate per privati, scuole e aziende:
- Comunicazione:servizi email professionali (Gmail), videoconferenze (Meet) e messaggistica di gruppo (Chat).
- Creazione di contenuti:strumenti per scrivere documenti (Documenti), creare fogli di lavoro (Fogli) e progettare presentazioni (Presentazioni).
- Organizzazione:calendari condivisi (Calendar) e appunti digitali (Keep).
- Archiviazione:spazio cloud centralizzato per salvare e condividere i file in modo sicuro (Drive).
- Gestione:controlli amministrativi per gestire gli utenti e le impostazioni di sicurezza (Console di amministrazione Workspace).
Quali tipi di integrazioni personalizzate?
Google Workspace e Gemini Enterprise creano un potente ciclo di feedback in cui Workspace fornisce dati in tempo reale e contesto di collaborazione, mentre Gemini Enterprise offre i modelli, il ragionamento agentico e l'orchestrazione necessari per automatizzare i workflow intelligenti.
- Connettività intelligente:gli archivi dati, le API e i server MCP gestiti da Google (personalizzati e gestiti da Google) consentono agli agenti di accedere in modo sicuro e senza problemi ai dati di Workspace e di eseguire azioni per conto degli utenti.
- Agenti personalizzati:utilizzando progettisti no-code o framework pro-code, i team possono creare agenti specializzati basati su dati e azioni di Workspace gestiti dall'amministratore.
- Integrazione nativa:i componenti aggiuntivi di Workspace colmano il divario tra i sistemi di AI e le applicazioni come Chat e Gmail, tramite componenti UI dedicati o processi in background. In questo modo, gli agenti possono incontrare gli utenti esattamente dove si trovano per un'assistenza immediata e consapevole del contesto.
Combinando il solido ecosistema di produttività di Google Workspace con la potenza agentica avanzata di Gemini Enterprise, le organizzazioni possono trasformare le proprie operazioni tramite agenti AI personalizzati e basati sui dati che automatizzano i workflow complessi direttamente negli strumenti che i team utilizzano già ogni giorno.
Prerequisiti
Se vuoi seguire tutti i passaggi nel tuo ambiente, ti serviranno:
- Una conoscenza di base di Google Cloud e Python.
- Un progetto Google Cloud di cui sei proprietario con fatturazione. Per verificare che la fatturazione sia abilitata per un progetto esistente, consulta Verifica lo stato di fatturazione dei progetti. Per creare un progetto e configurare la fatturazione, consulta Creare un progetto Google Cloud. Per modificare la proprietà del progetto, consulta Gestire i membri del progetto o modificare la proprietà del progetto.
- Versioni Gemini Enterprise Standard / Plus attivate. Per confrontare le versioni di Gemini Enterprise, vedi Confronto tra le versioni di Gemini Enterprise. Se non disponi di una licenza per Gemini Enterprise, avrai la possibilità di crearne una di prova nel passaggio successivo.
- Un account Google Workspace Business o Enterprise con accesso a Google Chat e alle funzionalità intelligenti attive.
- Google Cloud CLI installato e inizializzato per il tuo progetto Google Cloud.
- Python 3.11+ installato. Consulta le istruzioni sul sito web ufficiale di Python.
Cosa creerai
In questo codelab, creiamo tre soluzioni con agenti AI Gemini Enterprise strettamente integrati con Google Workspace. Mostreranno i pattern architetturali che possono essere utilizzati per interagire con dati, azioni e UI.
Agente personalizzato no-code
Questo agente consente agli utenti di cercare dati ed eseguire azioni per Workspace nel loro linguaggio naturale. Si basa sui seguenti elementi:
- Modello: Gemini.
- Dati e azioni: archivi di dati di Gemini Enterprise per Google Workspace (Calendar, Gmail, Drive, NotebookLM), Ricerca Google.
- Strumenti di creazione di agenti:Gemini Enterprise Agent Designer.
- Host dell'agente: Gemini Enterprise.
- UI:app web Gemini Enterprise.


Agente personalizzato con codice professionale
Questo agente consente agli utenti di cercare dati ed eseguire azioni per Workspace nel loro linguaggio naturale utilizzando strumenti e regole personalizzati. Si basa sui seguenti elementi:
- Modello: Gemini.
- Dati e azioni: archivi di dati di Gemini Enterprise per Google Workspace (Calendar, Gmail, Drive, NotebookLM), Ricerca Google, server del protocollo di contesto del modello (MCP) di Vertex AI Search gestito da Google, funzione di strumento personalizzato per inviare messaggi Google Chat (tramite l'API Google Chat).
- Strumenti di creazione di agenti:Agent Development Kit (ADK).
- Host dell'agente:Vertex AI Agent Engine.
- UI:app web Gemini Enterprise.


Agente predefinito come componente aggiuntivo di Google Workspace
Questo agente consente agli utenti di cercare dati per Workspace nel loro linguaggio naturale all'interno del contesto delle UI delle app Workspace. Si basa sui seguenti elementi:
- Modello: Gemini.
- Dati: archivi di dati di Gemini Enterprise per Google Workspace (Calendar, Gmail, Drive, NotebookLM), Ricerca Google.
- Host dell'agente: Gemini Enterprise.
- UI: componente aggiuntivo Google Workspace per Chat e Gmail (facilmente estendibile a Calendar, Drive, Documenti, Fogli e Presentazioni).
- Componente aggiuntivo Google Workspace:Apps Script, API Gemini Enterprise e Vertex AI, contestuali (metadati utente, messaggio Gmail selezionato).


Cosa imparerai a fare
- I punti di integrazione tra Gemini Enterprise e Google Workspace che consentono dati e azioni.
- Le opzioni no-code e pro-code per creare agenti personalizzati ospitati in Gemini Enterprise.
- I modi in cui gli utenti possono accedere agli agenti dall'app web Gemini Enterprise e dalle applicazioni Google Workspace.
2. Configurazione
Concetti relativi alle recensioni
App Gemini Enterprise
Un'app Gemini Enterprise fornisce risultati di ricerca, azioni e agenti agli utenti finali. Il termine app può essere utilizzato in modo intercambiabile con il termine motore nel contesto delle API. Un'app deve essere connessa a un datastore per poter utilizzare i dati al suo interno per mostrare risultati di ricerca, risposte o azioni.
App web Gemini Enterprise
Un'app web Gemini Enterprise è associata a un'app Gemini Enterprise. Funge da hub AI centralizzato in cui i dipendenti utilizzano una singola interfaccia di chat per eseguire ricerche nei dati aziendali isolati, eseguire agenti AI specializzati per workflow complessi e generare contenuti di livello professionale con privacy di livello aziendale.
Inizializzare le risorse e accedervi
In questa sezione, accedi e configura le seguenti risorse dal tuo browser web preferito.
App Gemini Enterprise
Apri la console Google Cloud in una nuova scheda, quindi segui questi passaggi:
- Seleziona il progetto.
- Nel campo di ricerca di Google Cloud, cerca e seleziona Gemini Enterprise, poi fai clic su + Crea app. Se non disponi di una licenza per Gemini Enterprise, ti verrà chiesto di attivare una licenza di prova senza costi di 30 giorni.
- Imposta Nome app su
codelab. - Viene generato un ID in base al nome e visualizzato sotto il campo. Copialo.
- Imposta Più regioni su
global (Global). - Fai clic su Crea.

- L'app viene creata e viene eseguito automaticamente il reindirizzamento a Gemini Enterprise > Panoramica.
- Nella sezione Ottieni l'accesso completo, fai clic su Configura identità.
- Nella nuova schermata, seleziona Utilizza Google Identity e fai clic su Conferma identità della forza lavoro.

- La configurazione viene salvata e viene eseguito automaticamente il reindirizzamento a Gemini Enterprise > Panoramica.
- Vai a Configurazioni.
- Nella scheda Gestione funzionalità, attiva Attiva progettazione agenti e fai clic su Salva.

App web Gemini Enterprise
Apri Gemini Enterprise dalla console Cloud in una nuova scheda, poi segui questi passaggi:
- Fai clic sull'app denominata
codelab. - Copia l'URL visualizzato, in quanto lo utilizzeremo per accedere all'app web Gemini Enterprise nei passaggi successivi.

3. Agente personalizzato no-code
Questo agente consente agli utenti di cercare dati ed eseguire azioni per Workspace nel loro linguaggio naturale. Si basa sui seguenti elementi:
- Modello: Gemini.
- Dati e azioni: archivi di dati di Gemini Enterprise per Google Workspace (Calendar, Gmail, Drive, NotebookLM), Ricerca Google.
- Strumenti di creazione di agenti:Gemini Enterprise Agent Designer.
- Host dell'agente: Gemini Enterprise.
- UI:app web Gemini Enterprise.
Concetti relativi alle recensioni
Gemini
Gemini è un LLM multimodale di Google. Aiuta le persone a liberare il proprio potenziale umano in modo da aumentare la loro immaginazione, espandere la loro curiosità e migliorare la loro produttività.
Datastore Gemini Enterprise
Un archivio dati Gemini Enterprise è un'entità che contiene i dati importati da un'origine dati proprietaria come Google Workspace o da applicazioni di terze parti come Jira o Salesforce. I datastore che contengono dati di applicazioni di terze parti sono chiamati anche connettori di dati.
Gemini Enterprise Agent Designer
Gemini Enterprise Agent Designer è una piattaforma interattiva no-code e low-code per creare, gestire e lanciare agenti singoli e multi-step in Gemini Enterprise.
Esamina l'architettura della soluzione

Abilita le API
I datastore Gemini Enterprise Workspace richiedono l'attivazione delle API:
- Nella console Google Cloud, abilita le API Calendar, Gmail e People:

- Fai clic su Menu ☰ > API e servizi > API e servizi abilitati e poi verifica che API Google Calendar, API Gmail e API People siano nell'elenco.
Configura la schermata per il consenso OAuth
Le azioni di Gemini Enterprise Workspace Calendar e Gmail richiedono una configurazione della schermata di consenso:
- Nella console Google Cloud, fai clic su per visualizzare il menu ☰ > Piattaforma Google Auth > Branding.
- Fai clic su Inizia.
- Nella sezione Informazioni sull'app, imposta il Nome app su
Codelab. - In Email dell'assistenza utente, scegli un indirizzo email dell'assistenza a cui gli utenti possono contattarti in caso di domande sul loro consenso.
- Fai clic su Avanti.
- Nella sezione Pubblico, seleziona Interno.
- Fai clic su Avanti.
- In Informazioni di contatto, inserisci un indirizzo email a cui ricevere notifiche in caso di modifiche al tuo progetto.
- Fai clic su Avanti.
- In Fine, esamina le Norme relative ai dati utente dei servizi API di Google e, se le accetti, seleziona Accetto le Norme relative ai dati utente dei servizi API di Google.
- Fai clic su Continua e poi su Crea.

- La configurazione viene salvata e viene visualizzata automaticamente la pagina Google Auth Platform > Panoramica.
- Vai ad Accesso ai dati.
- Fai clic su Aggiungi o rimuovi ambiti.
- Copia i seguenti ambiti e incollali nel campo Aggiungi ambiti manualmente.
https://www.googleapis.com/auth/calendar.readonly
https://www.googleapis.com/auth/calendar.events
https://www.googleapis.com/auth/calendar.calendars
https://www.googleapis.com/auth/gmail.send
https://www.googleapis.com/auth/gmail.readonly
- Fai clic su Aggiungi alla tabella, poi su Aggiorna e infine su Salva.

Per saperne di più, consulta la guida completa Configurare il consenso OAuth.
Crea le credenziali client OAuth
Crea un nuovo client OAuth per Gemini Enterprise per autenticare gli utenti:
- Nella console Google Cloud, fai clic su per visualizzare il menu ☰ > Piattaforma Google Auth > Client.
- Fai clic su + Crea cliente.
- Per Tipo di applicazione, seleziona Applicazione web.
- Imposta Nome su
codelab. - Salta Origini JavaScript autorizzate.
- Nella sezione URI di reindirizzamento autorizzati, fai clic su Aggiungi URI e inserisci
https://vertexaisearch.cloud.google.com/oauth-redirect. - Fai clic su Crea.
- Verrà visualizzata una finestra di dialogo con l'ID client OAuth e il client secret appena creati. Salva queste informazioni in un luogo sicuro.

Crea datastore
Apri Gemini Enterprise dalla console Cloud in una nuova scheda, poi segui questi passaggi:
- Fai clic sull'app denominata
codelab. - Nel menu di navigazione, fai clic su Datastore connessi.
- Fai clic su + Nuovo datastore.
- In Origine, cerca Google Calendar e fai clic su Seleziona.
- Nella sezione Azioni, inserisci l'ID client e il client secret salvati nei passaggi precedenti, quindi fai clic su Verifica autenticazione e segui i passaggi per autenticare e autorizzare il client OAuth.
- Attiva le azioni Crea evento di calendario e Aggiorna evento di calendario.
- Fai clic su Continua.

- Nella sezione Configurazione, imposta Nome connettore dati su
calendar. - Fai clic su Crea.
- Viene eseguito automaticamente il reindirizzamento a Datastore connessi, dove puoi visualizzare il datastore appena aggiunto.
Crea il datastore Google Gmail:
- Fai clic su + Nuovo datastore.
- In Origine, cerca Google Gmail e fai clic su Seleziona.
- Nella sezione Azioni, inserisci l'ID client e il client secret salvati nei passaggi precedenti, quindi fai clic su Verifica autenticazione.
- Attiva l'azione Invia email.
- Fai clic su Continua.
- Nella sezione Configurazione, imposta Nome connettore dati su
gmail. - Fai clic su Crea.
- Viene eseguito automaticamente il reindirizzamento a Datastore connessi, dove puoi visualizzare il datastore appena aggiunto.
Crea il datastore Google Drive:
- Fai clic su + Nuovo datastore.
- In Origine, cerca Google Drive e fai clic su Seleziona.
- Nella sezione Dati, seleziona Tutti e poi fai clic su Continua.
- Nella sezione Configurazione, imposta Nome connettore dati su
drive. - Fai clic su Crea.
- Viene eseguito automaticamente il reindirizzamento a Datastore connessi, dove puoi visualizzare il datastore appena aggiunto.
Crea il datastore NotebookLM:
- Fai clic su + Nuovo datastore.
- In Origine, cerca NotebookLM e fai clic su Seleziona.
- Nella sezione Configurazione, imposta Nome connettore dati su
notebooklm. - Fai clic su Crea.
- Viene eseguito automaticamente il reindirizzamento a Datastore connessi, dove puoi visualizzare il datastore appena aggiunto.
Dopo qualche minuto, lo stato di tutti i datastore connessi (ad eccezione di NotebookLM) sarà Attivo. Se visualizzi errori, puoi fare clic sull'origine dati per visualizzarne i dettagli.

Datastore di test
Apri l'URL dell'app web Gemini Enterprise che abbiamo copiato in precedenza:
- Fai clic su Menu ☰ > Nuova chat.
- Nel piè di pagina del nuovo campo del messaggio di chat, fai clic sull'icona Connettori e attiva tutti i connettori.
- Ora puoi sperimentare con i prompt relativi ai connettori. Ad esempio, nella chat, digita
Do I have any meetings today?e premienter. - Poi prova a digitare
How many emails did I receive today?e premienter. - Infine, digita
Give me the title of the last Drive file I createde premienter.

Crea un agente personalizzato
Nell'app web Gemini Enterprise, crea un nuovo agente utilizzando Agent Designer:
- Fai clic su Menu ☰ > + Nuovo agente.
- Nella chat, digita
An agent that always sends pirate-themed emails but use normal English otherwisee premienter.

- Agent Designer crea una bozza dell'agente in base al prompt e lo apre nell'editor.
- Fai clic su Crea
Prova l'agente personalizzato
- Nell'app web Gemini Enterprise, chatta con l'agente appena creato:
- Fai clic su Menu ☰ > Agenti.
- Seleziona l'agente nella sezione I tuoi agenti.
- Nel piè di pagina del nuovo campo del messaggio di chat, fai clic sull'icona Connettori, poi su Attiva azioni per Posta e segui le istruzioni per autorizzare l'agente.
- Nella chat, digita
Send an email to someone@example.com saying I'll see them at Cloud Next, generate some subject and body yourselfe premienter. Puoi sostituire l'email di esempio con il tuo indirizzo email. - Fai clic su ✔️ per inviare l'email.


4. Agente personalizzato pro-code
Questo agente consente agli utenti di cercare dati ed eseguire azioni per Workspace nel loro linguaggio naturale utilizzando strumenti e regole personalizzati. Si basa sui seguenti elementi:
- Modello: Gemini.
- Dati e azioni: archivi di dati di Gemini Enterprise per Google Workspace (Calendar, Gmail, Drive, NotebookLM), Ricerca Google, server del protocollo di contesto del modello (MCP) di Vertex AI Search gestito da Google, funzione di strumento personalizzato per inviare messaggi Google Chat (tramite l'API Google Chat).
- Strumenti di creazione di agenti:Agent Development Kit (ADK).
- Host dell'agente:Vertex AI Agent Engine.
- UI:app web Gemini Enterprise.
Verrà integrato in Gemini Enterprise utilizzando la funzionalità Bring Your Own, quindi dobbiamo seguire i passaggi di deployment, registrazione e configurazione.
Concetti relativi alle recensioni
Vertex AI
Vertex AI offre tutto ciò di cui hai bisogno per creare e utilizzare l'AI generativa, tra cui soluzioni AI, ricerca e conversazione, oltre 130 modelli di base e una piattaforma AI unificata.

Agent Development Kit (ADK)
Agent Development Kit (ADK) è una suite specializzata di strumenti e framework progettati per semplificare la creazione di agenti AI autonomi fornendo moduli predefiniti per il ragionamento, la gestione della memoria e l'integrazione degli strumenti.
Model Context Protocol (MCP)
Il Model Context Protocol (MCP) è uno standard aperto progettato per consentire un'integrazione semplice e sicura tra le applicazioni AI e varie origini dati o strumenti tramite un'interfaccia universale "plug and play".
Strumento Funzione
Uno strumento di funzione è una routine eseguibile predefinita che un modello di AI può attivare per eseguire azioni specifiche o recuperare dati in tempo reale da sistemi esterni, estendendo le sue funzionalità oltre la semplice generazione di testo.
Esamina l'architettura della soluzione

Esaminare il codice sorgente
agent.py
...
MODEL = "gemini-2.5-flash"
# Gemini Enterprise authentication injects a bearer token into the ToolContext state.
# The key pattern is "GE_AUTH_NAME_<random_digits>".
# We dynamically parse this token to authenticate our MCP and API calls.
GE_AUTH_NAME = "enterprise-ai"
VERTEXAI_SEARCH_TIMEOUT = 15.0
def get_project_id():
"""Fetches the consumer project ID from the environment natively."""
_, project = google.auth.default()
if project:
return project
raise Exception(f"Failed to resolve GCP Project ID from environment.")
def find_serving_config_path():
"""Dynamically finds the default serving config in the engine."""
project_id = get_project_id()
engines = discoveryengine_v1.EngineServiceClient().list_engines(
parent=f"projects/{project_id}/locations/global/collections/default_collection"
)
for engine in engines:
# engine.name natively contains the numeric Project Number
return f"{engine.name}/servingConfigs/default_serving_config"
raise Exception(f"No Discovery Engines found in project {project_id}")
def _get_access_token_from_context(tool_context: ToolContext) -> str:
"""Helper method to dynamically parse the intercepted bearer token from the context state."""
escaped_name = re.escape(GE_AUTH_NAME)
pattern = re.compile(fr"^{escaped_name}_\d+$")
# Handle ADK varying state object types (Raw Dict vs ADK State)
state_dict = tool_context.state.to_dict() if hasattr(tool_context.state, 'to_dict') else tool_context.state
matching_keys = [k for k in state_dict.keys() if pattern.match(k)]
if matching_keys:
return state_dict.get(matching_keys[0])
raise Exception(f"No bearer token found in ToolContext state matching pattern {pattern.pattern}")
def auth_header_provider(tool_context: ToolContext) -> dict[str, str]:
token = _get_access_token_from_context(tool_context)
return {"Authorization": f"Bearer {token}"}
def send_direct_message(email: str, message: str, tool_context: ToolContext) -> dict:
"""Sends a Google Chat Direct Message (DM) to a specific user by email address."""
chat_client = chat_v1.ChatServiceClient(
credentials=Credentials(token=_get_access_token_from_context(tool_context))
)
# 1. Setup the DM space or find existing one
person = chat_v1.User(
name=f"users/{email}",
type_=chat_v1.User.Type.HUMAN
)
membership = chat_v1.Membership(member=person)
space_req = chat_v1.Space(space_type=chat_v1.Space.SpaceType.DIRECT_MESSAGE)
setup_request = chat_v1.SetUpSpaceRequest(
space=space_req,
memberships=[membership]
)
space_response = chat_client.set_up_space(request=setup_request)
space_name = space_response.name
# 2. Send the message
msg = chat_v1.Message(text=message)
message_request = chat_v1.CreateMessageRequest(
parent=space_name,
message=msg
)
message_response = chat_client.create_message(request=message_request)
return {"status": "success", "message_id": message_response.name, "space": space_name}
vertexai_mcp = McpToolset(
connection_params=StreamableHTTPConnectionParams(
url="https://discoveryengine.googleapis.com/mcp",
timeout=VERTEXAI_SEARCH_TIMEOUT,
sse_read_timeout=VERTEXAI_SEARCH_TIMEOUT
),
tool_filter=['search'],
# The auth_header_provider dynamically injects the bearer token from the ToolContext
# into the MCP call for authentication.
header_provider=auth_header_provider
)
# Answer nicely the following user queries:
# - Please find my meetings for today, I need their titles and links
# - What is the latest Drive file I created?
# - What is the latest Gmail message I received?
# - Please send the following message to someone@example.com: Hello, this is a test message.
root_agent = LlmAgent(
model=MODEL,
name='enterprise_ai',
instruction=f"""
You are a helpful assistant that always uses the Vertex AI MCP search tool to answer the user's message, unless the user asks you to send a message to someone.
If the user asks you to send a message to someone, use the send_direct_message tool to send the message.
You MUST unconditionally use the Vertex AI MCP search tool to find answer, even if you believe you already know the answer or believe the Vertex AI MCP search tool does not contain the data.
The Vertex AI MCP search tool accesses the user's data through datastores including Google Drive, Google Calendar, and Gmail.
Only use the Vertex AI MCP search tool with servingConfig and query parameters, do not use any other parameters.
Always use the servingConfig {find_serving_config_path()} while using the Vertex AI MCP search tool.
""",
tools=[vertexai_mcp, FunctionTool(send_direct_message)]
)
Abilita le API
La soluzione richiede l'abilitazione di API aggiuntive:
- Nella console Google Cloud, abilita le API Vertex AI, Cloud Resource Manager e Google Chat:

- Fai clic su Menu ☰ > API e servizi > API e servizi abilitati e poi verifica che API Vertex AI, API Cloud Resource Manager e API Google Chat siano nell'elenco.
Aggiorna la schermata per il consenso OAuth
La soluzione richiede un accesso aggiuntivo ai dati:
- Nella console Google Cloud, fai clic su per visualizzare il menu ☰ > Piattaforma Google Auth > Accesso ai dati.
- Fai clic su Aggiungi o rimuovi ambiti.
- Copia i seguenti ambiti e incollali nel campo Aggiungi ambiti manualmente.
- Fai clic su Aggiungi alla tabella, poi su Aggiorna e infine su Salva.
https://www.googleapis.com/auth/cloud-platform
https://www.googleapis.com/auth/chat.messages.create
https://www.googleapis.com/auth/chat.spaces.create
- Fai clic su Aggiungi alla tabella, poi su Aggiorna e infine su Salva.

Aggiorna le credenziali client OAuth
La soluzione richiede un URI di reindirizzamento autorizzato aggiuntivo:
- Nella console Google Cloud, fai clic su per visualizzare il menu ☰ > Piattaforma Google Auth > Client.
- Fai clic sul nome del cliente
codelab. - Nella sezione URI di reindirizzamento autorizzati, fai clic su Aggiungi URI e inserisci
https://vertexaisearch.cloud.google.com/static/oauth/oauth.html. - Fai clic su Salva.

Abilita Vertex AI Search MCP
- In un terminale, esegui:
gcloud beta services mcp enable discoveryengine.googleapis.com \
--project=$(gcloud config get-value project)
Configurare l'app Chat
- Nella console Google Cloud, cerca
Google Chat APInel campo di ricerca di Google Cloud, fai clic su API Google Chat, poi su Gestisci e infine su Configurazione.
- Imposta Nome app e Descrizione su
Gemini Enterprise. - Imposta l'URL dell'avatar su
https://developers.google.com/workspace/add-ons/images/quickstart-app-avatar.png. - Deseleziona Attiva funzionalità interattive, quindi fai clic su Disattiva nella finestra di dialogo modale visualizzata.
- Seleziona Errori di log in Logging.
- Fai clic su Salva.

Deployment dell'agente in Vertex AI Agent Engine
- Scarica questo repository GitHub.
- In un terminale, apri la directory
solutions/enterprise-ai-agented esegui:
# 1. Create and activate a new virtual environment python3 -m venv .venv source .venv/bin/activate # 2. Install poetry and project dependencies pip install poetry poetry install # 3. Deploy the agent adk deploy agent_engine \ --project=$(gcloud config get-value project) \ --region=us-central1 \ --display_name="Enterprise AI" \ enterprise_ai

- Quando nei log viene visualizzata la riga Deploying to agent engine..., apri un nuovo terminale ed esegui il comando seguente per aggiungere le autorizzazioni richieste a Vertex AI Reasoning Engine Service Agent:
# 1. Get the current Project ID
PROJECT_ID=$(gcloud config get-value project)
# 2. Extract the Project Number for that ID
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
# 3. Construct the Service Account name
SERVICE_ACCOUNT="service-${PROJECT_NUMBER}@gcp-sa-aiplatform-re.iam.gserviceaccount.com"
# 4. Apply the IAM policy binding
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$SERVICE_ACCOUNT" \
--role="roles/discoveryengine.viewer"
- Attendi il completamento del comando adk deploy, quindi copia il nome della risorsa dell'agente appena sottoposto a deployment dall'output del comando in verde.

Registrare l'agente in Gemini Enterprise
Apri Gemini Enterprise dalla console Cloud in una nuova scheda, poi segui questi passaggi:
- Fai clic sull'app denominata
codelab. - Nel menu di navigazione, fai clic su Agenti.
- Fai clic su + Aggiungi agente.
- Fai clic su Aggiungi per Agente personalizzato tramite motore agente. Viene visualizzata la sezione Autorizzazioni.
- Fai clic su Aggiungi autorizzazione.
- Imposta Nome autorizzazione su
enterprise-ai. Viene generato un ID in base al nome e visualizzato sotto il campo. Copialo. - Imposta l'ID client sullo stesso valore del client OAuth creato e aggiornato nei passaggi precedenti.
- Imposta Client secret sullo stesso valore del client OAuth creato e aggiornato nei passaggi precedenti.
- Imposta URI del token su
https://oauth2.googleapis.com/token. - Imposta l'URI di autorizzazione sul seguente valore dopo aver sostituito <CLIENT_ID> con l'ID client OAuth creato e aggiornato nei passaggi precedenti.
https://accounts.google.com/o/oauth2/v2/auth?client_id=<CLIENT_ID>&redirect_uri=https%3A%2F%2Fvertexaisearch.cloud.google.com%2Fstatic%2Foauth%2Foauth.html&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar.readonly%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar.calendars%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar.events%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgmail.send%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgmail.readonly%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fchat.messages.create%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fchat.spaces.create&include_granted_scopes=true&response_type=code&access_type=offline&prompt=consent
- Fai clic su Fine, poi su Avanti. Viene visualizzata la sezione Configurazione.
- Imposta Nome dell'agente e Descrizione dell'agente su
Enterprise AI. - Imposta il motore di ragionamento di Agent Engine sul nome della risorsa del motore di ragionamento copiato nei passaggi precedenti. Il formato è il seguente:
projects/<PROJECT_ID>/locations/<LOCATION>/reasoningEngines/<REASONING_ENGINE_ID>
- Fai clic su Crea. L'agente appena aggiunto è ora elencato nella sezione Agenti.
Prova l'agente
- Nell'app web Gemini Enterprise, chatta con l'agente appena registrato:
- Fai clic su Menu ☰ > Agenti.
- Seleziona l'agente nella sezione Dalla tua organizzazione.
- Nella chat, digita
Please find my meetings for today, I need their titles and linkse premienter. - Fai clic su Autorizza, poi segui il flusso di autorizzazione.

- L'agente risponde con un elenco di eventi di calendario (a seconda dell'account dell'utente).
- Nella chat, digita
Please send a Chat message to someone@example.com with the following text: Hello!e premienter. - L'agente risponde con un messaggio di conferma.


5. Agente predefinito come componente aggiuntivo di Google Workspace
Questo agente consente agli utenti di cercare dati per Workspace nel loro linguaggio naturale nel contesto delle UI delle app Workspace. Si basa sui seguenti elementi:
- Modello: Gemini.
- Dati: archivi di dati di Gemini Enterprise per Google Workspace (Calendar, Gmail, Drive, NotebookLM), Ricerca Google.
- Host dell'agente: Gemini Enterprise.
- UI: componente aggiuntivo Google Workspace per Chat e Gmail (facilmente estendibile a Calendar, Drive, Documenti, Fogli e Presentazioni).
- Componente aggiuntivo Google Workspace:Apps Script, API Gemini Enterprise e Vertex AI, contestuali (metadati utente, messaggio Gmail selezionato).
Il componente aggiuntivo Google Workspace verrà collegato a Gemini Enterprise utilizzando l'API StreamAssist.
Rivedere i concetti
Componente aggiuntivo di Google Workspace
Un componente aggiuntivo di Google Workspace è un'applicazione personalizzata che estende una o più applicazioni Google Workspace (Gmail, Chat, Calendar, Documenti, Drive, Meet, Fogli e Presentazioni).
Apps Script
Apps Script è una piattaforma JavaScript basata sul cloud e basata su Google Drive che ti consente di integrare e automatizzare le attività nei prodotti Google.
Framework delle schede di Google Workspace
Il framework delle schede in Google Workspace consente agli sviluppatori di creare interfacce utente interattive e avanzate. Consente di creare schede organizzate e visivamente accattivanti che possono includere testo, immagini, pulsanti e altri widget. Queste schede migliorano l'esperienza utente fornendo informazioni strutturate e consentendo azioni rapide direttamente all'interno delle applicazioni Workspace.
Esamina l'architettura della soluzione

Esaminare il codice sorgente
appsscript.json
...
"addOns": {
"common": {
"name": "Enterprise AI",
"logoUrl": "https://developers.google.com/workspace/add-ons/images/quickstart-app-avatar.png"
},
"chat": {},
"gmail": {
"contextualTriggers": [
{
"unconditional": {},
"onTriggerFunction": "onAddonEvent"
}
]
}
},
"oauthScopes": [
"https://www.googleapis.com/auth/script.external_request",
"https://www.googleapis.com/auth/discoveryengine.assist.readwrite",
"https://www.googleapis.com/auth/gmail.addons.execute",
"https://www.googleapis.com/auth/gmail.addons.current.message.readonly"
]
...
Chat.gs
...
// Service that handles Google Chat operations.
// Handle incoming Google Chat message events, actions will be taken via Google Chat API calls
function onMessage(event) {
if (isInDebugMode()) {
console.log(`MESSAGE event received (Chat): ${JSON.stringify(event)}`);
}
// Extract data from the event.
const chatEvent = event.chat;
setChatConfig(chatEvent.messagePayload.space.name);
// Request AI agent to answer the message
requestAgent(chatEvent.messagePayload.message);
// Respond with an empty response to the Google Chat platform to acknowledge execution
return null;
}
// --- Utility functions ---
// The Chat direct message (DM) space associated with the user
const SPACE_NAME_PROPERTY = "DM_SPACE_NAME"
// Sets the Chat DM space name for subsequent operations.
function setChatConfig(spaceName) {
const userProperties = PropertiesService.getUserProperties();
userProperties.setProperty(SPACE_NAME_PROPERTY, spaceName);
console.log(`Space is set to ${spaceName}`);
}
// Retrieved the Chat DM space name to sent messages to.
function getConfiguredChat() {
const userProperties = PropertiesService.getUserProperties();
return userProperties.getProperty(SPACE_NAME_PROPERTY);
}
// Finds the Chat DM space name between the Chat app and the given user.
function findChatAppDm(userName) {
return Chat.Spaces.findDirectMessage(
{ 'name': userName },
{'Authorization': `Bearer ${getAddonCredentials().getAccessToken()}`}
).name;
}
// Creates a Chat message in the configured space.
function createMessage(message) {
const spaceName = getConfiguredChat();
console.log(`Creating message in space ${spaceName}...`);
return Chat.Spaces.Messages.create(
message,
spaceName,
{},
{'Authorization': `Bearer ${getAddonCredentials().getAccessToken()}`}
).name;
}
Sidebar.gs
...
// Service that handles Gmail operations.
// Triggered when the user opens the Gmail Add-on or selects an email.
function onAddonEvent(event) {
// If this was triggered by a button click, handle it
if (event.parameters && event.parameters.action === 'send') {
return handleSendMessage(event);
}
// Otherwise, just render the default initial sidebar
return createSidebarCard();
}
// Creates the standard Gmail sidebar card consisting of a text input and send button.
// Optionally includes an answer section if a response was generated.
function createSidebarCard(optionalAnswerSection) {
const card = CardService.newCardBuilder();
const actionSection = CardService.newCardSection();
// Create text input for the user's message
const messageInput = CardService.newTextInput()
.setFieldName("message")
.setTitle("Message")
.setMultiline(true);
// Create action for sending the message
const sendAction = CardService.newAction()
.setFunctionName('onAddonEvent')
.setParameters({ 'action': 'send' });
const sendButton = CardService.newTextButton()
.setText("Send message")
.setTextButtonStyle(CardService.TextButtonStyle.FILLED)
.setOnClickAction(sendAction);
actionSection.addWidget(messageInput);
actionSection.addWidget(CardService.newButtonSet().addButton(sendButton));
card.addSection(actionSection);
// Attach the response at the bottom if we have one
if (optionalAnswerSection) {
card.addSection(optionalAnswerSection);
}
return card.build();
}
// Handles clicks from the Send message button.
function handleSendMessage(event) {
const commonEventObject = event.commonEventObject || {};
const formInputs = commonEventObject.formInputs || {};
const messageInput = formInputs.message;
let userMessage = "";
if (messageInput && messageInput.stringInputs && messageInput.stringInputs.value.length > 0) {
userMessage = messageInput.stringInputs.value[0];
}
if (!userMessage || userMessage.trim().length === 0) {
return CardService.newActionResponseBuilder()
.setNotification(CardService.newNotification().setText("Please enter a message."))
.build();
}
let finalQueryText = `USER MESSAGE TO ANSWER: ${userMessage}`;
// If we have an email selected in Gmail, append its content as context
if (event.gmail && event.gmail.messageId) {
try {
GmailApp.setCurrentMessageAccessToken(event.gmail.accessToken);
const message = GmailApp.getMessageById(event.gmail.messageId);
const subject = message.getSubject();
const bodyText = message.getPlainBody() || message.getBody();
finalQueryText += `\n\nEMAIL THE USER HAS OPENED ON SCREEN:\nSubject: ${subject}\nBody:\n---\n${bodyText}\n---`;
} catch (e) {
console.error("Could not fetch Gmail context: " + e);
// Invalidate the token explicitly so the next prompt requests the missing scopes
ScriptApp.invalidateAuth();
CardService.newAuthorizationException()
.setResourceDisplayName("Enterprise AI")
.setAuthorizationUrl(ScriptApp.getAuthorizationUrl())
.throwException();
}
}
try {
const responseText = queryAgent({ text: finalQueryText, forceNewSession: true });
// We leverage the 'showdown' library to parse the LLM's Markdown output into HTML
// We also substitute markdown listings with arrows and adjust newlines for clearer rendering in the sidebar
let displayedText = substituteListingsFromMarkdown(responseText);
displayedText = new showdown.Converter().makeHtml(displayedText).replace(/\n/g, '\n\n');
const textParagraph = CardService.newTextParagraph();
textParagraph.setText(displayedText);
const answerSection = CardService.newCardSection()
.addWidget(textParagraph);
const updatedCard = createSidebarCard(answerSection);
return CardService.newActionResponseBuilder()
.setNavigation(CardService.newNavigation().updateCard(updatedCard))
.build();
} catch (err) {
return CardService.newActionResponseBuilder()
.setNotification(CardService.newNotification().setText("Error fetching response: " + err.message))
.build();
}
}
...
AgentHandler.gs
...
// Service that handles Gemini Enterprise AI Agent operations.
// Submits a query to the AI agent and returns the response string synchronously
function queryAgent(input) {
const isNewSession = input.forceNewSession || !PropertiesService.getUserProperties().getProperty(AGENT_SESSION_NAME);
const sessionName = input.forceNewSession ? createAgentSession() : getOrCreateAgentSession();
let systemPrompt = "SYSTEM PROMPT START Do not respond with tables but use bullet points instead.";
if (input.forceNewSession) {
systemPrompt += " Do not ask the user follow-up questions or converse with them as history is not kept in this interface.";
}
systemPrompt += " SYSTEM PROMPT END\n\n";
const queryText = isNewSession ? systemPrompt + input.text : input.text;
const requestPayload = {
"session": sessionName,
"userMetadata": { "timeZone": Session.getScriptTimeZone() },
"query": { "text": queryText },
"toolsSpec": { "vertexAiSearchSpec": { "dataStoreSpecs": getAgentDataStores().map(ds => { dataStore: ds }) } },
"agentsSpec": { "agentSpecs": [{ "agentId": getAgentId() }] }
};
const responseContentText = UrlFetchApp.fetch(
`https://${getLocation()}-discoveryengine.googleapis.com/v1alpha/${getReasoningEngine()}/assistants/default_assistant:streamAssist?alt=sse`,
{
method: 'post',
headers: { 'Authorization': `Bearer ${ScriptApp.getOAuthToken()}` },
contentType: 'application/json',
payload: JSON.stringify(requestPayload),
muteHttpExceptions: true
}
).getContentText();
if (isInDebugMode()) {
console.log(`Response: ${responseContentText}`);
}
const events = responseContentText.split('\n').map(s => s.replace(/^data:\s*/, '')).filter(s => s.trim().length > 0);
console.log(`Received ${events.length} agent events.`);
let answerText = "";
for (const eventJson of events) {
if (isInDebugMode()) {
console.log("Event: " + eventJson);
}
const event = JSON.parse(eventJson);
// Ignore internal events
if (!event.answer) {
console.log(`Ignored: internal event`);
continue;
}
// Handle text replies
const replies = event.answer.replies || [];
for (const reply of replies) {
const content = reply.groundedContent.content;
if (content) {
if (isInDebugMode()) {
console.log(`Processing content: ${JSON.stringify(content)}`);
}
if (content.thought) {
console.log(`Ignored: thought event`);
continue;
}
answerText += content.text;
}
}
if (event.answer.state === "SUCCEEDED") {
console.log(`Answer text: ${answerText}`);
return answerText;
} else if (event.answer.state !== "IN_PROGRESS") {
throw new Error("Something went wrong, check the Apps Script logs for more info.");
}
}
return answerText;
}
// Gets the list of data stores configured for the agent to include in the request.
function getAgentDataStores() {
const responseContentText = UrlFetchApp.fetch(
`https://${getLocation()}-discoveryengine.googleapis.com/v1/${getReasoningEngine().split('/').slice(0, 6).join('/')}/dataStores`,
{
method: 'get',
// Use the add on service account credentials for data store listing access
headers: { 'Authorization': `Bearer ${getAddonCredentials().getAccessToken()}` },
contentType: 'application/json',
muteHttpExceptions: true
}
).getContentText();
if (isInDebugMode()) {
console.log(`Response: ${responseContentText}`);
}
const dataStores = JSON.parse(responseContentText).dataStores.map(ds => ds.name);
if (isInDebugMode()) {
console.log(`Data stores: ${dataStores}`);
}
return dataStores;
}
...
Avviare il service account
Nella console Google Cloud, segui questi passaggi:
- Fai clic su Menu ☰ > IAM e amministrazione > Service account > + Crea service account.
- Imposta Nome service account su
ge-add-on.

- Fai clic su Crea e continua.
- Aggiungi il ruolo Visualizzatore Discovery Engine nelle autorizzazioni.

- Fai clic su Continua e poi su Fine. Viene visualizzata la pagina Service account e puoi vedere il service account che hai creato.

- Seleziona il service account appena creato e poi la scheda Chiavi.
- Fai clic su Aggiungi chiave, poi su Crea nuova chiave.
- Seleziona JSON, quindi fai clic su Crea.

- La finestra di dialogo si chiude e la coppia di chiavi pubblica/privata appena creata viene scaricata automaticamente nell'ambiente locale come file JSON.
Creare e configurare il progetto Apps Script
- Fai clic sul pulsante seguente per aprire il progetto Apps Script Enterprise AI add on:
- Fai clic su Panoramica > Crea una copia.
- Nel progetto Apps Script, fai clic su Impostazioni progetto > Modifica proprietà script > Aggiungi proprietà script per aggiungere le proprietà dello script.
- Imposta REASONING_ENGINE_RESOURCE_NAME sul nome della risorsa dell'applicazione Gemini Enterprise. Il formato è il seguente:
# 1. Replace PROJECT_ID with the Google Cloud project ID. # 2. Replace GE_APP_ID with the codelab app ID found in Google Cloud console > Gemini Enterprise > Apps. projects/<PROJECT_ID>/locations/global/collections/default_collection/engines/<GE_APP_ID>
- Imposta APP_SERVICE_ACCOUNT_KEY sulla chiave JSON del file del service account scaricato nei passaggi precedenti.
- Fai clic su Salva proprietà script.
Esegui il deployment su Gmail e Chat
Nel progetto Apps Script, segui questi passaggi:
- Fai clic su Deployment > Test deployment, poi su Installa. Ora è disponibile in Gmail.
- Fai clic su Copia in ID deployment head.

Nella console Google Cloud, segui questi passaggi:
- Cerca
Google Chat APInel campo di ricerca di Google Cloud, fai clic su API Google Chat, poi su Gestisci e infine su Configurazione.
- Seleziona Abilita funzionalità interattive.
- Deseleziona Partecipa a spazi e conversazioni di gruppo.
- Nella sezione Impostazioni di connessione, seleziona Apps Script.
- Imposta Deployment ID (ID deployment) sull'Head Deployment ID (ID deployment principale) copiato nei passaggi precedenti.
- Nella sezione Visibilità, seleziona Rendi disponibile questa app di chat a utenti e gruppi specifici nel tuo dominio Workspace e inserisci il tuo indirizzo email.
- Fai clic su Salva.

Prova il componente aggiuntivo
Apri Google Chat in una nuova scheda, poi segui questi passaggi:
- Apri uno spazio di messaggi diretti con l'app di chat Gemini Enterprise.

- Fai clic su Configura e segui il flusso di autenticazione.
- Digita
What are my meetings for today?e premienter. L'app di chat Gemini Enterprise dovrebbe rispondere con i risultati.

Apri Gmail in una nuova scheda, poi segui questi passaggi:
- Inviati un'email con il campo Oggetto impostato su
We need to talke il campo Corpo impostato suAre you available today between 8 and 9 AM?. - Apri il messaggio email appena ricevuto.
- Apri la barra laterale del componente aggiuntivo Enterprise AI.
- Imposta Messaggio su
Am I? - Fai clic su Invia messaggio.
- La risposta viene visualizzata dopo il pulsante.

6. Esegui la pulizia
Elimina progetto Google Cloud
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo codelab, ti consigliamo di eliminare il progetto Google Cloud.
Nella console Google Cloud, segui questi passaggi:
- Fai clic su Menu ☰ > IAM e amministrazione > Impostazioni.
- Fai clic su Chiudi.
- Inserisci l'ID progetto.
- Fai clic su Chiudi comunque.

7. Complimenti
Complimenti! Avete creato soluzioni che sfruttano la potenza di Gemini Enterprise e Google Workspace per i lavoratori.
Passaggi successivi
In questo codelab mostriamo solo i casi d'uso più tipici, ma ci sono molte aree di espansione che potresti prendere in considerazione nelle tue soluzioni, ad esempio:
- Utilizza strumenti per sviluppatori basati sull'AI come Gemini CLI e Antigravity.
- Integrati con altri framework e strumenti per agenti, come MCP personalizzati, chiamate di funzioni personalizzate e UI generative.
- Esegui l'integrazione con altri modelli di AI, inclusi quelli personalizzati, ospitati su piattaforme dedicate come Vertex AI.
- Eseguire l'integrazione con altri agenti, ospitati in piattaforme dedicate come Dialogflow o da terze parti tramite Cloud Marketplace.
- Pubblica agenti su Cloud Marketplace per consentire a team, organizzazioni o utenti pubblici di utilizzarli.
Scopri di più
Gli sviluppatori hanno a disposizione molte risorse, come video di YouTube, siti web di documentazione, esempi di codice e tutorial:
- Google Cloud Developer Center
- Prodotti supportati | Server MCP di Google Cloud
- A2UI
- Model Garden su Vertex AI | Google Cloud
- Panoramica degli agenti | Gemini Enterprise | Documentazione di Google Cloud
- Scalare gli agenti di AI con Google Cloud Marketplace e Gemini Enterprise
- Offrire agenti di AI tramite Google Cloud Marketplace
- Canale YouTube Google Workspace Developers - Benvenuti, sviluppatori!
- Sito web per gli sviluppatori di Google Workspace
- Repository GitHub per tutti gli esempi di componenti aggiuntivi di Google Workspace

