Rispondi agli incidenti con Google Chat, Vertex AI e Apps Script

Questo tutorial mostra come creare un'app Google Chat che risponde agli incidenti in tempo reale. Quando risponde a un incidente, l'app crea e compila uno spazio Chat, facilita la risoluzione dell'incidente con messaggi, comandi slash e finestre di dialogo e utilizza l'AI per riassumere la risposta all'incidente in un documento Google Docs.

Questo tutorial utilizza ambiti di autorizzazione che iniziano con https://www.googleapis.com/auth/chat.app.*, disponibili nell'ambito di un'anteprima per gli sviluppatori. La tua app Chat deve ottenere un'approvazione dell'amministratore una tantum.

Un incidente è un evento che richiede l'attenzione immediata di un team di persone per essere risolto. Ecco alcuni esempi di incidenti:

  • In una piattaforma di gestione dei rapporti con i clienti (CRM) viene creato un caso urgente che richiede la collaborazione di un team di assistenza per la risoluzione.
  • Un sistema va offline, avvisando un gruppo di Site Reliability Engineer (SRE) in modo che possano collaborare per ripristinarlo.
  • Si verifica un terremoto di forte magnitudo e gli operatori di emergenza devono coordinare la loro risposta.

Ai fini di questo tutorial, l'avviso di incidente inizia quando un utente segnala l'incidente con un clic su un pulsante di una pagina web. La pagina web simula un incidente chiedendo agli utenti di inserire le informazioni di base sull'incidente: titolo, descrizione e indirizzi email dei soccorritori.

Guarda l'app di chat per la gestione degli incidenti in azione:

  • Il sito web che avvia un incidente.
    Figura 1. Il sito web in cui è possibile segnalare un incidente.
  • Notifica che lo spazio di Chat per l'incidente è stato creato.
    Figura 2. Notifica che lo spazio di Chat dell'incidente è stato creato.
  • Lo spazio di Chat per la risposta agli incidenti.
    Figura 3. Lo spazio di Chat per la risposta agli incidenti.
  • Risoluzione dell'incidente con un comando slash.
    Figura 4. Risolvere l'incidente con un comando slash.
  • Finestra di dialogo Risoluzione dell'incidente.
    Figura 5. Finestra di dialogo Risoluzione dell'incidente.
  • Documento Google Docs sulla risoluzione degli incidenti condiviso nello spazio.
    Figura 6. Documento Documenti Google sulla risoluzione degli incidenti condiviso nello spazio.
  • Il documento Google con la risoluzione dell'incidente di riepilogo dell'AI.
    Figura 7. Il documento Google Docs sulla risoluzione degli incidenti di riepilogo dell'AI.

Prerequisiti

Se devi attivare uno di questi prerequisiti per la tua organizzazione, chiedi all'amministratore di Google Workspace di attivarli:

  • Un account Google Workspace Business o Enterprise con accesso a Google Chat.
  • Per attivare la directory (condivisione dei contatti) per Google Workspace. L'app per la gestione degli incidenti utilizza la directory per cercare i dati di contatto dei responsabili della risposta agli incidenti, come nome e indirizzo email. Gli addetti alla gestione degli incidenti devono essere utenti con un account Google Chat nella tua organizzazione Google Workspace.

Obiettivi

  • Crea un'app di chat che risponda agli incidenti.
  • Aiuta gli utenti a rispondere agli incidenti nel seguente modo:
    • Creazione di spazi di risposta agli incidenti.
    • Pubblicazione di messaggi che riepilogano incidenti e risposte.
    • Supportare la collaborazione con le funzionalità interattive dell'app Chat.
  • Riassumi conversazioni e risoluzioni con Vertex AI.

Architettura

Il seguente diagramma mostra l'architettura delle risorse Google Workspace e Google Cloud utilizzate dall'app Google Chat per la risposta agli incidenti.

Architettura dell'app Google Chat per la risposta agli incidenti

L'architettura mostra come l'app Google Chat per la risposta agli incidenti elabora un incidente e la relativa risoluzione.

  1. Un utente avvia un incidente da un sito web esterno ospitato su Apps Script.

  2. Il sito web invia una richiesta HTTP asincrona all'app Google Chat, ospitata anche su Apps Script.

  3. L'app Google Chat per la risposta agli incidenti elabora la richiesta:

    1. Il servizio Apps Script Admin SDK recupera le informazioni sui membri del team, come l'ID utente e l'indirizzo email.

    2. Con un insieme di richieste HTTP all'API Chat utilizzando il servizio avanzato Chat di Apps Script, l'app Google Chat per la risposta agli incidenti crea uno spazio Chat per gli incidenti, lo popola con i membri del team e invia un messaggio allo spazio.

  4. I membri del team discutono dell'incidente nello spazio di Chat.

  5. Un membro del team richiama un comando slash per segnalare la risoluzione dell'incidente.

    1. Una chiamata HTTP all'API Chat utilizzando il servizio avanzato Chat di Apps Script elenca tutti i messaggi dello spazio Chat.

    2. Vertex AI riceve i messaggi elencati e genera un riepilogo.

    3. Il servizio Apps Script DocumentApp crea un documento Google Docs e aggiunge il riepilogo di Vertex AI al documento.

    4. L'app Google Chat per la risposta agli incidenti chiama l'API Chat per inviare un messaggio con un link al riepilogo del documento Documenti.

Prepara l'ambiente

Questa sezione mostra come creare e configurare un progetto Google Cloud per l'app di chat.

Crea un progetto Google Cloud

