Создание приложений для Google Chat с помощью Gemini

1. Подготовка

Что такое приложения Google Chat с Gemini?

Приложения Google Chat с Gemini выполняют следующие действия:

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

Зачем интегрировать приложения Google Chat с Gemini?

Типичные варианты использования моделей генеративного ИИ, таких как Gemini, делятся на следующие категории:

  • Создание и улучшение контента. Генерируйте маркетинговые тексты, создавайте публикации для социальных сетей, реалистичные изображения, музыку и видеоконтент.
  • Поиск данных. Извлекайте ключевые идеи из неструктурированной базы знаний, обобщайте длинные тексты, классифицируйте контент или переводите на другие языки с повышенной точностью и скоростью.
  • Разговор. Общайтесь с Gemini на любые темы.

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

Требования

Что вы создаете

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

Приложение для управления проблемами (создание и улучшение контента)

Это приложение выполняет следующие действия:

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

Вы используете Gemini, чтобы:

  • Генерировать отчеты о проблемах на основе истории переписки и сведений о проблеме.
  • Классифицируйте неинклюзивные слова в сообщениях с помощью закрытых запросов.

Основные используемые технологии: Vertex AI, Gemini, Apps Script и Google Workspace API (Admin, Chat, Docs, Events).

22efdecff4601417.png2d127c63518673b2.png9aea694937f2f3ed.png

Приложение использует Gemini, чтобы понимать вопросы на естественном языке и отвечать на них, а также возвращать ссылки на источники из неструктурированных данных.

Основные используемые технологии – агент хранилища данных Dialogflow CX, вебхук Dialogflow CX, Google Cloud Functions и Gemini.

9468866bfe848bb8.png

Приложение для отзывов (разговор)

Это приложение использует Gemini для сбора и хранения отзывов с разговорами на естественном языке.

Основные используемые технологии: агент Dialogflow CX, инструмент Dialogflow CX, OpenAPI, Google Cloud Functions и Gemini.

99a7a0295f122f31.png

Что вы узнаете

  • Как интегрировать приложения Google Chat с Gemini через Vertex AI.
  • Как интегрировать приложения Google Chat с агентами Dialogflow CX.
  • Как использовать новые функции Google Chat: главный экран приложения, события Google Chat и виджеты.

Что вам понадобится

2. Подготовка

Инициализация ресурсов

В этом разделе вы получите доступ к следующим ресурсам и настроите их в предпочитаемом браузере.

Проект Apps Script

В консоли Apps Script выполните следующие действия:

  1. Нажмите Настройки и включите Google Apps Script API.

ea06c593b347b9d1.png

  1. Выберите проект.
  2. Нажмите Настройки проекта.
  3. Установите флажок Показать файл манифеста appsscript.json в редакторе.
  4. Переименуйте проект в Chat Apps Gemini.

12c1485bd248b766.png

Проект Google Cloud

В консоли Google Cloud выполните следующие действия:

  1. Выберите проект.
  2. Нажмите Меню ☰ > API и сервисы > Окно запроса доступа OAuth > Изменить приложение, а затем в поле Название приложения введите Chat Apps Gemini.

  1. Перейдите к конфигурации Google Chat API и задайте для параметров App name (Название приложения) и Description (Описание) значение Chat Apps Gemini.

a71f040755da3b8b.png

Google Chat

В Google Chat выполните следующие действия:

  1. При необходимости начните чат с приложением Google Chat.
  2. Отправьте сообщение, например Hello, чтобы убедиться, что все работает.

9625418251528ae9.png

Скачайте исходный код и ресурсы на локальный диск

  1. Скачайте этот репозиторий GitHub.

  1. В предпочитаемой среде разработки откройте каталог apps-script, а затем перейдите в тот же каталог в терминале.

da9478df97c99194.png

Установите и настройте clasp.

Мы используем clasp, чтобы легко редактировать и отправлять версии исходного кода из локальной среды в проект Apps Script.

  1. Установите последние версии node, npm и clasp в локальной среде.
npm install -g @google/clasp
  1. Войдите в аккаунт.
clasp login

8bc2434e6dc6f22a.png

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

e1d833eb4d5b3a8f.png

3. Приложение 1. Сборка

Посмотреть концепции

Vertex AI

Vertex AI предлагает все необходимое для создания и использования генеративного искусственного интеллекта, включая ИИ-решения, конструктор агентов, более 130 базовых моделей и единую ИИ-платформу.

c9e9c7a1945b22ac.png

Gemini

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

Расширенный сервис Chat

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

Архитектура отзывов

8c9c7b7328a69ea6.png

Это приложение Google Chat создано с помощью Apps Script. Ниже описан принцип работы этих отчетов.

  1. Пользователь отправляет сообщение приложению в прямой переписке или чат-группе.
  2. Приложение, которое реализовано в проекте Apps Script и связано с проектом Google Cloud, обрабатывает сообщение.
  3. Приложение интегрировано с API Google Документов и Google Chat.
  4. Приложение использует сервис свойств, чтобы сохранять данные в свойствах скрипта.
  5. Приложение отправляет синхронный ответ в прямой переписке или в исходной чат-группе.

Процессы проверки

Создать проблему

7ca0e8ba3c8255bb.png

Устранение неполадок в чат-группе

51b47714c378a24b.png

Как закрыть проблему в чат-группе

89e50228deeab0f9.png

Проверьте исходный код

Проект Apps Script содержит следующие скрипты:

  • Configuration – константы, которые нужно изменить в зависимости от среды.
  • ChatApp – обрабатывает события взаимодействия в Google Chat, включая сообщения, нажатия на карточки, слеш-команды и диалоги.
  • Storage – служебные функции, которые используют сервис Properties.
  • ChatAppAuth – служебные функции, которые используют аутентификацию приложения Google Chat.
  • Docs: служебные функции, которые используют Google Документы.
  • VertexAi – служебные функции, которые используют Vertex AI.

А вот какие части активно используются при создании отчетов с помощью Gemini и истории чатов:

appsscript.json

// Enables the Admin SDK Directory and Chat services, which you need to retrieve
// messages and usernames.

"enabledAdvancedServices": [
  ...
  {
    "userSymbol": "AdminDirectory",
    "version": "directory_v1",
    "serviceId": "admin"
  },
  {
    "userSymbol": "Chat",
    "version": "v1",
    "serviceId": "chat"
  }
  ...
]
// Includes the OAuth scopes to request the Admin SDK Directory, Google Chat,
// Google Docs, and Vertex AI APIs.

"oauthScopes": [
  ...
  "https://www.googleapis.com/auth/admin.directory.user.readonly",
  "https://www.googleapis.com/auth/chat.messages.readonly",
  "https://www.googleapis.com/auth/documents",
  "https://www.googleapis.com/auth/cloud-platform",
  ...
]

Configuration.js

// Relies on two constants: the first one is the Google Cloud project ID and the
// second one is the Vertex AI location to be used.

...
const PROJECT_ID = 'replace-with-gcp-project-id';
const VERTEX_AI_LOCATION_ID = 'us-central1';
...

ChatApp.js

// The slash command process function retrieves history, generates content, and passes
// it to the report generator.

