Реагируйте на инциденты с помощью Google Chat, Vertex AI и Apps Script.

В этом руководстве показано, как создать приложение Google Chat, которое реагирует на инциденты в режиме реального времени. При реагировании на инцидент приложение создаёт и заполняет чат-зону, облегчает разрешение инцидентов с помощью сообщений, слэш-команд и диалогов, а также использует искусственный интеллект для краткого изложения ответа на инцидент в документе Google Docs.

Инцидент — это событие, требующее немедленного вмешательства группы людей для решения. Примеры инцидентов:

  • На платформе управления взаимоотношениями с клиентами (CRM) создается срочное обращение, требующее совместной работы группы поддержки над его решением.
  • Система переходит в автономный режим, оповещая группу инженеров по надежности объекта (SRE), чтобы они могли совместно восстановить ее работу.
  • Происходит землетрясение большой магнитуды, и спасателям необходимо координировать свои действия.

В рамках данного руководства оповещение об инциденте запускается, когда кто-то сообщает об инциденте нажатием кнопки на веб-странице. Веб-страница имитирует инцидент, предлагая пользователям ввести основную информацию об инциденте: название, описание и адреса электронной почты ответственных лиц.

Посмотрите на приложение чата для управления инцидентами в действии:

  • Веб-сайт, с которого начинается инцидент.
    Рисунок 1. Веб-сайт, на котором можно сообщить об инциденте.
  • Уведомление о создании чат-пространства для инцидента.
    Рисунок 2. Уведомление о создании чат-пространства для инцидента.
  • Пространство чата для реагирования на инциденты.
    Рисунок 3. Чат-пространство для реагирования на инциденты.
  • Разрешение инцидента с помощью косой черты.
    Рисунок 4. Разрешение инцидента с помощью команды «косая черта».
  • Диалог разрешения инцидентов.
    Рисунок 5. Диалог разрешения инцидента.
  • Разрешение инцидента Документ Google Docs, опубликованный в космосе.
    Рисунок 6. Разрешение инцидента Документ Google Docs, размещенный в космосе.
  • Сводка по разрешению инцидентов ИИ в Google Doc.
    Рисунок 7. Сводка по разрешению инцидентов ИИ в документе Google Docs.

Предпосылки

Если вам необходимо включить какие-либо из этих предварительных условий для вашей организации, попросите администратора Google Workspace включить их:

  • Учетная запись Google Workspace Business или Enterprise с доступом к Google Chat .
  • Чтобы включить функцию «Справочник» (совместное использование контактов) для Google Workspace, приложение использует этот справочник для поиска контактной информации специалистов по реагированию на инциденты, например, имени и адреса электронной почты. Специалисты по реагированию на инциденты должны иметь учётную запись Google Chat в вашей организации Google Workspace.

Цели

  • Создайте чат-приложение, которое реагирует на инциденты.
  • Помогите пользователям реагировать на инциденты, выполнив следующие действия:
    • Создание пространств для реагирования на инциденты.
    • Публикация сообщений с кратким изложением инцидентов и ответов.
    • Поддержка совместной работы с помощью интерактивных функций приложения чата.
  • Подводите итоги обсуждений и решений с помощью Vertex AI.

Архитектура

На следующей диаграмме показана архитектура ресурсов Google Workspace и Google Cloud, используемых приложением Google Chat для реагирования на инциденты.

Архитектура приложения Google Chat для реагирования на инциденты

