Как создать приложение Google Chat с агентом Agent2Agent

На этой странице рассказывается, как создать приложение Google Chat, которое взаимодействует с ИИ-агентом, использующим протокол Agent2Agent (A2A). Вы разрабатываете ИИ-агента с помощью Agent Development Kit (ADK) и размещаете его в Vertex AI Agent Engine.

ИИ-агенты самостоятельно воспринимают окружающую среду, рассуждают и выполняют сложные многоэтапные действия для достижения определенной цели. В этом руководстве вы развернете образец мультиагентной системы LLM Auditor, которая проверяет и исправляет факты, используя Gemini и Google Поиск.

Пример мультиагентного приложения LLM Auditor в качестве приложения Chat.

На диаграмме ниже показана архитектура и шаблон обмена сообщениями.

Архитектура приложения Chat, реализованного с помощью ИИ-агента A2A.

На диаграмме показано, как пользователь взаимодействует с чат-приложением, в котором реализован агент A2A. Информация передается следующим образом:

  1. Пользователь отправляет сообщение приложению Chat в чате или чат-группе.
  2. Логика приложения Chat, реализованная в Apps Script или в виде веб-сервера с конечными точками HTTP, получает и обрабатывает сообщение.
  3. Агент A2A, размещенный в Vertex AI Agent Engine, получает и обрабатывает взаимодействие.
  4. Приложение Chat или ИИ-агент можно интегрировать с сервисами Google Workspace, такими как Календарь или Таблицы, или другими сервисами Google, например Картами или YouTube.
  5. Приложение Chat отправляет ответы асинхронно, используя API Google Chat для передачи информации о ходе работы ИИ-агента.
  6. Ответы будут отправлены пользователю.

Цели

  • Настройте среду.
  • Разверните A2A-агента.
  • Разверните приложение Chat.
  • Настройте приложение Chat.
  • Проверьте приложение Chat.

Требования

Как настроить среду

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

Прежде чем использовать API Google, их нужно включить в облачном проекте Google Cloud. В одном облачном проекте Google Cloud можно включить один или несколько API.

Как настроить окно запроса доступа OAuth

Для всех приложений, использующих OAuth 2.0, требуется настроить окно запроса доступа. Настройте окно запроса доступа OAuth для своего приложения. Это позволит вам определить, что будет показываться пользователям и проверяющим, а также зарегистрировать приложение, чтобы опубликовать его позже.

  1. В консоли API Google нажмите на значок меню > Платформа аутентификации Google > Брендинг.

    Перейти к брендингу

  2. Если вы уже настроили платформу аутентификации Google, вы можете задать следующие настройки окна запроса доступа OAuth в разделах Брендинг, Аудитория и Доступ к данным. Если вы видите сообщение Google Auth platform not configured yet (Платформа Google Auth ещё не настроена), нажмите Get Started (Начать):
    1. В разделе Информация о приложении в поле Название приложения введите название приложения.
    2. В поле Электронный адрес службы поддержки укажите адрес, по которому пользователи смогут обращаться с вопросами о согласии.
    3. Нажмите Далее.
    4. В разделе Аудитория выберите Внутренние.
    5. Нажмите Далее.
    6. В разделе Контактная информация укажите адрес электронной почты, на который вы хотите получать уведомления об изменениях в проекте.
    7. Нажмите Далее.
    8. В разделе Завершение ознакомьтесь с Правилами в отношении пользовательских данных сервисов API Google и, если вы согласны с ними, выберите Я принимаю Правила в отношении пользовательских данных сервисов API Google.
    9. Нажмите Продолжить.
    10. Нажмите Создать.
  3. Пока вы можете пропустить добавление областей действия. В будущем, когда вы будете создавать приложение для использования за пределами организации Google Workspace, вам нужно будет изменить Тип пользователя на Внешний. Затем добавьте области авторизации, необходимые вашему приложению. Подробнее о том, как настроить согласие OAuth…

Как создать сервисный аккаунт в консоли Google Cloud

Создайте сервисный аккаунт с ролью Vertex AI User, выполнив следующие действия:

Google Cloud Console

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

    Перейти на страницу сервисных аккаунтов

    Остальные действия выполняются в консоли Google Cloud.

  2. Выберите проект Google Cloud.
  3. Нажмите Создать сервисный аккаунт.
  4. Введите название сервисного аккаунта, которое будет показываться в консоли Google Cloud.
  5. Если вы не хотите настраивать контроль доступа сейчас, нажмите Готово, чтобы завершить создание сервисного аккаунта. Чтобы настроить контроль доступа сейчас, нажмите Создать и продолжить и перейдите к следующему шагу.
  6. Необязательно: назначьте сервисному аккаунту роли, чтобы предоставить доступ к ресурсам проекта Google Cloud в дополнение к ресурсам Google Workspace. Подробнее об управлении доступом к проектам, папкам и организациям…
  7. Нажмите Продолжить.
  8. Необязательно: укажите пользователей или группы, которые могут управлять этим сервисным аккаунтом и выполнять с ним действия. Подробнее о представлении сервисного аккаунта…
  9. Нажмите Готово, чтобы завершить создание сервисного аккаунта.

    Запишите адрес электронной почты сервисного аккаунта.

gcloud CLI

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

Сервисный аккаунт появится на странице сервисных аккаунтов.

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

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

  1. В консоли Google Cloud перейдите в меню > IAM и администрирование > Сервисные аккаунты.

    Перейти на страницу сервисных аккаунтов

    Остальные действия выполняются в консоли Google Cloud.

  2. Выберите проект Google Cloud.
  3. Нажмите на адрес электронной почты сервисного аккаунта, для которого вы хотите создать ключ.
  4. Откройте вкладку Ключи.
  5. Нажмите на раскрывающееся меню Добавить ключ и выберите Создать ключ.
  6. В качестве типа ключа выберите JSON и нажмите Создать.

    Будет сгенерирована новая пара открытого и закрытого ключей, которая будет скачана на ваш компьютер в виде файла ключа сервисного аккаунта. Сохраните скачанный JSON-файл как credentials.json в рабочем каталоге. Этот файл – единственная копия ключа. После того как вы скачаете файл ключа, повторно скачать его будет нельзя. Информацию о том, как безопасно хранить ключ, можно найти в статье Рекомендации по управлению ключами сервисных аккаунтов.

Подробнее о сервисных аккаунтах в документации по Google Cloud IAM…

