Répondre aux incidents avec Google Chat, Vertex AI et Apps Script

Ce tutoriel vous explique comment créer une application Google Chat qui répond aux incidents en temps réel. Lorsqu'elle répond à un incident, l'application crée et remplit un espace Chat, facilite la résolution de l'incident avec des messages, des commandes à barre oblique et des boîtes de dialogue, et utilise l'IA pour résumer la réponse à l'incident dans un document Google Docs.

Ce tutoriel utilise des niveaux d'autorisation qui commencent par https://www.googleapis.com/auth/chat.app.*. Pour que l'application Chat puisse utiliser ces niveaux d'accès, vous devez obtenir une approbation unique de l'administrateur.

Un incident est un événement qui nécessite l'attention immédiate d'une équipe pour être résolu. Voici quelques exemples d'incidents :

  • Une demande urgente est créée sur une plate-forme de gestion de la relation client (CRM), ce qui nécessite la collaboration d'une équipe de service pour la résoudre.
  • Un système est hors connexion, ce qui alerte un groupe d'ingénieurs en fiabilité des sites (SRE) afin qu'ils puissent travailler ensemble pour le remettre en ligne.
  • Un séisme de forte magnitude se produit et les équipes d'urgence doivent coordonner leur intervention.

Pour les besoins de ce tutoriel, l'alerte d'incident commence lorsqu'une personne signale l'incident en cliquant sur un bouton d'une page Web. La page Web simule un incident en demandant aux utilisateurs de saisir des informations de base sur l'incident : titre, description et adresses e-mail des personnes concernées.

Découvrez l'application Chat de gestion des incidents en action :

  • Site Web à l'origine d'un incident.
    Figure 1. Site Web sur lequel une personne peut signaler un incident.
  • Notification indiquant que l'espace de discussion de l'incident a été créé.
    Figure 2 : Notification indiquant que l'espace de discussion Chat pour l'incident a été créé.
  • Espace de discussion dédié à la réponse aux incidents.
    Figure 3. Espace de discussion sur la réponse aux incidents.
  • Résoudre l'incident avec une commande à barre oblique.
    Figure 4. Résoudre l'incident avec une commande à barre oblique.
  • Boîte de dialogue de résolution de l'incident.
    Figure 5 : Boîte de dialogue de résolution d'un incident.
  • Document Google Docs sur la résolution de l'incident partagé dans l'espace.
    Figure 6 : Document Google Docs sur la résolution de l'incident partagé dans l'espace.
  • Document Google Docs sur la résolution des incidents liés aux résumés générés par l'IA.
    Figure 7. Document Google Docs sur la résolution des incidents liés aux résumés générés par l'IA.

Prérequis

Si vous avez besoin d'activer l'un de ces prérequis pour votre organisation, demandez à votre administrateur Google Workspace de l'activer :

  • Compte Google Workspace Business ou Enterprise ayant accès à Google Chat.
  • L'option Annuaire (partage des contacts) doit être activée pour Google Workspace. L'application d'incident utilise le répertoire pour rechercher les coordonnées des personnes chargées de répondre aux incidents, comme leur nom et leur adresse e-mail. Les personnes chargées de répondre aux incidents doivent être des utilisateurs disposant d'un compte Google Chat dans votre organisation Google Workspace.

Objectifs

  • Créez une application Chat qui répond aux incidents.
  • Aidez les utilisateurs à répondre aux incidents en procédant comme suit :
    • Créer des espaces de réponse aux incidents.
    • Publier des messages résumant les incidents et les réponses
    • Favoriser la collaboration grâce aux fonctionnalités interactives de l'application Chat.
  • Résumez les conversations et les résolutions avec Vertex AI.

Architecture

Le schéma suivant illustre l'architecture des ressources Google Workspace et Google Cloud utilisées par l'application Google Chat de réponse aux incidents.

Architecture de l'application Google Chat de gestion des incidents

