Integrare gli agenti Gemini Enterprise con Google Workspace

1. Prima di iniziare

83e1c1629d14fb31.png

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.

127f2ed7d484722c.png

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:

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.

90e42539e5959634.png

60e62437ce29a818.png

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.

1647ebff031c42e7.png

a8087d2351e77fb4.png

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).

c8c63fb3f324fecf.png

d33b8cb50ee251b7.png

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:

  1. Seleziona il progetto.
  2. 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.

  1. Imposta Nome app su codelab.
  2. Viene generato un ID in base al nome e visualizzato sotto il campo. Copialo.
  3. Imposta Più regioni su global (Global).
  4. Fai clic su Crea.

8712ada39377205e.png

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

3209c156eff4ba43.png

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

f0cd9da419b41cb6.png

App web Gemini Enterprise

Apri Gemini Enterprise dalla console Cloud in una nuova scheda, poi segui questi passaggi:

  1. Fai clic sull'app denominata codelab.
  2. Copia l'URL visualizzato, in quanto lo utilizzeremo per accedere all'app web Gemini Enterprise nei passaggi successivi.

b46ee6176744565d.png

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

e77aafb772502aaf.png

Abilita le API

I datastore Gemini Enterprise Workspace richiedono l'attivazione delle API:

  1. Nella console Google Cloud, abilita le API Calendar, Gmail e People:

573322606b715a69.png

  1. 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.

Le azioni di Gemini Enterprise Workspace Calendar e Gmail richiedono una configurazione della schermata di consenso:

  1. Nella console Google Cloud, fai clic su per visualizzare il menu ☰ > Piattaforma Google Auth > Branding.

  1. Fai clic su Inizia.
  2. Nella sezione Informazioni sull'app, imposta il Nome app su Codelab .
  3. In Email dell'assistenza utente, scegli un indirizzo email dell'assistenza a cui gli utenti possono contattarti in caso di domande sul loro consenso.
  4. Fai clic su Avanti.
  5. Nella sezione Pubblico, seleziona Interno.
  6. Fai clic su Avanti.
  7. In Informazioni di contatto, inserisci un indirizzo email a cui ricevere notifiche in caso di modifiche al tuo progetto.
  8. Fai clic su Avanti.
  9. 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.
  10. Fai clic su Continua e poi su Crea.

578c2b38219b2f7b.png

  1. La configurazione viene salvata e viene visualizzata automaticamente la pagina Google Auth Platform > Panoramica.
  2. Vai ad Accesso ai dati.
  3. Fai clic su Aggiungi o rimuovi ambiti.
  4. 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
  1. Fai clic su Aggiungi alla tabella, poi su Aggiorna e infine su Salva.

874b1dda14e8f379.png

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:

  1. Nella console Google Cloud, fai clic su per visualizzare il menu ☰ > Piattaforma Google Auth > Client.

  1. Fai clic su + Crea cliente.
  2. Per Tipo di applicazione, seleziona Applicazione web.
  3. Imposta Nome su codelab.
  4. Salta Origini JavaScript autorizzate.
  5. Nella sezione URI di reindirizzamento autorizzati, fai clic su Aggiungi URI e inserisci https://vertexaisearch.cloud.google.com/oauth-redirect.
  6. Fai clic su Crea.
  7. Verrà visualizzata una finestra di dialogo con l'ID client OAuth e il client secret appena creati. Salva queste informazioni in un luogo sicuro.

a46e5ebfb851aea5.png

Crea datastore

Apri Gemini Enterprise dalla console Cloud in una nuova scheda, poi segui questi passaggi:

  1. Fai clic sull'app denominata codelab.
  2. Nel menu di navigazione, fai clic su Datastore connessi.
  3. Fai clic su + Nuovo datastore.
  4. In Origine, cerca Google Calendar e fai clic su Seleziona.
  5. 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.
  6. Attiva le azioni Crea evento di calendario e Aggiorna evento di calendario.
  7. Fai clic su Continua.

a1d76e70edec0cf.png

  1. Nella sezione Configurazione, imposta Nome connettore dati su calendar.
  2. Fai clic su Crea.
  3. Viene eseguito automaticamente il reindirizzamento a Datastore connessi, dove puoi visualizzare il datastore appena aggiunto.

Crea il datastore Google Gmail:

  1. Fai clic su + Nuovo datastore.
  2. In Origine, cerca Google Gmail e fai clic su Seleziona.
  3. Nella sezione Azioni, inserisci l'ID client e il client secret salvati nei passaggi precedenti, quindi fai clic su Verifica autenticazione.
  4. Attiva l'azione Invia email.
  5. Fai clic su Continua.
  6. Nella sezione Configurazione, imposta Nome connettore dati su gmail.
  7. Fai clic su Crea.
  8. Viene eseguito automaticamente il reindirizzamento a Datastore connessi, dove puoi visualizzare il datastore appena aggiunto.

