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

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

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

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

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

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

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

Предварительные условия

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

  • Аккаунт Google Workspace с доступом к 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-запросов к Chat API с использованием службы расширенного чата Apps Script приложение Google Chat для ответа на инцидент создает пространство чата для инцидентов, заполняет его членами команды и отправляет сообщение в это пространство.

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

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

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

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

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

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

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

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

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

Консоль Google Cloud

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

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

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

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

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

интерфейс командной строки gcloud

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

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

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

Консоль Google Cloud

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

    Перейти к оплате за мои проекты

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

интерфейс командной строки gcloud

  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

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

    gcloud config set project PROJECT_ID
    

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

  2. Включите Google Chat API, Google Docs 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. В консоли Google Cloud выберите Меню > и службы > Экран согласия OAuth .

    Перейдите на экран согласия OAuth.

  2. В разделе «Тип пользователя» выберите «Внутренний» , затем нажмите «Создать» .

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

  4. В разделе «Электронная почта поддержки пользователей» выберите свой адрес электронной почты или соответствующую группу Google.

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

  6. Нажмите «Сохранить и продолжить» .

  7. Нажмите «Добавить или удалить области» . Появится панель со списком областей действия для каждого API, который вы включили в своем облачном проекте.

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

    • 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
  9. Нажмите «Добавить в таблицу» .

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

  11. Нажмите «Сохранить и продолжить» .

  12. Просмотрите сводную информацию о регистрации приложения, затем нажмите «Вернуться на панель управления» .

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

В следующем разделе вы скопируете и обновите весь проект 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 в Chat 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 для создания документа Документов Google на Google Диске пользователя и записывает в документ сводку информации об инциденте, созданную в VertexAiApi.gs .

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

приложения-скрипт/инцидент-ответ/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

приложения-скрипт/инцидент-ответ/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

приложения-скрипт/инцидент-ответ/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 и связать его с проектом Cloud:

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

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

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

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

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

Установите облачный проект проекта 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-адрес веб-приложения , чтобы посетить его позже, когда начнете инцидент. Скопируйте идентификатор развертывания . Вы используете этот идентификатор при настройке приложения Chat в консоли Google Cloud.

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

Настройте приложение Chat в консоли 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. В разделе «Функциональность» выберите «Получать сообщения 1:1» , «Присоединяйтесь к группам и групповым беседам» .

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

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

  9. Зарегистрируйте косую черту , которую использует полностью реализованное приложение Chat:

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

    2. В поле Имя введите /closeIncident .

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

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

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

    6. Нажмите Готово . Команда косой черты зарегистрирована и внесена в список.

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

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

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

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

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

  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. В диалоговом окне введите идентификатор проекта и нажмите «Завершить работу» , чтобы удалить проект.