L'architecture montre comment l'application Google Chat de réponse aux incidents traite un incident et sa résolution.

  1. Un utilisateur lance un incident à partir d'un site Web externe hébergé sur Apps Script.

  2. Le site Web envoie une requête HTTP asynchrone à l'application Google Chat, également hébergée sur Apps Script.

  3. L'application Google Chat de gestion des incidents traite la demande :

    1. Le service Apps Script Admin SDK obtient des informations sur les membres de l'équipe, comme l'ID utilisateur et l'adresse e-mail.

    2. À l'aide d'un ensemble de requêtes HTTP envoyées à l'API Chat via le service Chat avancé Apps Script, l'application Google Chat de réponse aux incidents crée un espace de discussion dédié aux incidents, l'alimente avec les membres de l'équipe et envoie un message dans l'espace.

  4. Les membres de l'équipe discutent de l'incident dans l'espace Chat.

  5. Un membre de l'équipe invoque une commande à barre oblique pour signaler la résolution de l'incident.

    1. Un appel HTTP à l'API Chat à l'aide du service Chat avancé Apps Script liste tous les messages de l'espace Chat.

    2. Vertex AI reçoit les messages listés et génère un résumé.

    3. Le service Apps Script DocumentApp crée un document Docs et y ajoute le résumé de Vertex AI.

    4. L'application Google Chat de réponse aux incidents appelle l'API Chat pour envoyer un message partageant un lien vers le document Docs récapitulatif.

Préparer l'environnement

Cette section explique comment créer et configurer un projet Google Cloud pour l'application Chat.

Créer un projet Google Cloud

Console Google Cloud

  1. Dans la console Google Cloud, accédez à Menu  > IAM et administration > Créer un projet.

    Accéder à "Créer un projet"

  2. Dans le champ Nom du projet, saisissez un nom descriptif pour votre projet.

    Facultatif : Pour modifier l'ID du projet, cliquez sur Modifier. Vous ne pourrez plus modifier cet ID une fois le projet créé. Choisissez-en donc un qui répondra à vos besoins pour toute la durée de vie du projet.

  3. Dans le champ Emplacement, cliquez sur Parcourir pour afficher les emplacements potentiels de votre projet. Cliquez ensuite sur Sélectionner.
  4. Cliquez sur Créer. La console Google Cloud accède à la page "Tableau de bord" et votre projet est créé en quelques minutes.

CLI gcloud

Dans l'un des environnements de développement suivants, accédez à la Google Cloud CLI (gcloud) :

  • Cloud Shell : pour utiliser un terminal en ligne avec la gcloud CLI déjà configurée, activez Cloud Shell.
    Activer Cloud Shell
  • Shell local : pour utiliser un environnement de développement local, installez et initialisez la gcloud CLI.
    Pour créer un projet Cloud, utilisez la commande gcloud projects create :
    gcloud projects create PROJECT_ID
    Remplacez PROJECT_ID en définissant l'ID du projet que vous souhaitez créer.

Activez la facturation pour le projet Cloud.

Console Google Cloud

  1. Dans la console Google Cloud, accédez à Facturation. Cliquez sur Menu > Facturation > Mes projets.

    Accéder à la facturation pour Mes projets

  2. Dans Sélectionner une organisation, choisissez l'organisation associée à votre projet Google Cloud.
  3. Sur la ligne du projet, ouvrez le menu Actions (), cliquez sur Modifier la facturation, puis choisissez le compte de facturation Cloud.
  4. Cliquez sur Définir le compte.

CLI gcloud

  1. Pour lister les comptes de facturation disponibles, exécutez la commande suivante :
    gcloud billing accounts list
  2. Associez un compte de facturation à un projet Google Cloud :
    gcloud billing projects link PROJECT_ID --billing-account=BILLING_ACCOUNT_ID

    Remplacez les éléments suivants :

    • PROJECT_ID correspond à l'ID du projet pour le projet Cloud pour lequel vous souhaitez activer la facturation.
    • BILLING_ACCOUNT_ID est l'ID du compte de facturation à associer au projet Google Cloud.

Activer les API

