1. Прежде чем начать
Что такое Vertex AI?
Vertex AI — это унифицированная платформа разработки Google Cloud для создания, развертывания и масштабирования корпоративных агентов и приложений искусственного интеллекта. Она предоставляет разработчикам и специалистам по обработке данных сложные инструменты, необходимые для проектирования пользовательских рабочих процессов с участием агентов, глубоко интегрированных с глобальной инфраструктурой.
- Получите доступ к «Саду моделей»: выбирайте из более чем 150 базовых моделей, включая полное семейство Gemini, модели сторонних разработчиков и специализированные модели с открытым исходным кодом, чтобы найти оптимальный вариант для решения конкретных задач агента.
- Разработка архитектуры сложных систем оркестровки: Vertex AI предоставляет основу для проектирования автономных агентов, которые используют логические рассуждения для планирования, выполнения многоэтапных задач и вызова внешних API.
- Поддержка корпоративного уровня: подключение агентов к актуальным бизнес-данным, включая высокопроизводительную технологию RAG (Retrieval-Augmented Generation), для устранения искажений и обеспечения фактической точности.
- DevOps: Бесшовная интеграция разработки агентов в существующие конвейеры CI/CD с помощью надежных SDK, API и инструментов оценки для измерения производительности и безопасности агентов в масштабе предприятия.
- Надежная защита промышленного уровня: Vertex AI гарантирует, что данные клиентов, используемые для обучения или проверки квалификации, остаются конфиденциальными, зашифрованными и соответствуют требованиям международного резидентства.
- Оптимизированная инфраструктура: масштабирование агентских рабочих нагрузок без усилий на кластерах TPU и GPU мирового класса от Google, обеспечивающее низкую задержку даже для самых ресурсоемких глобальных приложений.
Что такое Google Workspace?
Google Workspace — это набор облачных решений для повышения производительности и совместной работы, разработанных для частных лиц, учебных заведений и предприятий.
- Коммуникация: Профессиональные почтовые сервисы (Gmail), видеоконференции (Meet) и командный мессенджер (Chat).
- Создание контента: Инструменты для написания документов (Docs), создания электронных таблиц (Sheets) и разработки презентаций (Slides).
- Организация: общие календари (Календари) и цифровые заметки (Keeping).
- Хранение данных: Централизованное облачное пространство для безопасного сохранения и обмена файлами (Drive).
- Управление: Административные средства управления пользователями и параметрами безопасности (Консоль администратора рабочей области).
Какие именно пользовательские интеграции?
Google Workspace и Vertex AI создают мощную петлю обратной связи, где Workspace предоставляет данные в реальном времени и контекст для совместной работы, а Vertex AI предлагает модели, агентное мышление и оркестровку, необходимые для автоматизации интеллектуальных рабочих процессов.
- Интеллектуальное подключение: управляемые Google хранилища данных, API и серверы MCP (управляемые Google и собственные) позволяют агентам безопасно и беспрепятственно получать доступ к данным Workspace и выполнять действия от имени пользователей.
- Пользовательские агенты: Используя конструкторы без кода или профессиональные фреймворки для программирования, команды могут создавать специализированные агенты, основанные на данных и действиях рабочего пространства, управляемых администратором.
- Встроенная интеграция: дополнения Workspace устраняют разрыв между системами искусственного интеллекта и такими приложениями, как Chat и Gmail, будь то с помощью специальных компонентов пользовательского интерфейса или фоновых процессов. Это позволяет агентам оказывать пользователям мгновенную помощь с учетом контекста именно там, где они находятся.
Сочетая мощную экосистему повышения производительности Google Workspace с передовыми возможностями агентского управления Vertex AI, организации могут трансформировать свою деятельность с помощью настраиваемых, основанных на данных агентов ИИ, которые автоматизируют сложные рабочие процессы непосредственно в инструментах, которые их команды уже используют каждый день.
Предварительные требования
Если вы хотите выполнить все шаги в своей собственной среде, вам потребуется:
- Базовые знания Google Cloud и Python .
- Проект Google Cloud, владельцем которого вы являетесь, с включенной оплатой. Чтобы проверить, включена ли оплата в существующем проекте, см. раздел «Проверка статуса оплаты ваших проектов ». Чтобы создать проект и настроить оплату, см. раздел «Создание проекта Google Cloud» . Чтобы изменить владельца проекта, см. раздел «Управление участниками проекта или изменение владельца проекта» .
- Корпоративный аккаунт Google Workspace ( для бизнеса) с включенным доступом к Google Chat и интеллектуальным функциям.
- Для вашего проекта Google Cloud установлен и инициализирован интерфейс командной строки Google Cloud.
- Для корректной работы требуется установленный Python 3.11+. Инструкции см. на официальном сайте Python .
Что вы построите
В этом практическом занятии мы создадим три решения с использованием агентов Vertex AI, тесно интегрированных с Google Workspace. Они продемонстрируют архитектурные шаблоны, которые можно использовать для взаимодействия с данными, действиями и пользовательскими интерфейсами.
Приложение Vertex AI Search
Этот агент позволяет пользователям искать данные и выполнять действия в Workspace на их естественном языке. Он основан на следующих элементах:
- Модель: Близнецы.
- Данные и действия: хранилища данных Vertex AI для Google Workspace (Календарь, Gmail, Диск).
- Агент-хост: Vertex AI Search.
- UI: Веб-виджет поиска Vertex AI.

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


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


