Как реагировать на инциденты с помощью Google Chat, Vertex AI, Apps Script и аутентификации пользователей

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

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

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

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

Посмотрите, как работает приложение "Управление инцидентами":

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

Требования

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

  • Аккаунт Google Workspace версии Business или Enterprise с доступом к Google Chat.
  • В Google Workspace должен быть включен каталог (совместное использование контактов). Приложение для обработки инцидентов использует каталог, чтобы найти контактную информацию ответственных лиц, например имя и адрес электронной почты. Участники группы реагирования на инциденты должны иметь аккаунт Google Chat в организации Google Workspace.

Цели

  • Создайте приложение Chat, которое реагирует на инциденты.
  • Чтобы помочь пользователям реагировать на инциденты, выполните следующие действия:
    • Создание чат-групп для реагирования на инциденты.
    • Публикация сообщений с кратким описанием инцидентов и ответов.
    • Поддержка совместной работы с помощью интерактивных функций чат-приложения.
  • Краткий пересказ разговоров и решений с помощью 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. Сервис Admin SDK Apps Script получает информацию о членах команды, например идентификатор пользователя и адрес электронной почты.

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

  4. Участники команды обсуждают инцидент в чат-группе.

  5. Сотрудник команды вызывает быструю команду, чтобы сообщить о решении инцидента.

    1. Вызов HTTP к Chat API с помощью сервиса Apps Script Advanced Chat перечисляет все сообщения чат-группы Chat.

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

    3. Сервис Apps Script DocumentApp создает документ Google Документов и добавляет в него краткий пересказ от Vertex AI.

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

Подготовка среды

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

Как создать проект Google Cloud

Google API Console

  1. В Google API Console нажмите на значок меню > IAM & Admin (IAM и администрирование) > Create a Project (Создать проект).

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

  2. В поле Project Name (Имя проекта) введите информативное название проекта.

    Чтобы изменить идентификатор проекта, нажмите Изменить. Идентификатор проекта нельзя изменить после его создания, поэтому выберите подходящий вариант, так как он будет связан с проектом на протяжении всего периода его действия.

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

gcloud CLI

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

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

Включите оплату для облачного проекта

Google API Console

  1. В Google API Console выберите Оплата. Нажмите Меню > Оплата > Мои проекты.

    Перейти к оплате проектов

  2. В разделе Выберите организацию выберите организацию, связанную с вашим облачным проектом Google Cloud.
  3. В строке проекта откройте меню Действия (), нажмите Изменить платежные данные и выберите платежный аккаунт Cloud.
  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 API Console

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

    Как включить API

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

  3. Убедитесь, что вы включаете нужные API, и нажмите Включить.

gcloud CLI

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

    gcloud config set project PROJECT_ID

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

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

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

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

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

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

  1. В консоли API Google выберите "Меню > Платформа аутентификации Google > Брендинг".

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

  2. Если вы уже настроили платформу Google Auth, вы можете задать следующие настройки окна запроса доступа OAuth в разделах Брендинг, Аудитория и Доступ к данным. Если вы видите сообщение Google Auth platform not configured yet (Платформа аутентификации Google ещё не настроена), нажмите Get Started (Начать):

    1. В разделе Информация о приложении в поле Название приложения введите Incident Management with User Auth.
    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. Выбрав нужные области действия, на странице Доступ к данным нажмите Сохранить.

Как создать и развернуть приложение Chat

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

В конце названий некоторых функций есть подчеркивание, например concatenateAllSpaceMessages_() из ChatApp.gs. Подчеркивание скрывает функцию на веб-странице инициализации инцидента, когда она открыта в браузере. Подробнее о частных функциях…

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

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

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

Ниже приведена информация о каждом файле.

Consts.gs

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

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

apps-script/chat/incident-response-user-auth/Consts.gs
const PROJECT_ID = 'replace-with-your-project-id';
const VERTEX_AI_LOCATION_ID = 'us-central1';
const CLOSE_INCIDENT_COMMAND_ID = 1;
const MODEL_ID = 'gemini-2.5-flash-lite';
ChatApp.gs

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

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

apps-script/chat/incident-response-user-auth/ChatApp.gs
/**
 * Responds to a MESSAGE event in Google Chat.
 * 
 * It always responds with a simple "Hello" text message.
 *
 * @param {Object} event the event object from Google Chat
 */
function onMessage(event) {
  return { hostAppDataAction: { chatDataAction: { createMessageAction: { message: {
    text: "Hello from Incident Response app!"
  }}}}};
}

/**
 * Responds to an APP_COMMAND event in Google Chat.
 *
 * @param {Object} event the event object from Google Chat
 */
function onAppCommand(event) {
  if (event.chat.appCommandPayload.appCommandMetadata.appCommandId != CLOSE_INCIDENT_COMMAND_ID) {
    return { hostAppDataAction: { chatDataAction: { createMessageAction: { message: {
      text: "Command not recognized. Use the quick command `Close incident` to close the incident managed by this space."
    }}}}};
  }
  return { action: { navigations: [{ pushCard: { 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" }}
      }]}
    }]
  }]}}]}};
}

