Создание простого туристического агентства с помощью ADK и Gemini CLI

1. Введение

9344c1d1a9f221b7.png

Последнее обновление: 02.02.2026

Создание простого туристического агентства с помощью ADK

Добро пожаловать на этот мастер-класс по ADK Python(*), который, благодаря Gemini CLI, включает в себя все необходимые инструменты!

Данный практический семинар разделен на два 🏅 этапа:

  1. Простой и распространенный путь обучения: настройка + мгновенное удовлетворение.
  2. Индивидуальный маршрут, в котором вы выбираете задачу для решения с помощью Gemini CLI.

Вторая часть делает этот практический проект идеальным для хакатона (и предусматривает призы за самые креативные решения!).

Первый этап: Ваш первый агент с ADK и Gemini CLI

Цель этого этапа — поэтапное создание простого туристического агентства с использованием ADK.

Для этого нам сначала нужно настроить Gemini CLI так, чтобы он помогал нам писать код с использованием ADK; это позволит вашей локальной оболочке выбирать последнюю версию Python ADK, анализировать код и документацию и предоставлять самый актуальный/оптимальный код для работы с ним в соответствии с вашей целью.

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

Этап 2: Расширение полномочий вашего агента

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

Что вы построите

В этом практическом занятии вы создадите приложение для туристического агентства, используя ADK и Gemini CLI. Ваше приложение будет:

  • Подключайтесь к API Airbnb через Airbnb MCP.
  • Ищите в интернете актуальную информацию (погода, даты и т. д.).
  • Запуск пользовательских инструментов.
  • Создайте изображения квартир/комнат с помощью NanoBanana.

Gemini CLI поможет вам во всем этом: писать/проверять код и находить актуальную документацию в локальном зеркале репозитория ADK (на Python или любом другом языке программирования).

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

  • Как создать приложение с помощью ADK
  • Как использовать Gemini CLI для создания приложений на основе локальной документации!
  • Как взаимодействовать с сервером MCP для подключения к внешним источникам данных в режиме реального времени, например, так:

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

  • Компьютер, позволяющий устанавливать пакеты (например, npm install .. ).
  • Базовые навыки программирования на Python, TypeScript, Go или Java.
  • Настоятельно рекомендуется использовать какую-либо интегрированную среду разработки (например, Antigravity , vscode, IntelliJ, vim).

Почему ADK + Gemini CLI?

Некоторые из вас могут задаться вопросом: зачем мне использовать ADK (SDK для создания агентов) в сочетании с локальным вспомогательным инструментом для работы с агентами (например, Gemini CLI)? Причина в том, что оба инструмента невероятно мощны, но их взаимодействие не является тривиальным; многие пытались работать с ними одновременно и потерпели неудачу (в основном из-за проблем с «зацикливанием»). В этом практическом занятии мы постараемся поделиться несколькими советами о том, как сделать это сосуществование возможным.

2. Настройка

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

Выполните практическое занятие на своем компьютере или запустите Cloud Shell, если хотите провести это занятие полностью в облаке.

Настройка среды для самостоятельного обучения

  1. Войдите в консоль Google Cloud и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

  • Название проекта — это отображаемое имя участников данного проекта. Это строка символов, не используемая API Google. Вы всегда можете его изменить.
  • Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (его нельзя изменить после установки). Консоль Cloud автоматически генерирует уникальную строку; обычно вам неважно, какая она. В большинстве практических заданий вам потребуется указать идентификатор вашего проекта (обычно обозначается как PROJECT_ID ). Если сгенерированный идентификатор вас не устраивает, вы можете сгенерировать другой случайный идентификатор. В качестве альтернативы вы можете попробовать свой собственный и посмотреть, доступен ли он. После этого шага его нельзя изменить, и он сохраняется на протяжении всего проекта.
  • К вашему сведению, существует третье значение — номер проекта , которое используется некоторыми API. Подробнее обо всех трех значениях можно узнать в документации .
  1. Далее вам потребуется включить оплату в консоли Cloud для использования ресурсов/API Cloud. Выполнение этого практического задания не потребует больших затрат, если вообще потребует. Чтобы отключить ресурсы и избежать дополнительных расходов после завершения этого урока, вы можете удалить созданные ресурсы или удалить проект. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Запустить Cloud Shell

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

В консоли Google Cloud нажмите на значок Cloud Shell на панели инструментов в правом верхнем углу:

Активировать Cloud Shell

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

Скриншот терминала Google Cloud Shell, показывающий, что среда подключена.

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

Предварительные условия (установка)

Для выполнения этого руководства вам необходимо установить:

1. Python и UV

python и uv (менеджер пакетов для Python ). Это необходимо для ADK . Убедитесь, что у вас установлен uv :

$ curl -LsSf https://astral.sh/uv/install.sh | sh

Почему именно uv? Хотя вы можете использовать любой менеджер Python по своему усмотрению, использование uv гарантирует, что настройка ENV/PATH для Python будет одинаковой как для вас, так и для Gemini CLI, поэтому ваш опыт работы с оболочкой будет в основном таким же, как и в Gemini CLI. Например, если вы используете virtualenv , Gemini CLI будет вынужден выполнять такие действия, как "source .env/venv/bin/activate && my-original-command", чтобы имитировать вашу среду.

2. Gemini CLI

Инструкции по установке gemini CLI можно найти здесь: https://github.com/google-gemini/gemini-cli .

Примечание: Для этого необходимо установить npm или npx.

npm install -g @google/gemini-cli

  1. На Mac вы можете использовать brew в соответствии с официальной документацией .
  2. В Windows можно использовать chocolatey или просто скачать исполняемый файл с сайта https://nodejs.org/en/download

Для шага 4 (позже) вам также потребуется установить npx . И npm , и npx должны быть частью Gemini CLI. Если нет, обратитесь за помощью в Gemini CLI.

При желании вы также можете установить просто , это более продвинутый и самодокументируемый Makefile . Также здесь: обратитесь за помощью в установке к Gemini CLI, он может сделать это за вас!

efade99623113f1.png

Аутентификация.

Для этого вам потребуется либо проект Google Cloud с включенной функцией Vertex AI, либо ключ API Google AI Studio .

Вариант A (рекомендуется для семинара): Экспортируйте свой API-ключ:

export GOOGLE_API_KEY="your-api-key"

Вариант B (Vertex AI): Аутентификация с помощью gcloud:

export GOOGLE_CLOUD_PROJECT="YOUR_PROJECT_ID"
export GOOGLE_CLOUD_LOCATION="YOUR_PROJECT_LOCATION"
export GOOGLE_GENAI_USE_VERTEXAI=true
gcloud auth application-default login

Обустройте свое рабочее место.

Вы собираетесь создать СОБСТВЕННОЕ решение в папке mysolution/ поэтому давайте создадим папку и два необходимых нам файла.

Сейчас самое время открыть свою IDE (Visual Studio Code, IntelliJ, RubyMine и т. д.) и открыть папку.

# 1. Find an empty directory, and download this repo.
git clone https://github.com/palladius/ai-friendly-agents/
cd ai-friendly-agents/adk/workshops/simple-travel-agent/

# 2. Create your solution empty skeleton
mkdir -p mysolution/
touch mysolution/__init__.py mysolution/agent.py

# 3. This installs ADK and MCP via `uv` by reading pyproject.toml
uv sync

# 4. Call Gemini CLI
gemini  # This runs Gemini CLI under the simple-travel-agent/ folder.
# Login with your GMail account.

uv sync не является строго обязательной, но если она не удается, значит, вам нужно исправить установку Python или UV .

Доступные решения

Весь код находится в папке 📂 steps/ . Вы можете свободно скопировать код оттуда.

Цель этого практического занятия не в том, чтобы научиться писать качественный код для ADK; цель — настроить вашу среду таким образом, чтобы ХОРОШИЙ код писался автоматически под вашим руководством.

  1. Установка программного обеспечения
  2. настройка/настройка его работы, и
  3. вход в праведный цикл обратной связи