Что вы узнаете
- Точки интеграции между Vertex AI Search и Google Workspace, обеспечивающие обработку данных и выполнение действий.
- Возможности создания пользовательских агентов, размещенных в Vertex AI.
- Способы доступа пользователей к таким агентам, как веб-виджет поиска Vertex AI и приложения Google Workspace.
2. Настройка
Перед созданием решений необходимо инициализировать настройки приложений Vertex AI для проекта, включить необходимые API и создать хранилища данных Vertex AI Workspace.
Обзор концепций
Приложение Vertex AI
Приложение Vertex AI — это управляемое комплексное решение на платформе Google Cloud, которое интегрирует модели машинного обучения (такие как генеративные ИИ-агенты или поисковые системы) с корпоративными данными и специализированными инструментами для выполнения сложных задач, таких как семантический поиск, генерация контента или автоматизированное взаимодействие с клиентами.
хранилище данных Vertex AI
Хранилище данных Vertex AI — это сущность, содержащая данные, полученные из собственного источника данных, такого как Google Workspace, или из сторонних приложений, таких как Jira или Shopify. Хранилища данных, содержащие данные из сторонних приложений, также называются коннекторами данных.
Запустить настройки приложений Vertex AI
Для включения создания агентов необходимо инициализировать настройки приложений Vertex AI.
Откройте консоль Google Cloud в новой вкладке, затем выполните следующие действия:
- Выберите свой проект.
- В поле поиска Google Cloud перейдите в раздел «Приложения искусственного интеллекта» .
- После ознакомления с условиями и принятия их, нажмите «Продолжить» и активируйте API .
- Перейдите в Настройки .
- На вкладке «Аутентификация» отредактируйте глобальные параметры .

- Выберите Google Identity , затем нажмите «Сохранить» .

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

- Нажмите Меню ☰ > API и сервисы > Включенные API и сервисы , а затем убедитесь, что Google Calendar API , Gmail API и People API присутствуют в списке.
Создание хранилищ данных
Создайте хранилище данных Google Drive:
- В консоли Google Cloud перейдите в раздел «Приложения ИИ» , а затем в раздел «Хранилища данных» .
- Нажмите + Создать хранилище данных .
- В разделе «Источник» , в подразделе «Google Drive» , нажмите «Выбрать» .

