Создание ИИ-агентов с помощью ADK: управление рабочими процессами агентов

1. Обзор

Чтобы выполнить запрос на поездку с несколькими ограничениями (например, составить маршрут на целый день по Киото стоимостью менее 100 долларов США с акцентом на исторические храмы и местную кухню и без галерей современного искусства), необходимо извлечь ограничения, одновременно изучить достопримечательности и рестораны, составить подробное расписание и проверить окончательный план. Если полагаться на одного монолитного агента с множеством инструментов, он может пропускать шаги проверки или нарушать исключения. Поэтому оркестрация координирует специализированных субагентов с помощью детерминированных контроллеров рабочих процессов.

В третьей части серии Создание ИИ-агентов с помощью ADK вы создадите автономный многоагентный планировщик путешествий на платформе агентов, используя контроллеры рабочих процессов Agent Development Kit (ADK) 2 (SequentialAgent, ParallelAgent и LoopAgent). На трех последовательных этапах (без необходимости настройки рабочей области из частей 1 и 2) вы скоординируете работу шести специализированных агентов на базе gemini-3.8-flash с общим состоянием сеанса (output_key), параллельным выполнением google_search и итеративным циклом доработки "создатель-проверяющий".

Требования

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

  • Как создать проект ADK 2 с несколькими агентами с нуля
  • Как создать команду специализированных агентов, которые делятся статусом сеанса, используя output_key
  • Как использовать SequentialAgent для выполнения субагентов в детерминированном пошаговом конвейере
  • Как использовать ParallelAgent для одновременного запуска независимых агентов, чтобы снизить задержку
  • Как использовать эскалацию LoopAgent и ToolContext для реализации итеративного цикла уточнения "создатель-проверяющий"
  • Как объединить последовательные, параллельные и циклические шаблоны в иерархический многоагентный рабочий процесс.

Что вам потребуется

  • Аккаунт Google (если вы хотите получить бонусы за участие в семинаре, используйте личный аккаунт @gmail.com).
  • ссылка на бонус от преподавателя (и камера телефона, чтобы отсканировать QR-код) или активный платежный аккаунт Cloud.
  • Google Chrome (рекомендуется использовать окно инкогнито, чтобы не путать личный и рабочий аккаунты).

2. Как получить бонусы Google Cloud (необязательно)

Если вы посещаете семинар, на котором предоставляется ссылка на бонус, воспользуйтесь бонусом Google Developer Program, чтобы создать платежный аккаунт без кредитной карты.

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

  1. Откройте ссылку на бонусы в окне инкогнито и войдите в аккаунт @gmail.com.
  2. На странице Claim Your Benefit (Получить бонус) нажмите Claim Credit (Получить бонус).

Карточка "Получите бонус" в Google Builders Hub с кнопкой "Получить бонус"

  1. Если вам будет предложено создать профиль Google Developer Program, заполните форму.
  2. Когда появится сообщение Отсканируйте, чтобы подтвердить, что вы человек, отсканируйте QR-код с помощью телефона и пройдите проверку. Если QR-код не появился, обновите страницу и снова нажмите Получить бонус.

Диалоговое окно с QR-кодом для подтверждения того, что вы человек, в Google Developer Program

  1. Дождитесь сообщения Бонус за участие в мероприятии успешно активирован и нажмите Открыть платежный аккаунт.

Google Builders Hub с сообщением об успешном получении бонуса и кнопкой "Открыть платежный аккаунт"

🔍 Проверьте свою работу

Настройка платежного аккаунта занимает до 3 минут.

  1. Откройте Google Cloud Billing (или скопируйте URL в окно инкогнито) и выберите Your billing accounts (Ваши платежные аккаунты).
https://console.cloud.google.com/billing
  1. Обновляйте страницу, пока у аккаунта GDP Credit не появится статус Активно.

Страница управления платежным аккаунтом Google Cloud, на которой показан активный платежный аккаунт GDP Credit

3. Создайте проект Google Cloud (необязательно)

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

  1. Откройте страницу Создание проекта или скопируйте URL в окно инкогнито.