Console Google Cloud

  1. Dans la console Google Cloud, activez les API Google Chat, Google Docs, Admin SDK, Google Workspace Marketplace SDK et Vertex AI.

    Activer les API

  2. Vérifiez que vous activez les API dans le bon projet Cloud, puis cliquez sur Suivant.

  3. Vérifiez que vous activez les bonnes API, puis cliquez sur Activer.

CLI gcloud

  1. Si nécessaire, définissez le projet Cloud actuel sur celui que vous avez créé avec la commande gcloud config set project :

    gcloud config set project PROJECT_ID

    Remplacez PROJECT_ID par l'ID du projet du projet Cloud que vous avez créé.

  2. Activez les API Google Chat, Google Docs, Admin SDK, Google Workspace Marketplace et Vertex AI avec la commande gcloud services enable :

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

Configurer l'authentification et l'autorisation

L'application Chat accède à l'API Google Chat à l'aide de ses identifiants. L'application accède aux API Admin SDK et Google Docs avec les identifiants utilisateur.

Configurer l'authentification et l'autorisation des utilisateurs

L'authentification et l'autorisation permettent à l'application Chat d'accéder aux ressources de Google Workspace et de Google Cloud pour traiter une réponse aux incidents. Plus précisément, l'authentification des utilisateurs est utilisée pour appeler l'API Google Docs et l'API Admin SDK.

Dans ce tutoriel, vous publiez l'application en interne sur votre domaine Workspace. Vous pouvez donc utiliser des informations de substitution. Avant de publier l'application en externe, remplacez les informations d'espace réservé par des informations réelles sur l'écran de consentement.

  1. Dans la console Google Cloud, accédez à Menu  > > Branding.

    Accéder à "Branding"

  2. Si vous avez déjà configuré, vous pouvez configurer les paramètres de l'écran d'autorisation OAuth suivants dans Branding, Audience et Accès aux données. Si le message pas encore configuré s'affiche, cliquez sur Commencer :

    1. Sous Informations sur l'application, dans Nom de l'application, saisissez Incident Management.
    2. Sous Adresse e-mail d'assistance utilisateur, sélectionnez votre adresse e-mail ou un groupe Google approprié.
    3. Cliquez sur Suivant.
    4. Sous Audience, sélectionnez Interne. Si vous ne pouvez pas sélectionner Interne, sélectionnez Externe.
    5. Cliquez sur Suivant.
    6. Sous Coordonnées, saisissez une adresse e-mail à laquelle vous pourrez être informé de toute modification apportée à votre projet.
    7. Cliquez sur Suivant.
    8. Sous Terminer, consultez le Règlement sur les données utilisateur dans les services d'API Google et, si vous l'acceptez, sélectionnez J'accepte le Règlement sur les données utilisateur dans les services d'API Google.
    9. Cliquez sur Continuer.
    10. Cliquez sur Créer.
    11. Si vous avez sélectionné Externe comme type d'utilisateur, ajoutez des utilisateurs de test :
      1. Cliquez sur Audience.
      2. Sous Utilisateurs de test, cliquez sur Ajouter des utilisateurs.
      3. Saisissez votre adresse e-mail et celles des autres utilisateurs de test autorisés, puis cliquez sur Enregistrer.
  3. Cliquez sur Accès aux données > Ajouter ou supprimer des autorisations. Un panneau s'affiche avec la liste des niveaux d'accès pour chaque API que vous avez activée dans votre projet Google Cloud.

    1. Sous Ajouter manuellement des niveaux d'accès, collez les niveaux d'accès suivants :

      • 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. Cliquez sur Ajouter au tableau.

    3. Cliquez sur Mettre à jour.

    4. Après avoir sélectionné les niveaux d'accès requis par votre application, cliquez sur Enregistrer sur la page Accès aux données.

Configurer l'authentification et l'autorisation des applications

L'authentification de l'application est utilisée pour appeler l'API Google Chat.

Créer un compte de service dans la console Google Cloud

Pour créer un compte de service, procédez comme suit :