- В разделе «Данные» выберите «Все » и нажмите «Продолжить» .

- В разделе «Конфигурация» укажите имя соединителя данных как
driveи нажмите «Продолжить» после ознакомления и согласия с применимыми тарифами.

- В разделе «Ценообразование» выберите предпочтительную модель ценообразования и нажмите «Создать» . В контексте данного практического занятия рекомендуется использовать общую модель ценообразования .
- Вы будете автоматически перенаправлены в раздел «Хранилища данных» , где сможете увидеть недавно добавленное хранилище данных.
Создайте хранилище данных Google Календаря:
- Нажмите + Создать хранилище данных .
- В разделе «Источник» найдите Google Календарь и нажмите «Выбрать» .
- В разделе «Действия» нажмите «Пропустить» .
- В разделе «Конфигурация» укажите имя соединителя данных как
calendar. - Нажмите «Создать» .
- Вы будете автоматически перенаправлены в раздел «Хранилища данных» , где сможете увидеть недавно добавленное хранилище данных.
Создайте хранилище данных Google Gmail:
- Нажмите + Создать хранилище данных .
- В поле «Источник» найдите Google Gmail и нажмите «Выбрать» .
- В разделе «Действия» нажмите «Пропустить» .
- В разделе «Конфигурация» укажите имя коннектора данных как
gmail. - Нажмите «Создать» .
- Вы будете автоматически перенаправлены в раздел «Хранилища данных» , где сможете увидеть недавно добавленное хранилище данных.
3. Приложение Vertex AI Search
Этот агент позволяет пользователям искать данные и выполнять действия в Workspace на их естественном языке. Он основан на следующих элементах:
- Модель: Близнецы.
- Данные и действия: хранилища данных Vertex AI для Google Workspace (Календарь, Gmail, Диск).
- Агент-хост: Vertex AI Search.
- UI: Веб-виджет поиска Vertex AI.
Обзор концепций
Приложение Vertex AI Search
Приложение Vertex AI Search предоставляет конечным пользователям результаты поиска, действия и агентов. Термин «приложение» можно использовать взаимозаменяемо с термином «движок» в контексте API. Приложение должно быть подключено к хранилищу данных, чтобы использовать данные из него для предоставления результатов поиска, ответов или действий.
Веб-виджет поиска Vertex AI
Vertex AI Search Web Widget — это готовый, настраиваемый компонент пользовательского интерфейса, позволяющий разработчикам встраивать поисковую строку и интерфейс результатов поиска на основе искусственного интеллекта непосредственно на веб-сайт с минимальным количеством кода.
Предварительный просмотр поиска Vertex AI
Vertex AI Search Preview — это встроенная среда тестирования в консоли Google Cloud, которая позволяет разработчикам проверять конфигурации поиска и генерируемые ответы, прежде чем беспрепятственно развертывать эти же настройки в готовом к использованию веб-виджете Vertex AI Search.
Обзор архитектуры решения

Создать приложение
Создайте новое поисковое приложение для привязки ваших хранилищ данных.
Откройте раздел «Приложения ИИ» > «Приложения» в облачной консоли, затем выполните следующие действия:
- Нажмите + Создать приложение .
- В разделе «Тип» , в подразделе «Пользовательский поиск (общий)» , нажмите «Создать» .

- В разделе «Конфигурация» после ознакомления с ценами и их согласия выберите функции корпоративной версии и параметр «Генеративные ответы» .
- Задайте название приложения как
codelab. - Идентификатор генерируется на основе имени и отображается под полем, скопируйте его.
- Установите название компании на
Codelab. - Установите для параметра «Многорегиона» значение
global (Global). - Нажмите «Продолжить» .

- В разделе «Данные» выберите хранилища данных «Диск» , «Gmail» и «Календарь» , затем нажмите «Продолжить» .