function processSlashCommand(event) {
  ...
  if (event.message.slashCommand.commandId == CLOSE_COMMAND_ID
    && event.message.space.type !== "DM") {
    ...
    const history = exportSpaceHistory(spaceId);
    const summary = summarizeSpace(history);
    const docUrl = createReport(
      issue.title, issue.description, resolution, history, summary
    );
    ...
  }
  ...
}
/**
 * Fetches and concatenates the 100 first space messages by using the Google Chat API.
 *
 * Messages with slash commands are filtered (app command invocations).
 *
 * @return {string} concatenate space messages in the format "Sender's name: Message"
 */
function exportSpaceHistory(spaceName) {
  const messages = Chat.Spaces.Messages.list(spaceName, { 'pageSize': 100 }).messages;
  // Returns results after fetching message sender display names.
  let users = new Map();
  return messages>
    .filter(message = message.slashCommand === undefin>ed)
    .map(message =
      `${getUserDisplayName(users, message.sender.name)}: ${message.text}`
    ).join('\n');
}
/**
 * Fetches a user's display name by using the Admin Directory API.
 *
 * A cache is used to only call the API once per user.
 *
 * @param {Map} cache the map containing users previously fetched
 * @param {string} userId the user ID to fetch
 * @return {string} the user's display name
 */
function getUserDisplayName(cache, userId) {
  if (cache.has(userId)) {
    return cache.get(userId);
  }
  let displayName = 'Unknown User';
  try {
    const user = AdminDirectory.Users.get(
      userId.replace("users/", ""),
      { projection: 'BASIC', viewType: 'domain_public' });
    displayName = user.name.displayName ? user.name.displayName : user.name.fullName;
  } catch (e) {
    // Ignores errors, uses 'Unknown User' by default.
  }
  cache.set(userId, displayName);
  return displayName;
}

VertexAi.js

/**
 * Summarizes a Google Chat space history with the Gemini Pro model using
 * Vertex AI API.
 *
 * @param {string} history the history
 * @return {string} the summary
 */
function summarizeSpace(history) {
  const url = `https://${VERTEX_AI_LOCATION_ID}-aiplatform.googleapis.com/v1`
    + `/projects/${PROJECT_ID}/locations/${VERTEX_AI_LOCATION_ID}`
    + "/publishers/google/models/gemini-1.0-pro:generateContent";
  const options = {
    method: "POST",
    headers: { Authorization: "Bearer " + ScriptApp.getOAuthToken() },
    contentType: "application/json",
    payload: JSON.stringify({
      contents: {
        role: "user",
        parts: {
          text: "Summarize the following conversation between engineers resolving"
              + " an issue in a few sentences.\n\n" + history
        }
      },
      safetySettings: {
        category: "HARM_CATEGORY_SEXUALLY_EXPLICIT",
        threshold: "BLOCK_LOW_AND_ABOVE"
      },
      generationConfig: {
        temperature: 0.2,
        topP: 0.8,
        topK: 40
      }
    })
  };

  return JSON.parse(UrlFetchApp.fetch(url, options).getContentText())
    .candidates[0].content.parts[0].text;
}

Docs.js

// The report generator function adds two sections: the first one is for the summary and the second one is for history.
function createReport(..., history, summary) {
  ...
  body.appendParagraph("Summary").setHeading(DocumentApp.ParagraphHeading.HEADING1);
  body.appendParagraph(summary);
  body.appendParagraph("History").setHeading(DocumentApp.ParagraphHeading.HEADING1);
  body.appendParagraph(history);
  ...
}

Обновить проект Google Cloud

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

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

  1. Нажмите Меню ☰ > API и сервисы > Включенные API и сервисы и убедитесь, что API включены.

Инициализация сервисного аккаунта

В консоли Google Cloud выполните следующие действия:

  1. Нажмите Меню ☰ > IAM и администрирование > Сервисные аккаунты > + Создать сервисный аккаунт.

74cf57426419f39.png

  1. В поле Service account name (Название сервисного аккаунта) укажите chat-app.
  2. В поле Service account description (Описание сервисного аккаунта) введите Chat app auth.
  3. Нажмите кнопку Создать и продолжить.
  4. Нажмите Готово. Вы будете перенаправлены на страницу Сервисные аккаунты, где увидите созданный вами сервисный аккаунт.

ca0468f1f93990f9.png

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

9f7e6ea020978ab0.png

Диалоговое окно закроется, и созданная пара ключей будет автоматически скачана на ваше устройство в виде JSON-файла. Его содержимое понадобится вам позже, когда вы будете редактировать исходный код проекта Apps Script.

Как изменить конфигурацию Google Chat API

В консоли Google Cloud выполните следующие действия:

  1. Добавьте слеш-команду.
  2. В поле Name (Название) укажите /create.
  3. В поле Command ID (Идентификатор команды) введите 1.
  4. В поле Description (Описание) введите Create a new issue.
  5. Установите флажок Открывает диалоговое окно.
  6. Добавьте ещё одну слеш-команду.
  7. В поле Name (Название) укажите /close.
  8. В поле Command ID (Идентификатор команды) введите 2.
  9. В поле Description (Описание) введите Close an issue.
  10. Нажмите Сохранить.

bee2e7b63659ab33.png

Обновление проекта Apps Script

  • Измените текущий каталог в локальном терминале на issue-management/1-baseline. Он содержит исходный код. Прежде чем отправлять исходный код в проект Apps Script, необходимо выполнить некоторые настройки.

Настройка исходного кода

  1. В файле Configuration.js задайте для константы JSON с именем CHAT_CREDENTIALS содержимое файла закрытого ключа, который вы скачали ранее.

d721f6bff73c5304.png

  1. В консоли Google Cloud нажмите Меню ☰ > IAM и администрирование > Настройки.

  1. Скопируйте идентификатор проекта.

82592fa0bd113469.png

  1. В файле Configuration.js задайте для строковой константы PROJECT_ID значение идентификатора проекта.

383cee561130ceba.png

Настройте параметры clasp.

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

  1. В консоли Apps Script выберите проект.
  2. Выберите Project Settings (Настройки проекта).
  3. В разделе Идентификаторы нажмите Копировать.

20ea033b6de882c6.png

  1. В текущем каталоге создайте файл .clasp.json.
  2. Замените <your-script-id> скопированным идентификатором.
  3. Скопируйте результат в файл .clasp.json.
  4. Сохраните файл .clasp.json.
{
  "scriptI<d": ">;your-script-id"
}

Исходный код push-уведомлений

  • Выполните следующую команду:
$clasp push
? Manifest file has been updated. Do you want to push and overwrite? Yes
└─ appsscript.json
└─ ChatApp.js
└─ ChatAppAuth.js
└─ Configuration.js
└─ Docs.js
└─ Storage.js
└─ VertexAi.js
Pushed 7 files.

Попробовать

  1. В Google Chat отправьте Hello! в прямом сообщении приложению. Приложение не ответит, но появится сообщение с предложением выполнить настройку.

4c1fc68121dcffed.png

  1. Нажмите Настроить.
  2. Выберите аккаунт Google.
  3. Выполните аутентификацию.
  4. Проверьте и разрешите доступ к приложению.

4a2fd7ac5918bf1a.png

Если все пройдет успешно, на веб-странице появится подтверждение, а в приложении – ответ на ваше исходное сообщение.