Console Google Cloud

  1. Dans la console Google Cloud, accédez au menu  > IAM et administration > Comptes de service.

    Accéder à la page "Comptes de service"

  2. Cliquez sur Créer un compte de service.
  3. Renseignez les détails du compte de service, puis cliquez sur Créer et continuer.
  4. Facultatif : Attribuez des rôles à votre compte de service pour lui accorder l'accès aux ressources de votre projet Google Cloud. Pour en savoir plus, consultez Accorder, modifier et révoquer les accès à des ressources.
  5. Cliquez sur Continuer.
  6. Facultatif : Saisissez les utilisateurs ou les groupes qui peuvent gérer ce compte de service et effectuer des actions avec. Pour en savoir plus, consultez Gérer l'emprunt d'identité d'un compte de service.
  7. Cliquez sur OK. Notez l'adresse e-mail du compte de service.

CLI gcloud

  1. Créez le compte de service :
    gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \
      --display-name="SERVICE_ACCOUNT_NAME"
  2. Facultatif : Attribuez des rôles à votre compte de service pour lui accorder l'accès aux ressources de votre projet Google Cloud. Pour en savoir plus, consultez Accorder, modifier et révoquer les accès à des ressources.

Le compte de service s'affiche sur la page "Comptes de service". Créez ensuite une clé privée pour le compte de service.

Créer une clé privée

Pour créer et télécharger une clé privée pour le compte de service, procédez comme suit :

  1. Dans la console Google Cloud, accédez au menu  > IAM et administration > Comptes de service.

    Accéder à la page "Comptes de service"

  2. Sélectionnez votre compte de service.
  3. Cliquez sur Clés > Ajouter une clé > Créer une clé.
  4. Sélectionnez JSON, puis cliquez sur Créer.

    La nouvelle paire de clés publique/privée est générée et téléchargée sur votre ordinateur sous la forme d'un nouveau fichier. Enregistrez le fichier JSON téléchargé sous le nom credentials.json dans votre répertoire de travail. Ce fichier est la seule copie de cette clé. Pour savoir comment stocker votre clé de façon sécurisée, consultez Gérer les clés de compte de service.

  5. Cliquez sur Fermer.

Pour en savoir plus sur les comptes de service, consultez la section Comptes de service dans la documentation Google Cloud IAM.

Créer un client OAuth compatible avec Google Workspace Marketplace

Pour créer un client OAuth compatible avec Google Workspace Marketplace, procédez comme suit :

  1. Dans la console Google Cloud, accédez à Menu  > IAM et administration > Comptes de service.

    Accéder à la page "Comptes de service"

  2. Cliquez sur le compte de service que vous avez créé pour votre application Chat.

  3. Cliquez sur Paramètres avancés.

  4. Cliquez sur Créer un client OAuth compatible avec Google Workspace Marketplace.

  5. Cliquez sur Continuer.

Un message de confirmation s'affiche pour indiquer qu'un client OAuth compatible avec Google Workspace Marketplace a été créé.

Créer et déployer l'application Chat

Dans la section suivante, vous allez copier et mettre à jour un projet Apps Script entier qui contient tout le code d'application requis pour votre application Chat. Vous n'aurez donc pas besoin de copier et coller chaque fichier.

Certaines fonctions incluent des traits de soulignement à la fin de leur nom, comme processSlashCommand_() de ChatApp.gs. Le trait de soulignement masque la fonction sur la page Web d'initialisation des incidents lorsqu'elle est ouverte dans un navigateur. Pour en savoir plus, consultez la section Fonctions privées.

Apps Script est compatible avec deux types de fichiers : les scripts .gs et les fichiers .html. Pour respecter cette compatibilité, le JavaScript côté client de l'application est inclus dans les balises <script /> et son CSS est inclus dans les balises <style /> à l'intérieur d'un fichier HTML.

Si vous le souhaitez, vous pouvez consulter l'intégralité du projet sur GitHub.

Afficher sur GitHub

Voici un aperçu de chaque fichier :

Consts.gs

Définit les constantes référencées par d'autres fichiers de code, y compris l'ID de votre projet Cloud, l'ID de localisation Vertex AI, les identifiants de l'application pour le compte de service et l'ID de la commande à barre oblique pour fermer un incident.

Afficher le code 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