- В разделе «Ценообразование» выберите предпочтительную модель ценообразования и нажмите «Создать» . В контексте данного практического занятия рекомендуется использовать общую модель ценообразования .
- Приложение создано, и вы автоматически перенаправляетесь в раздел Приложения ИИ > Приложения > codelab > Обзор приложения .
- Перейдите в раздел «Подключенные хранилища данных» .
- Через несколько минут все подключенные хранилища данных должны перейти в состояние «Активно» .

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

Попробуйте приложение
Протестируйте приложение поиска непосредственно в консоли Google Cloud.
- Перейдите в раздел «Предварительный просмотр» , там отобразится веб-виджет.
- В чате напишите «
Do I have any meetings today?и нажмитеenter. - В чате напишите «
Did I receive an email on March 1st 2026?и нажмитеenter. - В чате напишите
Give me the title of the latest Drive file I createdи нажмитеenter.

4. Таможенный агент
Этот агент позволяет пользователям искать данные и выполнять действия в Workspace на их естественном языке, используя пользовательские инструменты и правила. Он основан на следующих элементах:
- Модель: Близнецы.
- Данные и действия: хранилища данных Vertex AI для Google Workspace (Календарь, Gmail, Диск), сервер контекстного протокола модели поиска (MCP) Vertex AI, управляемый Google, пользовательская функция инструмента для отправки сообщений в Google Chat (через Google Chat API).
- Инструменты для создания агентов: Комплект для разработки агентов (ADK).
- Основной агент: Vertex AI Agent Engine.
- Пользовательский интерфейс: ADK Web.
Обзор концепций
Комплект для разработки агентов (ADK)
Комплект для разработки агентов (ADK) — это специализированный набор инструментов и фреймворков, предназначенный для упрощения создания автономных агентов искусственного интеллекта путем предоставления готовых модулей для рассуждений, управления памятью и интеграции инструментов.
Протокол контекста модели (MCP)
Протокол контекста модели (MCP) — это открытый стандарт, разработанный для обеспечения бесшовной и безопасной интеграции между приложениями искусственного интеллекта и различными источниками данных или инструментами посредством универсального интерфейса «подключи и работай».
Функциональный инструмент
Инструмент «Функция» — это предопределенная исполняемая подпрограмма, которую модель ИИ может запускать для выполнения определенных действий или получения данных в реальном времени из внешних систем, расширяя свои возможности за пределы простой генерации текста.
ADK Web
ADK web — это встроенный пользовательский интерфейс для разработчиков, поставляемый вместе с ADK SDK, который упрощает разработку и отладку.
Обзор архитектуры решения

Просмотрите исходный код
agent.py
Приведенный ниже код выполняет аутентификацию в Vertex AI, инициализирует инструменты Vertex AI Search MCP и Chat API, а также определяет поведение агента.
- Аутентификация : Для аутентификации вызовов MCP и API извлекается
ACCESS_TOKENиз переменных окружения. - Настройка инструментов : Инициализируется
vertexai_mcp, набор инструментов, подключающийся к серверу протокола контекста модели поиска Vertex AI (MCP), и инструментsend_direct_message. Это позволяет агенту осуществлять поиск по подключенным хранилищам данных и отправлять сообщения Google Chat. - Определение агента : В нем определяется
root_agentс использованием моделиgemini-2.5-flash. Инструкции указывают агенту отдавать приоритет использованию инструмента поиска для получения информации и инструментаsend_direct_messageдля выполнения действий, фактически закрепляя агента в корпоративных данных.
...
MODEL = "gemini-2.5-flash"
# Access token for authentication
ACCESS_TOKEN = os.environ.get("ACCESS_TOKEN")
if not ACCESS_TOKEN:
raise ValueError("ACCESS_TOKEN environment variable must be set")
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 send_direct_message(email: str, message: str) -> dict:
"""Sends a Google Chat Direct Message (DM) to a specific user by email address."""
chat_client = chat_v1.ChatServiceClient(
credentials=Credentials(token=ACCESS_TOKEN)
)
# 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,
headers={"Authorization": f"Bearer {ACCESS_TOKEN}"}
),
tool_filter=['search']
)
# 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)]
)
Скачать исходный код
Для начала загрузите пример кода в свою локальную среду.
- Загрузите этот репозиторий GitHub .
- В терминале откройте каталог
solutions/enterprise-ai-agent-local.
Включить 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 > Брендинг .
- Нажмите « Начать» .
- В разделе «Информация о приложении» укажите название приложения
Codelab. - В разделе «Электронная почта службы поддержки пользователей» выберите адрес электронной почты, по которому пользователи смогут связаться с вами, если у них возникнут вопросы относительно их согласия.
- Нажмите «Далее» .
- В разделе «Аудитория» выберите «Внутренняя» .
- Нажмите «Далее» .
- В поле «Контактная информация» укажите адрес электронной почты , на который вы сможете получать уведомления об изменениях в вашем проекте.
- Нажмите «Далее» .
- В разделе «Завершить» ознакомьтесь с Политикой использования пользовательских данных сервисов Google API и, если вы согласны, выберите «Я согласен с Политикой использования пользовательских данных сервисов Google API» .
- Нажмите «Продолжить» , затем «Создать» .