Архитектура показывает, как приложение Google Chat для реагирования на инциденты обрабатывает инцидент и решение.

  1. Пользователь запускает инцидент с внешнего веб-сайта, размещенного на Apps Script.

  2. Веб-сайт отправляет асинхронный HTTP-запрос в приложение Google Chat, также размещенное на Apps Script.

  3. Приложение Google Chat реагирования на инциденты обрабатывает запрос:

    1. Служба Apps Script Admin SDK получает информацию о членах команды, такую ​​как идентификатор пользователя и адрес электронной почты.

    2. С помощью набора HTTP-запросов к API чата с использованием службы Apps Script Advanced Chat приложение Google Chat для реагирования на инциденты создает пространство чата по инциденту, заполняет его членами команды и отправляет сообщение в пространство.

  4. Члены команды обсуждают инцидент в чате.

  5. Член команды использует команду «косая черта», чтобы обозначить разрешение инцидента.

    1. HTTP-вызов Chat API с использованием сервиса Apps Script Advanced Chat выводит список всех сообщений пространства чата.

    2. Vertex AI получает перечисленные сообщения и генерирует сводку.

    3. Служба Apps Script DocumentApp создает документ Docs и добавляет в него сводку Vertex AI.

    4. Приложение Google Chat для реагирования на инциденты вызывает Chat API для отправки сообщения со ссылкой на сводный документ Docs.

Подготовьте окружающую среду

В этом разделе показано, как создать и настроить проект Google Cloud для приложения Chat.

Создайте проект Google Cloud

Консоль Google Cloud

  1. В консоли Google Cloud перейдите в > IAM и администрирование > Создать проект .

    Перейти к созданию проекта

  2. В поле «Название проекта» введите описательное название вашего проекта.

    Необязательно: чтобы изменить идентификатор проекта , нажмите «Изменить» . Идентификатор проекта нельзя изменить после его создания, поэтому выберите идентификатор, который будет соответствовать вашим потребностям на протяжении всего жизненного цикла проекта.

  3. В поле «Местоположение» нажмите «Обзор» , чтобы отобразить возможные местоположения для вашего проекта. Затем нажмите « Выбрать» .
  4. Нажмите «Создать» . Консоль Google Cloud перейдет на страницу панели управления, и ваш проект будет создан в течение нескольких минут.

gcloud CLI

В одной из следующих сред разработки получите доступ к Google Cloud CLI ( gcloud ):

  • Cloud Shell : чтобы использовать онлайн-терминал с уже настроенным интерфейсом командной строки gcloud, активируйте Cloud Shell.
    Активировать Cloud Shell
  • Локальная оболочка : чтобы использовать локальную среду разработки, установите и инициализируйте gcloud CLI.
    Чтобы создать облачный проект, используйте команду gcloud projects create :
    gcloud projects create PROJECT_ID
    Замените PROJECT_ID , указав идентификатор проекта, который вы хотите создать.

Включить выставление счетов для облачного проекта

Консоль Google Cloud

  1. В консоли Google Cloud перейдите в раздел «Оплата» . Нажмите «Меню» « Оплата» > «Мои проекты» .

    Перейти к выставлению счетов за мои проекты

  2. В разделе Выберите организацию выберите организацию, связанную с вашим проектом Google Cloud.
  3. В строке проекта откройте меню Действия ( ), нажмите Изменить выставление счетов и выберите учетную запись Cloud Billing.
  4. Нажмите «Настроить учетную запись» .

gcloud CLI

  1. Чтобы вывести список доступных платежных аккаунтов, выполните:
    gcloud billing accounts list
  2. Свяжите платежный аккаунт с проектом Google Cloud:
    gcloud billing projects link PROJECT_ID --billing-account=BILLING_ACCOUNT_ID

    Заменить следующее:

    • PROJECT_ID — это идентификатор облачного проекта, для которого вы хотите включить выставление счетов.
    • BILLING_ACCOUNT_IDидентификатор платежного аккаунта для связи с проектом Google Cloud.

Включить API

Консоль Google Cloud

  1. В консоли Google Cloud включите API Google Chat, API Google Docs, API Admin SDK и API Vertex AI.

    Включить API

  2. Подтвердите, что вы включаете API в правильном облачном проекте, затем нажмите Далее .

  3. Подтвердите, что вы включаете правильные API, затем нажмите Включить .

gcloud CLI

  1. При необходимости установите текущий проект Cloud на тот, который вы создали с помощью команды gcloud config set project :

    gcloud config set project PROJECT_ID

    Замените PROJECT_ID на идентификатор созданного вами облачного проекта.

  2. Включите API Google Chat, API Google Docs, API Admin SDK и API Vertex AI с помощью команды gcloud services enable :

    gcloud services enable chat.googleapis.com docs.googleapis.com admin.googleapis.com aiplatform.googleapis.com