Как развернуть A2A-агента

  1. Если вы ещё не сделали этого, выполните аутентификацию с помощью аккаунта Google Cloud и настройте Google Cloud CLI для использования проекта Google Cloud.

    gcloud auth application-default login
    gcloud config set project PROJECT_ID
    gcloud auth application-default set-quota-project PROJECT_ID

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

  2. Скачайте репозиторий ADK-примеров на GitHub, нажав на кнопку ниже.

    Как скачать adk-samples

  3. В локальной среде разработки извлеките скачанный архив и откройте каталог adk-samples/python/agents/llm-auditor.

    unzip adk-samples-main.zip
    cd adk-samples-main/python/agents/llm-auditor
  4. Чтобы развернуть агента ADK в качестве удаленного агента A2A, измените реализацию следующим образом:

    1. pyproject.toml: добавьте зависимости ADK и A2A SDK в группу развертывания.

      apps-script/chat/a2a-ai-agent/llm-auditor/pyproject.toml
      [project]
      name = "llm-auditor"
      version = "0.1.0"
      description = "The LLM Auditor evaluates LLM-generated answers, verifies actual accuracy using the web, and refines the response to ensure alignment with real-world knowledge."
      authors = [
          { name = "Chun-Sung Ferng", email = "csferng@google.com" },
          { name = "Cyrus Rashtchian", email = "cyroid@google.com" },
          { name = "Da-Cheng Juan", email = "dacheng@google.com" },
          { name = "Ivan Kuznetsov", email = "ivanku@google.com" },
      ]
      license = "Apache License 2.0"
      readme = "README.md"
      
      [tool.poetry.dependencies]
      python = "^3.10"
      google-adk = "^1.0.0"
      google-cloud-aiplatform = { extras = [
          "adk",
          "agent-engines",
      ], version = "^1.93.0" }
      google-genai = "^1.9.0"
      pydantic = "^2.10.6"
      python-dotenv = "^1.0.1"
      
      [tool.poetry.group.dev]
      optional = true
      
      [tool.poetry.group.dev.dependencies]
      google-adk = { version = "^1.0.0", extras = ["eval"] }
      pytest = "^8.3.5"
      pytest-asyncio = "^0.26.0"
      
      [tool.poetry.group.deployment]
      optional = true
      
      [tool.poetry.group.deployment.dependencies]
      absl-py = "^2.2.1"
      google-adk = "^1.0.0"
      a2a-sdk = "^0.3.0"
      
      [build-system]
      requires = ["poetry-core>=2.0.0,<3.0.0"]
      build-backend = "poetry.core.masonry.api"
    2. deployment/deploy.py: замените развертывание приложения ADK агентом и картой A2A.

      apps-script/chat/a2a-ai-agent/llm-auditor/deployment/deploy.py
      # Copyright 2025 Google LLC
      #
      # Licensed under the Apache License, Version 2.0 (the "License");
      # you may not use this file except in compliance with the License.
      # You may obtain a copy of the License at
      #
      #     http://www.apache.org/licenses/LICENSE-2.0
      #
      # Unless required by applicable law or agreed to in writing, software
      # distributed under the License is distributed on an "AS IS" BASIS,
      # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      # See the License for the specific language governing permissions and
      # limitations under the License.
      
      """Deployment script for LLM Auditor."""
      
      import os
      
      from absl import app
      from absl import flags
      from dotenv import load_dotenv
      from llm_auditor.agent import root_agent
      import vertexai
      from vertexai import agent_engines
      
      # A2A wrapping
      from a2a.types import AgentSkill
      from google.adk.a2a.executor.a2a_agent_executor import A2aAgentExecutor
      from google.adk.runners import InMemoryRunner
      from vertexai.preview.reasoning_engines.templates.a2a import create_agent_card
      from vertexai.preview.reasoning_engines import A2aAgent
      
      FLAGS = flags.FLAGS
      flags.DEFINE_string("project_id", None, "GCP project ID.")
      flags.DEFINE_string("location", None, "GCP location.")
      flags.DEFINE_string("bucket", None, "GCP bucket.")
      flags.DEFINE_string("resource_id", None, "ReasoningEngine resource ID.")
      
      flags.DEFINE_bool("list", False, "List all agents.")
      flags.DEFINE_bool("create", False, "Creates a new agent.")
      flags.DEFINE_bool("delete", False, "Deletes an existing agent.")
      flags.mark_bool_flags_as_mutual_exclusive(["create", "delete"])
      
      
      def create() -> None:
          """Creates an agent engine for LLM Auditor."""
          agent_card = create_agent_card(
              agent_name=root_agent.name,
              description=root_agent.description,
              skills=[AgentSkill(
                  id='audit_llm_output',
                  name='Audit LLM Output',
                  description='Critiques and revises outputs from large language models.',
                  tags=['LLM', 'Audit', 'Revision'],
                  examples=[
                      'The earth is flat.',
                      'The capital of France is Berlin.',
                      'The last winner of the Super Bowl was the New England Patriots in 2020.',
                  ],
              )]
          )
          a2a_agent = A2aAgent(
              agent_card=agent_card,
              agent_executor_builder=lambda: A2aAgentExecutor(
                  runner=InMemoryRunner(
                      app_name=root_agent.name,
                      agent=root_agent,
                  )
              )
          )
          a2a_agent.set_up()
      
          remote_agent = agent_engines.create(
              a2a_agent,
              display_name=root_agent.name,
              requirements=[
                      "google-adk (>=0.0.2)",
                      "google-cloud-aiplatform[agent_engines] (>=1.88.0,<2.0.0)",
                      "google-genai (>=1.5.0,<2.0.0)",
                      "pydantic (>=2.10.6,<3.0.0)",
                      "absl-py (>=2.2.1,<3.0.0)",
                      "a2a-sdk>=0.3.22",
                      "uvicorn",
              ],
              # In-memory runner
              max_instances=1,
              env_vars ={
                  "NUM_WORKERS": "1"
              },
              extra_packages=["./llm_auditor"],
          )
          print(f"Created remote agent: {remote_agent.resource_name}")
      
      
      def delete(resource_id: str) -> None:
          remote_agent = agent_engines.get(resource_id)
          remote_agent.delete(force=True)
          print(f"Deleted remote agent: {resource_id}")
      
      
      def list_agents() -> None:
          remote_agents = agent_engines.list()
          TEMPLATE = '''
      {agent.name} ("{agent.display_name}")
      - Create time: {agent.create_time}
      - Update time: {agent.update_time}
      '''
          remote_agents_string = '\n'.join(TEMPLATE.format(agent=agent) for agent in remote_agents)
          print(f"All remote agents:\n{remote_agents_string}")
      
      def main(argv: list[str]) -> None:
          del argv  # unused
          load_dotenv()
      
          project_id = (
              FLAGS.project_id
              if FLAGS.project_id
              else os.getenv("GOOGLE_CLOUD_PROJECT")
          )
          location = (
              FLAGS.location if FLAGS.location else os.getenv("GOOGLE_CLOUD_LOCATION")
          )
          bucket = (
              FLAGS.bucket if FLAGS.bucket
              else os.getenv("GOOGLE_CLOUD_STORAGE_BUCKET")
          )
      
          print(f"PROJECT: {project_id}")
          print(f"LOCATION: {location}")
          print(f"BUCKET: {bucket}")
      
          if not project_id:
              print("Missing required environment variable: GOOGLE_CLOUD_PROJECT")
              return
          elif not location:
              print("Missing required environment variable: GOOGLE_CLOUD_LOCATION")
              return
          elif not bucket:
              print(
                  "Missing required environment variable: GOOGLE_CLOUD_STORAGE_BUCKET"
              )
              return
      
          vertexai.init(
              project=project_id,
              location=location,
              staging_bucket=f"gs://{bucket}",
          )
      
          if FLAGS.list:
              list_agents()
          elif FLAGS.create:
              create()
          elif FLAGS.delete:
              if not FLAGS.resource_id:
                  print("resource_id is required for delete")
                  return
              delete(FLAGS.resource_id)
          else:
              print("Unknown command")
      
      
      if __name__ == "__main__":
          app.run(main)
  5. Создайте новый сегмент Cloud Storage, предназначенный для агента ADK.

    gcloud storage buckets create gs://CLOUD_STORAGE_BUCKET_NAME --project=PROJECT_ID --location=PROJECT_LOCATION

    Замените следующее:

    1. CLOUD_STORAGE_BUCKET_NAME с уникальным названием сегмента, который вы хотите использовать.
    2. PROJECT_ID – идентификатор вашего облачного проекта.
    3. PROJECT_LOCATION с местоположением вашего облачного проекта.
  6. Задайте следующие переменные среды:

    export GOOGLE_GENAI_USE_VERTEXAI=true
    export GOOGLE_CLOUD_PROJECT=PROJECT_ID
    export GOOGLE_CLOUD_LOCATION=PROJECT_LOCATION
    export GOOGLE_CLOUD_STORAGE_BUCKET=CLOUD_STORAGE_BUCKET_NAME

    Замените следующее:

    1. CLOUD_STORAGE_BUCKET_NAME с названием созданного вами сегмента.
    2. PROJECT_ID – идентификатор вашего облачного проекта.
    3. PROJECT_LOCATION с местоположением вашего облачного проекта.
  7. Установите и разверните агента ADK из виртуальной среды.

    python3 -m venv myenv
    source myenv/bin/activate
    poetry install --with deployment
    python3 deployment/deploy.py --create
  8. Получите идентификатор агента. Он понадобится вам позже, при настройке приложения Chat.

    python3 deployment/deploy.py --list