- Настройки сохраняются, и вы автоматически перенаправляетесь на страницу Google Auth Platform > Overview .
Для получения более подробной информации ознакомьтесь с полным руководством по настройке согласия OAuth .
Создание учетных данных клиента OAuth
Создайте новый клиент OAuth для настольного приложения, чтобы аутентифицировать пользователя в локальной среде:
- В консоли Google Cloud перейдите в меню ☰ > Платформа аутентификации Google > Клиенты .
- Нажмите + Создать клиента .
- В поле «Тип приложения» выберите «Настольное приложение» .
- Задайте имя
codelab. - Нажмите «Создать» . Отобразятся только что созданные учетные данные.
- Нажмите «Скачать JSON» и сохраните файл как client_secret.json в каталоге
solutions/enterprise-ai-agent-local.

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

Запуск агента в ADK Web
Запустите агент локально, используя веб-интерфейс ADK.
- В терминале откройте каталог
solutions/enterprise-ai-agent-localи выполните следующую команду:
# 1. Authenticate with all the required scopes gcloud auth application-default login \ --client-id-file=client_secret.json \ --scopes=https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/chat.spaces,https://www.googleapis.com/auth/chat.messages # 2. Configure environment export ACCESS_TOKEN=$(gcloud auth application-default print-access-token) export GOOGLE_GENAI_USE_VERTEXAI=1 export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project) export GOOGLE_CLOUD_LOCATION=us-central1 # 3. Create and activate a new virtual environment python3 -m venv .venv source .venv/bin/activate # 4. Install poetry and project dependencies pip install poetry poetry install # 5. Start ADK Web adk web

Попробуйте агента
Проверьте ход процесса, пообщавшись со своим агентом.
- Откройте веб-сайт ADK в своем интернет-браузере.
- В чате напишите:
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. Он основан на следующих элементах:
- Модель: Близнецы.
- Данные и действия: хранилища данных Vertex AI для Google Workspace (Календарь, Gmail, Диск), сервер контекстного протокола модели поиска (MCP) Vertex AI, управляемый Google, пользовательская функция инструмента для отправки сообщений в Google Chat (через Google Chat API).
- Инструменты для создания агентов: Комплект для разработки агентов (ADK).
- Основной агент: Vertex AI Agent Engine.
- Пользовательский интерфейс: Дополнение Google Workspace для чата и Gmail (легко расширяется для календаря, диска, документов, таблиц и презентаций).
- Дополнение Google Workspace: Apps Script, API Vertex AI Agent Engine, контекстное (для выбранного сообщения Gmail).
Обзор концепций
Дополнение 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.
Обзор архитектуры решения