Console Google Cloud

  1. Nella console Google Cloud, vai a Menu > IAM e amministrazione > Crea un progetto.

    Vai a Crea un progetto

  2. Nel campo Nome progetto, inserisci un nome descrittivo per il progetto.

    (Facoltativo) Per modificare l'ID progetto, fai clic su Modifica. L'ID progetto non può essere modificato dopo la creazione del progetto, quindi scegli un ID che soddisfi le tue esigenze per l'intera durata del progetto.

  3. Nel campo Posizione, fai clic su Sfoglia per visualizzare le potenziali posizioni per il tuo progetto. Quindi, fai clic su Seleziona.
  4. Fai clic su Crea. La console Google Cloud passa alla pagina Dashboard e il progetto viene creato entro pochi minuti.

Interfaccia a riga di comando gcloud

In uno dei seguenti ambienti di sviluppo, accedi a Google Cloud CLI (gcloud):

  • Cloud Shell: per utilizzare un terminale online con gcloud CLI già configurato, attiva Cloud Shell.
    Attiva Cloud Shell
  • Shell locale: per utilizzare un ambiente di sviluppo locale, installa e inizializza gcloud CLI.
    Per creare un progetto Cloud, utilizza il comando gcloud projects create:
    gcloud projects create PROJECT_ID
    Sostituisci PROJECT_ID impostando l'ID del progetto che vuoi creare.

Abilita la fatturazione per il progetto Cloud

Console Google Cloud

  1. Nella console Google Cloud, vai a Fatturazione. Fai clic su Menu > Fatturazione > I miei progetti.

    Vai a Fatturazione per i miei progetti

  2. In Seleziona un'organizzazione, scegli l'organizzazione associata al tuo progetto Google Cloud.
  3. Nella riga del progetto, apri il menu Azioni (), fai clic su Modifica fatturazione e scegli l'account di fatturazione Cloud.
  4. Fai clic su Imposta account.

Interfaccia a riga di comando gcloud

  1. Per elencare gli account di fatturazione disponibili, esegui:
    gcloud billing accounts list
  2. Collega un account di fatturazione a un progetto Google Cloud:
    gcloud billing projects link PROJECT_ID --billing-account=BILLING_ACCOUNT_ID

    Sostituisci quanto segue:

    • PROJECT_ID è l'ID progetto del progetto Cloud per il quale vuoi attivare la fatturazione.
    • BILLING_ACCOUNT_ID è l'ID account di fatturazione da collegare al progetto Google Cloud.

Abilita le API

Console Google Cloud

  1. Nella console Google Cloud, abilita l'API Google Chat, l'API Google Docs, l'API SDK Admin, l'SDK Google Workspace Marketplace e l'API Vertex AI.

    Abilita le API

  2. Verifica di abilitare le API nel progetto Cloud corretto, poi fai clic su Avanti.

  3. Verifica di abilitare le API corrette, poi fai clic su Abilita.

Interfaccia a riga di comando gcloud

  1. Se necessario, imposta il progetto Cloud corrente su quello che hai creato con il comando gcloud config set project:

    gcloud config set project PROJECT_ID

    Sostituisci PROJECT_ID con l'ID progetto del progetto Cloud che hai creato.

  2. Attiva l'API Google Chat, l'API Google Docs, l'API SDK Admin, l'SDK Google Workspace Marketplace e l'API Vertex AI con il comando gcloud services enable:

    gcloud services enable chat.googleapis.com docs.googleapis.com admin.googleapis.com aiplatform.googleapis.com appsmarket-component.googleapis.com

Configurare l'autenticazione e l'autorizzazione

L'app di chat accede all'API Google Chat utilizzando le credenziali dell'app di chat. L'app accede all'API Admin SDK e all'API Google Docs con le credenziali utente.

Configurare l'autenticazione e l'autorizzazione degli utenti

L'autenticazione e l'autorizzazione consentono all'app Chat di accedere alle risorse in Google Workspace e Google Cloud per elaborare una risposta a un incidente. Nello specifico, l'autenticazione utente viene utilizzata per chiamare l'API Google Docs e l'API Admin SDK.

In questo tutorial, pubblichi l'app internamente nel tuo dominio Workspace, quindi è accettabile utilizzare informazioni segnaposto. Prima di pubblicare l'app esternamente, sostituisci le informazioni segnaposto con informazioni reali nella schermata del consenso.

  1. Nella console Google Cloud, vai a Menu > > Branding.

    Vai a Branding

  2. Se hai già configurato , puoi configurare le seguenti impostazioni della schermata per il consenso OAuth in Branding, Pubblico e Accesso ai dati. Se viene visualizzato un messaggio che indica non ancora configurata, fai clic su Inizia:

    1. In Informazioni sull'app, nella sezione Nome app, digita Incident Management.
    2. In Email di assistenza utenti, seleziona il tuo indirizzo email o un gruppo Google appropriato.
    3. Fai clic su Avanti.
    4. Nella sezione Pubblico, seleziona Interno. Se non riesci a selezionare Interno, seleziona Esterno.
    5. Fai clic su Avanti.
    6. Nella sezione Informazioni di contatto, inserisci un indirizzo email a cui ricevere notifiche relative a eventuali modifiche al tuo progetto.
    7. Fai clic su Avanti.
    8. 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.
    9. Fai clic su Continua.
    10. Fai clic su Crea.
    11. Se hai selezionato Esterno per il tipo di utente, aggiungi utenti di test:
      1. Fai clic su Segmento di pubblico.
      2. Nella sezione Utenti di test, fai clic su Aggiungi utenti.
      3. Inserisci il tuo indirizzo email e gli altri utenti di test autorizzati, quindi fai clic su Salva.
  3. Fai clic su Accesso ai dati > Aggiungi o rimuovi ambiti. Viene visualizzato un riquadro con un elenco di ambiti per ogni API che hai attivato nel tuo progetto Google Cloud.

    1. In Aggiungi ambiti manualmente, incolla i seguenti ambiti:

      • https://www.googleapis.com/auth/documents
      • https://www.googleapis.com/auth/admin.directory.user.readonly
      • https://www.googleapis.com/auth/script.external_request
      • https://www.googleapis.com/auth/userinfo.email
      • https://www.googleapis.com/auth/cloud-platform
    2. Fai clic su Aggiungi alla tabella.

    3. Fai clic su Aggiorna.

    4. Dopo aver selezionato gli ambiti richiesti dalla tua app, fai clic su Salva nella pagina Accesso ai dati.