Как создать и настроить проект приложения Chat

  1. Нажмите кнопку ниже, чтобы открыть проект Apps Script A2A ИИ-агент Quickstart.

    Как открыть проект

  2. Нажмите Обзор > Значок копирования Создать копию.

  3. В проекте Apps Script нажмите Значок настроек проекта Настройки проекта > Изменить свойства скрипта > Добавить свойство скрипта, чтобы добавить следующие свойства скрипта:

    1. REASONING_ENGINE_RESOURCE_NAME с названием ресурса ИИ-агента Vertex AI, скопированным на предыдущих шагах.
    2. SERVICE_ACCOUNT_KEY с ключом JSON из сервисного аккаунта, скачанным на предыдущих этапах, например { ... }.
  4. Нажмите Сохранить свойства скрипта.

  5. В Google API Console нажмите на значок меню > IAM и администрирование > Настройки.

    Перейти к настройкам IAM и администрирования

  6. В поле Номер проекта скопируйте значение.

  7. В проекте Apps Script нажмите Значок настроек проекта Настройки проекта.

  8. В разделе Проект Google Cloud Platform (GCP) нажмите Изменить проект.

  9. В поле Номер облачного проекта GCP вставьте номер облачного проекта Google Cloud, скопированный на предыдущих шагах.

  10. Нажмите Настроить проект. Облачный проект и проект Apps Script теперь связаны.