Crea il datastore Google Drive:

  1. Fai clic su + Nuovo datastore.
  2. In Origine, cerca Google Drive e fai clic su Seleziona.
  3. Nella sezione Dati, seleziona Tutti e poi fai clic su Continua.
  4. Nella sezione Configurazione, imposta Nome connettore dati su drive.
  5. Fai clic su Crea.
  6. Viene eseguito automaticamente il reindirizzamento a Datastore connessi, dove puoi visualizzare il datastore appena aggiunto.

Crea il datastore NotebookLM:

  1. Fai clic su + Nuovo datastore.
  2. In Origine, cerca NotebookLM e fai clic su Seleziona.
  3. Nella sezione Configurazione, imposta Nome connettore dati su notebooklm.
  4. Fai clic su Crea.
  5. 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.

ceba9eb2480a2696.png

Datastore di test

Apri l'URL dell'app web Gemini Enterprise che abbiamo copiato in precedenza:

  1. Fai clic su Menu ☰ > Nuova chat.
  2. Nel piè di pagina del nuovo campo del messaggio di chat, fai clic sull'icona Connettori e attiva tutti i connettori.
  3. Ora puoi sperimentare con i prompt relativi ai connettori. Ad esempio, nella chat, digita Do I have any meetings today? e premi enter.
  4. Poi prova a digitare How many emails did I receive today? e premi enter.
  5. Infine, digita Give me the title of the last Drive file I created e premi enter.

90e42539e5959634.png

Crea un agente personalizzato

Nell'app web Gemini Enterprise, crea un nuovo agente utilizzando Agent Designer:

  1. Fai clic su Menu ☰ > + Nuovo agente.
  2. Nella chat, digita An agent that always sends pirate-themed emails but use normal English otherwise e premi enter.

2803c1dedd20433e.png

  1. Agent Designer crea una bozza dell'agente in base al prompt e lo apre nell'editor.
  2. Fai clic su Crea

Prova l'agente personalizzato

  1. Nell'app web Gemini Enterprise, chatta con l'agente appena creato:
  2. Fai clic su Menu ☰ > Agenti.
  3. Seleziona l'agente nella sezione I tuoi agenti.
  4. 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.
  5. Nella chat, digita Send an email to someone@example.com saying I'll see them at Cloud Next, generate some subject and body yourself e premi enter. Puoi sostituire l'email di esempio con il tuo indirizzo email.
  6. Fai clic su ✔️ per inviare l'email.

60e62437ce29a818.png

d4fb65d14fdf27da.png

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.

4670fcf7a826af4d.png

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

43df337e0f3d64e8.png

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:

  1. Nella console Google Cloud, abilita le API Vertex AI, Cloud Resource Manager e Google Chat:

4f02a36b050bab00.png

  1. 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.

La soluzione richiede un accesso aggiuntivo ai dati:

  1. Nella console Google Cloud, fai clic su per visualizzare il menu ☰ > Piattaforma Google Auth > Accesso ai dati.

  1. Fai clic su Aggiungi o rimuovi ambiti.
  2. Copia i seguenti ambiti e incollali nel campo Aggiungi ambiti manualmente.
  3. 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
  1. Fai clic su Aggiungi alla tabella, poi su Aggiorna e infine su Salva.

56fbba733139acfe.png

Aggiorna le credenziali client OAuth

La soluzione richiede un URI di reindirizzamento autorizzato aggiuntivo:

  1. Nella console Google Cloud, fai clic su per visualizzare il menu ☰ > Piattaforma Google Auth > Client.

  1. Fai clic sul nome del cliente codelab.
  2. Nella sezione URI di reindirizzamento autorizzati, fai clic su Aggiungi URI e inserisci https://vertexaisearch.cloud.google.com/static/oauth/oauth.html.
  3. Fai clic su Salva.

deed597aa54fec91.png

Abilita Vertex AI Search MCP

  1. In un terminale, esegui:
gcloud beta services mcp enable discoveryengine.googleapis.com \
     --project=$(gcloud config get-value project)

Configurare l'app Chat

  1. Nella console Google Cloud, cerca Google Chat API nel campo di ricerca di Google Cloud, fai clic su API Google Chat, poi su Gestisci e infine su Configurazione.

  1. Imposta Nome app e Descrizione su Gemini Enterprise.
  2. Imposta l'URL dell'avatar su https://developers.google.com/workspace/add-ons/images/quickstart-app-avatar.png.
  3. Deseleziona Attiva funzionalità interattive, quindi fai clic su Disattiva nella finestra di dialogo modale visualizzata.
  4. Seleziona Errori di log in Logging.
  5. Fai clic su Salva.

90cb612e51bce4e6.png

Deployment dell'agente in Vertex AI Agent Engine

  1. Scarica questo repository GitHub.

  1. In un terminale, apri la directory solutions/enterprise-ai-agent ed 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