https://console.cloud.google.com/projectcreate
  1. Укажите сведения о проекте:
    • Название проекта, например google-cloud-workshop.
    • Платежный аккаунт (если показан): выберите GDP Credit (или ваш активный платежный аккаунт).
    • Родительский ресурс: Без организации (или ваша организация, если требуется).
  2. Запишите сгенерированный идентификатор проекта, который указан под названием проекта, и нажмите Создать.

Экран создания проекта Google Cloud с полями "Название проекта", "Идентификатор проекта", "Родительский ресурс" и кнопкой "Создать"

🔍 Проверьте свою работу

Нажмите Уведомления на панели инструментов в правом верхнем углу, а затем – Выбрать проект.

Меню уведомлений в консоли Google Cloud, в котором показаны ссылки "Создать проект" и "Выбрать проект"

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

Настройте Google Cloud Shell, включите Agent Platform API и создайте изолированную виртуальную среду Python 3.12 с помощью uv.

Как настроить Cloud Shell

  1. Нажмите Activate Cloud Shell (Активировать Cloud Shell) (>_) на панели инструментов консоли Google Cloud или откройте Google Cloud Shell напрямую (или скопируйте URL в окно инкогнито):
https://shell.cloud.google.com/?show=ide,terminal

Кнопка "Активировать Cloud Shell" на панели инструментов консоли Google Cloud

  1. При необходимости нажмите Авторизовать.

Диалоговое окно авторизации Cloud Shell

  1. Выберите активный идентификатор проекта Google Cloud в нумерованном меню терминала.
unset CLOUDSDK_CORE_PROJECT
PS3="Select your project (e.g. 1): "
select PROJECT_ID in $(gcloud projects list --format="value(projectId)"); do
  [ -n "$PROJECT_ID" ] && gcloud config set project "$PROJECT_ID" && break
done

Вы должны увидеть примерно такой результат (для проектов без тегов также выводится информационная строка [environment: untagged]):

1) google-cloud-workshop-4210
2) my-cloud-project-8812
Select your project (e.g. 1): 1
Updated property [core/project].

Убедитесь, что выбранный идентификатор проекта выделен желтым цветом в командной строке Cloud Shell:

Терминал Cloud Shell с выделенным желтым цветом идентификатором проекта

Включите необходимые API

Включите Agent Platform API, чтобы агенты ADK могли вызывать модели Gemini.

gcloud services enable aiplatform.googleapis.com

Вы должны увидеть примерно следующее:

Operation "operations/acat.p2-..." finished successfully.

Как создать виртуальную среду Python и установить ADK

Создайте рабочую область ~/adk-agents и активируйте виртуальную среду Python 3.12:

cd ~
mkdir -p adk-agents && cd ~/adk-agents

which uv >/dev/null 2>&1 || curl -LsSf https://astral.sh/uv/install.sh | sh
export PATH="$HOME/.local/bin:$PATH"

uv venv .venv --python 3.12
source .venv/bin/activate

Убедитесь, что в начале командной строки терминала появился префикс (.venv):

Терминал Cloud Shell с префиксом .venv в активной виртуальной среде Python

Установите ADK 2 в активной виртуальной среде:

uv pip install --no-cache "google-adk==2.14.0"

🔍 Проверьте свою работу

Проверьте установленную версию CLI adk:

adk --version

Вы должны увидеть примерно следующее:

adk, version 2.14.0

5. Создайте каркас агента для планирования путешествий

Когда среда будет готова, используйте встроенную команду ADK adk create, чтобы сгенерировать начальные файлы для пакета агента travel_planner.

Создайте стартовый пакет

Выполните команду adk create из каталога ~/adk-agents:

cd ~/adk-agents
adk create travel_planner

Когда в терминале появится запрос, выберите следующие параметры конфигурации (если при первом запуске появится запрос Enable telemetry? [Y/n]:, нажмите Ввод или введите n и нажмите Ввод):

  1. Выберите модель для корневого агента. Введите 2, чтобы выбрать gemini-3.8-flash (вариант 1 выбирает gemini-3.5-flash), и нажмите Ввод.
  2. Выберите серверную часть. Введите 2, чтобы выбрать серверную часть Google Cloud Agent Platform (вариант 2 в меню CLI ниже), и нажмите Ввод.
  3. Enter Google Cloud project ID (Введите идентификатор проекта Google Cloud). Подтвердите идентификатор проекта, указанный в скобках, нажав клавишу Ввод.
  4. Enter Google Cloud region (Укажите регион Google Cloud): введите global и нажмите Ввод.