/**
 * Responds to a BUTTON_CLICKED event in Google Chat from Close Incident dialog.
 *
 * @param {Object} event the event object from Google Chat
 */
function closeIncident(event) {
  if (event.chat.buttonClickedPayload.isDialogEvent) {
    if (event.chat.buttonClickedPayload.dialogEventType == 'SUBMIT_DIALOG') {
      return processSubmitDialog_(event);
    }
    return { action: { navigations: [{ endNavigation: {
      action: "CLOSE_DIALOG" }
    }]}};
  }
}

/**
 * Responds to a BUTTON_CLICKED event in Google Chat from Close Incident dialog submission.
 *
 * 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.commonEventObject.formInputs.description.stringInputs.value[0];
  const space = event.chat.buttonClickedPayload.space;
  const chatHistory = concatenateAllSpaceMessages_(space.name);
  const chatSummary = summarizeChatHistory_(chatHistory);
  const docUrl = createDoc_(space.displayName, resolution, chatHistory, chatSummary);
  return { hostAppDataAction: { chatDataAction: { createMessageAction: { 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.
 *
 * @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
    .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/chat/incident-response-user-auth/ChatSpaceCreator.gs
/**
 * Handles an incident by creating a chat space with the provided title and members, and posting a message.
 * All the actions are done using user 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 spaceName = setUpSpace_(formData.title, users);
  addAppToSpace_(spaceName);
  createMessage_(spaceName, formData.description);
  return spaceName;
}

/**
 * Creates a chat space.
 *
 * @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"
    },
    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;
}

/**
 * Creates a chat message.
 *
 * @param {string} spaceName - The resource name of the space.
 * @param {string} message - The text to be posted.
 * @return {string} the resource name of the new message.
 */
function createMessage_(spaceName, message) {
  const request = {
    text: message
  };
  // Call Chat API method spaces.messages.create
  const result = Chat.Spaces.Messages.create(request, spaceName);
  return result.name;
}
DocsApi.gs

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

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

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

Кратко пересказывает чат в чат-группе с помощью Vertex AI. Краткий пересказ будет опубликован в специально созданном документе в DocsAPI.gs.

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

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

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

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

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

HTML-код сайта, на котором инициализируется инцидент.

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

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

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

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

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

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

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

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

  1. В Google API Console перейдите к своему облачному проекту.

    Перейти в Google API Console

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

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

Как создать проект Apps Script

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

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

    1. Нажмите Копия приложения Chat "Управление инцидентами" с аутентификацией пользователей.

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

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

  5. В копии проекта Apps Script перейдите к файлу Consts.gs и задайте PROJECT_ID с идентификатором облачного проекта.

Как задать облачный проект для проекта Apps Script

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

Как создать тестовое развертывание Apps Script

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

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

    Перейти в Apps Script

  2. Нажмите Развертывание > Тестирование развертываний.

  3. Если Дополнение Google Workspace и Веб-приложение ещё не выбраны, рядом с пунктом Выберите тип нажмите на типы развертывания Значок настроек проекта и выберите Дополнение Google Workspace и Веб-приложение.

  4. Apps Script предоставляет идентификатор развертывания и URL для веб-приложения.

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

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

Как настроить приложение Chat в Google API Console

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

  1. В Google API Console нажмите Меню > API и сервисы > Включенные API и сервисы > Google Chat API > Конфигурация.

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

  2. В поле Название приложения введите Incident Management with User Auth.

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

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

  5. Переведите переключатель Включить интерактивные функции в положение "Включено".

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

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

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

  9. В разделе Триггеры настройте функции, которые будут реагировать на события взаимодействия:

    1. В поле Команда приложения введите onAppCommand.
  10. Зарегистрируйте быструю команду, которую использует полностью реализованное приложение Chat:

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

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

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

    4. В разделе Тип команды выберите Быстрая команда.

    5. В поле Название быстрой команды введите Close incident.

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

    7. Нажмите Готово. Команда зарегистрирована и указана в списке.

  11. В разделе Видимость выберите Сделать это чат-приложение доступным для определенных пользователей и групп в домене Workspace и введите свой адрес электронной почты.

  12. В разделе Журналы выберите Регистрировать ошибки в Logging.

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

Как протестировать приложение Chat

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

  1. Перейдите по URL веб-приложения, развернутого с помощью Apps Script.

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

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

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

  5. После создания чат-группы появится сообщение Space created!. Нажмите Открыть чат-группу. Чат-группа откроется в Chat на новой вкладке.

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

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

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

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

Приложение "Управление инцидентами" перечисляет сообщения в чат-группе, создает их краткое содержание с помощью Vertex AI, вставляет его в документ Google Документов и делится этим документом в чат-группе.

Организовать

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

  1. В Google API Console перейдите на страницу Управление ресурсами. Нажмите Меню > IAM и администрирование > Управление ресурсами.

    Перейти в Менеджер ресурсов

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