Configurare l'autenticazione e l'autorizzazione dell'app

L'autenticazione dell'app viene utilizzata per chiamare l'API Google Chat.

Crea un service account nella console Google Cloud

Per creare un service account:

Console Google Cloud

  1. Nella console Google Cloud, vai a Menu > IAM e amministrazione > Service account.

    Vai a Service account

  2. Fai clic su Crea account di servizio.
  3. Compila i dettagli del service account, quindi fai clic su Crea e continua.
  4. (Facoltativo) Assegna ruoli al tuo service account per concedere l'accesso alle risorse del tuo progetto Google Cloud. Per ulteriori dettagli, consulta Concessione, modifica e revoca dell'accesso alle risorse.
  5. Fai clic su Continua.
  6. (Facoltativo) Inserisci gli utenti o i gruppi che possono gestire ed eseguire azioni con questo service account. Per maggiori dettagli, consulta Gestione dell'impersonificazione degli account di servizio.
  7. Fai clic su Fine. Prendi nota dell'indirizzo email del service account.

Interfaccia a riga di comando gcloud

  1. Crea l'account di servizio:
    gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \
      --display-name="SERVICE_ACCOUNT_NAME"
  2. (Facoltativo) Assegna ruoli al tuo service account per concedere l'accesso alle risorse del tuo progetto Google Cloud. Per ulteriori dettagli, consulta Concessione, modifica e revoca dell'accesso alle risorse.

L'account di servizio viene visualizzato nella pagina degli account di servizio. Poi, crea una chiave privata per il service account.

Crea una chiave privata

Per creare e scaricare una chiave privata per il service account, segui questi passaggi:

  1. Nella console Google Cloud, vai a Menu > IAM e amministrazione > Service account.

    Vai a Service account

  2. Seleziona il tuo service account.
  3. Fai clic su Chiavi > Aggiungi chiave > Crea nuova chiave.
  4. Seleziona JSON, quindi fai clic su Crea.

    Una nuova coppia di chiavi pubblica/privata viene generata e scaricata sul tuo computer come nuovo file. Salva il file JSON scaricato come credentials.json nella directory di lavoro. Questo file è l'unica copia di questa chiave. Per informazioni su come archiviare la chiave in modo sicuro, consulta la sezione Gestire le chiavi degli account di servizio.

  5. Fai clic su Chiudi.

Per saperne di più sui service account, consulta la sezione Service account nella documentazione di Google Cloud IAM.

Crea un client OAuth compatibile con Google Workspace Marketplace

Per creare un client OAuth compatibile con Google Workspace Marketplace:

  1. Nella console Google Cloud, vai a Menu > IAM e amministrazione > Service account.

    Vai a Service account

  2. Fai clic sull'account di servizio che hai creato per la tua app di chat.

  3. Fai clic su Impostazioni avanzate.

  4. Fai clic su Crea client OAuth compatibile con Google Workspace Marketplace.

  5. Fai clic su Continua.

Viene visualizzato un messaggio di conferma che indica che è stato creato un client OAuth compatibile con Google Workspace Marketplace.

Creare e distribuire l'app di chat

Nella sezione seguente, copierai e aggiornerai un intero progetto Apps Script che contiene tutto il codice dell'applicazione richiesto per la tua app di chat, quindi non è necessario copiare e incollare ogni file.

Alcune funzioni includono trattini bassi alla fine dei nomi, ad esempio processSlashCommand_() da ChatApp.gs. Il carattere di sottolineatura nasconde la funzione dalla pagina web di inizializzazione dell'incidente quando è aperta in un browser. Per ulteriori informazioni, vedi Funzioni private.

Apps Script supporta due tipi di file: script .gs e file .html. Per rispettare questo supporto, il codice JavaScript lato client dell'app è incluso all'interno dei tag <script /> e il codice CSS è incluso all'interno dei tag <style /> all'interno di un file HTML.

Se vuoi, puoi visualizzare l'intero progetto su GitHub.

Visualizza su GitHub

Ecco una panoramica di ogni file:

Consts.gs

Definisce le costanti a cui fanno riferimento altri file di codice, tra cui l'ID progetto Cloud, l'ID località Vertex AI, le credenziali dell'app per il service account e l'ID comando slash per chiudere un incidente.

Visualizza il codice Consts.gs

apps-script/incident-response-app-auth/Consts.gs
const PROJECT_ID = 'replace-with-your-project-id';
const CLOSE_INCIDENT_COMMAND_ID = 1;
const APP_CREDENTIALS = 'replace-with-your-app-credentials';
const APP_CREDENTIALS_SCOPES = 'https://www.googleapis.com/auth/chat.bot https://www.googleapis.com/auth/chat.app.memberships https://www.googleapis.com/auth/chat.app.spaces.create';
const VERTEX_AI_LOCATION_ID = 'us-central1';
const MODEL_ID = 'gemini-1.5-flash-002';
ChatApp.gs