adk create записывает GOOGLE_GENAI_USE_ENTERPRISE=1, идентификатор проекта и GOOGLE_CLOUD_LOCATION=global в travel_planner/.env, чтобы ваши учетные данные оставались настроенными при последующем обновлении agent.py.

🔍 Проверьте свою работу

Вы должны увидеть примерно следующее:

Choose a model for the root agent:
1. gemini-3.5-flash
2. gemini-3.8-flash
3. Other models (fill later)
Choose model (1, 2, 3): 2
1. Google AI
2. Vertex AI
3. Login with Google
Choose a backend (1, 2, 3): 2

You need an existing Google Cloud account and project, check out this link for details:
https://google.github.io/adk-docs/get-started/quickstart/#gemini---google-cloud-vertex-ai

Enter Google Cloud project ID [google-cloud-workshop-4210]:
Enter Google Cloud region [us-central1]: global

Agent created in /home/your_username/adk-agents/travel_planner:
- .env
- .gitignore
- __init__.py
- agent.py

⚠️  WARNING: Secrets (like GOOGLE_API_KEY) are stored in .env.

Next steps:
- Chat with your agent in the terminal: adk run travel_planner
- Or in the browser: adk web .
- Have your coding agent evaluate and deploy it: uvx google-agents-cli setup
  (other install options: https://adk.dev/get-started/agents-cli/)

Откройте текущую папку в редакторе кода Cloud Shell, чтобы просматривать и редактировать файлы параллельно с терминалом:

which cloudshell >/dev/null 2>&1 && cloudshell workspace ~/adk-agents || true
cd ~/adk-agents
source .venv/bin/activate

Как протестировать агент по умолчанию

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

cd ~/adk-agents
adk web --allow_origins "*"

Откройте интерфейс разработки в браузере с помощью веб-просмотра Cloud Shell:

  1. Нажмите на значок Web Preview (Предварительный просмотр) на панели инструментов в правом верхнем углу Cloud Shell.
  2. Нажмите Изменить порт, введите 8000 и выберите Изменить и посмотреть.

Диалоговое окно настройки порта для предварительного просмотра в Cloud Shell. Выбран порт 8000.

После загрузки веб-интерфейса ADK отправьте приветствие, например "hello, what can you do?" или "Help me plan a trip to Japan":

Веб-интерфейс ADK Development с простым чатом с одним агентом

Обратите внимание, что root_agent отвечает сразу, не извлекая структурированные предпочтения, не выполняя поиск в интернете и не проверяя бюджет.

Завершив тестирование, нажмите Ctrl + C в терминале Cloud Shell, чтобы остановить сервер adk web и вернуться в командную строку.

6. Как создать рабочий процесс SequentialAgent

Теперь вы создадите свой первый шаблон оркестрации – линейный рабочий процесс на основе SequentialAgent. В последовательном конвейере субагенты выполняются в строгом порядке. Первый специалист извлекает структурированные параметры и сохраняет их в общем состоянии сеанса с помощью output_key="user_preferences", а второй специалист считывает {user_preferences} из общего состояния, чтобы составить маршрут.

Схема архитектуры, на которой показано, как root_agent делегирует задачи агенту master_travel_agent (SequentialAgent), который запускает user_profiler_agent, а затем itinerary_synthesizer_agent через общее состояние сеанса.

Создайте первых специалистов (specialists.py)

Создайте файл specialists.py в папке travel_planner/.

cloudshell edit ~/adk-agents/travel_planner/specialists.py

Вставьте следующий код в travel_planner/specialists.py, чтобы определить user_profiler_agent и itinerary_synthesizer_agent (импортировав ToolContext и google_search для следующих шагов):

from google.adk import Agent
from google.adk.tools import ToolContext, google_search

# --- Specialist 1: The User Profiler ---
user_profiler_agent = Agent(
    name="user_profiler_agent",
    description="Extracts travel preferences and constraints from user input.",
    instruction="""
        Extract destination, duration (default 1 day), budget, interests, and exclusions.
        Return a single JSON object with keys: "destination", "duration", "budget", "interests", "exclusions".
    """,
    output_key="user_preferences",  # Saves output to state['user_preferences']
)

# --- Specialist 2: The Synthesizer ---
itinerary_synthesizer_agent = Agent(
    name="itinerary_synthesizer_agent",
    description="Compiles preferences and research into a final Markdown itinerary.",
    instruction="""
        You are an elite Travel Concierge. Write a Markdown itinerary with an itemized USD and local currency cost breakdown using:
        - User Preferences: {user_preferences}
        - Activities (if available): {activity_recommendations?}
        - Restaurants (if available): {restaurant_recommendations?}
    """,
    output_key="final_itinerary",
)

Подключите последовательный конвейер (workflows.py)

Создайте файл workflows.py в папке travel_planner/, чтобы координировать работу специалистов.

cloudshell edit ~/adk-agents/travel_planner/workflows.py

Добавьте следующее определение SequentialAgent в travel_planner/workflows.py:

from google.adk.agents import SequentialAgent
from .specialists import (
    user_profiler_agent,
    itinerary_synthesizer_agent,
)

# 1. SEQUENTIAL PHASE: A linear two-step workflow
master_travel_agent = SequentialAgent(
    name="master_travel_agent",
    description="Orchestrates the end-to-end travel planning process for trip and itinerary requests.",
    sub_agents=[
        user_profiler_agent,         # Step 1: Extract constraints into user_preferences
        itinerary_synthesizer_agent,  # Step 2: Draft itinerary from user_preferences
    ],
)

Подключите рабочий процесс к root_agent (agent.py)

Теперь зарегистрируйте master_travel_agent как субагента root_agent. Откройте travel_planner/agent.py:

cloudshell edit ~/adk-agents/travel_planner/agent.py

Замените содержимое файла travel_planner/agent.py следующим кодом:

from google.adk import Agent
from .workflows import master_travel_agent

MODEL = "gemini-3.8-flash"

root_agent = Agent(
    model=MODEL,
    name="root_agent",
    description="A helpful assistant for user questions.",
    instruction=(
        "Greet the user and delegate any travel or trip planning requests "
        "to master_travel_agent."
    ),
    sub_agents=[master_travel_agent],
)

🔍 Проверьте свою работу

Запустите веб-интерфейс ADK из терминала:

cd ~/adk-agents
adk web --allow_origins "*"

Откройте веб-просмотр на порте 8000 и введите запрос:

Help me plan a trip to Kyoto

В представлении События вы должны увидеть примерно следующее:

1. root_agent -> calls transfer_to_agent(agent_name="master_travel_agent")
2. user_profiler_agent -> outputs JSON {"destination": "Kyoto", "duration": "1 day", ...} to state['user_preferences']
3. itinerary_synthesizer_agent -> reads {user_preferences} and outputs the formatted Markdown itinerary

Веб-интерфейс ADK 2.14.0, в котором показан граф выполнения от root_agent через master_travel_agent до user_profiler_agent и itinerary_synthesizer_agent, а также сгенерированный маршрут по Киото.

Нажмите на любой значок события (или на чип State: final_itinerary) и перейдите на вкладку State (Состояние) на панели инспектора слева, чтобы убедиться, что в состоянии сеанса заполнены оба параметра: user_preferences и final_itinerary.

Закончив проверку трассировки, нажмите Ctrl + C в терминале, чтобы остановить adk web.

7. Проводите исследования с помощью ParallelAgent

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

  • activity_finder_agent находит три достопримечательности, которые соответствуют пункту назначения и интересам пользователя, и указывает примерные цены на билеты.
  • restaurant_finder_agent: находит три местных ресторана с высоким рейтингом и указывает примерную стоимость на человека.

Поскольку поиск достопримечательностей и поиск ресторанов не зависят друг от друга, их последовательное выполнение приводит к потере времени. Вместо этого вы поместите обоих исследователей в ParallelAgent (parallel_research_agent), чтобы ADK выполнял оба рабочих процесса Google Поиска одновременно и заполнял {activity_recommendations?} и {restaurant_recommendations?} перед передачей в itinerary_synthesizer_agent.

Схема архитектуры, на которой показано, как master_travel_agent запускает user_profiler_agent на этапе 1, parallel_research_agent (ParallelAgent с activity_finder_agent и restaurant_finder_agent) на этапе 2 и itinerary_synthesizer_agent на этапе 3.

Добавить специалистов по параллельным исследованиям в specialists.py

Откройте travel_planner/specialists.py:

cloudshell edit ~/adk-agents/travel_planner/specialists.py

Добавьте в конец файла travel_planner/specialists.py (сразу после itinerary_synthesizer_agent) следующие две строки, относящиеся к Google Поиску:

# --- Specialist 3: The Activity Finder ---
activity_finder_agent = Agent(
    name="activity_finder_agent",
    description="Finds 3 attractions matching the user's destination and interests.",
    instruction="""
        Based on {user_preferences}, use google_search to find 3 specific attractions (including budget-friendly options).
        Return a JSON list with keys: "attraction_name", "estimated_cost_local", "estimated_cost_usd", "notes".
    """,
    tools=[google_search],
    output_key="activity_recommendations",
)

# --- Specialist 4: The Restaurant Finder ---
restaurant_finder_agent = Agent(
    name="restaurant_finder_agent",
    description="Finds 3 restaurants matching the destination and budget.",
    instruction="""
        Based on {user_preferences}, use google_search to find 3 highly-rated restaurants across price points.
        Return a JSON list with keys: "restaurant_name", "cuisine", "estimated_cost_local", "estimated_cost_usd".
    """,
    tools=[google_search],
    output_key="restaurant_recommendations",
)

Вставить ParallelAgent в workflows.py

Откройте travel_planner/workflows.py:

cloudshell edit ~/adk-agents/travel_planner/workflows.py

Обновите travel_planner/workflows.py, чтобы определить parallel_research_agent с помощью ParallelAgent, и поместите его между user_profiler_agent и itinerary_synthesizer_agent:

from google.adk.agents import ParallelAgent, SequentialAgent
from .specialists import (
    activity_finder_agent,
    itinerary_synthesizer_agent,
    restaurant_finder_agent,
    user_profiler_agent,
)

# Parallel branch: Run activity and restaurant research simultaneously
parallel_research_agent = ParallelAgent(
    name="parallel_research_agent",
    description="Runs activity and restaurant research concurrently.",
    sub_agents=[
        activity_finder_agent,
        restaurant_finder_agent,
    ],
)

# Master pipeline: Profile -> Parallel Research -> Synthesize
master_travel_agent = SequentialAgent(
    name="master_travel_agent",
    description="Orchestrates the end-to-end travel planning process for trip and itinerary requests.",
    sub_agents=[
        user_profiler_agent,          # Step 1: Extract constraints
        parallel_research_agent,      # Step 2: Research activities & restaurants in parallel
        itinerary_synthesizer_agent,  # Step 3: Synthesize into an itinerary
    ],
)

🔍 Проверьте свою работу

Снова запустите adk web, чтобы протестировать параллельный конвейер исследований:

cd ~/adk-agents
adk web --allow_origins "*"

В интерфейсе Web Preview отправьте запрос:

Help me plan a trip to Kyoto focused on historic temples and ramen

В представлении События вы должны увидеть примерно такую последовательность:

1. user_profiler_agent -> writes state['user_preferences']
2. parallel_research_agent -> fans out concurrently:
   - activity_finder_agent invokes google_search -> writes state['activity_recommendations']
   - restaurant_finder_agent invokes google_search -> writes state['restaurant_recommendations']
3. itinerary_synthesizer_agent -> merges all three state keys into state['final_itinerary']
  1. Просмотр трассировок. Нажмите Трассировки в верхней части панели чата (рядом с пунктом События) и проверьте реплику. Вы увидите, что временные шкалы для activity_finder_agent и restaurant_finder_agent в разделе parallel_research_agent перекрываются. Это означает, что общая задержка при поиске в интернете сократилась почти вдвое по сравнению с последовательным выполнением этих задач.
  2. Вкладка State (Состояние). Нажмите на вкладку State (Состояние) на панели инспектора слева, чтобы проверить словарь текущего сеанса (user_preferences, activity_recommendations, restaurant_recommendations и final_itinerary).

Завершив тестирование, нажмите Ctrl + C в терминале, чтобы остановить adk web.

8. Как дорабатывать черновики с помощью LoopAgent

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

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

  1. itinerary_critic_agent (The Checker): Audits {final_itinerary} against {user_preferences}. Она суммирует расчетные затраты, проверяет каждое отрицательное ограничение и либо записывает конкретные инструкции по пересмотру в critique_feedback, либо отвечает точной фразой "APPROVED".
  2. itinerary_refiner_agent (создатель/выход): считывает свойство {critique_feedback}. Если критика равна "APPROVED", вызывается инструмент exit_loop (tool_context.actions.escalate = True), чтобы немедленно выйти из LoopAgent. В противном случае он исправляет {final_itinerary}, чтобы устранить помеченные проблемы, и перезаписывает final_itinerary для следующего прохода.

Схема архитектуры, на которой показан агент master_travel_agent с агентом refinement_loop_agent (LoopAgent) этапа 4, который циклически переключается между агентами itinerary_critic_agent и itinerary_refiner_agent, пока не будет вызван агент exit_loop.

Добавьте exit_loop, Critic и Refiner в specialists.py.

Откройте travel_planner/specialists.py:

cloudshell edit ~/adk-agents/travel_planner/specialists.py

Добавьте инструмент exit_loop (ToolContext), itinerary_critic_agent и itinerary_refiner_agent в нижнюю часть travel_planner/specialists.py:

def exit_loop(tool_context: ToolContext) -> dict:
    """Call ONLY when the critique is APPROVED to exit the refinement loop."""
    print(f"[Tool Call] exit_loop triggered by {tool_context.agent_name}")
    tool_context.actions.escalate = True
    return {"status": "approved", "message": "Itinerary approved. Exiting refinement loop."}


# --- Specialist 5: The Budget & Constraint Critic (Inside LoopAgent) ---
itinerary_critic_agent = Agent(
    name="itinerary_critic_agent",
    include_contents="none",
    description="Audits the itinerary draft against budget and negative constraints.",
    instruction="""
        Audit Current Itinerary ({final_itinerary}) against User Preferences ({user_preferences}).
        Verify that the USD total stays within the user's budget and no excluded venue types appear.
        If all checks pass, respond EXACTLY with the single word "APPROVED".
        Otherwise, output 1-2 concise revision instructions explaining what to swap or adjust.
    """,
    output_key="critique_feedback",
)

# --- Specialist 6: The Itinerary Refiner / Exiter (Inside LoopAgent) ---
itinerary_refiner_agent = Agent(
    name="itinerary_refiner_agent",
    include_contents="none",
    description="Refines the itinerary from critique feedback, or calls exit_loop when APPROVED.",
    instruction="""
        Review Auditor Critique ({critique_feedback}) for Current Itinerary ({final_itinerary}).
        If the critique is EXACTLY "APPROVED", call `exit_loop` immediately and return the itinerary unchanged.
        Otherwise, revise the draft using {activity_recommendations} and {restaurant_recommendations}
        so all USD budget and exclusion rules pass, and output ONLY the updated Markdown itinerary.
    """,
    tools=[exit_loop],
    output_key="final_itinerary",
)

Добавьте аудиторию "LoopAgent" в кампании: workflows.py.

Откройте travel_planner/workflows.py:

cloudshell edit ~/adk-agents/travel_planner/workflows.py

Обновите travel_planner/workflows.py, чтобы обернуть itinerary_critic_agent и itinerary_refiner_agent в LoopAgent (max_iterations=3) и добавить его в качестве четвертого этапа master_travel_agent:

from google.adk.agents import LoopAgent, ParallelAgent, SequentialAgent
from .specialists import (
    activity_finder_agent,
    itinerary_critic_agent,
    itinerary_refiner_agent,
    itinerary_synthesizer_agent,
    restaurant_finder_agent,
    user_profiler_agent,
)

# Stage 2: Parallel research branch
parallel_research_agent = ParallelAgent(
    name="parallel_research_agent",
    description="Runs activity and restaurant research concurrently.",
    sub_agents=[
        activity_finder_agent,
        restaurant_finder_agent,
    ],
)

# Stage 4: Iterative Maker-Checker refinement loop
refinement_loop_agent = LoopAgent(
    name="refinement_loop_agent",
    description="Iteratively audits and refines the itinerary until constraints and budget are approved.",
    sub_agents=[
        itinerary_critic_agent,
        itinerary_refiner_agent,
    ],
    max_iterations=3,
)

# Master pipeline: Profile -> Parallel Research -> Synthesize -> Refinement Loop
master_travel_agent = SequentialAgent(
    name="master_travel_agent",
    description="Orchestrates the end-to-end travel planning process for trip and itinerary requests.",
    sub_agents=[
        user_profiler_agent,          # Stage 1: Extract constraints
        parallel_research_agent,      # Stage 2: Research activities & restaurants in parallel
        itinerary_synthesizer_agent,  # Stage 3: Draft initial itinerary
        refinement_loop_agent,        # Stage 4: Audit and refine until approved
    ],
)

🔍 Проверьте свою работу

Запустите adk web, чтобы протестировать весь рабочий процесс с несколькими агентами:

cd ~/adk-agents
adk web --allow_origins "*"

Откройте интерфейс предварительного просмотра в браузере на порте 8000, начните новый сеанс и протестируйте всю систему с помощью этого запроса с несколькими ограничениями для Киото:

Design a full-day itinerary for Kyoto with a total budget of $100. My main interests are historical landmarks, temples, and authentic local cuisine. Please do not include any modern art museums or galleries.

В представлении События и журналах терминала вы должны увидеть примерно такую последовательность выполнения:

1. user_profiler_agent -> writes JSON with destination="Kyoto", budget="$100", exclusions=["modern art museums", "galleries"]
2. parallel_research_agent -> runs activity_finder_agent and restaurant_finder_agent in parallel
3. itinerary_synthesizer_agent -> produces initial draft in state['final_itinerary']
4. refinement_loop_agent:
   - itinerary_critic_agent -> audits USD budget and exclusions -> outputs "APPROVED" (or revision notes)
   - itinerary_refiner_agent -> triggers [Tool Call] exit_loop triggered by itinerary_refiner_agent and outputs the approved itinerary
  1. Режим событий. Нажмите на любой чип события в itinerary_critic_agent или itinerary_refiner_agent, чтобы посмотреть его полезную нагрузку на вкладке Информация слева. Когда itinerary_refiner_agent вызывает exit_loop, проверьте событие, чтобы увидеть actions.escalate: true – сигнал, который сообщает LoopAgent, что нужно остановить итерацию до достижения max_iterations=3.
  2. Вкладка State (Состояние). Нажмите на вкладку State (Состояние), чтобы посмотреть, как обновляются значения state['critique_feedback'] и state['final_itinerary'] в разных картах. Если первоначальный черновик превысил $100 USD, critique_feedback содержит инструкции аудитора по пересмотру на этапе 1, прежде чем final_itinerary обновится с более дешевыми альтернативами, а critique_feedback изменится на "APPROVED" на этапе 2.

Завершив тестирование, нажмите Ctrl + C в терминале, чтобы остановить adk web.

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

Удалите файлы проекта в локальном хранилище браузера

Чтобы удалить каталог проекта adk-agents и виртуальную среду из главной папки Cloud Shell, выполните следующую команду:

cd ~
rm -rf ~/adk-agents

Как отключить Agent Platform API

Если вам больше не нужен Agent Platform API, отключите его с помощью gcloud:

gcloud services disable aiplatform.googleapis.com --quiet

Удалите весь облачный проект Google Cloud (необязательно)

PROJECT_ID=$(gcloud config get-value project)
gcloud projects delete "$PROJECT_ID" --quiet

🔍 Проверьте свою работу

Подтвердите, что ~/adk-agents удален:

test ! -d ~/adk-agents && echo "Workspace ~/adk-agents removed"

Вы должны увидеть примерно следующее:

Workspace ~/adk-agents removed

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

Поздравляем! Вы создали иерархическую многоагентную систему с помощью Google Agent Development Kit (ADK), которая координирует команду из шести специализированных агентов в последовательных, параллельных и итеративных рабочих процессах.

Чего вы достигли

  • Структурированное взаимодействие между агентами через общее состояние сеанса (внедрение шаблонов output_key и {state_variable}).
  • Создан детерминированный пошаговый конвейер с помощью SequentialAgent.
  • Одновременно запущены независимые агенты Google Поиска для исследований с помощью ParallelAgent
  • Внедрил автоматизированный цикл проверки с участием двух специалистов, используя LoopAgent и tool_context.actions.escalate = True.

Дальнейшие действия