Настройте аутентификацию и авторизацию

Аутентификация и авторизация позволяют приложению Chat получать доступ к ресурсам в Google Workspace и Google Cloud для обработки ответа на инцидент.

В этом руководстве вы опубликуете приложение для внутренней публикации, чтобы можно было использовать заглушки. Перед внешней публикацией замените заглушки на реальную информацию для экрана согласия.

  1. В консоли Google Cloud перейдите в > > Брендинг .

    Перейти к брендингу

  2. Если вы уже настроили, вы можете настроить следующие параметры экрана согласия OAuth в разделах «Брендинг» , «Аудитория» и «Доступ к данным» . Если вы видите сообщение: пока не настроено , нажмите «Начать» :

    1. В разделе «Информация о приложении» в поле «Имя приложения» введите Incident Management .
    2. В поле «Электронная почта поддержки пользователей» выберите свой адрес электронной почты или соответствующую группу Google.
    3. Нажмите Далее .
    4. В разделе «Аудитория» выберите «Внутренняя» . Если выбрать «Внутренняя» невозможно, выберите «Внешняя» .
    5. Нажмите Далее .
    6. В разделе «Контактная информация» введите адрес электронной почты , на который вы можете получать уведомления о любых изменениях в вашем проекте.
    7. Нажмите Далее .
    8. В разделе Готово ознакомьтесь с Политикой обработки данных пользователей API служб Google и, если вы согласны, выберите Я согласен с Политикой обработки данных пользователей API служб Google .
    9. Нажмите «Продолжить» .
    10. Нажмите «Создать» .
    11. Если вы выбрали тип пользователя «Внешний» , добавьте тестовых пользователей:
      1. Нажмите Аудитория .
      2. В разделе Тестовые пользователи нажмите Добавить пользователей .
      3. Введите свой адрес электронной почты и адрес других авторизованных тестовых пользователей, затем нажмите кнопку «Сохранить» .
  3. Нажмите «Доступ к данным» > «Добавить или удалить области действия» . Появится панель со списком областей действия для каждого API, которые вы включили в своем проекте Google Cloud.

    1. В разделе «Добавить области вручную» вставьте следующие области:

      • https://www.googleapis.com/auth/chat.spaces.create
      • https://www.googleapis.com/auth/chat.memberships
      • https://www.googleapis.com/auth/chat.memberships.app
      • https://www.googleapis.com/auth/chat.messages
      • 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. Нажмите Добавить в таблицу .

    3. Нажмите Обновить .

    4. После выбора областей, необходимых вашему приложению, на странице «Доступ к данным» нажмите кнопку «Сохранить» .

Создайте и разверните приложение чата

В следующем разделе вы скопируете и обновите весь проект Apps Script, содержащий весь необходимый код приложения для вашего приложения Chat, поэтому нет необходимости копировать и вставлять каждый файл.

Некоторые функции содержат подчёркивание в конце своего имени, например, processSlashCommand_() из ChatApp.gs . Подчёркивание скрывает функцию на веб-странице инициализации инцидента, когда она открыта в браузере. Подробнее см. в разделе «Частные функции» .

Apps Script поддерживает два типа файлов: скрипты .gs и файлы .html . Для обеспечения этой поддержки клиентский JavaScript-код приложения включается в теги <script /> , а его CSS-код — в теги <style /> HTML-файла.

При желании вы можете просмотреть весь проект на GitHub.

Посмотреть на GitHub

Вот обзор каждого файла:

Consts.gs

Определяет константы, на которые ссылаются другие файлы кода, включая идентификатор вашего облачного проекта, идентификатор местоположения Vertex AI и идентификатор команды с косой чертой для закрытия инцидента.

Просмотреть код Consts.gs

apps-script/incident-response/Consts.gs
const PROJECT_ID = 'replace-with-your-project-id';
const VERTEX_AI_LOCATION_ID = 'us-central1';
const CLOSE_INCIDENT_COMMAND_ID = 1;
ChatApp.gs