Gestisce gli eventi di interazione della chat, inclusi messaggi, clic sulle schede, comandi slash e dialoghi. Risponde al comando slash /closeIncident aprendo una finestra di dialogo per raccogliere i dettagli della risoluzione dell'incidente. Legge i messaggi nello spazio chiamando il metodo spaces.messages.list nell'API Chat. Recupera gli ID utente utilizzando il servizio Admin SDK Directory in Apps Script.

Visualizza il codice ChatApp.gs

apps-script/incident-response-app-auth/ChatApp.gs
/**
 * Responds to a MESSAGE event in Google Chat.
 *
 * This app only responds to a slash command with the ID 1 ("/closeIncident").
 * It will respond to any other message with a simple "Hello" text message.
 *
 * @param {Object} event the event object from Google Chat
 */
function onMessage(event) {
  if (event.message.slashCommand) {
    return processSlashCommand_(event);
  }
  return { "text": "Hello from Incident Response app!" };
}

/**
 * Responds to a CARD_CLICKED event in Google Chat.
 *
 * This app only responds to one kind of dialog (Close Incident).
 *
 * @param {Object} event the event object from Google Chat
 */
function onCardClick(event) {
  if (event.isDialogEvent) {
    if (event.dialogEventType == 'SUBMIT_DIALOG') {
      return processSubmitDialog_(event);
    }
    return {
      actionResponse: {
        type: "DIALOG",
        dialogAction: {
          actionStatus: "OK"
        }
      }
    };
  }
}

/**
 * Responds to a MESSAGE event with a Slash command in Google Chat.
 *
 * This app only responds to a slash command with the ID 1 ("/closeIncident")
 * by returning a Dialog.
 *
 * @param {Object} event the event object from Google Chat
 */
function processSlashCommand_(event) {
  if (event.message.slashCommand.commandId != CLOSE_INCIDENT_COMMAND_ID) {
    return {
      "text": "Command not recognized. Use the command `/closeIncident` to close the incident managed by this space."
    };
  }
  const sections = [
    {
      header: "Close Incident",
      widgets: [
        {
          textInput: {
            label: "Please describe the incident resolution",
            type: "MULTIPLE_LINE",
            name: "description"
          }
        },
        {
          buttonList: {
            buttons: [
              {
                text: "Close Incident",
                onClick: {
                  action: {
                    function: "closeIncident"
                  }
                }
              }
            ]
          }
        }
      ]
    }
  ];
  return {
    actionResponse: {
      type: "DIALOG",
      dialogAction: {
        dialog: {
          body: {
            sections,
          }
        }
      }
    }
  };
}

/**
 * Responds to a CARD_CLICKED event with a Dialog submission in Google Chat.
 *
 * This app only responds to one kind of dialog (Close Incident).
 * It creates a Doc with a summary of the incident information and posts a message
 * to the space with a link to the Doc.
 *
 * @param {Object} event the event object from Google Chat
 */
function processSubmitDialog_(event) {
  const resolution = event.common.formInputs.description[""].stringInputs.value[0];
  const chatHistory = concatenateAllSpaceMessages_(event.space.name);
  const chatSummary = summarizeChatHistory_(chatHistory);
  const docUrl = createDoc_(event.space.displayName, resolution, chatHistory, chatSummary);
  return {
    actionResponse: {
      type: "NEW_MESSAGE",
    },
    text: `Incident closed with the following resolution: ${resolution}\n\nHere is the automatically generated post-mortem:\n${docUrl}`
  };
}

/**
 * Lists all the messages in the Chat space, then concatenate all of them into
 * a single text containing the full Chat history.
 *
 * For simplicity for this demo, it only fetches the first 100 messages.
 *
 * Messages with slash commands are filtered out, so the returned history will
 * contain only the conversations between users and not app command invocations.
 *
 * @return {string} a text containing all the messages in the space in the format:
 *          Sender's name: Message
 */
function concatenateAllSpaceMessages_(spaceName) {
  // Call Chat API method spaces.messages.list
  const response = Chat.Spaces.Messages.list(spaceName, { 'pageSize': 100 });
  const messages = response.messages;
  // Fetch the display names of the message senders and returns a text
  // concatenating all the messages.
  let userMap = new Map();
  return messages
    .filter(message => message.slashCommand === undefined)
    .map(message => `${getUserDisplayName_(userMap, message.sender.name)}: ${message.text}`)
    .join('\n');
}

/**
 * Obtains the display name of a user by using the Admin Directory API.
 *
 * The fetched display name is cached in the provided map, so we only call the API
 * once per user.
 *
 * If the user does not have a display name, then the full name is used.
 *
 * @param {Map} userMap a map containing the display names previously fetched
 * @param {string} userName the resource name of the user
 * @return {string} the user's display name
 */
function getUserDisplayName_(userMap, userName) {
  if (userMap.has(userName)) {
    return userMap.get(userName);
  }
  let displayName = 'Unknown User';
  try {
    const user = AdminDirectory.Users.get(
      userName.replace("users/", ""),
      { projection: 'BASIC', viewType: 'domain_public' });
    displayName = user.name.displayName ? user.name.displayName : user.name.fullName;
  } catch (e) {
    // Ignore error if the API call fails (for example, because it's an
    // out-of-domain user or Chat app)) and just use 'Unknown User'.
  }
  userMap.set(userName, displayName);
  return displayName;
}
ChatSpaceCreator.gs

Riceve i dati del modulo inseriti dagli utenti nella pagina web di inizializzazione dell'incidente e li utilizza per configurare uno spazio Chat creandolo e compilando i dati, quindi pubblica un messaggio relativo all'incidente.

Visualizza il codice ChatSpaceCreator.gs