Gère les événements d'interaction Chat, y compris les messages, les clics sur les fiches, les commandes à barre oblique et les boîtes de dialogue. Répond à la commande à barre oblique /closeIncident en ouvrant une boîte de dialogue pour recueillir des informations sur la résolution des incidents. Lit les messages de l'espace en appelant la méthode spaces.messages.list dans l'API Chat. Obtient les ID utilisateur à l'aide du service Admin SDK Directory dans Apps Script.

Afficher le code 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

Reçoit les données de formulaire saisies par les utilisateurs sur la page Web d'initialisation des incidents et les utilise pour configurer un espace Chat en le créant et en le remplissant, puis en publiant un message sur l'incident.

Afficher le code 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

Appelle l'API Google Docs pour créer un document Google Docs dans le Google Drive d'un utilisateur et y rédige un résumé des informations sur l'incident, créé dans VertexAiApi.gs.

Afficher le code 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

Résume la conversation dans l'espace de discussion à l'aide de l'API Vertex AI. Ce résumé est publié dans un document spécialement créé dans DocsAPI.gs.

Afficher le code 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

Permet d'accéder au site Web d'initialisation des incidents.

Afficher le code 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

Code HTML du site Web d'initialisation de l'incident.

Afficher le code 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

Gère le comportement du formulaire, y compris les envois, les erreurs et les effacements, pour le site Web d'initialisation des incidents. Il est inclus dans Index.html par la fonction include personnalisée dans WebController.gs.

Afficher le code 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

CSS du site Web d'initialisation des incidents. Il est inclus dans Index.html par la fonction include personnalisée dans WebController.gs.

Afficher le code 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>

Trouver le numéro et l'ID de votre projet Cloud

  1. Dans la console Google Cloud, accédez à votre projet Cloud.

    Accéder à Google Cloud Console

  2. Cliquez sur Paramètres et utilitaires > Paramètres du projet.

  3. Notez les valeurs des champs Numéro de projet et ID du projet. Vous en aurez besoin dans les sections suivantes.

Créer le projet Apps Script

Pour créer un projet Apps Script et le connecter à votre projet Cloud :

  1. Cliquez sur le bouton suivant pour ouvrir le projet Apps Script Répondre aux incidents avec Google Chat.
    Ouvrir le projet
  2. Cliquez sur Vue d'ensemble.
  3. Sur la page "Vue d'ensemble", cliquez sur Icône permettant de créer une copie Créer une copie.
  4. Nommez votre copie du projet Apps Script :

    1. Cliquez sur Copie de Répondre aux incidents avec Google Chat.

    2. Dans le champ Titre du projet, saisissez Incident Management Chat app.

    3. Cliquez sur Renommer.

  5. Dans votre copie du projet Apps Script, accédez au fichier Consts.gs et remplacez YOUR_PROJECT_ID par l'ID de votre projet Cloud.

Définir le projet Cloud du projet Apps Script

  1. Dans votre projet Apps Script, cliquez sur Icône des paramètres du projet Paramètres du projet.
  2. Sous Projet Google Cloud Platform (GCP), cliquez sur Changer de projet.
  3. Dans Numéro de projet GCP, collez le numéro de projet de votre projet Cloud.
  4. Cliquez sur Définir un projet. Le projet Cloud et le projet Apps Script sont désormais associés.

Créer un déploiement Apps Script

Maintenant que tout le code est en place, déployez le projet Apps Script. Vous utilisez l'ID de déploiement lorsque vous configurez l'application Chat dans Google Cloud.

  1. Dans Apps Script, ouvrez le projet de l'application de réponse aux incidents.

    Accéder à Apps Script

  2. Cliquez sur Déployer > Nouveau déploiement.

  3. Si Module complémentaire et Application Web ne sont pas déjà sélectionnés, à côté de Sélectionner le type, cliquez sur les types de déploiement Icône des paramètres du projet, puis sélectionnez Module complémentaire et Application Web.

  4. Dans Description, saisissez une description de cette version, par exemple Complete version of incident management app.

  5. Dans Exécuter en tant que, sélectionnez Utilisateur accédant à l'application Web.

  6. Dans Qui a accès, sélectionnez Tous les membres de votre organisation Workspace, où "votre organisation Workspace" correspond au nom de votre organisation Google Workspace.

  7. Cliquez sur Déployer. Apps Script indique que le déploiement a réussi et fournit un ID de déploiement ainsi qu'une URL pour la page Web d'initialisation de l'incident.

  8. Notez l'URL de l'application Web pour y accéder plus tard lorsque vous déclencherez un incident. Copiez l'ID de déploiement. Vous utiliserez cet ID lors de la configuration de l'application Chat dans la console Google Cloud.

  9. Cliquez sur OK.