Просмотрите исходный код
Агент
agent.py
Приведенный ниже код выполняет аутентификацию в Vertex AI, инициализирует инструменты Vertex AI Search MCP и Chat API, а также определяет поведение агента.
- Аутентификация : используется вспомогательная функция
_get_access_token_from_contextдля получения токена аутентификации (CLIENT_AUTH_NAME), который внедряет клиент. Этот токен имеет решающее значение для безопасного вызова нижестоящих сервисов, таких как Vertex AI Search MCP и инструменты Google Chat. - Настройка инструментов : Инициализируется
vertexai_mcp, набор инструментов, подключающийся к серверу протокола контекста модели поиска Vertex AI (MCP), и инструментsend_direct_message. Это позволяет агенту осуществлять поиск по подключенным хранилищам данных и отправлять сообщения Google Chat. - Определение агента : В нем определяется
root_agentс использованием моделиgemini-2.5-flash. Инструкции указывают агенту отдавать приоритет использованию инструмента поиска для получения информации и инструментаsend_direct_messageдля выполнения действий, фактически закрепляя агента в корпоративных данных.
...
MODEL = "gemini-2.5-flash"
# Client injects a bearer token into the ToolContext state.
# The key pattern is "CLIENT_AUTH_NAME_<random_digits>".
# We dynamically parse this token to authenticate our MCP and API calls.
CLIENT_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(CLIENT_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)]
)
Клиент
appsscript.json
Приведенные ниже параметры конфигурации определяют триггеры и права доступа дополнения.
- Определяет надстройку : сообщает Workspace, что этот проект является надстройкой как для Chat , так и для Gmail .
- Контекстные триггеры : В Gmail настраивается
contextualTriggerтриггер, которыйonAddonEventпри открытии пользователем электронного письма. Это позволяет дополнению «видеть» содержимое письма. - Разрешения : Здесь перечислены области действия
oauthScopes, необходимые для работы дополнения, такие как разрешения на чтение текущего электронного письма, выполнение скрипта и подключение к внешним сервисам (например, API Vertex AI).
...
"addOns": {
"common": {
"name": "Vertex 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/cloud-platform",
"https://www.googleapis.com/auth/gmail.addons.execute",
"https://www.googleapis.com/auth/gmail.addons.current.message.readonly"
]
...
Chat.gs
Следующий код обрабатывает входящие сообщения в чате Google.
- Приём сообщений : Функция
onMessageявляется точкой входа для взаимодействия с сообщениями. - Управление контекстом : сохраняет
space.name(идентификатор чат-пространства) в свойствах пользователя. Это гарантирует, что когда агент будет готов ответить, он будет точно знать, в какой беседе отправить сообщение. - Делегирует агенту : вызывает
requestAgent, передавая сообщение пользователя основной логике, обрабатывающей взаимодействие с API.
...
// 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
Следующий код формирует боковую панель Gmail и получает контекст электронного письма.
- Создание пользовательского интерфейса : функция
createSidebarCardсоздает визуальный интерфейс с помощью службы Workspace Card Service. Она формирует простой макет с текстовым полем ввода и кнопкой «Отправить сообщение». - Перехват контекста электронного письма : В
handleSendMessageкод проверяет, просматривает ли пользователь в данный момент электронное письмо (event.gmail.messageId). Если да, то он безопасно получает тему и текст письма и добавляет их к подсказке пользователя. - Отображение результата : После того, как агент ответит, код обновляет карточку в боковой панели, отображая ответ.
...
// 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 response = queryAgent({ text: finalQueryText });
// 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(response.text);
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
Приведенный ниже код организует вызов API к Vertex AI.
- Обрабатывает вызов API :
queryAgent— это мост между вашим дополнением и Vertex AI Agent Engine. Он формирует запрос, который включает в себя запрос пользователя и токен аутентификации в состоянии. - Потоковая обработка ответа : Поскольку ответы агентов могут занимать некоторое время, используется API
streamQueryс Server-Sent Events (SSE). Код собирает ответ по частям и восстанавливает полный ответ.
...
// Service that handles Vertex AI Agent operations.
// Submits a query to the AI agent and returns the response string synchronously
function queryAgent(input) {
let systemPrompt = "SYSTEM PROMPT START Do not respond with tables but use bullet points instead." +
" Do not ask the user follow-up questions or converse with them as history is not kept in this interface." +
" SYSTEM PROMPT END\n\n";
const requestPayload = {
"class_method": "async_stream_query",
"input": {
"user_id": "vertex_ai_add_on",
"message": { "role": "user", "parts": [{ "text": systemPrompt + input.text }] },
"state_delta": {
"enterprise-ai_999": `${ScriptApp.getOAuthToken()}`
}
}
};
const responseContentText = UrlFetchApp.fetch(
`https://${getLocation()}-aiplatform.googleapis.com/v1/${getReasoningEngine()}:streamQuery?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 author = "default";
let answerText = "";
for (const eventJson of events) {
if (isInDebugMode()) {
console.log("Event: " + eventJson);
}
const event = JSON.parse(eventJson);
// Retrieve the agent responsible for generating the content
author = event.author;
// Ignore events that are not useful for the end-user
if (!event.content) {
console.log(`${author}: internal event`);
continue;
}
// Handle text answers
const parts = event.content.parts || [];
const textPart = parts.find(p => p.text);
if (textPart) {
answerText += textPart.text;
}
}
return { author: author, text: answerText };
}
...
Разверните агента в Vertex AI Agent Engine.
- В терминале откройте каталог
solutions/enterprise-ai-agentиз источников, загруженных на предыдущих шагах, и выполните следующую команду:
# 1. Create and activate a new virtual environment deactivate 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 , затем скопируйте имя ресурса только что развернутого агента из вывода команды, выделенного зеленым цветом.

Инициализация сервисного аккаунта
Создайте выделенную учетную запись службы для авторизации операций на стороне сервера дополнения.
В консоли Google Cloud выполните следующие действия:
- Нажмите Меню ☰ > IAM и администрирование > Учетные записи служб > + Создать учетную запись службы .
- Установите имя учетной записи службы на
vertexai-add-on.

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

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

- Диалоговое окно закрывается, и созданная вами пара открытого/закрытого ключей автоматически загружается в вашу локальную среду в виде JSON-файла.
Создание и настройка проекта Apps Script
Создайте новый проект Apps Script для размещения кода дополнения и настройте параметры подключения.
- Нажмите следующую кнопку, чтобы открыть проект Apps Script надстройки Enterprise AI :
- Нажмите «Обзор» > «Создать копию» .
- В проекте Apps Script перейдите в раздел «Настройки проекта» > «Изменить свойства скрипта» > «Добавить свойство скрипта» , чтобы добавить свойства скрипта.
- Установите значение параметра REASONING_ENGINE_RESOURCE_NAME равным имени ресурса агента Vertex AI, скопированному на предыдущих шагах. Оно имеет следующий формат:
projects/<PROJECT_NUMBER>/locations/us-central1/reasoningEngines/<AGENT_ID>
- Установите значение параметра APP_SERVICE_ACCOUNT_KEY равным JSON-ключу из файла учетной записи службы, загруженного на предыдущих шагах.
- Нажмите «Сохранить свойства сценария».
Развернуть в Gmail и чате.
Разверните дополнение, чтобы протестировать его непосредственно в Gmail и Google Chat.
В проекте Apps Script выполните следующие действия:
- Нажмите «Развернуть» > «Проверить развертывания» , затем «Установить» . Теперь приложение доступно в Gmail.
- Нажмите «Копировать» под идентификатором развертывания головного узла .

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

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

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

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

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

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

