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

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

В этом руководстве используются области авторизации, начинающиеся с https://www.googleapis.com/auth/chat.app.* . Чтобы приложение Chat использовало эти области, необходимо получить однократное разрешение администратора .

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

  • На платформе управления взаимоотношениями с клиентами (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, SDK Google Workspace Marketplace и 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, SDK Google Workspace Marketplace и API Vertex AI с помощью команды gcloud services enable :

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

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

Приложение Chat обращается к API Google Chat, используя свои учётные данные. Приложение обращается к API Admin SDK и API Google Docs, используя учётные данные пользователя.

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

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

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

  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/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. После выбора областей, необходимых вашему приложению, на странице «Доступ к данным» нажмите кнопку «Сохранить» .

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

Аутентификация приложения используется для вызова API Google Chat.

Создайте учетную запись службы в консоли Google Cloud

Чтобы создать учетную запись службы, выполните следующие действия:

Консоль Google Cloud

  1. В консоли Google Cloud перейдите в > IAM и администрирование > Учетные записи служб .

    Перейти к учетным записям служб

  2. Нажмите Создать учетную запись службы .
  3. Заполните данные учетной записи службы, затем нажмите «Создать» и продолжите .
  4. Необязательно: назначьте роли своему сервисному аккаунту, чтобы предоставить доступ к ресурсам вашего проекта Google Cloud. Подробнее см. в разделе Предоставление, изменение и отзыв доступа к ресурсам .
  5. Нажмите «Продолжить» .
  6. Необязательно: введите пользователей или группы, которые смогут управлять этой учётной записью службы и выполнять с ней действия. Подробнее см. в разделе Управление олицетворением учётной записи службы .
  7. Нажмите «Готово» . Запишите адрес электронной почты для учётной записи сервиса.

gcloud CLI

  1. Создайте учетную запись службы:
    gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \
      --display-name="SERVICE_ACCOUNT_NAME"
  2. Необязательно: назначьте роли своему сервисному аккаунту, чтобы предоставить доступ к ресурсам вашего проекта Google Cloud. Подробнее см. в разделе Предоставление, изменение и отзыв доступа к ресурсам .

Учётная запись сервиса появится на странице учётной записи сервиса. Затем создайте для неё закрытый ключ.

Создать закрытый ключ

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

  1. В консоли Google Cloud перейдите в > IAM и администрирование > Учетные записи служб .

    Перейти к учетным записям служб

  2. Выберите свою учетную запись службы.
  3. Нажмите Ключи > Добавить ключ > Создать новый ключ .
  4. Выберите JSON , затем нажмите Создать .

    Ваша новая пара открытого и закрытого ключей будет сгенерирована и загружена на ваш компьютер в виде нового файла. Сохраните загруженный JSON-файл как credentials.json в вашем рабочем каталоге. Этот файл — единственная копия данного ключа. Сведения о безопасном хранении ключа см. в разделе Управление ключами учётной записи службы .

  5. Нажмите «Закрыть» .

Дополнительную информацию об учетных записях служб см. в разделе «Учетные записи служб» в документации Google Cloud IAM.

Создайте клиент OAuth, совместимый с Google Workspace Marketplace

Чтобы создать клиент OAuth, совместимый с Google Workspace Marketplace, выполните следующие действия:

  1. В консоли Google Cloud перейдите в > IAM и администрирование > Учетные записи служб .

    Перейти к учетным записям служб

  2. Щелкните учетную запись службы, которую вы создали для своего приложения Chat.

  3. Нажмите Дополнительные настройки .

  4. Нажмите «Создать клиент OAuth, совместимый с Google Workspace Marketplace» .

  5. Нажмите «Продолжить» .

Появится подтверждающее сообщение о том, что создан клиент OAuth, совместимый с Google Workspace Marketplace.

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

В следующем разделе вы скопируете и обновите весь проект 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-app-auth/Consts.gs
const PROJECT_ID = 'replace-with-your-project-id';
const CLOSE_INCIDENT_COMMAND_ID = 1;
const APP_CREDENTIALS = 'replace-with-your-app-credentials';
const APP_CREDENTIALS_SCOPES = 'https://www.googleapis.com/auth/chat.bot https://www.googleapis.com/auth/chat.app.memberships https://www.googleapis.com/auth/chat.app.spaces.create';
const VERTEX_AI_LOCATION_ID = 'us-central1';
const MODEL_ID = 'gemini-1.5-flash-002';
ChatApp.gs

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

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

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

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

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

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

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

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

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

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

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

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

}

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

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

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

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

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

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

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


function summarizeChatHistory_(chatHistory) {

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  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. Снимите флажок «Создать это приложение чата как дополнение к Google Workspace» . Откроется диалоговое окно с запросом на подтверждение. В диалоговом окне нажмите «Отключить» .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Получите одобрение администратора

Чтобы получить одобрение администратора, необходимо настроить приложение Chat в Google Workspace Marketplace SDK.

Настройте приложение чата в Google Workspace Marketplace SDK

Чтобы настроить приложение Chat в Google Workspace Marketplace SDK, выполните следующие действия:

  1. В консоли Google Cloud перейдите > API и службы > Включенные API и службы > Google Workspace Marketplace SDK > Конфигурация приложения .

    Перейти к конфигурации приложения

  2. Заполните страницу конфигурации приложения. Настройка приложения Chat зависит от вашей целевой аудитории и других факторов. За информацией о заполнении страницы конфигурации приложения обратитесь к разделу «Настройка приложения в Google Workspace Marketplace SDK» . Для целей данного руководства введите следующую информацию:

    1. В разделе Видимость приложения выберите Частное .
    2. В разделе «Параметры установки» выберите «Установка администратора» .
    3. В разделе Интеграция приложений выберите Приложение чата .
    4. В разделе «Области действия OAuth» введите следующие области действия:
      • https://www.googleapis.com/auth/chat.app.spaces
      • https://www.googleapis.com/auth/chat.app.memberships
    5. В разделе «Информация о разработчике» введите имя разработчика , URL-адрес веб-сайта разработчика и адрес электронной почты разработчика .
    6. Нажмите Сохранить черновик .

После настройки приложения обновите страницу в магазине:

  1. В консоли Google Cloud перейдите в Меню > API и службы > Включенные API и службы > Google Workspace Marketplace SDK > Список приложений в магазине .
  2. В разделе «Сведения о приложении» выберите категорию «Веб-разработка».
  3. В разделе «Графические активы» загрузите значки приложений в требуемых форматах.
  4. В разделе «Снимки экрана» загрузите снимок экрана приложения.
  5. В разделе «Ссылки поддержки» заполните URL-адрес условий обслуживания, URL-адрес конфиденциальности и URL-адрес поддержки.
  6. В разделе Распространение выберите регионы, в которых будет доступно это приложение.
  7. Нажмите «Опубликовать» .

Получите одобрение администратора

Теперь, когда ваша учетная запись службы настроена на получение одобрения администратора, получите его у администратора Google Workspace, который может предоставить одобрение, выполнив шаги, описанные в разделе Настройка авторизации для приложений чата .

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

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

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