Configurer l'application Chat dans la console Google Cloud

Cette section explique comment configurer l'API Google Chat dans la console Google Cloud en fournissant des informations sur votre application Chat, y compris l'ID du déploiement que vous venez de créer à partir de votre projet Apps Script.

  1. Dans la console Google Cloud, cliquez sur Menu > Autres produits > Google Workspace > Bibliothèque de produits > API Google Chat > Gérer > Configuration.

    Accéder à la configuration de l'API Chat

  2. Décochez la case Créer cette application Chat en tant que module complémentaire Google Workspace. Une boîte de dialogue s'ouvre et vous demande de confirmer. Dans la boîte de dialogue, cliquez sur Désactiver.

  3. Dans le champ Nom de l'application, saisissez Incident Management.

  4. Dans URL de l'avatar, saisissez https://developers.google.com/chat/images/quickstart-app-avatar.png.

  5. Dans Description, saisissez Responds to incidents..

  6. Cliquez sur le bouton Activer les fonctionnalités interactives pour l'activer.

  7. Sous Fonctionnalité, sélectionnez Rejoindre des espaces et des conversations de groupe.

  8. Sous Paramètres de connexion, sélectionnez Apps Script.

  9. Dans ID de déploiement, collez l'ID de déploiement Apps Script que vous avez copié précédemment à partir du déploiement du projet Apps Script.

  10. Enregistrez une commande à barre oblique utilisée par l'application Chat entièrement implémentée :

    1. Sous Commandes, cliquez sur Ajouter une commande.

    2. Dans ID de commande, saisissez 1.

    3. Dans Description, saisissez Closes the incident being discussed in the space..

    4. Sous Type de commande, sélectionnez Commande à barre oblique.

    5. Dans le champ Nom de la commande à barre oblique, saisissez /closeIncident.

    6. Sélectionnez Ouvre une boîte de dialogue.

    7. Cliquez sur OK. La commande à barre oblique est enregistrée et listée.

  11. Sous Visibilité, sélectionnez Rendre cette application de chat accessible à certains utilisateurs et groupes du domaine Votre domaine Workspace, puis saisissez votre adresse e-mail.

  12. Sous Journaux, sélectionnez Consigner les erreurs dans Logging.

  13. Cliquez sur Enregistrer. Un message de configuration enregistrée s'affiche, ce qui signifie que l'application est prête à être testée.

Obtenir l'approbation de l'administrateur

Pour obtenir l'approbation de l'administrateur, vous devez configurer l'application Chat dans le SDK Google Workspace Marketplace.

Configurer l'application Chat dans le SDK Google Workspace Marketplace

Pour configurer l'application Chat dans le SDK Google Workspace Marketplace, procédez comme suit :

  1. Dans la console Google Cloud, accédez à Menu > API et services > API et services activés > SDK Google Workspace Marketplace > Configuration de l'application.

    Accéder à la configuration de l'application

  2. Remplissez la page "Configuration de l'application". La façon dont vous configurez votre application Chat dépend de votre audience cible et d'autres facteurs. Pour obtenir de l'aide sur la page de configuration de l'application, consultez Configurer votre application dans le SDK Google Workspace Marketplace. Pour les besoins de ce guide, saisissez les informations suivantes :

    1. Sous Visibilité de l'application, sélectionnez Privée.
    2. Sous Paramètres d'installation, sélectionnez Installation administrateur.
    3. Sous Intégrations d'applications, sélectionnez Application de chat.
    4. Sous Champs d'application OAuth, saisissez les champs d'application suivants :
      • https://www.googleapis.com/auth/chat.app.spaces
      • https://www.googleapis.com/auth/chat.app.memberships
    5. Sous Informations sur le développeur, saisissez votre nom de développeur, l'URL du site Web du développeur et l'adresse e-mail du développeur.
    6. Cliquez sur Enregistrer le brouillon.