acb9065568fe47d2.png2d6ef9c62f47e082.png

  1. Отправьте приложению ещё одно сообщение, но со слеш-командой /create.

be3f3c6eb0f929c1.png

  1. В диалоговом окне в поле Название введите Issue Title 1.
  2. В поле Description (Описание) введите Issue Description 1.
  3. Нажмите Создать.

22efdecff4601417.png

Приложение выполняет следующие действия:

  1. Закрывает диалоговое окно.
  2. Создает чат-группу, посвященную новой проблеме, с тем же названием.
  3. Вы присоединитесь к созданной чат-группе.
  4. Отправляет сообщение с описанием проблемы в созданную чат-группу.
  5. Отправляет вам прямое сообщение со ссылкой на созданную чат-группу.

3253cec2392e281f.png

  1. В новой чат-группе отправьте сообщение со слеш-командой /close и разрешением, например Not reproducible.

132cc4acfc10b98c.png

Приложение выполняет следующие действия:

  1. Создает отчет в Google Документах.
  2. Отправляет в чат-группу, посвященную проблеме, сообщение со ссылкой на созданный документ отчета.

2d127c63518673b2.png

  1. Откройте документ с отчетом. В нем содержится основная информация, история и краткое описание.

9aea694937f2f3ed.png

4. Необязательно. Приложение 1: добавить главный экран приложения

Основные понятия

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

65f56f70f67a32e4.png

Процессы проверки

Как устранять проблемы

10663f5fc107fb3f.png

Проверьте исходный код

Проект Apps Script нужно изменить.

ChatApp.js

/**
 * Handles app home requests in Google Chat.
 * 
 * Displays the latest status of all issues.
 */
function onAppHome() {
  // Generates one card section per issue.
  var sections = [];
  for (var issueKey in appProperties.getProperties()) {
    const issue = JSON.parse(appProperties.getProperty(issueKey));
    if (issue.spaceId) {
      sections.push({
        header: `${issue.status} - ${issue.title}`,
        widgets: [{ textParagraph: {
            text: `Description: ${issue.description}`
          }}, { textParagraph: {
            text: `Resolution: ${issue.resolution}`
          }}, { buttonList: { buttons: [{
              text: "Open space",
              onClick: { openLink: {
                url: `https://mail.google.com/mail/u/0/#chat/space/${issue.spaceId}`
              }}
            }, {
              text: "Open report",
              onClick: { openLink: {
                url: issue.reportUrl !== "" ? issue.reportUrl : "docs.new"
              }},
              disabled: issue.reportUrl === ""
          }]}
        }]
      });
    }
  }

  return { action: { navigations: [{ push_card: {
    sections: sections
  }}]}};
}

Обновить проект Google Cloud

В консоли Google Cloud выполните следующие действия:

  1. В разделе Интерактивные функции установите флажок Поддержка главного экрана приложения.

97159c1c69ca8303.png

В локальной среде выполните следующие действия:

  1. Измените текущий каталог в терминале на issue-management/2-app-home. В нем содержится исходный код, который вам нужно использовать.
  2. Скопируйте файл issue-management/1-baseline/.clasp.json в текущий каталог.
  3. Скопируйте файл issue-management/1-baseline/Configuration.js в текущий каталог, чтобы заменить существующий.
  4. Выполните следующую команду:
clasp push

Попробовать

В Google Chat выполните следующие действия:

  1. Отправьте приложению прямое сообщение со слеш-командой /create. Приложение откроет диалоговое окно.
  2. В поле Title (Название) введите Issue Title 2.
  3. В поле Description (Описание) введите Issue Description 2.
  4. Нажмите Создать.

3b2a8690e758f965.png

  1. Выберите вкладку Главная в чат-группе с приложением Google Chat. Вы увидите подробные сведения о созданных вами проблемах.

ed8e32da0e6f2ac6.png

5. Необязательно. Приложение 1: добавьте мониторинг чат-групп

Проверка концепций

Pub/Sub

Pub/Sub – это асинхронный масштабируемый сервис обмена сообщениями, который разделяет сервисы, создающие сообщения, и сервисы, обрабатывающие их. Pub/Sub позволяет создавать системы организаторов и участников событий (издателей и подписчиков). Издатели взаимодействуют с подписчиками асинхронно через трансляцию событий, а не через синхронные вызовы удаленных процедур (RPC).

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

Тема. Именованный ресурс, представляющий собой фид сообщений. Прежде чем публиковать тему или подписываться на нее, ее нужно создать.

Подписка. Чтобы получать сообщения, опубликованные в теме, необходимо создать подписку на эту тему. Клиент-подписчик получает и обрабатывает сообщения, опубликованные в теме. У темы может быть несколько подписок, но каждая подписка относится только к одной теме.

События Google Workspace

События Google Workspace представляют собой изменения в ресурсах Google Workspace, например создание, обновление или удаление ресурсов. Приложения могут подписываться на ресурсы Google Workspace, чтобы асинхронно получать и обрабатывать соответствующие события.

7816e477b112bfb6.png

Вот как Google Workspace Events API доставляет события в приложение по подписке:

  1. Приложение подписывается на ресурс в приложении Google Workspace, например на чат-группу.
  2. Ресурс, на который подписано приложение, изменяется.
  3. Приложение Google Workspace доставляет событие в тему в Pub/Sub, которая служит конечной точкой оповещений для подписки Google Workspace приложения. Событие содержит данные о том, что изменилось в ресурсе.
  4. Приложение обрабатывает сообщение Pub/Sub, содержащее событие, и при необходимости выполняет действие.

Процессы проверки

Создать проблему (обновление)

6d7a9d7a68666a80.png

Устранение неполадок в специальном чат-боте (обновление)

17e60f052f222456.png

Закрыть вопрос из выделенного пространства (обновление)

742d490ea0b6fe3a.png

Как обрабатывать подписки

de3017100dec6401.png

Проверьте исходный код

Проект Apps Script нужно изменить.

appsscript.json

// Enables the Workspace Events service.

"enabledAdvancedServices": [
  ...
  {
    "userSymbol": "WorkspaceEvents",
    "version": "v1";,
    "serviceId": "workspaceevents"
  }
  ...
]

Configuration.js

// Adds two constants: the first one is the Pub/Sub topic ID and the second one
// is the Pub/Sub subscription ID to be used to retrieve Google Workspace events.

...
const GWS_PUBSUB_TOPIC_ID = `projects/${PROJECT_ID}/topics/workspace-events`;
const GWS_PUBSUB_SUBSCRIPTION_ID =
  `projects/${PROJECT_ID}/subscriptions/workspace-events-sub`;
...

ChatApp.js

// Edits the function to delete the subscription at issue closure.

function processSlashCommand(event) {
  ...
  if (event.message.slashCommand.commandId == CLOSE_COMMAND_ID
    && event.message.space.type !== "DM") {
    ...
    deleteSubscription(issue.subscriptionId);
    ...
  }
  ...
}
// Edits the function to create the subscription.

function createIssue(event) {
  ...
  const subscriptionId = createSpaceSubscription(spaceUrl);
  const createdIssue = saveCreatedIssue(..., subscriptionId);
  ...
}
// Edits the function to delete the subscription.

function onRemoveFromSpace(event) {
  ...
  deleteSubscription(issue.subscriptionId);
  ...
}

Storage.js

// Edits the function to keep track of the subscription ID.

function saveCreatedIssue(..., spaceId, subscriptionId) {
  ...
  appProperties.setProperty(spaceId, JSON.stringify({
    ...
    subscriptionId: subscriptionId,
    ...
  }));
  ...
}

WorkspaceEvent.js

/**
 * Creates a new subscription to Google Workspace Events associated to a
 * Google Chat space.
 * 
 * The subscription scope includes message creation events and resources.
 * 
 * @param {string} spaceId the space ID to create a subscription for
 * @return the ID of the newly created subscription
 */
function createSpaceSubscription(spaceId) {
  const operation = WorkspaceEvents.Subscriptions.create({
    targetResource: `//chat.googleapis.com/${spaceId}`,
    eventTypes: ["google.workspace.chat.message.v1.created"],
    notificationEndpoint: { pubsubTopic: GWS_PUBSUB_TOPIC_ID },
    payloadOptions: { includeResource: true },
  });

  return operation.response.name;
}
/**
 * Processes events from subscription by using the Google Cloud PubSub API.
 * 
 * It pulls and acknowledges each event.
 */
function processSubscription() {
  const response = UrlFetchApp.fetch(
    `https://pubsub.googleapis.com/v1/${GWS_PUBSUB_SUBSCRIPTION_ID}:pull`,
    {
      method: "POST",
      contentType: "application/json",
      headers: { "Authorization": "Bearer " + ScriptApp.getOAuthToken() },
      payload: JSON.stringify({ maxMessages: 10 })
    }
  );

  const messages = JSON.parse(response.getContentText()).receivedMessages;
  for (var messageIndex in messages) {
    const message = messages[messageIndex];
    const ceType = message.message.attributes["ce-type"];
    const dataStr = Utilities.newBlob(Utilities.base64Decode(message.message.data))
      .getDataAsString();
    if (ceType === "google.workspace.events.subscription.v1.expirationReminder") {
      // Renews subscription.
      renewSubscription(JSON.parse(dataStr).subscription.name);
    } else if (ceType === "google.workspace.chat.message.v1.created") {
      // Processes the message text when it's sent in a space.
      const chatMessage = JSON.parse(dataStr).message;
      if (chatMessage.sender.type !== "BOT") {
        console.log("Message was processed.");
      }
    }
    // Acknowledges successful processing to avoid getting it again next time.
    ackSubscription(message.ackId);
  }
}
/**
 * Acknowledges a subscription event by using the Google Cloud PubSub API.
 * 
 * @param {string} ackId the ID of the event acknowledgment to send
 */
function ackSubscription(ackId) {
  UrlFetchApp.fetch(
    `https://pubsub.googleapis.com/v1/${GWS_PUBSUB_SUBSCRIPTION_ID}:acknowledge`,
    {
      method: "POST",
      contentType: "application/json",
      headers: { "Authorization": "Bearer " + ScriptApp.getOAuthToken() },
      payload: JSON.stringify({
        ackIds: [ackId]
      })
    }
  );
}
/**
 * Renews a subscription to Google Workspace Events.
 * 
 * The default time to live option is used.
 * 
 * @param {string} subscriptionId the ID of the subscription to renew
 */
function renewSubscription(subscriptionId) {
  WorkspaceEvents.Subscriptions.patch({ttl: '0s'}, subscriptionId);
}
/**
 * Deletes a subscription to Google Workspace Events.
 * 
 * @param {string} subscriptionId the ID of the subscription to delete
 */
function deleteSubscription(subscriptionId) {
  WorkspaceEvents.Subscriptions.remove(subscriptionId);
}

Обновить проект Google Cloud

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

  1. В консоли Google Cloud включите Google Workspace Events и Pub/Sub.

  1. Нажмите Меню ☰ > API и сервисы > Включенные API и сервисы и убедитесь, что оба API включены.

Как оформить подписку

Необходимо создать тему издателя-подписчика и подписаться на нее, чтобы публиковать все события Workspace.

В консоли Google Cloud выполните следующие действия:

  1. Выберите Меню ☰ > издатель-подписчик > Topics (Темы).

.

  1. Нажмите Создать тему.
  2. В поле Topic ID (Идентификатор темы) введите workspace-events.
  3. Установите флажок Добавить подписку по умолчанию.
  4. Нажмите Создать.

b39f9a0aec7c9939.png

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

  1. Выберите тему из списка.
  2. Перейдите на вкладку Права доступа.
  3. Добавьте chat-api-push@system.gserviceaccount.com в поле New principals (Новые субъекты).
  4. В разделе Роль выберите Издатель Pub/Sub.
  5. Нажмите Сохранить.

8d4016c37532503.png

Обновление проекта Apps Script

В консоли Google Cloud выполните следующие действия:

  1. Нажмите на значок Меню ☰ > IAM & Admin (IAM и администрирование) > Settings (Настройки).

  1. Скопируйте идентификатор проекта.

82592fa0bd113469.png

В локальной среде выполните следующие действия:

  1. Измените текущий каталог в терминале на issue-management/3-message-monitoring. В нем содержится нужный вам исходный код.
  2. В файле Configuration.js задайте для строковой константы PROJECT_ID значение скопированного идентификатора проекта.
  3. Задайте для константы JSON с именем CHAT_CREDENTIALS в файле Configuration.js значение, соответствующее содержимому файла закрытого ключа, который вы скачали ранее.
  4. Скопируйте файл issue-management/2-app-home/.clasp.json в текущий каталог.
  5. Выполните следующую команду:
clasp push

Попробовать

В Google Chat выполните следующие действия:

  1. Отправьте приложению прямое сообщение со слеш-командой /create. Приложение откроет диалоговое окно.
  2. В поле Title (Название) введите Issue Title 3.
  3. В поле Description (Описание) введите Issue Description 3.
  4. Нажмите Создать.
  5. В новой чат-группе отправьте несколько сообщений, в которых обсуждается проблема.
  6. Отправьте сообщение со слеш-командой /close и решением, например Fixed.

В консоли Google Cloud выполните следующие действия:

  1. Выберите Меню ☰ > Pub/Sub > Subscriptions (Подписки).

  1. Выберите подписку workspace-events-sub.
  2. Выберите вкладку Сообщения.
  3. Нажмите Pull (Извлечь). В таблице показаны сообщения, связанные с тем, что вы отправили в новую чат-группу.

82631c9792d83889.png

В консоли Apps Script выполните следующие действия:

  1. Выберите проект.
  2. Выберите Редактор.
  3. Выберите файл WorkspaceEvent.gs.
  4. В разделе Выполнить выберите processSubscription.
  5. Нажмите Run.В журнале выполнения вы увидите, что сообщения были обработаны.

c612e8fa2bd0a163.png

В консоли Google Cloud выполните следующие действия:

  1. Выберите Меню ☰ > Pub/Sub > Subscriptions (Подписки).

  1. Выберите подписку workspace-events-sub.
  2. Выберите вкладку Сообщения.
  3. Нажмите Pull (Извлечь). В таблице больше не показываются сообщения, связанные с тем, что вы отправили в новую чат-группу.

e185454cac862a7b.png

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

В консоли Google Cloud выполните следующие действия:

  1. Выберите Меню ☰ > Pub/Sub > Subscriptions (Подписки).

  1. Выберите подписку workspace-events-sub.
  2. Выберите вкладку Сообщения.
  3. Нажмите Pull (Извлечь). В таблице не отображаются сообщения, связанные с тем, что вы отправили в новую чат-группу.

6. Optional: App 1: Add inclusivity help

Проверка концепций

Запросы к генеративному ИИ – это искусство составления инструкций или вопросов, которые направляют модель генеративного ИИ к получению желаемого результата. Распространенная практика – ограничивать ответы, добавляя правила и условия в запросы. Это помогает сделать результат безопасным, релевантным, последовательным и соответствующим ожиданиям.

Процессы проверки

Как обрабатывать подписки (обновление)

780d0802f77dd180.png

Проверьте исходный код

Проект Apps Script нужно изменить.

WorkspaceEvent.js

// Edits the function to replace logging by an actual card message.

function processSubscription() {
  ...
  for (var messageIndex in messages) {
    ...
    } else if (ceType === "google.workspace.chat.message.v1.created") {
      ...
      const inclusivityCheck = getInclusivityFeedback(chatMessage.text);
      if (inclusivityCheck !== "It's inclusive!") {
        createAppMessageUsingChatService({
          cardsV2: [{ cardId: "1", card: { header: {
              title: "Inclusivity",
              subtitle: `The following words are not inclusive: ${inclusivityCheck}`
          }}}]
        },
        chatMessage.space.name);
      }
      ...
    }
    ...
  }
  ...
}

VertexAi.js

/**
 * Gets feedback on inclusivity for a text with the Gemini Pro model using
 * Vertex AI API.
 * 
 * Returns "It's inclusive!" when it is otherwise a list of word(s) that might not
 * be optimal.
 *
 * @param {string} text the text
 * @return {string} the feedback
 */
function getInclusivityFeedback(text) {
  const url = `https://${VERTEX_AI_LOCATION_ID}-aiplatform.googleapis.com/v1`
    + `/projects/${PROJECT_ID}/locations/${VERTEX_AI_LOCATION_ID}`
    + "/publishers/google/models/gemini-1.0-pro:generateContent";
  const options =  {
    method: "POST",
    headers: { Authorization: "Bearer " + ScriptApp.getOAuthToken() },
    contentType: "application/json",
    payload: JSON.stringify({
      contents: {
        role: "user",
        parts: {
          text: "Are there any words that obviously go against inclusivity "
            + "in this text:"
            + `\n\n----------\n${text}\n----------\n\n`
            + "If there are not, answer \"It's inclusive!\" "
            + "otherwise answer by listing them separated by commas. "
            + "Do not answer with any explanation."
        }
      },
      safetySettings: {
        category: "HARM_CATEGORY_SEXUALLY_EXPLICIT",
        threshold: "BLOCK_LOW_AND_ABOVE"
      },
      generationConfig: {
        temperature: 0.2,
        topP: 0.8,
        topK: 40
      }
    })
  };

  return JSON.parse(UrlFetchApp.fetch(url, options).getContentText())
    .candidates[0].content.parts[0].text;
}

Обновление проекта Apps Script

В локальной среде выполните следующие действия:

  1. Измените текущий каталог в терминале на issue-management/4-inclusivity-help. В нем содержится нужный вам исходный код.
  2. Скопируйте файл issue-management/3-message-monitoring/.clasp.json в текущий каталог.
  3. Скопируйте файл issue-management/3-message-monitoring/Configuration.js в текущий каталог, чтобы заменить существующий.
  4. Выполните следующую команду:
clasp push

Попробовать

В Google Chat выполните следующие действия:

  1. Отправьте приложению прямое сообщение со слеш-командой /create. Приложение откроет диалоговое окно.
  2. В поле Title (Название) введите Issue Title 4.
  3. В поле Описание введите "Проблема Description 4".
  4. Нажмите Создать.
  5. В созданной чат-группе отправьте It happened to me last week as well.

В консоли Apps Script выполните следующие действия:

  1. Выберите проект.
  2. Выберите Редактор.
  3. Выберите файл WorkspaceEvent.gs.
  4. В разделе Выполнить выберите processSubscription.
  5. Нажмите Выполнить. В журнале выполнения можно увидеть, что сообщения были обработаны.

В Google Chat выполните следующие действия:

  1. Обратите внимание, что приложение не отправило никаких подсказок по инклюзивности в только что созданную чат-группу.
  2. В созданной чат-группе отправьте сообщение I had to add myself from the master to fix it.

В консоли Apps Script выполните следующие действия:

  1. Выберите проект.
  2. Выберите Редактор.
  3. Выберите файл WorkspaceEvent.gs.
  4. В разделе Выполнить выберите processSubscription.
  5. Нажмите Выполнить. В журнале выполнения можно увидеть, что сообщения были обработаны. В Google Chat приложение отправило справочное сообщение об инклюзивности в недавно созданную чат-группу.

7936342847acbe2d.png

7. Необязательно. Приложение 1: добавьте настройки

.

Проверка концепций

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

eebe88238f6b13f.png

Процессы проверки

Как отключить подсказки по инклюзивности

1bb7a8592ee6221e.png

Проверьте исходный код

Проект Apps Script нужно изменить.

ChatApp.js

// Edits the function to handle the inclusivity help disablement action for a
// given space.

function onCardClick(event) {
  ...
  if (event.action.actionMethodName === "disableInclusivityHelp") {
    disableInclusivityHelp(event.common.parameters.spaceId);
  }
}

Storage.js

// Edits the function to keep track of the inclusivity help setting.

function saveCreatedIssue(title, description, spaceId, subscriptionId) {
  appProperties.setProperty(spaceId, JSON.stringify({
    ...
    inclusivityHelp: true,
    ...
  }));
  ...
}
/**
 * Disables inclusivity help in a space.
 * 
 * @param {string} spaceId the ID of dedicated space of the issue
 */
function disableInclusivityHelp(spaceId) {
  var issue = JSON.parse(appProperties.getProperty(spaceId));
  issue.inclusivityHelp = false;
  appProperties.setProperty(spaceId, JSON.stringify(issue));
}
/**
 * Checks whether the app should help with inclusivity in a given space.
 * 
 * @param {string} spaceId the ID of dedicated space of the issue
 * @return whether the app should help with inclusivity
 */
function shouldHelpWithInclusivity(spaceId) {
  return JSON.parse(appProperties.getProperty(spaceId)).inclusivityHelp;
}

WorkspaceEvent.js

// Edits the function to display the accessory widget to the existing card message.

function processSubscription() {
  ...
  for (var messageIndex in messages) {
    ...
    } else if (ceType === "google.workspace.chat.message.v1.created") {
      ...
    &&  if (...  shouldHelpWithInclusivity(chatMessage.space.name)) {
        createAppMessageUsingChatService({
          ...
          accessoryWidgets: [{ buttonList: { buttons: [{
            altText: "Disable inclusivity help",
            icon: {
              iconUrl: "https://upload.wikimedia.org/.../Stop_hand_rugen.png"
            },
            onClick: { action: {
              function: "disableInclusivityHelp",
              parameters: [{
                key: "spaceId",
                value: chatMessage.space.name
              }]
            }}
          }]}}]
        }, ...);
        ...
      }
      ...
    }
    ...
  }
  ...
}

Обновление проекта Apps Script

В локальной среде выполните следующие действия:

  1. Измените текущий каталог в терминале на issue-management/5-disable-help. В нем содержится нужный вам исходный код.
  2. Скопируйте файл issue-management/4-inclusivity-help/.clasp.json в текущий каталог.
  3. Скопируйте файл issue-management/4-inclusivity-help/Configuration.js в текущий каталог, чтобы заменить существующий.
  4. Выполните следующую команду:
clasp push

Попробовать

Как отключить справку

  • В Google Chat в чат-группе, посвященной четвертой проблеме, которую вы создали с помощью слеш-команды /create, отправьте сообщение I had to add myself from the master to fix.

В консоли Apps Script выполните следующие действия:

  1. Выберите проект.
  2. Выберите Редактор.
  3. Выберите файл WorkspaceEvent.gs.
  4. В разделе Выполнить выберите processSubscription.
  5. Нажмите Выполнить. В журнале выполнения можно увидеть, что сообщения были обработаны.

В Google Chat выполните следующие действия:

  1. Обратите внимание, что приложение отправило сообщение с советами по инклюзивности в чат-группу, посвященную проблеме с виджетом аксессуаров.
  2. Нажмите на виджет, чтобы отключить подсказки по инклюзивности.

de722cff1928dec9.png

Проверка отключения

  • В Google Chat в чат-группе, посвященной четвертой проблеме, которую вы создали с помощью слеш-команды /create, отправьте сообщение I had to add myself from the master to fix.

В консоли Apps Script выполните следующие действия:

  1. Выберите проект.
  2. Выберите Редактор.
  3. Выберите файл WorkspaceEvent.gs.
  4. В разделе Выполнить выберите processSubscription.
  5. Нажмите Выполнить. В журнале выполнения можно увидеть, что сообщения были обработаны. В Google Chat приложение не отправило сообщение с рекомендациями по инклюзивности в чат-группу, посвященную этой проблеме, поскольку оно было отключено.

347d659db53b73e9.png

8. Приложение 2. Сборка

Посмотреть концепции

Обоснование генеративного ИИ

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

Естественный язык

Любой язык, на котором люди говорят или пишут в повседневном общении, в отличие от искусственных или компьютерных языков.

Cloud Storage

Cloud Storage позволяет размещать данные в нашем хранилище и получать их когда угодно и из любой точки земного шара. Его можно использовать для различных целей, включая размещение контента сайта, хранение данных для архивирования и аварийного восстановления или распространение больших объектов данных среди пользователей путем прямой загрузки.

Хранилище данных Dialogflow CX

Dialogflow CX интегрируется с хранилищами данных – наборами сайтов и документов, которые агенты хранилища данных используют для поиска ответов на вопросы конечных пользователей. Агент хранилища данных ищет ответ на вопрос в предоставленном контенте и обобщает результаты в связный ответ. Также в ответе приводятся ссылки на источники, чтобы пользователь мог узнать больше.

Архитектура отзывов

9d3342d12f3b4dda.png

Это приложение Google Chat создано с помощью Dialogflow CX и работает следующим образом:

  1. Пользователь отправляет сообщение приложению в прямой переписке или чат-группе.
  2. Приложение, которое является агентом Dialogflow CX и связано с проектом Google Cloud, обрабатывает сообщение.
  3. Приложение интегрировано с хранилищем данных в Cloud Storage.
  4. Приложение отправляет синхронный ответ в прямой переписке или в исходной чат-группе.

Проверить процессы

Ответить на вопрос

aad9fb5a7ca48956.png

Проверьте исходный код

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

google-chat-overview.pdf

Содержит неструктурированную информацию о приложениях Google Chat, печатную версию страницы с сайта разработчиков Google Workspace.

e9b91c4587b1a3a0.png

Обновить проект Google Cloud

В консоли Google Cloud выполните следующие действия:

  1. Включите Dialogflow API и Cloud Storage API.

  1. Включите Vertex AI Agent Builder API.

  1. Нажмите Меню ☰ > API и сервисы > Включенные API и сервисы и убедитесь, что все API включены.

.

Как создать агент хранилища данных Dialogflow CX

Инициализация данных базы знаний

В консоли Google Cloud выполните следующие действия:

  1. Нажмите на значок меню ☰ > Cloud Storage > Сегменты.

.

4f15978ae9f1b687.png

  1. Нажмите Создать.
  2. В поле name укажите gchat-knowledge.
  3. Нажмите Создать.

6b38c6d4d2c41bba.png

  1. Выберите сегмент gchat-knowledge.
  2. Нажмите Загрузить файлы.
  3. Скачайте и выберите файл google-chat-overview.pdf из локальной среды.

df89acb22e1762af.png

Создать приложение

В консоли Google Cloud выполните следующие действия:

  1. Нажмите Меню ☰ > Agent Builder > Приложения.

  1. Нажмите Новое приложение.
  2. Выберите тип чата.

44276003074bcf14.png

  1. В качестве Company name укажите название компании.
  2. Присвойте свойству Agent name значение knowledge.
  3. Нажмите Продолжить.

c4fedfd7556f723b.png

  1. Нажмите Создать хранилище данных.
  2. Выберите Cloud Storage в качестве источника данных.

6e2440ecf0f8f9bd.png

  1. Выберите Файл.
  2. Нажмите Поиск.
  3. Выберите файл google-chat-overview.pdf.
  4. Нажмите Продолжить.
  5. Укажите название хранилища данных: gchat-knowledge-ds.
  6. Нажмите Создать.

a675df7490b83900.png

  1. Выберите в таблице хранилище данных gchat-knowledge-ds.
  2. Нажмите Создать.

f121d580771ed96.png

  1. Через пару минут нажмите Меню ☰ > Agent Builder > Apps (Приложения) и убедитесь, что приложение появилось в списке.

d929a7431dd84968.png

  1. Нажмите Меню ☰ > Agent Builder > Хранилища данных.

  1. Нажмите на хранилище данных gchat-knowledge-ds. Количество документов – 1. Это означает, что все готово.

558319790a0accf2.png

Завершение и тестирование приложения

В консоли Dialogflow CX выполните следующие действия:

  1. Выберите проект Google Cloud.
  2. Выберите агент Знания.

ca9b2fb4be92e8e4.png

  1. Выберите Agent settings (Настройки агента) > Generative AI (Генеративный искусственный интеллект) > Generative agent (Генеративный агент).
  2. Переключите модель с Text Bison на Gemini Pro.
  3. Нажмите Сохранить.

68cc4713ec9b25a0.png

  1. Нажмите Протестировать агент.
  2. Отправить What is Google Chat?. Агент дает осмысленный ответ.

8e3a2cb02469041a.png

Интеграция приложения Google Chat

В консоли Dialogflow CX выполните следующие действия:

  1. Выберите проект Google Cloud.
  2. В строке агента нажмите на значок с тремя точками 1e7ede7abae4aa3c.png > Копировать название.

e19f61185158110d.png

В консоли Google Cloud выполните следующие действия:

  1. Перейдите к конфигурации Google Chat API.

  1. В разделе Настройки подключения выберите Dialogflow.
  2. В разделе Настройки Dialogflow выберите Dialogflow CX.
  3. В поле Название ресурса агента или среды вставьте скопированное название агента.
  4. Удалите две слеш-команды.

505ff39a50880904.png

  1. В Google Chat отправьте What is Google Chat? в прямом сообщении приложению Google Chat. Агент ответит на него.

abda9e43b81fb0ea.png

9. Приложение 2 (необязательно). Добавьте источники

Посмотреть концепции

Вебхук Dialogflow CX

Сервис, в котором размещена бизнес-логика или который вызывает другие сервисы. Во время сеанса Dialogflow CX вебхуки могут использовать данные, извлеченные с помощью обработки естественного языка, чтобы генерировать динамические ответы, проверять собранные данные или запускать действия на сервере.

Cloud Functions

Cloud Functions отлично подходит для создания бессерверных бэкендов, обработки данных в реальном времени и создания интеллектуальных приложений. Вам не нужно настраивать, обслуживать и обновлять серверы. Они автоматически масштабируются, обладают высокой доступностью и отказоустойчивостью.

Процессы проверки

Ответить на вопрос (обновление)

92767c07c7b252aa.png

Проверьте исходный код

Единственный исходный код, который вам нужен, – это функция для адаптации ответов агента к сообщениям Google Chat. Он используется как вебхук.

package.json

// The function relies on the Cloud Functions framework to run.

{
  "name": "agent-response-adapter",
  "version": "0.0.1",
  "dependencies": {
    "@google-cloud/functions-framework": "^3.0.0"
  },
  ...
}

index.js

/** 
 * Handles all incoming requests.
 *
 * It takes a Dialogflow CX agent response as input and returns a
 * valid Google Chat card message with both the text and source links
 */
functions.http('agent-response-adapter', (request, res>ponse) = {
  // Creates Google Chat buttons based on the data store agent response
  // grounding details.
  var linkTitles = [];
  var linkButtons = [];
  const grounding = request.body.messages[1].payload.richContent[0][0];
  if (grounding.type === "match_citations") {
    // Supports citation match type.
    grounding.citations.fo>rEach((citation) = {
      // Avoid duplications.
      if (linkTitles.indexO<f(citation.title)  0) {
        linkButtons.push({
          text: citation.title,
          onClick: { openLink: {
            url: citation.actionLink
          }}
        });
        linkTitles.push(citation.title);
      }
    });
  } else if (grounding.type === "info") {
    // Supports info type.
    if (linkTitl<es.indexOf(grounding.title)  0) {
      linkButtons.push({
        text: grounding.title,
        onClick: { openLink: {
          url: grounding.actionLink
        }}
      });
      linkTitles.push(grounding.title);
    }
  }

  // Sends the Dialogflow CX fulfillment response to replace the agent response
  // with the Chat message with text and source buttons.
  response.send({ fulfillment_response: {
    merge_behavior: "REPLACE",
    messages: [{ payload: {
      // Reuses the original data store agent response text.
      text: request.body.messages[0].text.text[0],
      cardsV2: [{
        cardId: "sourcesCard",
        card: { sections: [{
          header: "Sources",
          widgets: [{ buttonList: {
            buttons: linkButtons
          }}]
        }]}
      }]
    }}]
  }});
});

Обновить проект Google Cloud

В консоли Google Cloud выполните следующие действия:

  1. Включите Cloud Build API, Cloud Functions API, Cloud Logging API, Artifact Registry API и Cloud Run API.

  1. Нажмите Меню ☰ > API и сервисы > Включенные API и сервисы и убедитесь, что API включены.

Как обновить агент хранилища данных Dialogflow CX

Вам нужно развернуть функцию Cloud Functions и обновить вебхук Dialogflow CX, чтобы он запускал ее с несколькими источниками, когда это возможно.

Возврат нескольких источников

По умолчанию новый агент хранилища данных возвращает только один источник, но вы можете изменить это значение.

В консоли Dialogflow CX выполните следующие действия:

  1. Выберите проект Google Cloud.
  2. Выберите агент Знания.
  3. Выберите Начальная страница.
  4. Выберите Изменить хранилища данных.
  5. В разделе Agent responses (Ответы агента) задайте для параметра Data store response options (Варианты ответов хранилища данных) значение 5.
  6. Нажмите Сохранить.

f5932d03057df645.png

Запуск функции Cloud Functions

В консоли Google Cloud выполните следующие действия:

  1. Нажмите Меню ☰ > Cloud Functions.

  1. Нажмите Create function (Создать функцию).
  2. В разделе Основные настройки в поле Название введите function-1.
  3. В разделе Аутентификация выберите переключатель Разрешить вызовы без аутентификации.
  4. В разделе Runtime, build, connections and security settings (Среда выполнения, сборка, подключения и настройки безопасности) задайте для параметра Maximum number of instances (Максимальное количество экземпляров) значение 3.
  5. Нажмите Далее.

bd3790a9285f9c07.png

  1. В поле Entry point (Точка входа) введите agent-response-adapter.
  2. Замените контент по умолчанию файлами package.json и index.js.
  3. Нажмите Deploy (Развернуть).

b379bb8ca0fc1079.png

  1. Скопируйте URL и подождите несколько минут, пока функция будет развернута.

eaae08cf048b9b1c.png

Инициация вебхука

Вам нужно настроить агент Dialogflow CX так, чтобы он использовал вебхук, который запускает только что развернутую функцию.

В консоли Dialogflow CX выполните следующие действия:

  1. Выберите проект Google Cloud.
  2. Выберите агент Знания.
  3. Выберите Manage (Управление) > Webhooks (Вебхуки) > Create (Создать).
  4. В поле Отображаемое название укажите Google Chat Response Adapter.
  5. В поле Webhook URL (URL вебхука) вставьте скопированный ранее URL.
  6. Нажмите Сохранить.

5f3c6804d52b87c1.png

  1. Нажмите Создать.
  2. Выберите Начальная страница.
  3. Выберите Изменить хранилища данных.
  4. В разделе Настройки вебхука нажмите на переключатель Включить вебхук.
  5. Выберите Google Chat Response Adapter for Webhook (Адаптер ответов Google Chat для вебхука).
  6. Присвойте свойству tag значение arbitrary_tag.
  7. Нажмите Сохранить.

442fcaaec9b8f2e3.png

Тестовое приложение

  • В Google Chat отправьте What is Google Chat? в прямом сообщении приложению Google Chat. Агент ответит по существу и покажет карточку с источниками, если они есть.

9468866bfe848bb8.png

10. Приложение 3. Сборка

Посмотреть концепции

Взаимодействие в чате

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

Спецификация OpenAPI

Она обеспечивает согласованную передачу информации на каждом этапе жизненного цикла API. Это язык спецификации для HTTP API, который определяет структуру и синтаксис независимо от языка программирования, на котором создан API. Спецификации API обычно пишутся на YAML или JSON, что позволяет легко делиться ими и использовать их.

Агент Dialogflow CX

Основной строительный блок приложений-агентов. В приложении агента обычно много агентов, каждый из которых выполняет определенные задачи. Данные агента передаются LLM, чтобы у нее была информация, необходимая для ответов на вопросы и выполнения задач. Каждый агент может предоставлять информацию, отправлять запросы внешним сервисам или передавать управление разговором потоку Dialogflow CX или другому агенту для обработки подзадач.

Инструмент Dialogflow CX

Инструменты используются для подключения приложений агентов к внешним системам. Эти системы могут расширить знания приложений-агентов и дать им возможность эффективно выполнять сложные задачи.

Архитектура отзывов

9d3342d12f3b4dda.png

Это приложение Google Chat создано с помощью Dialogflow CX и работает следующим образом:

  1. Пользователь отправляет сообщение приложению в прямой переписке или чат-группе.
  2. Приложение, которое является агентом Dialogflow CX и связано с проектом Google Cloud, обрабатывает сообщение.
  3. Приложение интегрировано с агентом.
  4. Приложение отправляет синхронный ответ в прямой переписке или в исходной чат-группе.

Проверить процессы

Сбор отзывов

a67a5b8b513bfc2c.png

Проверьте исходный код

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

package.json

// The function relies on the Cloud Functions framework to run.

{
  "name": "feedback-app-backend",
  "version": "0.0.1",
  "dependencies": {
    "@google-cloud/functions-framework": "^3.0.0"
  },
  ...
}

index.js

/** 
 * Handles all incoming requests.
 * 
 * It always returns OK in plain text.
 */
functions.http('feedback-app-backend', (request, res>ponse) = {
    response.send(9;OK');
});

service-openapi.yaml

// Defines the backend service structure and how to request it.

openapi: 3.1.0
info:
  title: Review Store
  license:
    name: Apache 2.0
    identifier: Apache-2.0
  version: 0.0.1
servers:
  - url: https://us-central1-project-0.cloudfunctions.net
paths:
  /store-review:
    post:
      operationId: storeReview
      summary: Store a new review
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                stars:
                  type: integer
                  format: int64
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                type: string

Инициализация макета серверной службы

Вы развертываете функцию Cloud Functions, чтобы симулировать бэкенд-службу, которую агент Dialogflow CX должен интегрировать и вызывать как инструмент.

В консоли Google Cloud выполните следующие действия:

  1. Нажмите Меню ☰ > Cloud Functions.

  1. Нажмите Create function (Создать функцию).
  2. В разделе Основные настройки в поле Название введите function-2.
  3. В разделе Аутентификация выберите переключатель Разрешить вызовы без аутентификации.
  4. В разделе Runtime, build, connections and security settings (Среда выполнения, сборка, подключения и настройки безопасности) задайте для параметра Maximum number of instances (Максимальное количество экземпляров) значение 3.
  5. Нажмите Далее.

e8cf0ee7441bf634.png

  1. В поле Entry point (Точка входа) введите feedback-app-backend.
  2. Замените контент по умолчанию файлами package.json и index.js.
  3. Нажмите Развернуть.

bdb5cf9f503aa7f6.png

  1. Скопируйте URL и подождите несколько минут, пока функция будет развернута.

Как создать приложение агента Dialogflow CX

Создать приложение

В консоли Google Cloud выполните следующие действия:

  1. Нажмите Меню ☰ > Agent Builder > Приложения.

  1. Нажмите Новое приложение.
  2. Выберите Агент.
  3. В поле Отображаемое название укажите Feedback App.
  4. Нажмите Создать.

7ef3dbacee96c5aa.png

Запустите инструмент.

В консоли Google Cloud выполните следующие действия:

  1. Нажмите Меню ☰ > Agent Builder > Приложения.

  1. Выберите агент Feedback App.
  2. Нажмите Инструменты > + Создать.
  3. В поле Name (Название) укажите review.
  4. Выберите OpenAPI.
  5. Задайте для свойства description следующее значение:
The tool takes the number of stars as a parameter of the store review method and saves it in a database for later use.
  1. Скачайте файл service-openapi.yaml и замените в нем $URL на скопированный ранее URL.
  2. Задайте для YAML Schema отредактированное содержимое файла service-openapi.yaml.
  3. Нажмите Сохранить.

58085d6d56b603f7.png

Как запустить агент

В консоли Google Cloud выполните следующие действия:

  1. Нажмите Меню ☰ > Agent Builder > Приложения.

  1. Выберите агент Feedback App.
  2. Выберите Агенты > Генеративный агент по умолчанию.
  3. В поле Agent name (Название агента) укажите Feedback collector.
  4. Задайте для параметра goal следующее значение:
You are an agent that collects reviews from Google Chat app developers.
A review may be between 0 and 5 stars. The more stars, the more positive the review.
  1. Задайте для свойства instructions следующее значение:
If the developer didn't provide the number of stars, ask for the number of stars.
After the developer provides the number of stars of the review, confirm the number with the developer and use ${TOOL: review} to store the review with the number of stars.
If ${TOOL: review} fails, apologize and ask to try again later. Otherwise, thank the developer for the review.
  1. Нажмите Сохранить.

ebee7fdfa826b487.png

Тестовое приложение

В консоли Google Cloud выполните следующие действия:

  1. Нажмите Меню ☰ > Agent Builder > Приложения.

  1. Выберите агент Feedback App.
  2. Перейдите в раздел Предварительный просмотр агента.
  3. В разделе Агент выберите Сборщик отзывов.
  4. В разделе Select generative model (Выбрать генеративную модель) выберите gemini-pro.
  5. Чтобы начать, отправьте сообщение Hello!.

90ca8cb7b2c1cb4b.png

В консоли Google Cloud выполните следующие действия:

  1. Нажмите Меню ☰ > Cloud Functions.

  1. Выберите function-2 > Logs (Функция-2 > Журналы). В некоторых журналах в качестве вызывающего абонента указан Google-Dialogflow.

48bfdf1788004d18.png

Интегрировать приложение Google Chat

В консоли Dialogflow CX выполните следующие действия:

  1. Выберите проект Google Cloud.
  2. Нажмите на меню действий агента Feedback App.
  3. Нажмите Скопировать название.

В консоли Google Cloud выполните следующие действия:

  1. Перейдите к конфигурации Google Chat API.

  1. В поле Agent or Environment resource name (Название ресурса агента или среды) вставьте скопированное ранее название агента.

df16619a1cb85cf8.png

  • В Google Chat отправьте Hello! в прямом сообщении приложению Google Chat, чтобы начать. Агент отвечает так же, как и при тестировании в консоли Dialogflow CX.

99a7a0295f122f31.png

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

Как удалить проект Google Cloud

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

В консоли Google Cloud выполните следующие действия:

  1. Нажмите Меню ☰ > IAM и администрирование > Настройки.

  1. Нажмите Завершить работу.
  2. Введите идентификатор проекта.
  3. Нажмите Все равно выключить.

407699a4e03afea6.png

Удалить проект Apps Script

Мы рекомендуем также удалить проект Apps Script.

В консоли Apps Script выполните следующие действия:

  1. Выберите проект.
  2. Нажмите на меню действий.
  3. Нажмите Удалить.

fa3a42d7d2201eb9.png

12. Поздравляю!

Поздравляем! Вы создали приложения Google Chat с помощью Gemini.

Что дальше?

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

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

Подробнее…