Обрабатывает события взаимодействия в чате, включая сообщения, нажатия на карточки, команды с косой чертой и диалоги. Отвечает на команду /closeIncident , открывая диалоговое окно для сбора информации о разрешении инцидента. Читает сообщения в чате, вызывая метод spaces.messages.list в API чата. Получает идентификаторы пользователей с помощью службы каталогов Admin SDK в Apps Script.

Посмотреть код ChatApp.gs

apps-script/incident-response/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

Получает данные формы, которые пользователи вводят на веб-странице инициализации инцидента, и использует их для настройки пространства чата, создавая и заполняя его, а затем публикует сообщение об инциденте.

Посмотреть код ChatSpaceCreator.gs

apps-script/incident-response/ChatSpaceCreator.gs
/**
 * Creates a space in Google Chat with the provided title and members, and posts an
 * initial message to it.
 *
 * @param {Object} formData the data submitted by the user. It should contain the fields
 *                          title, description, and users.
 * @return {string} the resource name of the new space.
 */
function createChatSpace(formData) {
  const users = formData.users.trim().length > 0 ? formData.users.split(',') : [];
  const spaceName = setUpSpace_(formData.title, users);
  addAppToSpace_(spaceName);
  createMessage_(spaceName, formData.description);
  return spaceName;
}

/**
 * Creates a space in Google Chat with the provided display name and members.
 *
 * @return {string} the resource name of the new space.
 */
function setUpSpace_(displayName, users) {
  const memberships = users.map(email => ({
    member: {
      name: `users/${email}`,
      type: "HUMAN"
    }
  }));
  const request = {
    space: {
      displayName: displayName,
      spaceType: "SPACE",
      externalUserAllowed: true
    },
    memberships: memberships
  };
  // Call Chat API method spaces.setup
  const space = Chat.Spaces.setup(request);
  return space.name;
}

/**
 * Adds this Chat app to the space.
 *
 * @return {string} the resource name of the new membership.
 */
function addAppToSpace_(spaceName) {
  const request = {
    member: {
      name: "users/app",
      type: "BOT"
    }
  };
  // Call Chat API method spaces.members.create
  const membership = Chat.Spaces.Members.create(request, spaceName);
  return membership.name;
}

/**
 * Posts a text message to the space on behalf of the user.
 *
 * @return {string} the resource name of the new message.
 */
function createMessage_(spaceName, text) {
  const request = {
    text: text
  };
  // Call Chat API method spaces.messages.create
  const message = Chat.Spaces.Messages.create(request, spaceName);
  return message.name;
}
DocsApi.gs

Вызывает API Google Docs для создания документа Google Docs на Google Диске пользователя и записывает в документ сводку информации об инциденте, созданную в VertexAiApi.gs .

Посмотреть код DocsApi.gs

apps-script/incident-response/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

Подводит итоги беседы в чате с использованием Vertex AI. Этот итог публикуется в специально созданном документе DocsAPI.gs .

Посмотреть код VertexAiApi.gs

apps-script/incident-response/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 prompt =
    "Summarize the following conversation between Engineers resolving an incident"
      + " in a few sentences. Use only the information from the conversation.\n\n"
      + chatHistory;
  const request = {
    instances: [
      { prompt: prompt }
    ],
    parameters: {
      temperature: 0.2,
      maxOutputTokens: 256,
      topK: 40,
      topP: 0.95
    }
  }
  const fetchOptions = {
    method: 'POST',
    headers: { Authorization: 'Bearer ' + ScriptApp.getOAuthToken() },
    contentType: 'application/json',
    payload: JSON.stringify(request)
  }
  const response = UrlFetchApp.fetch(
    `https://${VERTEX_AI_LOCATION_ID}-aiplatform.googleapis.com/v1`
      + `/projects/${PROJECT_ID}/locations/${VERTEX_AI_LOCATION_ID}`
      + "/publishers/google/models/text-bison:predict",
    fetchOptions);
  const payload = JSON.parse(response.getContentText());
  return payload.predictions[0].content;
}
WebController.gs

