1. Обзор
В сфере искусственного интеллекта и технологий всё меняется быстрее, чем кто-либо может за этим уследить. Ежедневно появляются новые модели, статьи и продукты. Агент, который бы собирал сегодняшние заголовки, писал краткие резюме и генерировал PDF-файлы каждое утро, решил бы эту проблему, но раньше для его создания требовалось выбрать фреймворк, определить инструменты на Python, написать цикл оркестрации, упаковать контейнер и развернуть его в Cloud Run. И всё это ещё до того, как агент сделал хотя бы один веб-запрос.
Использование управляемых агентов через API Gemini меняет ситуацию. Вы пишете два конфигурационных файла в формате Markdown и предварительно созданный скрипт рендеринга, делаете один вызов API, и загружается настоящая песочница Ubuntu, просматривает веб-страницы, пишет ваши сводки и генерирует PDF-файл. Никаких контейнеров. Никакого развертывания. Никакого кода оркестрации.
В этом практическом занятии вы создадите именно такого агента: от пустой функции до работающего ежедневного дайджеста, шаг за шагом, рассматривая каждую концепцию.
Что вы построите
- Создайте и запустите свой первый управляемый агент в реальной песочнице Linux.
- Настройте агента, указав подробные инструкции.
- Загрузите PDF-файл с результатами работы агента.
- Продолжите обсуждение, чтобы уточнить сводку, не перезагружая веб-страницу.
- Сохраните конфигурацию агента и запускайте его по идентификатору в будущих запусках.
Что вам понадобится
- Python 3.10+
- API-ключ Gemini с включенной оплатой: aistudio.google.com/api-keys
- Примерно 1 доллар США в виде кредита API (каждый полный запуск стоит 0,30–1,30 доллара США)
2. Что такое управляемые агенты в API Gemini?
Три уровня систем искусственного интеллекта
Прежде чем углубляться в код, давайте рассмотрим, какое место занимают управляемые агенты по сравнению с двумя альтернативами:
Уровень | Что это такое | Кто управляет инфраструктурой? |
Стандартная степень магистра права | Вы задаёте запрос, он отвечает текстом. Нет рук, нет памяти, нет интернета. | Н/Д: оно ничего не может сделать самостоятельно. |
Агент, размещающий свои данные самостоятельно | Вы соединяете ADK/LangChain/AutoGen + Docker + инструменты + память. | Вы: всё это (или управляемая платформа, например, Agent Engine) |
Управляемый агент | Вы задаёте ему цель. Google создаёт защищённую песочницу. Агент пишет код, запускает его, читает ошибки, ищет информацию в интернете и автоматически исправляет баги. | Google: всё это |
Этот практический урок посвящен третьему ряду. Вы предоставляете задание и файлы конфигурации. Google занимается всем остальным.
Что бы вы создали с помощью ADK + Cloud Run
Для создания агента, генерирующего новостные сводки, который просматривает веб-страницы, запускает Python и создает PDF-файлы, вам потребуется все это с помощью ADK + Cloud Run:
# agent.py: define tools and wire up the agent
from google.adk.agents import LlmAgent
from google.adk.tools import google_search, built_in_code_execution
agent = LlmAgent(
name="digest-agent",
model=MODEL,
instruction=AGENTS_MD, # your editorial voice and rules
tools=[google_search, built_in_code_execution],
)
# app.py: serve the agent over HTTP
from google.adk.runners import FastApiRunner
runner = FastApiRunner(agent=agent)
app = runner.app
# pdf_tool.py: custom tool, install reportlab, render PDF
# scraper.py: custom tool, fetch each news source
# streaming.py: wire agent events to your SSE endpoint
# Dockerfile: package everything
FROM python:3.12
COPY . /app
RUN pip install google-adk reportlab requests
CMD ["uvicorn", "app:app", "--host", "0.0.0.0"]
# Deploy to Cloud Run
gcloud run deploy digest-agent \
--image gcr.io/your-project/digest-agent \
--set-secrets GEMINI_API_KEY=gemini-key:latest \
--memory 2Gi
Это происходит до того, как агент хотя бы раз запустится. Вам по-прежнему необходима изоляция в песочнице (чтобы агент не мог повредить ваш сервер), установка пакетов, управление состоянием между вызовами инструментов и потоковая инфраструктура для передачи событий клиенту.
На что заменяет это управляемый агент?
from google import genai
client = genai.Client()
stream = client.interactions.create(
agent="antigravity-preview-05-2026",
input="",
stream=True,
environment={
"type": "remote",
"sources": [ # your config files, mounted at startup
{
"type": "inline",
"target": ".agents/AGENTS.md",
"content": AGENTS_MD,
},
{
"type": "inline",
"target": ".agents/skills/digest-pdf/SKILL.md",
"content": SKILL_MD,
},
{
"type": "inline",
"target": ".agents/skills/digest-pdf/scripts/generate_pdf.py",
"content": GENERATE_PDF_PY,
},
],
},
)
Что требуется для работы ADK + Cloud Run | Что для вас делает служба управляемых агентов |
Образ контейнера + Dockerfile + CI/CD | Полностью управляемая песочница Ubuntu (Python 3.12, Node 22, 4 CPU / 16 ГБ ОЗУ) |
Развертывание и масштабирование Cloud Run | Предоставляется за каждое взаимодействие, автоматически удаляется через 7 дней бездействия. |
изоляция песочницы | Изолирован по взаимодействиям |
Пользовательский инструмент для работы с PDF + | Агент устанавливает пакеты в песочницу. |
Инфраструктура потоковой передачи SSE | |
Определения инструментов в Python | Встроенные инструменты: просмотр веб-страниц, выполнение кода, файловая система. |
Управление состоянием между вызовами инструментов | Встроено в цикл рассуждений агента. |
Вы пишете конфигурационные файлы ( AGENTS.md , SKILL.md , готовый скрипт) и делаете один вызов API. Google позаботится обо всем остальном.
Как работает песочница
interactions.create() call
│
▼
Google provisions Ubuntu sandbox (Python 3.12, Node 22, 4 CPU / 16 GB RAM)
│
▼
Agent reasoning loop:
plan → fetch URLs → run Python → write files → reason → repeat
│
▼
Events stream back in real time: tool calls, text chunks, completion
│
▼
interaction.completed → environment_id + interaction_id
Песочница сохраняется в течение 7 дней бездействия. Вы можете возобновить её работу, используя environment_id , чтобы уточнить результаты, запустить последующие задачи или создать форк в сохранённом именованном агенте.
3. Настройка
Вариант А: Cloud Shell (рекомендуется)
Нажмите кнопку ниже, чтобы открыть этот практический урок в Google Cloud Shell. Все необходимые зависимости уже установлены.
Вариант B: Локальная настройка
git clone https://github.com/Saoussen-CH/tech-digest-managed-agent.git
cd tech-digest-managed-agent
При необходимости установите uv :
curl -LsSf https://astral.sh/uv/install.sh | sh
Настройте свой API-ключ
cp .env.example .env
cloudshell edit .env
Установите свой ключ:
GEMINI_API_KEY=your-key-here
Установите зависимости
uv sync
4. Сделайте свой первый звонок агенту.
Откройте стартовый файл
cloudshell edit run_digest.py
run_digest() содержит один пункт TODO, который нужно заполнить сейчас, и еще три для следующего шага. Два вспомогательных поля уже предварительно заполнены выше:
-
load_source(path): считывает файл из.agents/относительно скрипта. Вы будете использовать его в следующем упражнении для монтирования редакторского текста, сценария PDF и средства визуализации в изолированную среду. -
run_stream(stream): обрабатывает поток событий и возвращает(environment_id, interaction_id). Вам не нужно писать цикл обработки событий самостоятельно.
Что добавить
TODO 1: заменить pass на (пока игнорируйте TODO 3 и 4 — они для следующего шага):
from google import genai
client = genai.Client()
stream = client.interactions.create(
agent=BASE_AGENT,
input="Fetch the Hacker News front page and list the top 5 stories.",
stream=True,
environment="remote",
)
environment_id, interaction_id = run_stream(stream)
print(f"\nDone. environment_id={environment_id}")
Что делает каждая часть
genai.Client() считывает GEMINI_API_KEY из переменных окружения. Все остальное обрабатывается этим клиентом.
interactions.create() является ключевым вызовом. Для его работы требуется четыре параметра:
-
agent=BASE_AGENT: выбирает агент Antigravity (antigravity-preview-05-2026), универсальный управляемый агент на базе Gemini 3.5 Flash. Он поставляется с тремя встроенными инструментами, включенными по умолчанию:code_execution(запуск Bash, Python, Node.js),google_searchиurl_context(получение и чтение веб-страниц). Инструменты файловой системы (read_file,write_file,list_files) включаются автоматически при передаче параметраenvironment. Один вызов инициализирует полностью управляемую среду Ubuntu с предустановленными Python 3.12, Node.js 22, git, pip и curl. Не нужно создавать контейнеры или запускать развертывание. -
input: задача для данного запуска. Агент просматривает Hacker News и анализирует результаты. -
environment="remote": создает новую облачную песочницу для этого взаимодействия. -
stream=True: возвращает итерируемый объект событий вместо блокировки. Без него вызов ожидает 30-90 секунд и возвращает весь вывод сразу в видеinteraction.output_text. При потоковой передаче вы видите, как агент рассуждает и действует по мере развития событий. Потоковая передача здесь не является расширенной функцией: это правильный вариант по умолчанию, поскольку 90-секундный «черный ящик» не дает вам никакого сигнала о том, работает ли агент или завис.
То, что вы только что настроили: каждый вызов interactions.create() запускает выделенную песочницу:
Компонент | Спецификация |
Операционная система | Изолированная среда Ubuntu Linux |
Предустановленные среды выполнения | Python 3.12, Node.js 22, Bash |
Вычислить | 4 ядра ЦП, 16 ГБ ОЗУ |
Управление контекстом | Автоматическое сжатие запускается при достижении объема примерно в 135 000 токенов. |
Сетевые технологии | Исходящий веб-доступ через прокси-сервер исходящего трафика |
Агент может устанавливать любые пакеты с помощью pip или npm , читать и записывать файлы, а также выполнять исходящие веб-запросы. Ваша машина и учетные данные остаются нетронутыми.
environment_id — это идентификатор только что запущенной песочницы. После interaction.completed песочница не завершает работу: она остается активной до 7 дней. environment_id — это способ вернуться к ней. Передайте его во второй вызов interactions.create() , и агент возобновит работу на той же файловой системе, с теми же файлами и установленными пакетами, как если бы он и не покидал её. На следующем шаге он используется для загрузки PDF-файла без повторного запуска агента, а на шаге после этого — для продолжения диалога.
interaction_id — это идентификатор только что завершившегося диалога. Передайте его в качестве previous_interaction_id в следующем звонке, и агент будет иметь полную память о том, что он сказал и сделал в этом диалоге.
Проверять
uv run python run_digest.py
Вы должны видеть вывод в реальном времени во время работы агента:
[agent started]
[tool] run_code
Here are the top 5 stories currently on the Hacker News front page, retrieved via the official Hacker News API:
1. **Qwen 3.6 27B is the sweet spot for local development** — 471 points
2. **.self: A new top-level domain designed to support self-hosting** — 116 points
...
Done. environment_id=e3de58774073f75a6ef42924c6ce2e88
API возвращает реальный environment_id даже при environment="remote" . Песочница запустилась. Отсутствует конфигурация: нет голосового ввода, нет навыков, нет генератора PDF. Агент просто распечатал истории в текстовом виде и остановился. На следующем шаге они будут добавлены.
Каждая строка вывода соответствует событию из run_stream() :
| Что это такое | Что выводит функция |
| агент получает URL-адрес | |
| агент запускает код в песочнице | |
| агент ищет в интернете | |
| файловые инструменты и другие | |
| агент пишет текст | транслируется напрямую в стандартный вывод |
5. Настройка агента
У агента не было никаких инструкций: ни голоса, ни навыков, ни генератора PDF-файлов. На этом этапе вы загружаете файлы конфигурации из папки .agents/ и монтируете их в песочницу.
Что изменить
Внесите четыре изменения в run_digest.py :
TODO 2: После функции load_source() добавьте три константы уровня модуля (они находятся вне run_digest() , в верхней части файла):
AGENTS_MD = load_source(".agents/AGENTS.md")
SKILL_MD = load_source(".agents/skills/digest-pdf/SKILL.md")
GENERATE_PDF_PY = load_source(".agents/skills/digest-pdf/scripts/generate_pdf.py")
Откройте каждый файл, чтобы увидеть, что вы загружаете: AGENTS.md задает стиль редактирования и правила рабочего процесса; SKILL.md — это пошаговое руководство по созданию PDF-файлов; generate_pdf.py — это предварительно созданный рендерер, который будет запускать агент.
Теперь внесите еще два изменения в run_digest() :
TODO 3: изменить environment с "remote" на словарь источников и установить input на "" :
environment={
"type": "remote",
"sources": [
{
"type": "inline",
"target": ".agents/AGENTS.md",
"content": AGENTS_MD,
},
{
"type": "inline",
"target": ".agents/skills/digest-pdf/SKILL.md",
"content": SKILL_MD,
},
{
"type": "inline",
"target": ".agents/skills/digest-pdf/scripts/generate_pdf.py",
"content": GENERATE_PDF_PY,
},
],
},
TODO 4: добавьте эти строки сразу после print(f"\nDone. environment_id={environment_id}") :
set_key(".env", "ENVIRONMENT_ID", environment_id)
set_key(".env", "INTERACTION_ID", interaction_id)
( set_key уже импортирована в начале файла run_digest.py .)
В ходе выполнения этой операции оба идентификатора записываются в файл .env , поэтому на следующем шаге можно будет загрузить PDF-файл без повторного запуска агента.
Что делает каждый источник
Каждый исходный файл монтируется в файловую систему песочницы при запуске, до начала работы агента. target пути соответствуют тем местам, где, по мнению Antigravity, они должны находиться:
.agents/
├── AGENTS.md ← auto-loaded as global instructions
└── skills/
└── digest-pdf/
├── SKILL.md ← auto-discovered and registered as a skill
└── scripts/
└── generate_pdf.py ← pre-built renderer the agent can run
| Переменная | Для чего используется ремень безопасности? |
| | Автоматически загружаются в виде постоянных инструкций: редакционный стиль, рабочий процесс, правила выполнения. |
| | Автоматически обнаружен и зарегистрирован как именованный навык; агент вызывает его по имени. |
| | Встроенный инструмент для рендеринга PDF-файлов; агент записывает файл |
Проверять
uv run python run_digest.py
Теперь выполнение занимает 1-3 минуты. Вы должны увидеть, как агент считывает файлы конфигурации, записывает сводки и сохраняет PDF-файл:
[agent started]
[tool] read_file (/.agents/skills/digest-pdf/SKILL.md)
[tool] list_files (/.agents/skills/digest-pdf/scripts)
[tool] read_file (/.agents/skills/digest-pdf/scripts/generate_pdf.py)
[tool] run_code
[tool] write_file (/workspace/summaries.json)
[tool] run_code
[tool] delete_file (/tmp/test_scrape.py)
I have successfully generated today's tech news digest and saved the formatted document to /workspace/digest.pdf.
Done. environment_id=4129ffd75574e308748e9425d7ec828f
Теперь environment_id — это реальное значение: песочница работала с вашими конфигурационными файлами, и агент создал digest.pdf . На следующем шаге он будет загружен.
6. Скачайте PDF-файл
Агент записал digest.pdf в папку /workspace/digest.pdf внутри песочницы. Снимок среды доступен в виде архива tar через API файлов Gemini.
При необходимости установите requests :
uv pip install requests
Что нужно заполнить
Откройте download_pdf.py . В нём два пункта TODO.
TODO 1: Заполнить вызов requests.get() :
r = requests.get(
f"https://generativelanguage.googleapis.com/v1beta/files/environment-{environment_id}:download",
params={"alt": "media"},
headers={"x-goog-api-key": api_key},
allow_redirects=True,
)
r.raise_for_status()
URL-адрес обращается к снимку песочницы. params={"alt": "media"} возвращает необработанные байты вместо метаданных. Ваш существующий GEMINI_API_KEY также используется для аутентификации в Files API.
TODO 2: найти и извлечь PDF-файл из архива tar:
member = next(m for m in tar.getmembers() if m.name.endswith("workspace/digest.pdf"))
tar.extract(member, path=tmp, filter="data")
Префикс пути к архиву tar меняется в зависимости от запуска, поэтому выполняйте поиск по суффиксу, а не указывайте точный путь вручную. filter="data" подавляет предупреждение об устаревании Python 3.13, связанное с небезопасным извлечением архива tar.
Проверять
uv run python download_pdf.py
Saved digest.pdf (48,231 bytes)
Откройте digest.pdf в той же директории. Он содержит отформатированный дайджест, сгенерированный агентом на основе данных с работающих веб-страниц.
7. Продолжите разговор.
У вас уже есть digest.pdf . Если вам нужен был только этот файл, то всё готово. Этот шаг предназначен для другого: вы просите агента изменить дайджест без повторной загрузки веб-страницы.
Песочница всё ещё активна. У агента по-прежнему есть /workspace/digest.pdf , и он помнит каждую историю, которую он резюмировал. Второй вызов interactions.create() отправляет последующее сообщение в ту же песочницу. Здесь вы просите его добавить примечание «Почему это важно» под каждой историей, и он обновляет PDF-файл на месте, без повторной загрузки и повторного составления резюме.
Что нужно заполнить
Откройте refine_digest.py . В нём три пункта TODO.
Задачи 1 и 2: заполните два параметра для многошагового режима внутри interactions.create() :
environment=environment_id,
previous_interaction_id=interaction_id,
environment=environment_id возобновляет работу в той же песочнице с ее файлами и пакетами. previous_interaction_id=interaction_id предоставляет агенту историю разговоров. Ничего больше не меняется по сравнению с первым звонком.
TODO 3: сохранить новый interaction_id обратно в файл .env после завершения цикла обработки событий:
set_key(".env", "INTERACTION_ID", interaction_id)
Каждый вызов interactions.create() создает новый interaction_id . Запись его обратно означает, что при следующем запуске это уточнение передается как previous_interaction_id , и цепочка взаимодействий выполняется корректно. Идентификатор песочницы никогда не меняется, поэтому ENVIRONMENT_ID обновлять не нужно.
Два параметра, обеспечивающие работу многооборотного механизма.
ИДЕНТИФИКАТОР | Что оно сохраняет | Аналогия |
| Файлы, установленные пакеты, состояние системы: всё в файловой системе Linux. | Сохранение одного и того же рабочего стола между совещаниями. |
| История разговора: что агент говорил и делал в предыдущих диалогах. | Вспоминая, что обсуждалось на последнем совещании |
Вы можете передать каждый из этих идентификаторов независимо:
- Только для
environment_id: повторное использование файлов и пакетов, но начало нового диалога. Полезно для новой задачи в том же рабочем пространстве. - Только
previous_interaction_id: продолжить контекст беседы, но в новой песочнице (файлы удалены). - Оба варианта: полная непрерывность, которая используется на этом этапе.
Без environment_id : пустая песочница, PDF-файл недоступен. Без previous_interaction_id : отсутствует контекст, агент не может уточнить конкретный раздел.
Проверять
uv run python refine_digest.py
Поток должен быть быстрым; агент ничего не запрашивает повторно. После завершения:
Refinement done.
Saved digest_v2.pdf (52,418 bytes)
Откройте digest_v2.pdf и сравните его с digest.pdf . В каждой статье теперь должна быть добавлена строка "Почему это важно".
8. Сохранение конфигурации управляемого агента.
До сих пор каждый вызов передавал AGENTS.md , SKILL.md и generate_pdf.py в режиме inline. Это работает, но ваш вызывающий код передаёт полное содержимое файлов при каждом запуске. agents.create() встраивает конфигурацию в сохранённый именованный агент на стороне Google. Следующий вызов просто передаёт идентификатор агента:
Inline calls: send sources on every call
Named agent: bake once → invoke by ID, no sources
Что нужно заполнить
Откройте save_agent.py . У него есть одно TODO (TODO 1).
Обратите внимание, что константы импортируются непосредственно из run_digest.py (без дублирования):
from run_digest import BASE_AGENT, AGENTS_MD, SKILL_MD, GENERATE_PDF_PY
TODO 1: Заполнить вызов agents.create() :
agent = client.agents.create(
id="my-digest",
base_agent=BASE_AGENT,
description="Daily tech digest with editorial voice and PDF generation.",
base_environment={
"type": "remote",
"sources": [
{
"type": "inline",
"target": ".agents/AGENTS.md",
"content": AGENTS_MD,
},
{
"type": "inline",
"target": ".agents/skills/digest-pdf/SKILL.md",
"content": SKILL_MD,
},
{
"type": "inline",
"target": ".agents/skills/digest-pdf/scripts/generate_pdf.py",
"content": GENERATE_PDF_PY,
},
],
},
)
Ключевое отличие от встроенного вызова на предыдущем шаге заключается в base_environment (а не environment ): исходные файлы хранятся на стороне Google и автоматически монтируются при каждом последующем вызове. Запускайте его один раз, а не при каждом запуске дайджеста.
Проверить: сохранить агента
uv run python save_agent.py
Saved: my-digest
my-digest: Daily tech digest with editorial voice and PDF generation.
Запустите сохраненный агент
Откройте invoke_agent.py . Он вызывает сохраненный агент по ID без указания источников:
stream = client.interactions.create(
agent="my-digest",
input="",
stream=True,
environment="remote",
)
Сравните это с встроенным вызовом: agent=BASE_AGENT заменяется на "my-digest" , а полный блок environment с тремя встроенными источниками заменяется на environment="remote" . Конфигурация уже встроена на стороне Google.
Проверка: вызовите сохраненный агент.
uv run python invoke_agent.py
Вы должны увидеть ту же прямую трансляцию, что и при запуске скрипта непосредственно в программе, но вызов не будет содержать исходных файлов. После запуска значения ENVIRONMENT_ID и INTERACTION_ID в .env будут обновлены, поэтому вы можете продолжить работу с refine_digest.py как и раньше.
[agent started]
[tool] read_file
[tool] write_file
[tool] run_code
I have successfully created today's tech news digest.
Done. environment_id=9a1c3e02-...
9. Уборка
Песочница автоматически закрывается через 7 дней бездействия. Нет необходимости останавливать серверы. Нет необходимости удалять контейнеры.
Если вы сохранили конфигурацию агента, удалите её:
uv run python delete_agent.py
10. Резюме
Вы создали управляемого агента с нуля, шаг за шагом, рассматривая каждую концепцию. Вот чему вас научило каждое упражнение:
Упражнение | Концепция | Ключ API |
Сделайте свой первый звонок | Создайте реальную песочницу Linux и транслируйте её события в прямом эфире. | |
Настройте агента | Смонтируйте конфигурационные файлы; сохраните идентификаторы в файле | |
Скачать PDF | Загрузите PDF-файл, не запуская агент повторно. | API файлов Gemini |
Продолжите разговор | Продолжите разговор, не перезагружая веб-страницу. | |
Сохранение конфигурации агента | Сохранять конфигурацию агента; запускать по идентификатору, источники не требуются. | |
Ключевые шаблоны
- Один вызов, одна песочница :
interactions.create()обрабатывает всю инфраструктуру (не нужно развертывать контейнеры, не нужно устанавливать пакеты локально). - Прогрессивная потоковая передача :
stream=Trueпревращает 90-секундный «черный ящик» в прямую трансляцию вызовов инструментов и фрагментов текста. - Встроенные источники : монтируются
AGENTS.md,SKILL.mdи предварительно скомпилированные скрипты в песочницу без каких-либо шагов загрузки или развертывания. - Автоматическое обнаружение файлов : файлы, размещенные в папке
.agents/автоматически распознаются (настройка SDK не требуется). - Двумерное состояние :
environment_idотслеживает файлы и пакеты;previous_interaction_idотслеживает контекст разговора; любой из этих параметров может передаваться независимо. - Загрузка снимка : среда представляет собой полный архив файловой системы в формате tar, доступный через API файлов Gemini.
- Именованные агенты :
agents.create()сохраняет конфигурацию навсегда; последующие вызовы передают только идентификатор агента иenvironment="remote", без указания источников.
ADK + Cloud Run против управляемых агентов: разница вкратце
Возможности | ADK + Cloud Run | Управляемые агенты в API Gemini |
Создайте песочницу. | | |
Определить инструменты | Функции Python, зарегистрированные в агенте. | Встроенные функции: просмотр веб-страниц, выполнение кода, файловая система. |
Установить пакеты | | Агент запускает |
Трансляция событий | Пользовательская инфраструктура SSE | |
Продолжить сессию | База данных сессий + внедрение контекста | |
Файлы конфигурации | Задается жестко в агенте или внедряется при запуске. | Смонтировано через |
Инфраструктура для управления | Контейнеры, Cloud Run, IAM, секреты | Никто |
Следующие шаги
- Ознакомьтесь с информацией об управляемых агентах в документации по API Gemini.