1. Введение
В этом практическом занятии вы создадите сложный агент Marathon Planner, используя комплект разработки агентов (ADK). Вы постепенно изучите возможности агента, начиная от хорошо структурированной системной подсказки и заканчивая динамической загрузкой навыков и сопоставлением инструментов MCP. Наконец, вы протестируете агента локально и развернете его в среде выполнения агентов (Agent Engine).
Что вы будете делать
- Инициализировать новый проект агента ADK .
- Создайте надежную системную подсказку с помощью конструктора структурированных сообщений.
- Добавьте инструменты Google Maps MCP для отображения реального местоположения.
- Динамическая загрузка навыков в набор инструментов агента.
- Проверьте выполнение агента локально.
- Разверните агент в Agent Engine (Cloud Run).
Что вам понадобится
- Веб-браузер, например Chrome.
- Проект Google Cloud с включенной функцией выставления счетов.
- Базовые знания Python.
Этот практический семинар предназначен для разработчиков среднего уровня, стремящихся создавать специализированных агентов генеративного искусственного интеллекта.
Ориентировочная продолжительность: 45 минут
Стоимость ресурсов, созданных в рамках этого практического занятия, должна составлять менее 2 долларов.
2. Прежде чем начать
Создайте проект в Google Cloud.
- В консоли Google Cloud на странице выбора проекта выберите или создайте проект Google Cloud .
- Убедитесь, что для вашего облачного проекта включена функция выставления счетов. Узнайте, как проверить, включена ли функция выставления счетов для проекта .
Запустить Cloud Shell
Cloud Shell — это среда командной строки, работающая в Google Cloud и поставляемая с предустановленными необходимыми инструментами.
- В верхней части консоли Google Cloud нажмите кнопку «Активировать Cloud Shell» .
- После подключения к Cloud Shell подтвердите свою аутентификацию:
gcloud auth list - Убедитесь, что ваш проект настроен:
gcloud config get project - Если параметры вашего проекта заданы не так, как ожидалось, настройте их следующим образом:
export PROJECT_ID=<YOUR_PROJECT_ID> gcloud config set project $PROJECT_ID
Проверка подлинности:
gcloud auth list
Подтвердите свой проект:
gcloud config get project
При необходимости установите значение:
export PROJECT_ID=<YOUR_PROJECT_ID> gcloud config set project $PROJECT_ID
Включить API
Выполните эту команду, чтобы включить все необходимые API:
gcloud services enable \ aiplatform.googleapis.com \ run.googleapis.com \ secretmanager.googleapis.com \ mapstools.googleapis.com \ storage.googleapis.com \ cloudresourcemanager.googleapis.com \ serviceusage.googleapis.com
Создайте ключ API Google Maps.
Для использования инструментов Google Maps MCP необходимо сгенерировать ключ API карт.
- В консоли Google Cloud воспользуйтесь строкой поиска, чтобы перейти к Google Maps Platform > Credentials .
- При появлении запроса подтвердите свой проект в Google Cloud.
- Нажмите «Создать учетные данные» и выберите «Ключ API» .
- Скопируйте сгенерированный API-ключ. Он понадобится вам на следующем шаге.
3. Настройте свою среду.
Для этого практического занятия код размещен на GitHub. Вам нужно будет клонировать репозиторий, который содержит структуру каталогов и необходимые подкомпоненты (например, каталог skills/ ).
- Клонируйте репозиторий и перейдите в папку проекта:
git clone https://github.com/GoogleCloudPlatform/next-26-keynotes cd next-26-keynotes/devkey/demo-1
- Настройте виртуальное окружение Python и установите ADK:
uv venv source .venv/bin/activate uv sync
- Укажите свой ключ API для работы с картами. Приложение считывает его из переменной окружения:
export GOOGLE_MAPS_API_KEY="<YOUR_MAPS_API_KEY>"
Настройка переменных среды
Агент симулятора использует файл .env для настройки. Скопируйте пример файла и обновите его, указав идентификатор вашего проекта.
- Скопируйте пример файла среды:
cp planner_agent/sample.env planner_agent/.env
- Откройте
planner_agent/.envи обновите полеGOOGLE_CLOUD_PROJECT, указав в нем фактический идентификатор вашего проекта Google Cloud, а также обновите полеGOOGLE_MAPS_API_KEY, указав созданный вами ключ API Google Maps.
Файл должен выглядеть примерно так:
GOOGLE_GENAI_USE_VERTEXAI=1
GOOGLE_CLOUD_PROJECT=<YOUR_PROJECT_ID>
GOOGLE_CLOUD_LOCATION=us-west1
GOOGLE_MAPS_API_KEY=<YOUR_MAPS_API_KEY>
GOOGLE_CLOUD_AGENT_ENGINE_ENABLE_TELEMETRY=true
OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED=true
OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=true
ADK_CAPTURE_MESSAGE_CONTENT_IN_SPANS=true
4. Создайте нового агента ADK.
Изучите основной файл, определяющий агента: planner_agent/agent.py .
В репозитории build-agents-with-skills инициализация агента осуществляется с помощью класса Agent из ADK. Он задает базовую модель, имя идентификатора и подтягивает инструкции и инструменты, определенные в других модулях.
Откройте planner_agent/agent.py , чтобы изучить код инициализации:
instruction="Answer user questions to the best of your knowledge"
description="A helpful assistant for user questions."
tools=[]
# ...
root_agent = Agent(
model='gemini-3-flash-preview',
name='planner_agent',
description=description,
instruction=instruction,
tools=tools
)
Класс Agent абстрагирует историю сообщений, управление инструментами и коммуникацию LLM, позволяя вам сосредоточиться на поведении агента.
В настоящий момент агент очень универсальный. Взаимодействовать с ним можно так же, как и с любым другим агентом LLM.
uv run adk run planner_agent
Эта команда запустит чат с агентом. Она использует gemini-3-flash-preview в качестве модели и может отвечать на основные вопросы.
Running agent planner_agent, type exit to exit.
[user]: What is the length of a Marathon
[planner_agent]: The official length of a marathon is **26.2 miles**, which is
equivalent to **42.195 kilometers**.
Агент уже знаком с некоторыми фактами о марафонах. Однако этого недостаточно для того, чтобы правильно спланировать марафон, разработав правила и маршрут.
5. Создайте системную подсказку.
Системные подсказки (инструкции) определяют поведение агента. Вместо одной большой строки в этом проекте используется PromptBuilder ( planner_agent/utils.py ) для динамического составления инструкций.
Откройте planner_agent/prompts.py чтобы увидеть, как подсказка структурирована на логические разделы:
from collections import OrderedDict
from .utils import PromptBuilder
ROLE = """\
...
"""
RULES = """\
...
"""
WORKFLOW = """\
...
"""
###
# Planner instructions with no tools mentioned
PLANNER_INSTRUCTION_NO_TOOLS = PromptBuilder(
OrderedDict(
role=ROLE,
rules=RULES,
tools=TOOLS_PROMPT_ONLY,
workflow=WORKFLOW_PROMPT_ONLY,
)
).build()
# Planner instruction with skills and tools defined
PLANNER_INSTRUCTION = PromptBuilder(
OrderedDict(
role=ROLE,
rules=RULES,
skills=SKILLS,
tools=TOOLS,
workflow=WORKFLOW,
)
).build()
В файле planner_agent/agent.py это уже импортировано.
Найдите раздел с TODO: Replace Instruction and Description и раскомментируйте переназначение переменных instruction и description .
Этот фрагмент кода должен выглядеть следующим образом:
instruction=PLANNER_INSTRUCTION_NO_TOOLS
description="Expert GIS analyst for marathon route and event planning."
Вы импортируете версию приглашения для агента, в которой отсутствуют ссылки на инструменты. Инструменты будут добавлены на более позднем этапе.
Вы можете протестировать эту версию агента:
uv run adk run planner_agent
В окне чата отправьте следующее сообщение:
Plan a marathon for 10000 participants in Las Vegas on April 24, 2027 in the
evening timeframe
Через несколько мгновений вы должны получить ответ, похожий на этот:
Running agent planner_agent, type exit to exit.
[user]: Plan a marathon for 10000 participants in Las Vegas on April 24, 2027 in the evening timeframe
[planner_agent]: Here is the comprehensive marathon plan for Las Vegas.
As requested, I have designed this event for an evening start on April 24, 2027. Because certain parameters (theme and budget) were not specified, I have applied pragmatic defaults: this will be a "Neon Nights" scenic theme to capitalize on the evening Strip, operating on a moderate-to-high budget given the infrastructure needed to secure major Las Vegas corridors.
### 1. Intent Alignment
* **City & Theme:** Las Vegas, Nevada. Theme: "Neon Nights" an evening race maximizing the visual impact of the illuminated city.
* **Date & Time:** Saturday, April 24, 2027. Late April evenings in Las Vegas offer optimal running weather (temperatures dropping from ~70°F at sunset to ~60°F). Race start is 6:30 PM (sunset is approx. 7:20 PM).
...
...
При наличии четко сформулированной подсказки результат уже значительно приближается к ожидаемому. На следующем этапе вы добавите инструменты, которые позволят вывести работу агента на новый уровень.
6. Добавьте навыки и инструменты.
Чтобы включить навыки и инструменты в planner_agent/agent.py , найдите раздел с TODO: Replaces Tools и раскомментируйте следующие две строки. Ваш код должен выглядеть следующим образом:
instruction=PLANNER_INSTRUCTION
tools=get_tools()
Это единственное изменение кода, необходимое на этом этапе. Остальная часть этого раздела объясняет концепции, лежащие в основе навыков и инструментов.
Навыки
Навык агента — это самодостаточный функционал, который агент ADK может использовать для выполнения конкретной задачи. Навык агента инкапсулирует необходимые инструкции, ресурсы и инструменты, требуемые для выполнения задачи, в соответствии со спецификацией навыка агента. Структура навыка позволяет загружать его постепенно, чтобы минимизировать влияние на контекстное окно работы агента.
Для специалиста по планированию марафона определены 3 навыка:
- ГИС-пространственная инженерия — отвечает за обработку данных GeoJSON для создания маршрута марафона.
- Картография — используйте инструменты Google Maps для поиска мест и информации о погоде.
- Директор забега - Подтвердите соответствие маршрута марафона планировочным рекомендациям.
Навыки могут включать в себя скрипты, дополнительные ресурсы и ссылки.
Приложение загружает все навыки и предоставляет их в качестве инструментов в planner_agent/tools.py . Обратите внимание, как это делается в функции get_tools() :
def get_tools() -> list:
"""Build the planner's tool list with lazy-loaded skills."""
from google.adk.code_executors.unsafe_local_code_executor import UnsafeLocalCodeExecutor
skills_dir = pathlib.Path(__file__).parent / "skills"
skills = []
if skills_dir.exists():
skills = [
load_skill_from_dir(d)
for d in sorted(skills_dir.iterdir())
if d.is_dir() and not d.name.startswith("_") and (d / "SKILL.md").exists()
]
additional_tools = _load_additional_tools(skills_dir)
skill_toolset = SkillToolset(
skills=skills,
code_executor=UnsafeLocalCodeExecutor(),
additional_tools=additional_tools,
)
tools = [
skill_toolset,
PreloadMemoryTool(),
]
tools.extend(get_maps_tools())
return tools
Наиболее интересная часть — это метод load_skill_from_dir из ADK. В ADK есть ещё один способ создания навыков — встроенный. Хотя в этом практическом занятии он не используется, выглядит он примерно так:
from google.adk.skills import models
greeting_skill = models.Skill(
frontmatter=models.Frontmatter(
name="greeting-skill",
description=(
"A friendly greeting skill that can say hello to a specific person."
),
),
instructions=(
"Step 1: Read the 'references/hello_world.txt' file to understand how"
" to greet the user. Step 2: Return a greeting based on the reference."
),
resources=models.Resources(
references={
"hello_world.txt": "Hello! So glad to have you here!",
"example.md": "This is an example reference.",
},
),
)
Добавить инструменты картографирования
Для построения маршрутов марафонского забега необходим пространственный контекст. Вы можете обеспечить его, интегрировав сервер Google Maps MCP (Model Context Protocol).
В planner_agent/tools.py обратите внимание на то, как сервер MCP регистрируется в инструменте ApiRegistry :
from google.adk.integrations.api_registry import ApiRegistry
class MapsApiRegistry(ApiRegistry):
"""ApiRegistry subclass that strips ADC headers to force API key auth."""
def get_toolset(self, *args, **kwargs): # noqa: ANN002, ANN003
toolset = super().get_toolset(*args, **kwargs)
conn = getattr(toolset, "_connection_params", None)
headers = getattr(conn, "headers", None) if conn else None
if headers:
headers.pop("Authorization", None) # type: ignore[union-attr]
headers.pop("x-goog-user-project", None) # type: ignore[union-attr]
return toolset
def get_maps_tools() -> list:
"""Return Maps MCP toolset if configured."""
project_id = os.getenv("GOOGLE_CLOUD_PROJECT", "").strip()
maps_key = _resolve_maps_key()
if not project_id or not maps_key:
return []
# Map the MCP server location on Google Cloud
mcp_server_name = f"projects/{project_id}/locations/global/mcpServers/google-mapstools.googleapis.com-mcp"
# Initialize the custom API registry that supports header injection
api_registry = MapsApiRegistry(
api_registry_project_id=project_id,
header_provider=header_provider,
)
return [api_registry.get_toolset(mcp_server_name=mcp_server_name)]
Добавив набор инструментов MCP, агент автоматически получает возможность запрашивать у Google Maps информацию о маршруте, высоте и местоположении!
7. Запустите агент локально.
Теперь, когда агент, подсказка и инструменты связаны между собой, запустите агент локально. На этот раз вы будете использовать adk web , чтобы видеть события загрузки навыков и вызова инструментов.
uv run adk web
Вы должны увидеть что-то подобное.
INFO: Started server process [99665]
INFO: Waiting for application startup.
+-----------------------------------------------------------------------------+
| ADK Web Server started |
| |
| For local testing, access at http://127.0.0.1:8000. |
+-----------------------------------------------------------------------------+
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
- Откройте браузер и перейдите по URL-адресу, отображаемому в терминале (обычно
http://localhost:8000). - В выпадающем списке в левом верхнем углу выберите
planner_agent. - В окне чата отправьте следующее сообщение:
Plan a marathon for 10000 participants in Las Vegas on April 24, 2027 in the
evening timeframe
Вы увидите, как загружаются навыки и вызываются инструменты. Через несколько мгновений агент сгенерирует план выполнения задачи.
Ваш пользовательский интерфейс должен выглядеть примерно так:

8. Разверните агента.
Как только вы убедитесь, что агент работает локально, вы можете развернуть его в Agent Engine, который безопасно размещает агент в Cloud Run.
Для развертывания агента используйте команду развертывания ADK CLI:
uv run adk deploy agent_engine \ --env_file planner_agent/.env \ planner_agent
После завершения развертывания CLI выводит на экран защищенную конечную точку для вашего агента. Теперь вы можете интегрировать эту конечную точку в приложения для внешнего интерфейса, чат-боты или другие бэкэнд-системы. Вы также можете использовать среду выполнения агента (Agent Runtime Playground) для тестирования агента.
Результат выглядит следующим образом:
Files and dependencies resolved Deploying to agent engine... ✅ Created agent engine: projects/<PROJECT_ID>/locations/us-west1/reasoningEngines/<AGENT_ID>
Для связи с агентом вы можете использовать предоставленный скрипт на языке Python.
- Скопируйте пример файла среды:
cp sample.env .env
- Откройте файл
.envи обновите полеGOOGLE_CLOUD_PROJECT, указав в нем фактический идентификатор вашего проекта Google Cloud.
Файл должен выглядеть следующим образом:
GOOGLE_CLOUD_PROJECT=<YOUR_PROJECT_ID>
GOOGLE_CLOUD_LOCATION=us-west1
- Вы можете указать агентов в своем проекте.
python main.py list
Вы должны увидеть что-то подобное.
Listing deployed agents... ID: <AGENT_ID> | Display Name: planner_agent
Получив идентификатор развернутого агента, вы можете отправить запрос:
export AGENT_ID=<AGENT_ID>
python main.py prompt --agent-id ${AGENT_ID} --message "Plan a marathon for
10000 participants in Las Vegas on April 24, 2027 in the evening timeframe"
В результате вы получите результат, который будет выглядеть следующим образом:
Streaming response from agent <AGENT_ID>:
{'model_version': 'gemini-3-flash-preview', 'content': {'parts': [{'text': 'Here is a comprehensive
...
...
...
9. Уборка
Чтобы избежать дальнейших списаний средств с вашего аккаунта Google Cloud, удалите ресурсы, созданные в ходе этого практического занятия.
Удалите службу Cloud Run, созданную в ходе развертывания:
python main.py delete --agent-id ${AGENT_ID}
Если вы сохранили ключ API карт в Secret Manager, удалите секрет:
gcloud secrets delete maps-api-key --project=$PROJECT_ID
Если вы создали новый проект Google Cloud для этого практического занятия, вы можете удалить весь проект, чтобы удалить все связанные с ним ресурсы и API:
gcloud projects delete $PROJECT_ID
10. Поздравляем!
Поздравляем! Вы создали сложный агент планирования марафона с помощью ADK.
Что вы узнали
- Инициализация проекта комплекта разработки агентов (ADK).
- Использование
PromptBuilderдля модульных системных подсказок. - Интеграция возможностей сопоставления данных с использованием инструментов MCP и
ApiRegistry - Условная загрузка навыков с помощью
SkillToolset - Тестирование локально и развертывание в Agent Engine.