eafd2f9c4fbf305.png

  1. 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"
  1. 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.

d098fe1347d6581b.png

Registrare l'agente in Gemini Enterprise

Apri Gemini Enterprise dalla console Cloud in una nuova scheda, poi segui questi passaggi:

  1. Fai clic sull'app denominata codelab.
  2. Nel menu di navigazione, fai clic su Agenti.
  3. Fai clic su + Aggiungi agente.
  4. Fai clic su Aggiungi per Agente personalizzato tramite motore agente. Viene visualizzata la sezione Autorizzazioni.
  5. Fai clic su Aggiungi autorizzazione.
  6. Imposta Nome autorizzazione su enterprise-ai. Viene generato un ID in base al nome e visualizzato sotto il campo. Copialo.
  7. Imposta l'ID client sullo stesso valore del client OAuth creato e aggiornato nei passaggi precedenti.
  8. Imposta Client secret sullo stesso valore del client OAuth creato e aggiornato nei passaggi precedenti.
  9. Imposta URI del token su https://oauth2.googleapis.com/token.
  10. 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
  1. Fai clic su Fine, poi su Avanti. Viene visualizzata la sezione Configurazione.
  2. Imposta Nome dell'agente e Descrizione dell'agente su Enterprise AI.
  3. 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>
  1. Fai clic su Crea. L'agente appena aggiunto è ora elencato nella sezione Agenti.

Prova l'agente

  1. Nell'app web Gemini Enterprise, chatta con l'agente appena registrato:
  2. Fai clic su Menu ☰ > Agenti.
  3. Seleziona l'agente nella sezione Dalla tua organizzazione.
  4. Nella chat, digita Please find my meetings for today, I need their titles and links e premi enter.
  5. Fai clic su Autorizza, poi segui il flusso di autorizzazione.

ed61cf654cbcd76c.png

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

1647ebff031c42e7.png

a8087d2351e77fb4.png

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

1798c39f7aaed8fc.png

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:

  1. Fai clic su Menu ☰ > IAM e amministrazione > Service account > + Crea service account.

  1. Imposta Nome service account su ge-add-on.

d44d6aae29e2464c.png

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

f1374efa4f326ef5.png

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

b9496085f1404c5c.png

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

f4280f5533a08821.png

  1. 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

  1. Fai clic sul pulsante seguente per aprire il progetto Apps Script Enterprise AI add on:

  1. Fai clic su Panoramica > Crea una copia.
  2. Nel progetto Apps Script, fai clic su Impostazioni progetto > Modifica proprietà script > Aggiungi proprietà script per aggiungere le proprietà dello script.
  3. 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>
  1. Imposta APP_SERVICE_ACCOUNT_KEY sulla chiave JSON del file del service account scaricato nei passaggi precedenti.
  2. Fai clic su Salva proprietà script.

Esegui il deployment su Gmail e Chat

Nel progetto Apps Script, segui questi passaggi:

  1. Fai clic su Deployment > Test deployment, poi su Installa. Ora è disponibile in Gmail.
  2. Fai clic su Copia in ID deployment head.

2ed2df972ad92715.png

Nella console Google Cloud, segui questi passaggi:

  1. Cerca Google Chat API nel campo di ricerca di Google Cloud, fai clic su API Google Chat, poi su Gestisci e infine su Configurazione.

  1. Seleziona Abilita funzionalità interattive.
  2. Deseleziona Partecipa a spazi e conversazioni di gruppo.
  3. Nella sezione Impostazioni di connessione, seleziona Apps Script.
  4. Imposta Deployment ID (ID deployment) sull'Head Deployment ID (ID deployment principale) copiato nei passaggi precedenti.
  5. 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.
  6. Fai clic su Salva.

3b7d461c423f7c51.png

Prova il componente aggiuntivo

Apri Google Chat in una nuova scheda, poi segui questi passaggi:

  1. Apri uno spazio di messaggi diretti con l'app di chat Gemini Enterprise.

3da8690d19baf2d0.png

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

c8c63fb3f324fecf.png

Apri Gmail in una nuova scheda, poi segui questi passaggi:

  1. Inviati un'email con il campo Oggetto impostato su We need to talk e il campo Corpo impostato su Are you available today between 8 and 9 AM?.
  2. Apri il messaggio email appena ricevuto.
  3. Apri la barra laterale del componente aggiuntivo Enterprise AI.
  4. Imposta Messaggio su Am I?
  5. Fai clic su Invia messaggio.
  6. La risposta viene visualizzata dopo il pulsante.

d33b8cb50ee251b7.png

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:

  1. Fai clic su Menu ☰ > IAM e amministrazione > Impostazioni.

  1. Fai clic su Chiudi.
  2. Inserisci l'ID progetto.
  3. Fai clic su Chiudi comunque.

3b9492d97f771b2c.png

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: