1. Прежде чем начать
Что такое Gemini Enterprise?
Gemini Enterprise — это передовая платформа для работы с агентами, которая предоставляет лучшие возможности искусственного интеллекта Google каждому сотруднику и для любого рабочего процесса. Она позволяет командам находить, создавать, совместно использовать и запускать агентов ИИ в единой безопасной среде.
- Получите доступ к передовым моделям: пользователи получают мгновенный доступ к самым мощным многомодальным моделям искусственного интеллекта Google, включая Gemini, для решения сложных бизнес-задач.
- Используйте специализированных агентов: в пакет входят готовые к использованию агенты Google для исследований, программирования и ведения заметок, обеспечивающие немедленную пользу.
- Расширьте возможности каждого сотрудника: варианты без программирования и с возможностью написания кода позволяют сотрудникам всех отделов создавать и управлять собственными пользовательскими агентами для автоматизации рабочих процессов.
- Внедрение агентов в данные: Агенты могут быть безопасно подключены к внутренним данным компании и сторонним приложениям, чтобы обеспечить контекстную точность их ответов.
- Централизованное управление: администраторы могут визуализировать и проверять всю активность агентов, чтобы гарантировать соответствие организации строгим стандартам безопасности и соответствия требованиям.
- Расширяйте возможности экосистемы: платформа интегрируется с широкой сетью партнерских приложений и поставщиков услуг, что позволяет распространить автоматизацию на различные системы.
Что такое Google Workspace?
Google Workspace — это набор облачных решений для повышения производительности и совместной работы, разработанных для частных лиц, учебных заведений и предприятий.
- Коммуникация: Профессиональные почтовые сервисы (Gmail), видеоконференции (Meet) и командный мессенджер (Chat).
- Создание контента: Инструменты для написания документов (Docs), создания электронных таблиц (Sheets) и разработки презентаций (Slides).
- Организация: общие календари (Календари) и цифровые заметки (Keeping).
- Хранение данных: Централизованное облачное пространство для безопасного сохранения и обмена файлами (Drive).
- Управление: Административные средства управления пользователями и параметрами безопасности (Консоль администратора рабочей области).
Какие именно пользовательские интеграции?
Google Workspace и Gemini Enterprise создают мощную петлю обратной связи, где Workspace предоставляет данные в реальном времени и контекст для совместной работы, а Gemini Enterprise предлагает модели, агентное мышление и оркестровку, необходимые для автоматизации интеллектуальных рабочих процессов.
- Интеллектуальное подключение: управляемые Google хранилища данных, API и серверы MCP (управляемые Google и собственные) позволяют агентам безопасно и беспрепятственно получать доступ к данным Workspace и выполнять действия от имени пользователей.
- Пользовательские агенты: Используя конструкторы без кода или профессиональные фреймворки для программирования, команды могут создавать специализированные агенты, основанные на данных и действиях рабочего пространства, управляемых администратором.
- Встроенная интеграция: дополнения Workspace устраняют разрыв между системами искусственного интеллекта и такими приложениями, как Chat и Gmail, будь то с помощью специальных компонентов пользовательского интерфейса или фоновых процессов. Это позволяет агентам оказывать пользователям мгновенную помощь с учетом контекста именно там, где они находятся.
Сочетая мощную экосистему повышения производительности Google Workspace с передовыми возможностями агентского управления Gemini Enterprise, организации могут трансформировать свою деятельность с помощью настраиваемых, основанных на данных агентов искусственного интеллекта, которые автоматизируют сложные рабочие процессы непосредственно в инструментах, которые их команды уже используют каждый день.
Предварительные требования
Если вы хотите выполнить все шаги в своей собственной среде, вам потребуется:
- Базовые знания Google Cloud и Python .
- Проект Google Cloud, владельцем которого вы являетесь, с включенной оплатой. Чтобы проверить, включена ли оплата в существующем проекте, см. раздел «Проверка статуса оплаты ваших проектов ». Чтобы создать проект и настроить оплату, см. раздел «Создание проекта Google Cloud» . Чтобы изменить владельца проекта, см. раздел «Управление участниками проекта или изменение владельца проекта» .
- Доступны версии Gemini Enterprise Standard / Plus. Для сравнения версий Gemini Enterprise см. раздел «Сравнение версий Gemini Enterprise» . Если у вас нет лицензии на Gemini Enterprise, на следующем шаге у вас будет возможность создать пробную лицензию.
- Корпоративный аккаунт Google Workspace ( для бизнеса) с включенным доступом к Google Chat и интеллектуальным функциям.
- Для вашего проекта Google Cloud установлен и инициализирован интерфейс командной строки Google Cloud.
- Для корректной работы требуется установленный Python 3.11+. Инструкции см. на официальном сайте Python .
Что вы построите
В этом практическом занятии мы создадим три решения с использованием агентов Gemini Enterprise AI, тесно интегрированных с Google Workspace. Они продемонстрируют архитектурные шаблоны, которые можно использовать для взаимодействия с данными, действиями и пользовательскими интерфейсами.
Пользовательский агент без кода
Этот агент позволяет пользователям искать данные и выполнять действия в Workspace на их естественном языке. Он основан на следующих элементах:
- Модель: Близнецы.
- Данные и действия: хранилища данных Gemini Enterprise для Google Workspace (Календарь, Gmail, Диск, NotebookLM), Google Поиск .
- Инструменты для создания агентов: Gemini Enterprise Agent Designer.
- Агент-хост: Gemini Enterprise.
- Пользовательский интерфейс: Веб-приложение Gemini Enterprise.


Пользовательский агент с промокодом
Этот агент позволяет пользователям искать данные и выполнять действия в Workspace на их естественном языке, используя пользовательские инструменты и правила. Он основан на следующих элементах:
- Модель: Близнецы.
- Данные и действия: хранилища данных Gemini Enterprise для Google Workspace (Календарь, Gmail, Диск, NotebookLM), Google Поиск , сервер Vertex AI Search Model Context Protocol (MCP), управляемый Google, пользовательская функция инструмента для отправки сообщений Google Chat (через Google Chat API).
- Инструменты для создания агентов: Комплект для разработки агентов (ADK).
- Основной агент: Vertex AI Agent Engine.
- Пользовательский интерфейс: Веб-приложение Gemini Enterprise.


Агентом по умолчанию является надстройка Google Workspace.
Этот агент позволяет пользователям искать данные для Workspace на своем естественном языке в контексте пользовательского интерфейса приложения Workspace. Он основан на следующих элементах:
- Модель: Близнецы.
- Данные: хранилища данных Gemini Enterprise для Google Workspace (Календарь, Gmail, Диск, NotebookLM), Google Поиск .
- Агент-хост: Gemini Enterprise.
- Пользовательский интерфейс: Дополнение Google Workspace для чата и Gmail (легко расширяется для календаря, диска, документов, таблиц и презентаций).
- Дополнение Google Workspace: Apps Script, API Gemini Enterprise и Vertex AI, контекстное (метаданные пользователя, выбранное сообщение Gmail).


Что вы узнаете
- Точки интеграции между Gemini Enterprise и Google Workspace, обеспечивающие доступ к данным и выполнение действий.
- Варианты создания пользовательских агентов без программирования и с использованием профессионального программирования, размещенных в Gemini Enterprise.
- Способы доступа пользователей к агентам через веб-приложение Gemini Enterprise и приложения Google Workspace.
2. Настройка
Обзор концепций
Приложение Gemini Enterprise
Приложение Gemini Enterprise предоставляет конечным пользователям результаты поиска, действия и агентов. Термин «приложение» можно использовать взаимозаменяемо с термином «движок» в контексте API. Приложение должно быть подключено к хранилищу данных, чтобы использовать данные из него для предоставления результатов поиска, ответов или действий.
Веб-приложение Gemini Enterprise
Веб-приложение Gemini Enterprise связано с приложением Gemini Enterprise. Оно функционирует как централизованная база для ИИ, где сотрудники используют единый чат-интерфейс для поиска по разрозненным данным компании, запуска специализированных агентов ИИ для сложных рабочих процессов и создания контента профессионального уровня с соблюдением конфиденциальности корпоративного уровня.
Инициализация и доступ к ресурсам.
В этом разделе вы можете получить доступ к следующим ресурсам и настроить их с помощью предпочитаемого вами веб-браузера.
Приложение Gemini Enterprise
Откройте консоль Google Cloud в новой вкладке, затем выполните следующие действия:
- Выберите свой проект.
- В поле поиска Google Cloud найдите и выберите Gemini Enterprise , затем нажмите + Создать приложение . Если у вас нет лицензии на Gemini Enterprise, вам будет предложено активировать 30-дневную бесплатную пробную лицензию.
- Задайте название приложения как
codelab. - Идентификатор генерируется на основе имени и отображается под полем, скопируйте его.
- Установите для параметра «Многорегиона» значение
global (Global). - Нажмите «Создать» .

- Приложение создано, и вы автоматически перенаправляетесь на страницу Gemini Enterprise > Обзор .
- В разделе «Полный доступ» нажмите «Настроить учетную запись» .
- На новом экране выберите «Использовать учетную запись Google» и нажмите «Подтвердить учетные данные сотрудников» .

- Настройки сохраняются, и вы автоматически перенаправляетесь на страницу Gemini Enterprise > Обзор .
- Перейдите в раздел «Настройки» .
- На вкладке «Управление функциями» включите параметр «Включить конструктор агентов» и нажмите «Сохранить» .

Веб-приложение Gemini Enterprise
Откройте Gemini Enterprise в новой вкладке консоли Cloud, затем выполните следующие действия:
- Нажмите на приложение под названием
codelab. - Скопируйте появившийся URL-адрес, поскольку мы будем использовать его для перехода к веб-приложению Gemini Enterprise на следующих шагах.

3. Пользовательский агент без написания кода
Этот агент позволяет пользователям искать данные и выполнять действия в Workspace на их естественном языке. Он основан на следующих элементах:
- Модель: Близнецы.
- Данные и действия: хранилища данных Gemini Enterprise для Google Workspace (Календарь, Gmail, Диск, NotebookLM), Google Поиск .
- Инструменты для создания агентов: Gemini Enterprise Agent Designer.
- Агент-хост: Gemini Enterprise.
- Пользовательский интерфейс: Веб-приложение Gemini Enterprise.
Обзор концепций
Близнецы
Gemini — это мультимодальная магистерская программа от Google. Она помогает людям раскрыть свой человеческий потенциал, чтобы они могли развивать воображение, расширять кругозор и повышать продуктивность.
Хранилище данных Gemini Enterprise
Хранилище данных Gemini Enterprise — это сущность, содержащая данные, поступающие из собственных источников данных, таких как Google Workspace, или сторонних приложений, таких как Jira или Salesforce. Хранилища данных, содержащие данные из сторонних приложений, также называются коннекторами данных.
Gemini Enterprise Agent Designer
Gemini Enterprise Agent Designer — это интерактивная платформа без или с минимальным использованием кода для создания, управления и запуска одно- и многошаговых агентов в Gemini Enterprise.
Обзор архитектуры решения

Включить API
Для работы хранилищ данных Gemini Enterprise Workspace требуется активация API:
- В консоли Google Cloud включите API для календаря, Gmail и пользователей:

- Нажмите Меню ☰ > API и сервисы > Включенные API и сервисы , а затем убедитесь, что Google Calendar API , Gmail API и People API присутствуют в списке.
Настройте экран согласия OAuth.
Для использования функций календаря Gemini Enterprise Workspace и Gmail требуется настройка экрана согласия:
- В консоли Google Cloud перейдите в меню ☰ > Платформа аутентификации Google > Брендинг .
- Нажмите « Начать» .
- В разделе «Информация о приложении» укажите название приложения
Codelab. - В разделе «Электронная почта службы поддержки пользователей» выберите адрес электронной почты, по которому пользователи смогут связаться с вами, если у них возникнут вопросы относительно их согласия.
- Нажмите «Далее» .
- В разделе «Аудитория» выберите «Внутренняя» .
- Нажмите «Далее» .
- В поле «Контактная информация» укажите адрес электронной почты , на который вы сможете получать уведомления об изменениях в вашем проекте.
- Нажмите «Далее» .
- В разделе «Завершить » ознакомьтесь с Политикой использования пользовательских данных сервисов Google API и, если вы согласны, выберите «Я согласен с Политикой использования пользовательских данных сервисов Google API» .
- Нажмите «Продолжить» , затем «Создать» .

- Настройки сохраняются, и вы автоматически перенаправляетесь на страницу Google Auth Platform > Overview .
- Перейдите в раздел «Доступ к данным» .
- Нажмите «Добавить или удалить области действия» .
- Скопируйте следующие области действия и вставьте их в поле «Добавить области действия вручную» .
https://www.googleapis.com/auth/calendar.readonly
https://www.googleapis.com/auth/calendar.events
https://www.googleapis.com/auth/calendar.calendars
https://www.googleapis.com/auth/gmail.send
https://www.googleapis.com/auth/gmail.readonly
- Нажмите «Добавить в таблицу» , затем «Обновить» , затем «Сохранить» .

Для получения более подробной информации ознакомьтесь с полным руководством по настройке согласия OAuth .
Создание учетных данных клиента OAuth
Создайте новый OAuth-клиент для Gemini Enterprise для аутентификации пользователей:
- В консоли Google Cloud перейдите в меню ☰ > Платформа аутентификации Google > Клиенты .
- Нажмите + Создать клиента .
- В поле «Тип приложения» выберите «Веб-приложение» .
- Задайте имя
codelab. - Пропустить авторизованные источники JavaScript .
- В разделе «Авторизованные URI перенаправления » нажмите «Добавить URI» и введите
https://vertexaisearch.cloud.google.com/oauth-redirect. - Нажмите «Создать» .
- Появится диалоговое окно с созданным вами идентификатором клиента OAuth и секретным ключом. Сохраните эту информацию в надежном месте.

Создание хранилищ данных
Откройте Gemini Enterprise в новой вкладке консоли Cloud, затем выполните следующие действия:
- Нажмите на приложение под названием
codelab. - В навигационном меню нажмите «Подключенные хранилища данных» .
- Нажмите + Создать хранилище данных .
- В разделе «Источник» найдите Google Календарь и нажмите «Выбрать» .
- В разделе «Действия» введите идентификатор клиента (Client ID) и секретный ключ клиента (Client Secret), сохраненные на предыдущих шагах, затем нажмите «Проверить аутентификацию» (Verify Auth) и следуйте инструкциям для аутентификации и авторизации клиента OAuth.
- Включите действия «Создать событие календаря» и «Обновить событие календаря» .
- Нажмите «Продолжить» .

- В разделе «Конфигурация» укажите имя соединителя данных как
calendar. - Нажмите «Создать» .
- Вы будете автоматически перенаправлены на страницу подключенных хранилищ данных , где сможете увидеть недавно добавленное хранилище данных.
Создайте хранилище данных Google Gmail:
- Нажмите + Создать хранилище данных .
- В поле «Источник» найдите Google Gmail и нажмите «Выбрать» .
- В разделе «Действия» введите идентификатор клиента (Client ID ) и секретный ключ клиента (Client Secret), сохраненные на предыдущих шагах, а затем нажмите «Проверить аутентификацию» (Verify Auth) .
- Включите действие «Отправить электронное письмо» .
- Нажмите «Продолжить» .
- В разделе «Конфигурация» укажите имя коннектора данных как
gmail. - Нажмите «Создать» .
- Вы будете автоматически перенаправлены на страницу подключенных хранилищ данных , где сможете увидеть недавно добавленное хранилище данных.
Создайте хранилище данных Google Drive:
- Нажмите + Создать хранилище данных .
- В поле «Источник» найдите Google Drive и нажмите «Выбрать» .
- В разделе «Данные» выберите «Все» , затем нажмите «Продолжить» .
- В разделе «Конфигурация» укажите имя соединителя данных как
drive. - Нажмите «Создать» .
- Вы будете автоматически перенаправлены на страницу подключенных хранилищ данных , где сможете увидеть недавно добавленное хранилище данных.
Создайте хранилище данных NotebookLM:
- Нажмите + Создать хранилище данных .
- В поле «Источник» найдите NotebookLM и нажмите «Выбрать» .
- В разделе «Конфигурация» укажите имя коннектора данных как
notebooklm. - Нажмите «Создать» .
- Вы будете автоматически перенаправлены на страницу подключенных хранилищ данных , где сможете увидеть недавно добавленное хранилище данных.
Через несколько минут статус всех подключенных хранилищ данных (кроме NotebookLM) изменится на «Активный» . Если вы обнаружите какие-либо ошибки, вы можете щелкнуть по источнику данных, чтобы просмотреть подробности ошибки.

хранилища тестовых данных
Откройте URL-адрес веб-приложения Gemini Enterprise, который мы скопировали ранее:
- Нажмите Меню ☰ > Новый чат .
- В нижней части поля для нового сообщения чата нажмите значок « Коннекторы» и включите все коннекторы.
- Теперь вы можете поэкспериментировать с подсказками, связанными с коннекторами. Например, в чате введите
Do I have any meetings today?и нажмитеenter. - Далее попробуйте набрать
How many emails did I receive today?и нажмитеenter. - Наконец,
Give me the title of the last Drive file I createdи нажмитеenter.

Создать пользовательского агента
В веб-приложении Gemini Enterprise создайте нового агента с помощью конструктора агентов:
- Нажмите Меню ☰ > + Новый агент .
- В чате напишите
An agent that always sends pirate-themed emails but use normal English otherwiseи нажмитеenter.

- Создатель агентов разрабатывает образ агента на основе заданного запроса и открывает его в редакторе.
- Нажмите «Создать».
Попробуйте использовать пользовательский агент
- В веб-приложении Gemini Enterprise вы можете пообщаться с недавно созданным агентом:
- Нажмите Меню ☰ > Агенты .
- Выберите агента в разделе «Ваши агенты» .
- В нижней части поля для нового сообщения чата щелкните значок «Коннекторы» , затем щелкните «Включить действия для почты» и следуйте инструкциям для авторизации агента.
- В чате напишите «
Send an email to someone@example.com saying I'll see them at Cloud Next, generate some subject and body yourselfи нажмитеenter. Вы можете заменить пример письма своим адресом электронной почты. - Нажмите ✔️, чтобы отправить письмо.


4. Пользовательский агент Pro-code
Этот агент позволяет пользователям искать данные и выполнять действия в Workspace на их естественном языке, используя пользовательские инструменты и правила. Он основан на следующих элементах:
- Модель: Близнецы.
- Данные и действия: хранилища данных Gemini Enterprise для Google Workspace (Календарь, Gmail, Диск, NotebookLM), Google Поиск , сервер Vertex AI Search Model Context Protocol (MCP), управляемый Google, пользовательская функция инструмента для отправки сообщений Google Chat (через Google Chat API).
- Инструменты для создания агентов: Комплект для разработки агентов (ADK).
- Основной агент: Vertex AI Agent Engine.
- Пользовательский интерфейс: Веб-приложение Gemini Enterprise.
Интеграция будет осуществляться в Gemini Enterprise с использованием функции "используй собственное оборудование" , поэтому нам необходимо пройти этапы развертывания, регистрации и настройки.
Обзор концепций
Vertex AI
Vertex AI предлагает все необходимое для создания и использования генеративного ИИ, включая решения для ИИ, поиск и диалоги, более 130 базовых моделей и единую платформу ИИ.

Комплект для разработки агентов (ADK)
Комплект для разработки агентов (ADK) — это специализированный набор инструментов и фреймворков, предназначенный для упрощения создания автономных агентов искусственного интеллекта путем предоставления готовых модулей для рассуждений, управления памятью и интеграции инструментов.
Протокол контекстной модели (MCP)
Протокол контекста модели (MCP) — это открытый стандарт, разработанный для обеспечения бесшовной и безопасной интеграции между приложениями искусственного интеллекта и различными источниками данных или инструментами посредством универсального интерфейса «подключи и работай».
Функциональный инструмент
Инструмент «Функция» — это предопределенная исполняемая подпрограмма, которую модель ИИ может запускать для выполнения определенных действий или получения данных в реальном времени из внешних систем, расширяя свои возможности за пределы простой генерации текста.
Обзор архитектуры решения

Просмотрите исходный код
agent.py
...
MODEL = "gemini-2.5-flash"
# Gemini Enterprise authentication injects a bearer token into the ToolContext state.
# The key pattern is "GE_AUTH_NAME_<random_digits>".
# We dynamically parse this token to authenticate our MCP and API calls.
GE_AUTH_NAME = "enterprise-ai"
VERTEXAI_SEARCH_TIMEOUT = 15.0
def get_project_id():
"""Fetches the consumer project ID from the environment natively."""
_, project = google.auth.default()
if project:
return project
raise Exception(f"Failed to resolve GCP Project ID from environment.")
def find_serving_config_path():
"""Dynamically finds the default serving config in the engine."""
project_id = get_project_id()
engines = discoveryengine_v1.EngineServiceClient().list_engines(
parent=f"projects/{project_id}/locations/global/collections/default_collection"
)
for engine in engines:
# engine.name natively contains the numeric Project Number
return f"{engine.name}/servingConfigs/default_serving_config"
raise Exception(f"No Discovery Engines found in project {project_id}")
def _get_access_token_from_context(tool_context: ToolContext) -> str:
"""Helper method to dynamically parse the intercepted bearer token from the context state."""
escaped_name = re.escape(GE_AUTH_NAME)
pattern = re.compile(fr"^{escaped_name}_\d+$")
# Handle ADK varying state object types (Raw Dict vs ADK State)
state_dict = tool_context.state.to_dict() if hasattr(tool_context.state, 'to_dict') else tool_context.state
matching_keys = [k for k in state_dict.keys() if pattern.match(k)]
if matching_keys:
return state_dict.get(matching_keys[0])
raise Exception(f"No bearer token found in ToolContext state matching pattern {pattern.pattern}")
def auth_header_provider(tool_context: ToolContext) -> dict[str, str]:
token = _get_access_token_from_context(tool_context)
return {"Authorization": f"Bearer {token}"}
def send_direct_message(email: str, message: str, tool_context: ToolContext) -> dict:
"""Sends a Google Chat Direct Message (DM) to a specific user by email address."""
chat_client = chat_v1.ChatServiceClient(
credentials=Credentials(token=_get_access_token_from_context(tool_context))
)
# 1. Setup the DM space or find existing one
person = chat_v1.User(
name=f"users/{email}",
type_=chat_v1.User.Type.HUMAN
)
membership = chat_v1.Membership(member=person)
space_req = chat_v1.Space(space_type=chat_v1.Space.SpaceType.DIRECT_MESSAGE)
setup_request = chat_v1.SetUpSpaceRequest(
space=space_req,
memberships=[membership]
)
space_response = chat_client.set_up_space(request=setup_request)
space_name = space_response.name
# 2. Send the message
msg = chat_v1.Message(text=message)
message_request = chat_v1.CreateMessageRequest(
parent=space_name,
message=msg
)
message_response = chat_client.create_message(request=message_request)
return {"status": "success", "message_id": message_response.name, "space": space_name}
vertexai_mcp = McpToolset(
connection_params=StreamableHTTPConnectionParams(
url="https://discoveryengine.googleapis.com/mcp",
timeout=VERTEXAI_SEARCH_TIMEOUT,
sse_read_timeout=VERTEXAI_SEARCH_TIMEOUT
),
tool_filter=['search'],
# The auth_header_provider dynamically injects the bearer token from the ToolContext
# into the MCP call for authentication.
header_provider=auth_header_provider
)
# Answer nicely the following user queries:
# - Please find my meetings for today, I need their titles and links
# - What is the latest Drive file I created?
# - What is the latest Gmail message I received?
# - Please send the following message to someone@example.com: Hello, this is a test message.
root_agent = LlmAgent(
model=MODEL,
name='enterprise_ai',
instruction=f"""
You are a helpful assistant that always uses the Vertex AI MCP search tool to answer the user's message, unless the user asks you to send a message to someone.
If the user asks you to send a message to someone, use the send_direct_message tool to send the message.
You MUST unconditionally use the Vertex AI MCP search tool to find answer, even if you believe you already know the answer or believe the Vertex AI MCP search tool does not contain the data.
The Vertex AI MCP search tool accesses the user's data through datastores including Google Drive, Google Calendar, and Gmail.
Only use the Vertex AI MCP search tool with servingConfig and query parameters, do not use any other parameters.
Always use the servingConfig {find_serving_config_path()} while using the Vertex AI MCP search tool.
""",
tools=[vertexai_mcp, FunctionTool(send_direct_message)]
)
Включить API
Для решения этой задачи требуется активация дополнительных API:
- В консоли Google Cloud включите API Vertex AI, Cloud Resource Manager и Google Chat:

- Нажмите Меню ☰ > API и сервисы > Включенные API и сервисы , а затем убедитесь, что Vertex AI API , Cloud Resource Manager API и Google Chat API присутствуют в списке.
Обновите экран согласия OAuth.
Для решения этой задачи требуется дополнительный доступ к данным:
- В консоли Google Cloud перейдите в меню ☰ > Платформа аутентификации Google > Доступ к данным .
- Нажмите «Добавить или удалить области действия» .
- Скопируйте следующие области действия и вставьте их в поле «Добавить области действия вручную» .
- Нажмите «Добавить в таблицу» , затем «Обновить» , затем «Сохранить» .
https://www.googleapis.com/auth/cloud-platform
https://www.googleapis.com/auth/chat.messages.create
https://www.googleapis.com/auth/chat.spaces.create
- Нажмите «Добавить в таблицу» , затем «Обновить» , затем «Сохранить» .

Обновить учетные данные клиента OAuth
Для решения требуется дополнительный авторизованный URI перенаправления:
- В консоли Google Cloud перейдите в меню ☰ > Платформа аутентификации Google > Клиенты .
- Нажмите на имя клиента
codelab. - В разделе «Авторизованные URI перенаправления» нажмите «Добавить URI» и введите
https://vertexaisearch.cloud.google.com/static/oauth/oauth.html. - Нажмите « Сохранить ».

Включить поиск Vertex AI MCP
- В терминале выполните следующую команду:
gcloud beta services mcp enable discoveryengine.googleapis.com \
--project=$(gcloud config get-value project)
Настройка приложения «Чат»
- В консоли Google Cloud найдите
Google Chat APIв поле поиска Google Cloud, щелкните Google Chat API , затем нажмите «Управление» и нажмите «Конфигурация» .
- Установите название приложения и описание на
Gemini Enterprise. - Установите URL-адрес аватара на
https://developers.google.com/workspace/add-ons/images/quickstart-app-avatar.png. - Снимите флажок «Включить интерактивные функции» , затем нажмите «Отключить» в появившемся диалоговом окне.
- Выберите пункт «Регистрировать ошибки» в разделе «Ведение журнала» .
- Нажмите « Сохранить ».

Разверните агента в Vertex AI Agent Engine.
- Загрузите этот репозиторий GitHub .
- В терминале откройте каталог
solutions/enterprise-ai-agentи выполните следующую команду:
# 1. Create and activate a new virtual environment python3 -m venv .venv source .venv/bin/activate # 2. Install poetry and project dependencies pip install poetry poetry install # 3. Deploy the agent adk deploy agent_engine \ --project=$(gcloud config get-value project) \ --region=us-central1 \ --display_name="Enterprise AI" \ enterprise_ai

- Когда в журналах появится строка «Развертывание в агентском движке...» , откройте новое окно терминала и выполните следующую команду, чтобы добавить необходимые разрешения для агента службы Vertex AI Reasoning Engine :
# 1. Get the current Project ID
PROJECT_ID=$(gcloud config get-value project)
# 2. Extract the Project Number for that ID
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
# 3. Construct the Service Account name
SERVICE_ACCOUNT="service-${PROJECT_NUMBER}@gcp-sa-aiplatform-re.iam.gserviceaccount.com"
# 4. Apply the IAM policy binding
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$SERVICE_ACCOUNT" \
--role="roles/discoveryengine.viewer"
- Дождитесь завершения команды adk deploy , затем скопируйте имя ресурса только что развернутого агента из вывода команды, выделенного зеленым цветом.

Зарегистрированный агент в Gemini Enterprise
Откройте Gemini Enterprise в новой вкладке консоли Cloud, затем выполните следующие действия:
- Нажмите на приложение под названием
codelab. - В навигационном меню нажмите «Агенты» .
- Нажмите + Добавить агента .
- Нажмите «Добавить» для создания пользовательского агента через Agent Engine . Отобразится раздел «Авторизации» .
- Нажмите «Добавить авторизацию» .
- Установите имя авторизации на
enterprise-ai. На основе этого имени будет сгенерирован идентификатор, который отобразится в соответствующем поле; скопируйте его. - Установите идентификатор клиента (Client ID) равным значению клиента OAuth, созданного и обновленного на предыдущих шагах.
- Установите для параметра Client secret то же значение, что и для клиента OAuth, созданного и обновленного на предыдущих шагах.
- Установите URI токена на
https://oauth2.googleapis.com/token. - Установите значение URI авторизации следующим образом, заменив <CLIENT_ID> на идентификатор клиента OAuth, созданный и обновленный на предыдущих шагах.
https://accounts.google.com/o/oauth2/v2/auth?client_id=<CLIENT_ID>&redirect_uri=https%3A%2F%2Fvertexaisearch.cloud.google.com%2Fstatic%2Foauth%2Foauth.html&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar.readonly%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar.calendars%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar.events%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgmail.send%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgmail.readonly%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fchat.messages.create%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fchat.spaces.create&include_granted_scopes=true&response_type=code&access_type=offline&prompt=consent
- Нажмите «Готово» , затем «Далее» . Отобразится раздел «Конфигурация» .
- Установите имя и описание агента на
Enterprise AI. - Установите для механизма логических рассуждений Agent Engine имя ресурса механизма рассуждений, скопированное на предыдущих шагах. Оно имеет следующий формат:
projects/<PROJECT_ID>/locations/<LOCATION>/reasoningEngines/<REASONING_ENGINE_ID>
- Нажмите «Создать» . Новый добавленный агент теперь отображается в списке агентов .
Попробуйте агента
- В веб-приложении Gemini Enterprise вы можете пообщаться в чате с недавно зарегистрированным агентом:
- Нажмите Меню ☰ > Агенты .
- Выберите агента в разделе « Из вашей организации» .
- В чате напишите:
Please find my meetings for today, I need their titles and links, и нажмитеenter. - Нажмите «Авторизовать» , затем следуйте инструкциям по авторизации.

- Агент отвечает списком событий календаря (в зависимости от учетной записи пользователя).
- В чате напишите
Please send a Chat message to someone@example.com with the following text: Hello!и нажмитеenter. - Агент отправляет подтверждающее сообщение.


5. Агент по умолчанию — надстройка Google Workspace.
Этот агент позволяет пользователям искать данные для Workspace на своем естественном языке в контексте пользовательского интерфейса приложения Workspace. Он основан на следующих элементах:
- Модель: Близнецы.
- Данные: хранилища данных Gemini Enterprise для Google Workspace (Календарь, Gmail, Диск, NotebookLM), Google Поиск .
- Агент-хост: Gemini Enterprise.
- Пользовательский интерфейс: Дополнение Google Workspace для чата и Gmail (легко расширяется для календаря, диска, документов, таблиц и презентаций).
- Дополнение Google Workspace: Apps Script, API Gemini Enterprise и Vertex AI, контекстное (метаданные пользователя, выбранное сообщение Gmail).
Дополнение Google Workspace будет подключено к Gemini Enterprise с помощью API StreamAssist .
Обзор концепций
Дополнение Google Workspace
Надстройка Google Workspace — это настраиваемое приложение, расширяющее функциональность одного или нескольких приложений Google Workspace (Gmail, Chat, Calendar, Docs, Drive, Meet, Sheets и Slides).
Apps Script
Apps Script — это облачная платформа на основе JavaScript, работающая на базе Google Drive, которая позволяет интегрироваться с продуктами Google и автоматизировать задачи в них.
Фреймворк Google Workspace Card
Фреймворк Card в Google Workspace позволяет разработчикам создавать многофункциональные интерактивные пользовательские интерфейсы. Он позволяет создавать организованные и визуально привлекательные карточки, которые могут включать текст, изображения, кнопки и другие виджеты. Эти карточки улучшают пользовательский опыт, предоставляя структурированную информацию и позволяя быстро выполнять действия непосредственно в приложениях Workspace.
Обзор архитектуры решения

Просмотрите исходный код
appsscript.json
...
"addOns": {
"common": {
"name": "Enterprise AI",
"logoUrl": "https://developers.google.com/workspace/add-ons/images/quickstart-app-avatar.png"
},
"chat": {},
"gmail": {
"contextualTriggers": [
{
"unconditional": {},
"onTriggerFunction": "onAddonEvent"
}
]
}
},
"oauthScopes": [
"https://www.googleapis.com/auth/script.external_request",
"https://www.googleapis.com/auth/discoveryengine.assist.readwrite",
"https://www.googleapis.com/auth/gmail.addons.execute",
"https://www.googleapis.com/auth/gmail.addons.current.message.readonly"
]
...
Chat.gs
...
// Service that handles Google Chat operations.
// Handle incoming Google Chat message events, actions will be taken via Google Chat API calls
function onMessage(event) {
if (isInDebugMode()) {
console.log(`MESSAGE event received (Chat): ${JSON.stringify(event)}`);
}
// Extract data from the event.
const chatEvent = event.chat;
setChatConfig(chatEvent.messagePayload.space.name);
// Request AI agent to answer the message
requestAgent(chatEvent.messagePayload.message);
// Respond with an empty response to the Google Chat platform to acknowledge execution
return null;
}
// --- Utility functions ---
// The Chat direct message (DM) space associated with the user
const SPACE_NAME_PROPERTY = "DM_SPACE_NAME"
// Sets the Chat DM space name for subsequent operations.
function setChatConfig(spaceName) {
const userProperties = PropertiesService.getUserProperties();
userProperties.setProperty(SPACE_NAME_PROPERTY, spaceName);
console.log(`Space is set to ${spaceName}`);
}
// Retrieved the Chat DM space name to sent messages to.
function getConfiguredChat() {
const userProperties = PropertiesService.getUserProperties();
return userProperties.getProperty(SPACE_NAME_PROPERTY);
}
// Finds the Chat DM space name between the Chat app and the given user.
function findChatAppDm(userName) {
return Chat.Spaces.findDirectMessage(
{ 'name': userName },
{'Authorization': `Bearer ${getAddonCredentials().getAccessToken()}`}
).name;
}
// Creates a Chat message in the configured space.
function createMessage(message) {
const spaceName = getConfiguredChat();
console.log(`Creating message in space ${spaceName}...`);
return Chat.Spaces.Messages.create(
message,
spaceName,
{},
{'Authorization': `Bearer ${getAddonCredentials().getAccessToken()}`}
).name;
}
Sidebar.gs
...
// Service that handles Gmail operations.
// Triggered when the user opens the Gmail Add-on or selects an email.
function onAddonEvent(event) {
// If this was triggered by a button click, handle it
if (event.parameters && event.parameters.action === 'send') {
return handleSendMessage(event);
}
// Otherwise, just render the default initial sidebar
return createSidebarCard();
}
// Creates the standard Gmail sidebar card consisting of a text input and send button.
// Optionally includes an answer section if a response was generated.
function createSidebarCard(optionalAnswerSection) {
const card = CardService.newCardBuilder();
const actionSection = CardService.newCardSection();
// Create text input for the user's message
const messageInput = CardService.newTextInput()
.setFieldName("message")
.setTitle("Message")
.setMultiline(true);
// Create action for sending the message
const sendAction = CardService.newAction()
.setFunctionName('onAddonEvent')
.setParameters({ 'action': 'send' });
const sendButton = CardService.newTextButton()
.setText("Send message")
.setTextButtonStyle(CardService.TextButtonStyle.FILLED)
.setOnClickAction(sendAction);
actionSection.addWidget(messageInput);
actionSection.addWidget(CardService.newButtonSet().addButton(sendButton));
card.addSection(actionSection);
// Attach the response at the bottom if we have one
if (optionalAnswerSection) {
card.addSection(optionalAnswerSection);
}
return card.build();
}
// Handles clicks from the Send message button.
function handleSendMessage(event) {
const commonEventObject = event.commonEventObject || {};
const formInputs = commonEventObject.formInputs || {};
const messageInput = formInputs.message;
let userMessage = "";
if (messageInput && messageInput.stringInputs && messageInput.stringInputs.value.length > 0) {
userMessage = messageInput.stringInputs.value[0];
}
if (!userMessage || userMessage.trim().length === 0) {
return CardService.newActionResponseBuilder()
.setNotification(CardService.newNotification().setText("Please enter a message."))
.build();
}
let finalQueryText = `USER MESSAGE TO ANSWER: ${userMessage}`;
// If we have an email selected in Gmail, append its content as context
if (event.gmail && event.gmail.messageId) {
try {
GmailApp.setCurrentMessageAccessToken(event.gmail.accessToken);
const message = GmailApp.getMessageById(event.gmail.messageId);
const subject = message.getSubject();
const bodyText = message.getPlainBody() || message.getBody();
finalQueryText += `\n\nEMAIL THE USER HAS OPENED ON SCREEN:\nSubject: ${subject}\nBody:\n---\n${bodyText}\n---`;
} catch (e) {
console.error("Could not fetch Gmail context: " + e);
// Invalidate the token explicitly so the next prompt requests the missing scopes
ScriptApp.invalidateAuth();
CardService.newAuthorizationException()
.setResourceDisplayName("Enterprise AI")
.setAuthorizationUrl(ScriptApp.getAuthorizationUrl())
.throwException();
}
}
try {
const responseText = queryAgent({ text: finalQueryText, forceNewSession: true });
// We leverage the 'showdown' library to parse the LLM's Markdown output into HTML
// We also substitute markdown listings with arrows and adjust newlines for clearer rendering in the sidebar
let displayedText = substituteListingsFromMarkdown(responseText);
displayedText = new showdown.Converter().makeHtml(displayedText).replace(/\n/g, '\n\n');
const textParagraph = CardService.newTextParagraph();
textParagraph.setText(displayedText);
const answerSection = CardService.newCardSection()
.addWidget(textParagraph);
const updatedCard = createSidebarCard(answerSection);
return CardService.newActionResponseBuilder()
.setNavigation(CardService.newNavigation().updateCard(updatedCard))
.build();
} catch (err) {
return CardService.newActionResponseBuilder()
.setNotification(CardService.newNotification().setText("Error fetching response: " + err.message))
.build();
}
}
...
AgentHandler.gs
...
// Service that handles Gemini Enterprise AI Agent operations.
// Submits a query to the AI agent and returns the response string synchronously
function queryAgent(input) {
const isNewSession = input.forceNewSession || !PropertiesService.getUserProperties().getProperty(AGENT_SESSION_NAME);
const sessionName = input.forceNewSession ? createAgentSession() : getOrCreateAgentSession();
let systemPrompt = "SYSTEM PROMPT START Do not respond with tables but use bullet points instead.";
if (input.forceNewSession) {
systemPrompt += " Do not ask the user follow-up questions or converse with them as history is not kept in this interface.";
}
systemPrompt += " SYSTEM PROMPT END\n\n";
const queryText = isNewSession ? systemPrompt + input.text : input.text;
const requestPayload = {
"session": sessionName,
"userMetadata": { "timeZone": Session.getScriptTimeZone() },
"query": { "text": queryText },
"toolsSpec": { "vertexAiSearchSpec": { "dataStoreSpecs": getAgentDataStores().map(ds => { dataStore: ds }) } },
"agentsSpec": { "agentSpecs": [{ "agentId": getAgentId() }] }
};
const responseContentText = UrlFetchApp.fetch(
`https://${getLocation()}-discoveryengine.googleapis.com/v1alpha/${getReasoningEngine()}/assistants/default_assistant:streamAssist?alt=sse`,
{
method: 'post',
headers: { 'Authorization': `Bearer ${ScriptApp.getOAuthToken()}` },
contentType: 'application/json',
payload: JSON.stringify(requestPayload),
muteHttpExceptions: true
}
).getContentText();
if (isInDebugMode()) {
console.log(`Response: ${responseContentText}`);
}
const events = responseContentText.split('\n').map(s => s.replace(/^data:\s*/, '')).filter(s => s.trim().length > 0);
console.log(`Received ${events.length} agent events.`);
let answerText = "";
for (const eventJson of events) {
if (isInDebugMode()) {
console.log("Event: " + eventJson);
}
const event = JSON.parse(eventJson);
// Ignore internal events
if (!event.answer) {
console.log(`Ignored: internal event`);
continue;
}
// Handle text replies
const replies = event.answer.replies || [];
for (const reply of replies) {
const content = reply.groundedContent.content;
if (content) {
if (isInDebugMode()) {
console.log(`Processing content: ${JSON.stringify(content)}`);
}
if (content.thought) {
console.log(`Ignored: thought event`);
continue;
}
answerText += content.text;
}
}
if (event.answer.state === "SUCCEEDED") {
console.log(`Answer text: ${answerText}`);
return answerText;
} else if (event.answer.state !== "IN_PROGRESS") {
throw new Error("Something went wrong, check the Apps Script logs for more info.");
}
}
return answerText;
}
// Gets the list of data stores configured for the agent to include in the request.
function getAgentDataStores() {
const responseContentText = UrlFetchApp.fetch(
`https://${getLocation()}-discoveryengine.googleapis.com/v1/${getReasoningEngine().split('/').slice(0, 6).join('/')}/dataStores`,
{
method: 'get',
// Use the add on service account credentials for data store listing access
headers: { 'Authorization': `Bearer ${getAddonCredentials().getAccessToken()}` },
contentType: 'application/json',
muteHttpExceptions: true
}
).getContentText();
if (isInDebugMode()) {
console.log(`Response: ${responseContentText}`);
}
const dataStores = JSON.parse(responseContentText).dataStores.map(ds => ds.name);
if (isInDebugMode()) {
console.log(`Data stores: ${dataStores}`);
}
return dataStores;
}
...
Инициализация сервисного аккаунта
В консоли Google Cloud выполните следующие действия:
- Нажмите Меню ☰ > IAM и администрирование > Учетные записи служб > + Создать учетную запись службы .
- Установите имя учетной записи службы на
ge-add-on.

- Нажмите «Создать и продолжить» .
- Добавьте роль «Просмотрщик системы обнаружения» в список разрешений.

- Нажмите «Продолжить» , затем «Готово» . Вы будете перенаправлены на страницу учетных записей служб , где сможете увидеть созданную вами учетную запись службы.

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

- Диалоговое окно закрывается, и созданная вами пара открытого/закрытого ключей автоматически загружается в вашу локальную среду в виде JSON-файла.
Создание и настройка проекта Apps Script
- Нажмите следующую кнопку, чтобы открыть проект Apps Script надстройки Enterprise AI :
- Нажмите «Обзор» > «Создать копию» .
- В проекте Apps Script перейдите в раздел «Настройки проекта» > «Изменить свойства скрипта» > «Добавить свойство скрипта» , чтобы добавить свойства скрипта.
- Установите значение параметра REASONING_ENGINE_RESOURCE_NAME равным имени ресурса приложения Gemini Enterprise. Оно имеет следующий формат:
# 1. Replace PROJECT_ID with the Google Cloud project ID. # 2. Replace GE_APP_ID with the codelab app ID found in Google Cloud console > Gemini Enterprise > Apps. projects/<PROJECT_ID>/locations/global/collections/default_collection/engines/<GE_APP_ID>
- Установите значение параметра APP_SERVICE_ACCOUNT_KEY равным JSON-ключу из файла учетной записи службы, загруженного на предыдущих шагах.
- Нажмите «Сохранить свойства сценария».
Развернуть в Gmail и чате.
В проекте Apps Script выполните следующие действия:
- Нажмите «Развернуть» > «Проверить развертывания» , затем «Установить» . Теперь приложение доступно в Gmail.
- Нажмите «Копировать» под идентификатором развертывания головного узла .

В консоли Google Cloud выполните следующие действия:
- В поле поиска Google Cloud найдите
Google Chat API, затем щелкните Google Chat API , выберите «Управление» и нажмите «Конфигурация» .
- Выберите «Включить интерактивные функции» .
- Снимите флажок « Присоединяйтесь к пространствам и групповым беседам» .
- В разделе «Настройки подключения» выберите «Apps Script» .
- Установите идентификатор развертывания равным идентификатору головного развертывания, скопированному на предыдущих шагах.
- В разделе «Видимость» выберите «Сделать это приложение чата доступным для определенных людей и групп в вашем домене рабочего пространства» и введите свой адрес электронной почты.
- Нажмите « Сохранить ».

Попробуйте дополнение
Откройте Google Чат в новой вкладке, затем выполните следующие действия:
- Откройте личный кабинет с помощью приложения для чата Gemini Enterprise .

- Нажмите «Настроить» и пройдите процедуру аутентификации.
- Введите
What are my meetings for today?и нажмитеenter. Приложение Gemini Enterprise Chat должно ответить результатами.

Откройте Gmail в новой вкладке, затем выполните следующие действия:
- Отправьте себе электронное письмо с темой «
We need to talkи текстом «Are you available today between 8 and 9 AM? - Откройте только что полученное электронное письмо.
- Откройте боковую панель надстройки Enterprise AI .
- Установите сообщение на
Am I? - Нажмите «Отправить сообщение» .
- Ответ отображается после кнопки.

6. Уборка
Удалить проект Google Cloud
Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, использованные в этом практическом задании, мы рекомендуем удалить проект Google Cloud.
В консоли Google Cloud выполните следующие действия:
- Нажмите Меню ☰ > IAM и администрирование > Настройки .
- Нажмите « Выключить» .
- Введите идентификатор проекта.
- Нажмите « Выключить в любом случае» .

7. Поздравляем!
Поздравляем! Вы создали решения, которые позволяют сотрудникам эффективнее использовать возможности Gemini Enterprise и Google Workspace!
Что дальше?
В этом практическом занятии мы демонстрируем только наиболее типичные примеры использования, но существует множество дополнительных областей, которые вы можете рассмотреть при разработке своих решений, например:
- Используйте инструменты разработки с поддержкой искусственного интеллекта, такие как Gemini CLI и Antigravity.
- Интеграция с другими агентскими фреймворками и инструментами, такими как пользовательские MCP, пользовательские вызовы функций и генеративные пользовательские интерфейсы.
- Интегрируйтесь с другими моделями ИИ, включая пользовательские, размещенными на специализированных платформах, таких как Vertex AI.
- Интегрируйтесь с другими агентами, размещенными на специализированных платформах, таких как Dialogflow, или сторонними сервисами через Cloud Marketplace.
- Размещайте агентов на Cloud Marketplace, чтобы расширить возможности команд, организаций или обычных пользователей.
Узнать больше
Разработчикам доступно множество ресурсов, таких как видеоролики на YouTube, сайты с документацией, примеры кода и обучающие материалы:
- Центр разработчиков Google Cloud
- Поддерживаемые продукты | Серверы Google Cloud MCP
- A2UI
- Модель сада на платформе Vertex AI | Google Cloud
- Обзор агентов | Gemini Enterprise | Документация Google Cloud
- Масштабирование агентов ИИ с помощью Google Cloud Marketplace и Gemini Enterprise
- Предлагайте агентов искусственного интеллекта через Google Cloud Marketplace.
- YouTube-канал Google Workspace Developers — Добро пожаловать, разработчики!
- Веб-сайт разработчиков Google Workspace
- Репозиторий GitHub со всеми примерами дополнений для Google Workspace.