apps-script/incident-response-app-auth/ChatSpaceCreator.gs
/**
 * Handles an incident by creating a chat space, adding members, and posting a message.
 * All the actions are done using application credentials.
 *
 * @param {Object} formData - The data submitted by the user. It should contain the fields:
 *                           - title: The display name of the chat space.
 *                           - description: The description of the incident.
 *                           - users: A comma-separated string of user emails to be added to the space.
 * @return {string} The resource name of the new space.
 */
function handleIncident(formData) {
  const users = formData.users.trim().length > 0 ? formData.users.split(',') : [];
  const service = getService_();
  if (!service.hasAccess()) {
    console.error(service.getLastError());
    return;
   }
  const spaceName = createChatSpace_(formData.title, service);
  createHumanMembership_(spaceName, getUserEmail(), service);
  for (const user of users ){
    createHumanMembership_(spaceName, user, service);
  }
  createMessage_(spaceName, formData.description, service);
  return spaceName;
}
/**
 * Creates a chat space with application credentials.
 *
 * @param {string} displayName - The name of the chat space.
 * @param {object} service - The credentials of the service account.
 * @returns {string} The resource name of the new space.
*/
function createChatSpace_(displayName, service) {
  try {
    // For private apps, the alias can be used
    const my_customer_alias = "customers/my_customer";
    // Specify the space to create.
    const space = {
        displayName: displayName,
        spaceType: 'SPACE',                
        customer: my_customer_alias
    };
    // Call Chat API with a service account to create a message.
    const createdSpace = Chat.Spaces.create(
        space,
        {},
        // Authenticate with the service account token.
        {'Authorization': 'Bearer ' + service.getAccessToken()});
    return createdSpace.name;
  } catch (err) {
    // TODO (developer) - Handle exception.
    console.log('Failed to create space with error %s', err.message);
  }
}
/*
 * Creates a chat message with application credentials.
 *
 * @param {string} spaceName - The resource name of the space.
 * @param {string} message - The text to be posted.
 * @param {object} service - The credentials of the service account.
 * @return {string} the resource name of the new space.
 */
function createMessage_(spaceName, message, service) {
  try {
    // Call Chat API with a service account to create a message.
    const result = Chat.Spaces.Messages.create(
        {'text': message},
        spaceName,
        {},
        // Authenticate with the service account token.
        {'Authorization': 'Bearer ' + service.getAccessToken()});

  } catch (err) {
    // TODO (developer) - Handle exception.
    console.log('Failed to create message with error %s', err.message);
  }
}
/**
 * Creates a human membership in a chat space with application credentials.
 *
 * @param {string} spaceName - The resource name of the space.
 * @param {string} email - The email of the user to be added.
 * @param {object} service - The credentials of the service account.
 */
function createHumanMembership_(spaceName, email, service){
  try{
    const membership = {
      member: {
        name: 'users/'+email,
        // User type for the membership
        type: 'HUMAN'
      }
    };
    const result = Chat.Spaces.Members.create(
      membership,
      spaceName,
      {},
      {'Authorization': 'Bearer ' + service.getAccessToken()}
    );
  } catch (err){
    console.log('Failed to create membership with error %s', err.message)
  }

}

 /*
 * Creates a service for the service account.
 * @return {object}  - The credentials of the service account.
 */
function getService_() {
  return OAuth2.createService(APP_CREDENTIALS.client_email)
      .setTokenUrl('https://oauth2.googleapis.com/token')
      .setPrivateKey(APP_CREDENTIALS.private_key)
      .setIssuer(APP_CREDENTIALS.client_email)
      .setSubject(APP_CREDENTIALS.client_email)
      .setScope(APP_CREDENTIALS_SCOPES)
      .setPropertyStore(PropertiesService.getScriptProperties());
}
DocsApi.gs

Chiama l'API Google Docs per creare un documento Google Docs nel Google Drive di un utente e scrive un riepilogo delle informazioni sull'incidente, creato in VertexAiApi.gs, nel documento.

Visualizza il codice DocsApi.gs

apps-script/incident-response-app-auth/DocsApi.gs
/**
 * Creates a Doc in the user's Google Drive and writes a summary of the incident information to it.
 *
 * @param {string} title The title of the incident
 * @param {string} resolution Incident resolution described by the user
 * @param {string} chatHistory The whole Chat history be included in the document
 * @param {string} chatSummary A summary of the Chat conversation to be included in the document
 * @return {string} the URL of the created Doc
 */
function createDoc_(title, resolution, chatHistory, chatSummary) {
  let doc = DocumentApp.create(title);
  let body = doc.getBody();
  body.appendParagraph(`Post-Mortem: ${title}`).setHeading(DocumentApp.ParagraphHeading.TITLE);
  body.appendParagraph("Resolution").setHeading(DocumentApp.ParagraphHeading.HEADING1);
  body.appendParagraph(resolution);
  body.appendParagraph("Summary of the conversation").setHeading(DocumentApp.ParagraphHeading.HEADING1);
  body.appendParagraph(chatSummary);
  body.appendParagraph("Full Chat history").setHeading(DocumentApp.ParagraphHeading.HEADING1);
  body.appendParagraph(chatHistory);
  return doc.getUrl();
}
VertexAiApi.gs

Riassume la conversazione nello spazio Chat utilizzando l'API Vertex AI. Questo riepilogo viene pubblicato in un documento creato appositamente in DocsAPI.gs.

Visualizza il codice VertexAiApi.gs

apps-script/incident-response-app-auth/VertexAiApi.gs
/**
 * Summarizes a Chat conversation using the Vertex AI text prediction API.
 *
 * @param {string} chatHistory The Chat history that will be summarized.
 * @return {string} The content from the text prediction response.
 */