Именно этому мы хотим, чтобы вы здесь научились. Вы также можете протестировать все варианты одновременно с помощью команды $ just web-4steps !`.

3. Шаг 1: Базовый агент

abfef47ab2ff0c98.png

Начнём с создания базового агента, способного вести диалог.

Отредактируйте файл mysolution/__init__.py , добавив следующее содержимое:

from .agent import root_agent

Всё очень просто! Это позволяет ADK узнать, где находится ваш код: в agent.py .

Отредактируйте файл mysolution/agent.py , добавив следующее содержимое:

from google.adk.agents import Agent

root_agent = Agent(
    name="travel_basic",
    model="gemini-2.5-flash",
    instruction="You are a helpful travel assistant." +
    "You can help with general travel advice based on your knowledge.",
)

Тестирование агента

Это справедливо для всех этапов. ADK позволяет тестировать агента двумя способами: через командную строку и через веб-интерфейс.

  • Интерфейс командной строки лучше всего подходит для быстрых и автоматизированных тестов.
  • Веб — лучший способ визуально увидеть, что происходит, использовать микрофон (!) и устранять неполадки.

Совет : для выполнения этого упражнения, чтобы сделать что-либо (кроме модульного тестирования), используйте веб-интерфейс. Это действительно потрясающе! Используйте командную строку только для автоматизированного тестирования.

В качестве хорошей подсказки, которая должным образом проверяет шаги 1-2-3-4, можно использовать следующий пример (умная "лакмусовая подсказка":

# <!– litmus prompt –> Привет, я хотела бы забронировать отель в Париже на завтрашний вечер, одну ночь, в центре Парижа. В идеале, недалеко от вокзала Лион. Бюджет: менее 200 евро за ночь.

  1. Скажите, какой завтрашний день (ГГГГММДД) и какой день недели.
  2. Скажите, какой отель вы видите на завтра (как минимум 3). Мне нужна информация о: цене, адресе, рейтинге (в формате XX/YY, например, "4.7/5" - из Google Hotels, Booking или Airbnb), количестве отзывов. Предоставьте данные в табличном формате. В идеале, название отеля должно быть связано с URL-адресом отеля (не нужно добавлять столбец с URL). Убедитесь, что ссылка действительна (работает и ведет на страницу с информацией об отеле!).

Это продуманный запрос, поскольку он проверяет время и отели и будет давать разные ошибки на шагах 1, 2, 3, а полностью успешно завершится только на шаге 4. Конечно, вы можете использовать любой запрос по своему усмотрению!

Запустите его из bash (CLI):

# 1. If ADK was installed:
adk run mysolution/
# ... but if you get: -bash: adk: command not found"
# 2. Call ADK cli script through UV to avoid python install nightmares.
uv run adk run mysolution/

Попробуйте использовать указанную выше "подсказку".

Скорее всего, оно не сможет распознавать конкретные даты. Нам нужно научить его распознавать даты!

Для веб-сайтов это можно сделать следующим образом:

  1. uv run adk web . : Эта команда запускает все агенты в этой папке. Вам нужно указать путь к подпапке "mysolution/".
  2. Выберите mysolution/ в правом верхнем углу ( см. изображение рядом ).
  3. Задайте свой вопрос в текстовом формате или через микрофон, используя что-то вроде "подсказки".

TODO(ricc): <изображение здесь>

Обратите внимание, что запускать adk web нужно из папки, расположенной выше, в соответствии с версией CLI.

Вот возможное решение, с полугаллюцинацией во время свидания. Обратите внимание, что 3 из 5 ссылок для бронирования работают! Неплохо.

4. Шаг 2: Добавьте инструмент now()

Агент не знает, что такое «сегодня». Давайте дадим ему инструмент.

TODO(image): ricc put here image of step2.

Добавьте эту функцию в agent.py непосредственно перед определением root_agent :

from datetime import datetime

def now() -> dict:
    """Returns the current date and time."""
    my_datetime = ... # Ask Gemini CLI to help you!
    return {
        "status": "success",
        "current_time": my_datetime
    }

Обновите определение агента, добавив в него инструмент:

  # file XXX.py

  travel_agent = LlmAgent(
        name="..",
        model="..",
        instruction="..",
        tools=[now] # <== This is the only line you want to add.
    )

Запустите программу еще раз и задайте тот же вопрос. Теперь она должна знать дату (хорошо) и нечетко указывать отели (плохо)!

Вы также можете проверить это примерно так:

# Let's pretend we're in Milan. This should call the tool
# and respond correctly (possibly with some TZ math issues)

echo "What time is it in Milan?" | uv run adk run mysolution/

5. Шаг 3: Давайте сменим тему: google_search

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

3cd72c019b8b225f.png

Ваша задача — модифицировать агента из шага 2. Вместо инструмента now вы импортируете и используете инструмент google_search из библиотеки ADK.

# Full Code: `steps/step03_search/agent.py`
# Remember to REMOVE the now() tool here. See above why.
from google.adk.agents import Agent
from google.adk.tools import google_search

root_agent = Agent(
    name="travel_agent",
    model="gemini-2.5-flash",
    tools=[google_search],
    instruction="""You are a travel agent.
Your job is to help the user plan a trip.
You have access to a search engine.
If you don't know the answer, you can use the search engine.
When you are done, reply with "DONE".""",
)

Как бегать

Аналогично шагу 1.

Только для экспертов . Для более сложной интеграции (с использованием google_search и now together) ознакомьтесь с кодом в steps/step03b_search_and_tool/agent.py и запустите его с помощью just run-step3b . Это совершенно необязательно.

6. Шаг 4: Более совершенный инструмент: MCP

TODO(ricc): добавить изображение 4

Теперь, когда мы рассмотрели как пользовательские, так и встроенные инструменты, давайте перейдем к чему-то более мощному: шаблону «Модель как инструмент» с использованием протокола контекста модели (MCP) .

Чтобы на этом этапе сосредоточиться на мощных возможностях MCP, мы снова заменим наш предыдущий инструмент ( google_search ). Мы вновь представим наш простой инструмент now , который будет работать параллельно с инструментом airbnb_mcp . Это демонстрирует, как агент может использовать несколько совместимых инструментов (в данном случае, FunctionTool и MCPToolset ) для выполнения сложных задач.

# Full Code: steps/step04_mcp/agent.py
# ... Imports as before
from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset
from google.adk.tools.mcp_tool.mcp_session_manager import StdioConnectionParams
from mcp import StdioServerParameters

def now() -> dict:
    # ... as before

# Configure the Airbnb MCP Toolset
airbnb_mcp = MCPToolset(
    connection_params=StdioConnectionParams(
        server_params=StdioServerParameters(
            command='npx',
            args=["-y", "@openbnb/mcp-server-airbnb", "--ignore-robots-txt"],
        ),
    )
)

root_agent = Agent(
    name="travel_mcp",
    model="gemini-2.5-flash",
    instruction="You are a helpful travel assistant. You can find accommodation using Airbnb, and have access to the current time.",
    tools=[now, airbnb_mcp],
)

Как бегать

Для выполнения этого шага необходимо установить npx на вашу систему. В остальном все аналогично описанному выше.

Предостережения/Ошибки

  1. Если вы получаете ошибку ограничения robots.txt , вы можете внести изменения в MCP, добавив директиву ignore robots. Подробнее см. в документации: https://github.com/openbnb-org/mcp-server-airbnb
  2. Если вы получаете ошибку timeout (5 секунд — слишком мало для получения ответов от Airbnb), обратитесь к документации ADK, чтобы узнать, как увеличить тайм-аут, например, до 30 секунд. Или... используйте Gemini CLI! Обратите внимание, что 25 декабря Cloud Shell выдал мне ошибку тайм-аута, я исправил ошибку тайм-аута, но ошибки всё ещё возникали, пока я не принудительно установил предыдущую версию: args=["-y", "@openbnb/mcp-server-airbnb@0.1.2", "--ignore-robots-txt"] .

7. 🏅 Первый этап завершен!

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

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

Теперь пришло время добавить дополнительную функциональность с помощью «Gemini CLI».

8. 🏅 Этап 2: освоение ADK с помощью Gemini CLI и создание собственного кода.

Теперь мы переходим к самой интересной части мастер-класса.

  1. Убедитесь, что вы зафиксировали изменения в коде с помощью git commit в надёжном месте. Вы можете создать форк оригинального кода или отдельную ветку: не волнуйтесь, Gemini CLI отлично вам в этом поможет!
  2. Найдите 💡 идею для реализации. Вы можете ознакомиться с идеями ниже, найти подходящую самостоятельно или попросить Gemini посмотреть документацию в rag/ и предложить несколько интересных идей.
  3. Выполните необходимые предварительные условия , чтобы Gemini мог читать документацию ADK, и после этого всё будет в порядке!

💡 Идеи

Вот меню с несколькими идеями различной сложности.

  1. 🟢 [легко] Вы владеете несколькими языками программирования? Хотите попробовать go , java или Typescript ? Рефакторинг существующего кода очень прост! Просто скачайте соответствующий ADK и попросите Gemini CLI выполнить перевод!
  2. 🟢 [просто] Добавьте эмодзи или укажите желаемый формат вывода (например, таблица с эмодзи отеля, затем цена, а затем эмодзи от 1 до 5 звезд, используя 🌕🌕🌕🌗🌑 для отображения и половинных оценок!).
  3. 🟢 [просто] Измените подсказку, чтобы она обучала вас конкретным критериям, которые вы ищете или не ищете (разрешено проживание с животными, нет первого этажа, тихо, рядом с общественным транспортом и т. д.), и протестируйте. Возможно, добавьте личную оценку, например, «оценка YOUR_NAME по шкале от 1 до 10», основанную на вышеописанном, и отсортируйте по этой оценке.
  4. 🟢 [просто] Есть ли оператор в комнате? Разверните в Cloud Run ! Или в Vertex AI Agent Engine ! Знаете ли вы, что можете интегрировать этого агента и вызывать его напрямую из новой Gemini Enterprise ?
  5. 🟢 [простой вариант] Интегрируйте `adk run` с 🍌 NanoBanana MCP . Требуется ключ API Gemini . Здесь вы сможете создавать изображения, но не визуализировать их. Более сложный вариант см. ниже.
  6. 🟡 [средний уровень сложности] Создайте субагента, который будет выполнять поиск HotelSearch , и создайте BudgetAgent или агента LocationAgent , который сможет перебирать отели, учитывая ваши требования к местоположению, например, «не дальше X км от МЕСТОПОЛОЖЕНИЯ». Если API этого не позволяет, возможно, потребуется обмен данными с помощью GoogleSearch. Примечание: Gemini CLI может вам помочь.
  7. 🟡 [средний уровень сложности] Реализуйте AirbnbReviewAgent , который будет анализировать отзывы и суммировать положительные и отрицательные моменты в виде нескольких цветовых блоков для 1 или N отелей, найденных в результате поиска. У вас уже есть 2 компонента (GoogleSearch и MCP Airbnb), затем вам нужно связать это с основным агентом и, возможно, разработать какой-то протокол для их взаимодействия.
  8. 🟡 [средний уровень сложности] Интегрируйте с A2A . Сделайте его агентом A2A! Снова обратитесь за помощью в Gemini CLI!
  9. 🔴 [сложный] Вы можете интегрировать с Flights или другими функциями MCP для создания многофункционального туристического агентства.
  10. 🔴 [сложная задача] Интеграция ADK web с 🍌 NanoBanana MCP . Это сложнее, чем предыдущая задача, и вы можете найти несколько советов в https://github.com/palladius/ai-friendly-agents/issues/11 . Автору потребовалось 3 часа переписки с Gemini CLI, Gemini3 и чтения документации/кода с rag/ !

Ищете дополнительное вдохновение?

  1. Загляните в замечательный учебник по ADK от Маурицио, там вы найдете несколько полезных идей.
  2. Попросите Gemini CLI найти идеи, изучив документацию в rag/ : возможный запрос может быть таким: Is there a feature in here which seems very succulent to you? Give me 3 proposals and let's implement together the one I choose .

Предварительные требования для ADK "RAG"

Для реализации функциональности с помощью Vibe Code мы рекомендуем загрузить полный Python ADK (обратите внимание: его можно очень легко адаптировать под ваш любимый язык, например, Java или Go !).

Код находится в папке ./rag и может быть загружен с помощью ./download-adk.sh .

Поскольку папка rag указана в вашем файле .gitignore , убедитесь, что ваш файл .gemini/settings.json содержит следующее:

{
 "context": {
   "includeDirectories": ["rag"]
 }
}

Почему? Мы хотим, чтобы Gemini мог читать эти файлы, при этом они должным образом игнорируются Git. Технически, вы также можете отобразить все файлы .gitignore, установив context.fileFiltering.respectGitIgnore в false , но это создаст много мусора в node_modules/ и __pycache__/ , поэтому явное включение папок является предпочтительным вариантом.

9. Дальнейшие шаги

Интересный факт : Этот мастер-класс был создан с помощью Gemini CLI. Если вам интересно, вы можете узнать, как я это сделал, изучив файлы GEMINI.md и WORKSHOP_PLAN.md в этой папке.

Уроки, извлеченные из опыта

Мы научились использовать ADK в паре с Gemini CLI.

Дополнительные материалы для чтения

6d05afb6b8b235d8.png