Après avoir configuré l'application, mettez à jour la fiche Play Store :

  1. Dans la console Google Cloud, accédez à Menu > API et services > API et services activés > SDK Google Workspace Marketplace > Fiche du Google Workspace Marketplace.
  2. Dans Détails de l'application, sélectionnez "Développement Web" comme catégorie.
  3. Dans Éléments graphiques, importez les icônes des applications dans les formats requis.
  4. Dans Captures d'écran, importez une capture d'écran de l'application.
  5. Dans Liens d'assistance, renseignez l'URL des conditions d'utilisation, l'URL de confidentialité et l'URL d'assistance.
  6. Dans Distribution, sélectionnez les régions dans lesquelles cette application sera disponible.
  7. Cliquez sur Publier.

Obtenir l'approbation de l'administrateur

Maintenant que votre compte de service est configuré pour recevoir l'approbation de l'administrateur, obtenez-la auprès d'un administrateur Google Workspace qui peut l'accorder en suivant les étapes décrites dans Configurer l'autorisation pour les applications Chat.

Tester l'application Chat

Pour tester l'application Chat de gestion des incidents, lancez un incident depuis la page Web et vérifiez que l'application Chat fonctionne comme prévu :

  1. Accédez à l'URL de l'application Web de déploiement Apps Script.

  2. Lorsque Apps Script vous demande l'autorisation d'accéder à vos données, cliquez sur Examiner les autorisations, connectez-vous avec un compte Google approprié dans votre domaine Google Workspace, puis cliquez sur Autoriser.

  3. La page Web d'initialisation de l'incident s'ouvre. Saisissez les informations de test :

    1. Dans le champ Titre de l'incident, saisissez The First Incident.
    2. Si vous le souhaitez, dans Personnes chargées de répondre aux incidents, saisissez les adresses e-mail des autres personnes chargées de répondre aux incidents. Ils doivent être des utilisateurs disposant d'un compte Google Chat dans votre organisation Google Workspace, sinon la création de l'espace échouera. Ne saisissez pas votre propre adresse e-mail, car elle est incluse automatiquement.
    3. Dans Message initial, saisissez Testing the incident management Chat app..
  4. Cliquez sur Créer un espace de discussion. Un message creating space s'affiche.

  5. Une fois l'espace créé, un message Space created! s'affiche. Cliquez sur Ouvrir l'espace pour ouvrir l'espace dans Chat dans un nouvel onglet.

  6. Vous et les autres personnes chargées de répondre à l'incident pouvez également envoyer des messages dans l'espace. L'application résume ces messages à l'aide de Vertex AI et partage un document rétrospectif.

  7. Pour mettre fin à la gestion de l'incident et commencer le processus de résolution, saisissez /closeIncident dans l'espace de discussion. Une boîte de dialogue de gestion des incidents s'ouvre.

  8. Dans Fermer l'incident, saisissez une description de la résolution de l'incident, comme Test complete.

  9. Cliquez sur Fermer l'incident.

L'application Incident Management liste les messages de l'espace, les résume avec Vertex AI, colle le résumé dans un document Google Docs et partage le document dans l'espace.

Effectuer un nettoyage

Pour éviter que les ressources utilisées dans ce tutoriel soient facturées sur votre compte Google Cloud, nous vous recommandons de supprimer le projet Cloud.

  1. Dans la console Google Cloud, accédez à la page Gérer les ressources. Cliquez sur Menu > IAM et administration > Gérer les ressources.

    Accéder au gestionnaire de ressources

  2. Dans la liste des projets, sélectionnez celui que vous souhaitez supprimer, puis cliquez sur Supprimer .
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.