function summarizeChatHistory_(chatHistory) {

  const API_ENDPOINT = `https://${VERTEX_AI_LOCATION_ID}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${VERTEX_AI_LOCATION_ID}/publishers/google/models/${MODEL_ID}:generateContent`;
  const prompt = "Summarize the following conversation between Engineers resolving an incident"
      + " in a few sentences. Use only the information from the conversation.\n\n" + chatHistory;
  // Get the access token.
  const accessToken = ScriptApp.getOAuthToken();

  const headers = {
    'Authorization': 'Bearer ' + accessToken,
    'Content-Type': 'application/json',
  };
  const payload = {
    'contents': {
      'role': 'user',
      'parts' : [
        {
          'text': prompt
        }
      ]
    }
  }
  const options = {
    'method': 'post',
    'headers': headers,
    'payload': JSON.stringify(payload),
    'muteHttpExceptions': true,
  };
  try {
    const response = UrlFetchApp.fetch(API_ENDPOINT, options);
    const responseCode = response.getResponseCode();
    const responseText = response.getContentText();

    if (responseCode === 200) {
      const jsonResponse = JSON.parse(responseText);
      console.log(jsonResponse)
      if (jsonResponse.candidates && jsonResponse.candidates.length > 0) {
        return jsonResponse.candidates[0].content.parts[0].text; // Access the summarized text
      } else {
        return "No summary found in response.";
      }

    } else {
      console.error("Vertex AI API Error:", responseCode, responseText);
      return `Error: ${responseCode} - ${responseText}`;
    }
  } catch (e) {
    console.error("UrlFetchApp Error:", e);
    return "Error: " + e.toString();
  }
}
WebController.gs

Mostra il sito web di inizializzazione dell'incidente.

Visualizza il codice WebController.gs

apps-script/incident-response-app-auth/WebController.gs
/**
 * Serves the web page from Index.html.
 */
function doGet() {
  return HtmlService
    .createTemplateFromFile('Index')
    .evaluate();
}

/**
 * Serves the web content from the specified filename.
 */
function include(filename) {
  return HtmlService
    .createHtmlOutputFromFile(filename)
    .getContent();
}

/**
 * Returns the email address of the user running the script.
 */
function getUserEmail() {
  return Session.getActiveUser().getEmail();
}
Index.html

L'HTML che compone il sito web di inizializzazione dell'incidente.

Visualizza il codice Index.html

apps-script/incident-response-app-auth/Index.html
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <link href='https://fonts.googleapis.com/css?family=Roboto' rel='stylesheet'>
    <?!= include('Stylesheet'); ?>
  </head>
  <body>
    <div class="container">
      <div class="content">
        <h1>Incident Manager</h1>
        <form id="incident-form" onsubmit="handleFormSubmit(this)">
          <div id="form">
            <p>
              <label for="title">Incident title</label><br/>
              <input type="text" name="title" id="title" />
            </p>
            <p>
              <label for="users">Incident responders</label><br/>
              <small>
                Please enter a comma-separated list of email addresses of the users
                that should be added to the space.
                Do not include <?= getUserEmail() ?> as it will be added automatically.
              </small><br/>
              <input type="text" name="users" id="users" />
            </p>
            <p>
              <label for="description">Initial message</label></br>
              <small>This message will be posted after the space is created.</small><br/>
              <textarea name="description" id="description"></textarea>
            </p>
            <p class="text-center">
              <input type="submit" value="CREATE CHAT SPACE" />
            </p>
          </div>
          <div id="output" class="hidden"></div>
          <div id="clear" class="hidden">
            <input type="reset" value="CREATE ANOTHER INCIDENT" onclick="onReset()" />
          </div>
        </form>
      </div>
    </div>
    <?!= include('JavaScript'); ?>
  </body>
</html>
JavaScript.html

Gestisce il comportamento dei moduli, inclusi invii, errori e cancellazioni, per il sito web di inizializzazione dell'incidente. È incluso in Index.html dalla funzione personalizzata include in WebController.gs.

Visualizza il codice JavaScript.html

apps-script/incident-response-app-auth/JavaScript.html
<script>
  var formDiv = document.getElementById('form');
  var outputDiv = document.getElementById('output');
  var clearDiv = document.getElementById('clear');

  function handleFormSubmit(formObject) {
    event.preventDefault();
    outputDiv.innerHTML = 'Please wait while we create the space...';
    hide(formDiv);
    show(outputDiv);
    google.script.run
      .withSuccessHandler(updateOutput)
      .withFailureHandler(onFailure)
      .handleIncident(formObject);
  }

  function updateOutput(response) {
    var spaceId = response.replace('spaces/', '');
    outputDiv.innerHTML =
      '<p>Space created!</p><p><a href="https://mail.google.com/chat/#chat/space/'
        + spaceId
        + '" target="_blank">Open space</a></p>';
    show(outputDiv);
    show(clearDiv);
  }

  function onFailure(error) {
    outputDiv.innerHTML = 'ERROR: ' + error.message;
    outputDiv.classList.add('error');
    show(outputDiv);
    show(clearDiv);
  }

  function onReset() {
    outputDiv.innerHTML = '';
    outputDiv.classList.remove('error');
    show(formDiv);
    hide(outputDiv);
    hide(clearDiv);
  }

  function hide(element) {
    element.classList.add('hidden');
  }

  function show(element) {
    element.classList.remove('hidden');
  }
</script>
Stylesheet.html

Il CSS per il sito web di inizializzazione dell'incidente. È incluso in Index.html dalla funzione personalizzata include in WebController.gs.

Visualizza il codice Stylesheet.html