Как создать тестовое развертывание

Вам понадобится идентификатор развертывания для этого проекта Apps Script, чтобы использовать его на следующем шаге.

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

  1. В проекте Apps Script для приложения Chat нажмите Развернуть > Тестовые развертывания.
  2. В разделе Идентификатор развертывания головного устройства нажмите Значок копирования Копировать.
  3. Нажмите Готово.

Как настроить приложение Chat

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

  1. В API Console выполните поиск по запросу Google Chat API и нажмите Google Chat API.
  2. Нажмите Настроить.
  3. Нажмите Настройки и настройте приложение Chat:

    1. В поле Название приложения введите A2A Quickstart.
    2. В поле Avatar URL (URL аватара) введите https://developers.google.com/workspace/chat/images/quickstart-app-avatar.png.
    3. В поле Description (Описание) введите A2A Quickstart.
    4. В разделе Функциональность выберите Присоединяться к чат-группам и групповым чатам.
    5. В разделе "Настройки подключения" выберите Проект Apps Script.
    6. В поле Deployment ID (Идентификатор развертывания) вставьте идентификатор развертывания Head, скопированный ранее.
    7. В разделе "Видимость" выберите Определенные пользователи и группы в вашем домене и введите свой адрес электронной почты.
  4. Нажмите Сохранить.

Приложение Chat готово отвечать на сообщения.

Как протестировать приложение Chat

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

  1. Откройте Google Chat, используя аккаунт Google Workspace, который вы указали, когда добавляли себя в качестве доверенного тестировщика.

    Перейти в Google Chat

  2. Нажмите Новый чат.
  3. В поле Добавьте одного или нескольких пользователей введите название приложения Chat.
  4. Выберите приложение Chat в результатах поиска. Откроется прямая переписка.

  5. В новой прямой переписке с приложением введите The Eiffel Tower was completed in 1900 и нажмитеenter.

    Приложение Chat ответит с помощью субагентов Критик и Редактор.

Чтобы добавить доверенных тестировщиков и узнать больше о тестировании интерактивных функций, ознакомьтесь со статьей Как тестировать интерактивные функции приложений для Google Chat.

Устранение неполадок

Если приложение Google Chat или карточка возвращает ошибку, в интерфейсе Chat появляется сообщение "Что-то пошло не так". или "Не удалось обработать запрос". Иногда в интерфейсе Chat не показывается сообщение об ошибке, но приложение Chat или карточка выдает неожиданный результат, например не появляется сообщение на карточке.

Хотя в интерфейсе Chat может не показываться сообщение об ошибке, при включенном ведении журнала ошибок для приложений Chat вам будут доступны подробные сообщения об ошибках и данные журнала, которые помогут устранить неполадки. Чтобы узнать, как просматривать, отлаживать и исправлять ошибки, ознакомьтесь с разделом Устранение неполадок в Google Chat.

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

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

  1. В Google API Console перейдите на страницу Управление ресурсами. Нажмите Меню > IAM и администрирование > Управление ресурсами.

    Перейти в Менеджер ресурсов

  2. В списке проектов выберите проект, который хотите удалить, и нажмите Удалить .
  3. В диалоговом окне введите идентификатор проекта и нажмите Закрыть, чтобы удалить проект.