Обслуживает веб-сайт инициализации инцидентов.

Просмотреть код WebController.gs

apps-script/incident-response/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

HTML-код веб-сайта инициализации инцидента.

Просмотреть код Index.html

apps-script/incident-response/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

Обрабатывает поведение формы, включая отправку, ошибки и очистку, для сайта инициализации инцидента. Включается в Index.html с помощью пользовательской функции include в WebController.gs .

Просмотреть код JavaScript.html

apps-script/incident-response/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)
      .createChatSpace(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 для сайта инициализации инцидента. Он включён в Index.html с помощью пользовательской функции include в WebController.gs .

Просмотреть код Stylesheet.html

apps-script/incident-response/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>

Найдите номер и идентификатор вашего облачного проекта

  1. В консоли Google Cloud перейдите в свой облачный проект.

    Перейти в консоль Google Cloud

  2. Нажмите Настройки и утилиты > Настройки проекта .

  3. Запишите значения в полях «Номер проекта» и «Идентификатор проекта» . Они понадобятся вам в следующих разделах.

Создайте проект Apps Script

Чтобы создать проект Apps Script и подключить его к вашему облачному проекту:

  1. Нажмите следующую кнопку, чтобы открыть проект « Реагирование на инциденты с помощью скрипта Google Chat Apps».
    Открыть проект
  2. Нажмите Обзор .
  3. На странице обзора нажмите Значок для создания копии Сделайте копию .
  4. Назовите свою копию проекта Apps Script:

    1. Нажмите «Копия ответа на инциденты с помощью Google Chat» .

    2. В поле «Название проекта» введите Incident Management Chat app .

    3. Нажмите «Переименовать» .

  5. В вашей копии проекта Apps Script перейдите в файл Consts.gs и замените YOUR_PROJECT_ID на идентификатор вашего проекта Cloud.

Настройте облачный проект проекта Apps Script.

  1. В проекте Apps Script нажмите Значок настроек проекта Настройки проекта .
  2. В разделе «Проект Google Cloud Platform (GCP)» нажмите «Изменить проект» .
  3. В поле Номер проекта GCP вставьте номер вашего облачного проекта.
  4. Нажмите «Установить проект» . Теперь проекты Cloud и Apps Script связаны.

Создайте развертывание скрипта приложений

Теперь, когда весь код готов, разверните проект Apps Script. Идентификатор развёртывания используется при настройке приложения Chat в Google Cloud.

  1. В Apps Script откройте проект приложения реагирования на инциденты.

    Перейти к скрипту приложений

  2. Нажмите Развернуть > Новое развертывание .

  3. Если надстройка и веб-приложение еще не выбраны, рядом с пунктом «Выбрать тип» нажмите «Типы развертывания». Значок настроек проекта и выберите Надстройка и веб-приложение .

  4. В поле Описание введите описание этой версии, например Complete version of incident management app .

  5. В поле «Выполнить как » выберите «Пользователь, получающий доступ к веб-приложению».

  6. В поле «У кого есть доступ » выберите Любой в пределах вашей организации Workspace , где «ваша организация Workspace» — это название вашей организации Google Workspace.

  7. Нажмите «Развернуть» . Apps Script сообщает об успешном развертывании и предоставляет идентификатор развертывания и URL-адрес веб-страницы инициализации инцидента.

  8. Запишите URL-адрес веб-приложения , чтобы вернуться к нему позже при запуске инцидента. Скопируйте идентификатор развёртывания . Этот идентификатор используется при настройке приложения чата в консоли Google Cloud.

  9. Нажмите Готово .

Настройте приложение чата в консоли Google Cloud

В этом разделе показано, как настроить API Google Chat в консоли Google Cloud, используя информацию о вашем приложении Chat, включая идентификатор развертывания, которое вы только что создали из своего проекта Apps Script.

  1. В консоли Google Cloud выберите Меню Дополнительные продукты > Google Workspace > Библиотека продуктов > Google Chat API > Управление > Конфигурация .

    Перейти к настройке API чата

  2. В поле Имя приложения введите Incident Management .

  3. В поле URL аватара введите https://developers.google.com/chat/images/quickstart-app-avatar.png .

  4. В поле Описание введите Responds to incidents.

  5. Установите переключатель «Включить интерактивные функции» в положение «Вкл.».

  6. В разделе «Функциональность» выберите Присоединяйтесь к пространствам и групповым беседам .

  7. В разделе «Настройки подключения» выберите «Скрипт приложений» .

  8. В поле Deployment ID вставьте идентификатор развертывания Apps Script, скопированный ранее из развертывания проекта Apps Script.

  9. Зарегистрируйте слэш-команду , которую будет использовать полностью реализованное приложение чата:

    1. В разделе «Команды с косой чертой» нажмите «Добавить команду с косой чертой» .

    2. В поле Имя введите Close incident .

    3. В поле «Идентификатор команды» введите 1 .

    4. В поле Описание введите Closes the incident being discussed in the space.

    5. В разделе «Тип команды» выберите «Команда косой черты» .

    6. В поле Имя команды Slash введите /closeIncident .

    7. Выбрать Открывает диалоговое окно .

    8. Нажмите «Готово» . Команда «Слэш» зарегистрирована и добавлена ​​в список.

  10. В разделе «Видимость» выберите «Сделать это приложение чата доступным для определенных людей и групп в домене вашего рабочего пространства» и введите свой адрес электронной почты.

  11. В разделе Журналы выберите Записывать ошибки в Журнал .

  12. Нажмите «Сохранить» . Появится сообщение о сохранении конфигурации, означающее, что приложение готово к тестированию.

Протестируйте приложение чата

Чтобы протестировать приложение чата для управления инцидентами, инициируйте инцидент с веб-страницы и убедитесь, что приложение чата работает должным образом:

  1. Перейдите по URL-адресу веб-приложения развертывания Apps Script.

  2. Когда Apps Script запросит разрешение на доступ к вашим данным, нажмите кнопку Просмотреть разрешения , войдите в соответствующую учетную запись Google в вашем домене Google Workspace и нажмите кнопку Разрешить .

  3. Откроется веб-страница инициализации инцидента. Введите информацию о тесте:

    1. В поле «Название инцидента» введите The First Incident .
    2. При желании в поле «Реагент на инциденты» введите адреса электронной почты ваших коллег, отвечающих за инциденты. Это должны быть пользователи с учётной записью Google Chat в вашей организации Google Workspace, иначе создание пространства завершится ошибкой. Не указывайте свой адрес электронной почты, так как он добавляется автоматически.
    3. В поле «Исходное сообщение» введите Testing the incident management Chat app.
  4. Нажмите «Создать чат-пространство» . Появится сообщение creating space .

  5. После создания пространства появится сообщение « Space created! . Нажмите «Открыть пространство» , чтобы открыть пространство в чате в новой вкладке.

  6. При желании вы и другие специалисты по реагированию на инциденты можете отправлять сообщения в этом пространстве. Приложение обобщает эти сообщения с помощью Vertex AI и публикует ретроспективный документ.

  7. Чтобы завершить реагирование на инцидент и начать процесс разрешения, в поле чата введите /closeIncident . Откроется диалоговое окно управления инцидентом.

  8. В поле Закрыть инцидент введите описание для разрешения инцидента, например Test complete .

  9. Нажмите Закрыть инцидент .

Приложение «Управление инцидентами» перечисляет сообщения в пространстве, суммирует их с помощью Vertex AI, вставляет сводку в документ Google Docs и делится документом в пространстве.

Уборка

Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, используемые в этом руководстве, мы рекомендуем вам удалить проект Cloud.

  1. В консоли Google Cloud перейдите на страницу «Управление ресурсами» . Выберите « Меню > «IAM и администрирование» > «Управление ресурсами» .

    Перейти к диспетчеру ресурсов

  2. В списке проектов выберите проект .
  3. В диалоговом окне введите идентификатор проекта, а затем нажмите кнопку «Завершить» , чтобы удалить проект.