apps-script/incident-response-app-auth/Stylesheet.html
<style>
  * {
    box-sizing: border-box;
  }
  body {
    font-family: Roboto, Arial, Helvetica, sans-serif;
  }
  div.container {
    display: flex;
    justify-content: center;
    align-items: center;
    position: absolute;
    top: 0; bottom: 0; left: 0; right: 0;
  }
  div.content {
    width: 80%;
    max-width: 1000px;
    padding: 1rem;
    border: 1px solid #999;
    border-radius: 0.25rem;
    box-shadow: 0 2px 2px 0 rgba(66, 66, 66, 0.08), 0 2px 4px 2px rgba(66, 66, 66, 0.16);
  }
  h1 {
    text-align: center;
    padding-bottom: 1rem;
    margin: 0 -1rem 1rem -1rem;
    border-bottom: 1px solid #999;
  }
 #output {
    text-align: center;
    min-height: 250px;
  }
  div#clear {
    text-align: center;
    padding-top: 1rem;
    margin: 1rem -1rem 0 -1rem;
    border-top: 1px solid #999;
  }
  input[type=text], textarea {
    width: 100%;
    padding: 1rem 0.5rem;
    margin: 0.5rem 0;
    border: 0;
    border-bottom: 1px solid #999;
    background-color: #f0f0f0;
  }
  textarea {
    height: 5rem;
  }
  small {
    color: #999;
  }
  input[type=submit], input[type=reset] {
    padding: 1rem;
    border: none;
    background-color: #6200ee;
    color: #fff;
    border-radius: 0.25rem;
    width: 25%;
  }
  .hidden {
    display: none;
  }
  .text-center {
    text-align: center;
  }
  .error {
    color: red;
  }
</style>

Trovare il numero e l'ID del progetto Cloud

  1. Nella console Google Cloud, vai al tuo progetto Cloud.

    Vai alla console Google Cloud

  2. Fai clic su Impostazioni e utilità > Impostazioni progetto.

  3. Prendi nota dei valori nei campi Numero progetto e ID progetto. Li utilizzerai nelle sezioni seguenti.

Crea il progetto Apps Script

Per creare un progetto Apps Script e connetterlo al tuo progetto Cloud:

  1. Fai clic sul seguente pulsante per aprire il progetto Apps Script Rispondere agli incidenti con Google Chat.
    Apri il progetto
  2. Fai clic su Panoramica.
  3. Nella pagina di panoramica, fai clic su L&#39;icona per creare una copia Crea una copia.
  4. Assegna un nome alla tua copia del progetto Apps Script:

    1. Fai clic su Copia di Rispondere agli incidenti con Google Chat.

    2. In Titolo del progetto, digita Incident Management Chat app.

    3. Fai clic su Rinomina.

  5. Nella tua copia del progetto Apps Script, vai al file Consts.gs e sostituisci YOUR_PROJECT_ID con l'ID del tuo progetto Cloud.

Imposta il progetto cloud del progetto Apps Script

  1. Nel tuo progetto Apps Script, fai clic su L&#39;icona delle impostazioni del progetto Impostazioni progetto.
  2. In Progetto Google Cloud (GCP), fai clic su Cambia progetto.
  3. In Numero di progetto Google Cloud, incolla il numero di progetto del tuo progetto Cloud.
  4. Fai clic su Imposta progetto. Il progetto Cloud e il progetto Apps Script sono ora connessi.

Crea un deployment Apps Script

Ora che tutto il codice è a posto, esegui il deployment del progetto Apps Script. Utilizzi l'ID deployment quando configuri l'app Chat in Google Cloud.

  1. In Apps Script, apri il progetto dell'app di risposta agli incidenti.

    Vai ad Apps Script

  2. Fai clic su Esegui il deployment > Nuovo deployment.

  3. Se Componente aggiuntivo e App web non sono già selezionati, fai clic sui tipi di deployment L&#39;icona delle impostazioni del progetto accanto a Seleziona tipo e seleziona Componente aggiuntivo e App web.

  4. In Descrizione, inserisci una descrizione per questa versione, ad esempio Complete version of incident management app.

  5. In Esegui come, seleziona Utente che accede all'applicazione web.

  6. In Chi ha accesso, seleziona Chiunque all'interno della tua organizzazione Workspace, dove "la tua organizzazione Workspace" è il nome della tua organizzazione Google Workspace.

  7. Fai clic su Esegui il deployment. Apps Script segnala l'avvenuto deployment e fornisce un ID deployment e un URL per la pagina web di inizializzazione dell'incidente.

  8. Prendi nota dell'URL dell'app web da visitare in un secondo momento quando avvii un incidente. Copia l'ID deployment. Utilizzi questo ID durante la configurazione dell'app di chat nella console Google Cloud.

  9. Fai clic su Fine.

Configurare l'app Chat nella console Google Cloud

Questa sezione mostra come configurare l'API Google Chat nella console Google Cloud con informazioni sulla tua app di chat, incluso l'ID del deployment che hai appena creato dal tuo progetto Apps Script.

  1. Nella console Google Cloud, fai clic su Menu > Altri prodotti > Google Workspace > Libreria di prodotti > API Google Chat > Gestisci > Configurazione.

    Vai alla configurazione dell'API Chat

  2. In Nome app, digita Incident Management.

  3. In URL avatar, digita https://developers.google.com/chat/images/quickstart-app-avatar.png.

  4. In Descrizione, digita Responds to incidents..

  5. Fai clic sul pulsante di attivazione/disattivazione Abilita funzionalità interattive in modo che sia impostato su On.

  6. In Funzionalità, seleziona Partecipa a spazi e conversazioni di gruppo.

  7. Nella sezione Impostazioni di connessione, seleziona Apps Script.

  8. In ID deployment, incolla l'ID deployment di Apps Script che hai copiato in precedenza dal deployment del progetto Apps Script.

  9. Registra un comando slash utilizzato dall'app Chat completamente implementata:

    1. Nella sezione Comandi, fai clic su Aggiungi un comando.

    2. In ID comando, digita 1.

    3. In Descrizione, digita Closes the incident being discussed in the space.

    4. In Tipo di comando, seleziona Comando slash.

    5. In Nome comando slash, digita /closeIncident.

    6. Seleziona Apre una finestra di dialogo.

    7. Fai clic su Fine. Il comando slash è registrato ed elencato.

  10. In Visibilità, seleziona Rendi disponibile questa app di chat a utenti e gruppi specifici nel tuo dominio Workspace e inserisci il tuo indirizzo email.

  11. In Log, seleziona Errori di log in Logging.

  12. Fai clic su Salva. Viene visualizzato un messaggio di configurazione salvata, il che significa che l'app è pronta per il test.

Ricevere l'approvazione dell'amministratore

Per ricevere l'approvazione dell'amministratore, devi configurare l'app di chat nell'SDK di Google Workspace Marketplace.

Configurare l'app di chat nell'SDK di Google Workspace Marketplace

Per configurare l'app Chat nell'SDK di Google Workspace Marketplace:

  1. Nella console Google Cloud, vai a Menu > API e servizi > API e servizi abilitati > SDK Google Workspace Marketplace > Configurazione app.

    Vai a Configurazione app

  2. Completa la pagina Configurazione app. La configurazione dell'app Chat dipende dal pubblico di destinazione e da altri fattori. Per assistenza nella compilazione della pagina di configurazione dell'app, vedi Configurare l'app nell'SDK di Google Workspace Marketplace. Ai fini di questa guida, inserisci le seguenti informazioni:

    1. In Visibilità app, seleziona Privato.
    2. Nella sezione Impostazioni di installazione, seleziona Installazione amministratore.
    3. In Integrazioni app, seleziona App di chat.
    4. In Ambiti OAuth, inserisci i seguenti ambiti:
      • https://www.googleapis.com/auth/chat.app.spaces
      • https://www.googleapis.com/auth/chat.app.memberships
    5. In Informazioni sviluppatore, inserisci il Nome sviluppatore, l'URL del sito web sviluppatore e l'Email sviluppatore.
    6. Fai clic su Salva bozza.

Dopo aver configurato l'app, aggiorna la scheda dello Store:

  1. Nella console Google Cloud, vai a Menu > API e servizi > API e servizi abilitati > SDK Google Workspace Marketplace > Scheda dello Store.
  2. In Dettagli app, seleziona Sviluppo web come categoria.
  3. In Risorse grafiche, carica le icone delle applicazioni nei formati richiesti.
  4. In Screenshot, carica uno screenshot dell'applicazione.
  5. In Link di assistenza, inserisci un URL dei Termini di servizio, un URL della privacy e un URL di assistenza.
  6. In Distribuzione, seleziona le regioni in cui sarà disponibile questa applicazione.
  7. Fai clic su Pubblica.

Ottenere l'approvazione dell'amministratore

Ora che l'account di servizio è configurato per ricevere l'approvazione dell'amministratore, ottienila da un amministratore di Google Workspace che può concederla seguendo i passaggi descritti in Configurare l'autorizzazione per le app di chat.

Testare l'app Chat

Per testare l'app Chat per la gestione degli incidenti, avvia un incidente dalla pagina web e verifica che l'app Chat funzioni come previsto:

  1. Vai all'URL dell'app web di deployment di Apps Script.

  2. Quando Apps Script chiede l'autorizzazione per accedere ai tuoi dati, fai clic su Rivedi autorizzazioni, accedi con un Account Google appropriato nel tuo dominio Google Workspace e fai clic su Consenti.

  3. Si apre la pagina web di inizializzazione dell'incidente. Inserisci le informazioni sul test:

    1. In Titolo incidente, digita The First Incident.
    2. (Facoltativo) In Incident responders, inserisci gli indirizzi email dei tuoi colleghi che rispondono agli incidenti. Devono essere utenti con un account Google Chat nella tua organizzazione Google Workspace o la creazione dello spazio non va a buon fine. Non inserire il tuo indirizzo email perché è incluso automaticamente.
    3. In Messaggio iniziale, digita Testing the incident management Chat app.
  4. Fai clic su Crea spazio di Chat. Viene visualizzato un messaggio creating space.

  5. Dopo la creazione dello spazio, viene visualizzato un messaggio Space created!. Fai clic su Apri spazio, che apre lo spazio in Chat in una nuova scheda.

  6. (Facoltativo) Tu e gli altri soccorritori potete inviare messaggi nello spazio. L'app riepiloga questi messaggi utilizzando Vertex AI e condivide un documento retrospettivo.

  7. Per terminare la risposta all'incidente e iniziare la procedura di risoluzione, digita /closeIncident nello spazio di chat. Si apre una finestra di dialogo di gestione degli incidenti.

  8. In Chiudi incidente, inserisci una descrizione della risoluzione dell'incidente, ad esempio Test complete.

  9. Fai clic su Chiudi incidente.

L'app Incident Management elenca i messaggi nello spazio, li riepiloga con Vertex AI, incolla il riepilogo in un documento Google Docs e condivide il documento nello spazio.

Esegui la pulizia

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, ti consigliamo di eliminare il progetto Cloud.

  1. Nella console Google Cloud, vai alla pagina Gestisci risorse. Fai clic su Menu > IAM e amministrazione > Gestisci risorse.

    Vai a Resource Manager

  2. Nell'elenco dei progetti, seleziona quello che vuoi eliminare, quindi fai clic su Elimina .
  3. Nella finestra di dialogo, digita l'ID progetto, quindi fai clic su Chiudi per eliminare il progetto.