Состоянийные удаленные сандбоксы с управляемыми агентами типа «антигравитация» и SDK GenAI
Агенты с управлением антигравитацией с помощью GenAI SDK: поддерживают работу удаленной среды Ubuntu в режиме «сандбокс» на протяжении нескольких ходов, восстанавливают подключение по идентификатору среды и загружают снимок рабочего пространства.
Источники: Orchestrating with Antigravity: A Crescendo of Agents (Part 1)
Некоторые разработчики полностью погружены в терминал. Если инструмент нельзя автоматизировать с помощью bash, они просто обходят его, а их ежедневная работа с ИИ основывается на агентах командной строки, таких как gemini-cli и его более новый аналог antigravity-cli (agy). Это способ работы, характерный для «BashOps», в противоположность группе «ClickOps», предпочитающей графические инструменты.
Такой подход сталкивается с трудностями, когда объем работы агентов увеличивается. Запуск нескольких кодинговых агентов одновременно, управление многократными циклами с сохранением состояния и отслеживание изменений файлов могут потребовать контроля за шестью–двенадцатью терминальными окнами, расположенными на разных виртуальных рабочих столах, что быстро превращается в психологическую нагрузку. Первым решением является сохранение состояния: предоставление каждому агенту рабочей среды, которая сохраняется между вызовами. Вторым решением, связанным с безопасным параллельным запуском локальных подагентов с использованием git worktrees, является отдельная тема.
Здесь мы рассматриваем, как работают состоянийные удаленные песочницы с управляемыми агентами Google Antigravity с использованием SDK Google GenAI и пробной модели агента antigravity-preview-05-2026. Вы узнаете, как снова подключиться к среде контейнера и как загрузить рабочее пространство агента на ваш собственный компьютер из локальной оболочки. Архитектура и сторона хостинга управляемых агентов подробно описаны в других источниках, например, в статье Philipp Schmid о том, как функционируют управляемые агенты внутри системы. Здесь основное внимание уделяется программному управлению ими для создания циклов автоматизации.
Практическое применение состоянийных агентов
В традиционном вызове API агента нет памяти. Вы отправляете запрос, агент отвечает, и рабочее пространство исчезает. Если вы хотите, чтобы он отредактировал файл, созданный им в предыдущем шаге, вам приходится отправлять весь файл обратно в запрос. Это потребляет токены, увеличивает задержку и замедляет процесс генерации кода в несколько шагов, делая его дорогостоящим.
Решением от Antigravity является удаленная песочница с сохранением состояния. Передайте параметр "remote" в качестве среды, и SDK само займется следующим:
- оно создает закрытый контейнер Ubuntu в Google Cloud;
- агент выполняется внутри него;
- контейнер остается активным после завершения вызова, и возвращается
environment_idдля его идентификации; - любой последующий вызов может подключиться к тому же контейнеру и обнаружить, что файловая система осталась нетронутой.
Самый простой способ убедиться в этом — посмотреть код.
Пример: аналитик IPO, работающий с Python
Чтобы проиллюстрировать эту идею, приведён скрипт, который организует сессию с агентом, имеющим состояние, и включающую три этапа. Агент выполняет роль аналитика IPO. На первом этапе он исследует информацию о публичной листинговой записи компании и сохраняет отчёт в формате Markdown. На втором этапе он снова подключается к тому же контейнеру, открывает этот отчёт и преобразует его в интерфейс в формате HTML с собственным стилем, а также генерирует соответствующее изображение. На третьем этапе скрипт загружает снимок всего рабочего пространства.
Функции, связанные с сохранением состояния, реализуются с помощью стандартного Python SDK Google GenAI путём вызова модели агента preview с параметром environment="remote".
import os
import requests
import tarfile
from google import genai
client = genai.Client()
print("🚀 Turn 1: Launching SRE/Financial Agent in remote Ubuntu Sandbox...")
# Turn 1: Launch agent to research and write a report in a remote sandbox
interaction_1 = client.interactions.create(
agent="antigravity-preview-05-2026",
input="Research SpaceX IPO and save report as spacex-report.md.",
environment="remote" # Launches a remote Ubuntu sandbox
)
env_id = interaction_1.environment_id
print(f"✅ Turn 1 Complete. Container Environment ID: {env_id}")
print("\n🔄 Turn 2: Re-attaching to same container and converting to HTML...")
# Turn 2: Re-attach to the SAME sandbox and preserve conversation memory
interaction_2 = client.interactions.create(
agent="antigravity-preview-05-2026",
environment=env_id, # ← Re-attaches to same sandbox
previous_interaction_id=interaction_1.id, # ← Preserves conversation memory
input="Convert that spacex-report.md file into a clean index.html webpage" +
" with styling and generate a custom nanobanana image."
)
print("✅ Turn 2 Complete.")
print("\n📦 Turn 3: Downloading the entire container snapshot (.tar) locally...")
# Turn 3: Download the entire sandbox environment state (.tar) locally
api_key = os.environ.get("GEMINI_API_KEY")
response = requests.get(
f"https://generativelanguage.googleapis.com/v1beta/files/environment-{env_id}:download",
params={"alt": "media"},
headers={"x-goog-api-key": api_key},
)
tar_path = "snapshot_env.tar"
with open(tar_path, "wb") as f:
f.write(response.content)
print(f"✅ Snapshot downloaded to {tar_path}. Extracting...")
with tarfile.open(tar_path) as tar:
tar.extractall(path="./workspace_extract")
# Wow! We've dumped the remote agent workspace locally!
print("🎉 Workspace extracted successfully! Check ./workspace_extract/")
Что делает скрипт, шаг за шагом:
- Запуск и исследование. Google запускает контейнер на машине с Ubuntu — реальной машине с реальным диском — и агент начинает свои исследования.
- Продолжение и преобразование. На втором этапе Markdown преобразуется в HTML. Это странное разделение, поскольку на первом этапе можно было бы сразу получить HTML, но это демонстрирует возможность временно приостановить работу и возобновить её завтра с сохранённой сессией, возможно, даже из чат-приложения.
- Загрузка результатов локально. Именно этот этап придаёт всему ощущение реальности. В контейнере находится реальное рабочее пространство, возможно, с клонированным репозиторием и добавленными тестами. В ходе этого запуска там был отчёт в формате Markdown с первого этапа, файл
index.html, изображение и таблица стилей с второго этапа.
Открытие файла index.html в браузере показывает сгенерированную панель управления, включая раздел с сравнением «быков» и «медведей» для анализа инвестиционной стратегии.
Пример: прототипирование простой детской игры
Тот же принцип применим и при разработке программного обеспечения. Возьмём, к примеру, игру для детей, направленную на обучение чтению времени. Проблема, которую она решает, конкретна: ребёнок, хорошо справляющийся с арифметикой, может столкнуться с трудностями при преобразовании значений на аналоговых часах, например, времени 19:45, в соответствующую цифровую запись. Как только цифровая форма времени получена, вычисление разниц, такой как 08:45 плюс или минус 20 минут, становится простым. Препятствие носит исключительно визуальный характер, поэтому игра, соединяющая обе формы представления времени, оказывается полезной.
Целью была разработка мобильной игры, работающей на разных платформах с использованием Flutter; это было связано с тем, что частые путешествия делают полезной приложение, которое может работать офлайн на телефоне во время полета. Для начала первый прототип был создан с помощью одного скрипта с состоянием. Ему было дано подробное многократное указание: прочитать файл с требованиями к продукту, реализовать игру, запустить локальный сервер, сделать скриншот и открыть pull request на GitHub.
В основе этого скрипта используется SDK google-genai для настройки удаленной среды выполнения, подключения к репозиторию Git, а затем загрузки и распаковки итоговой копии рабочей среды:
from google import genai
import requests, os
client = genai.Client()
api_key = os.environ["GEMINI_API_KEY"]
gh_token = os.environ.get("GITHUB_TOKEN") # optional: enables the agent to push a PR
# Mount the git repo AND inject the GitHub token as a file into the sandbox
sources = [
{"type": "repository",
"source": "https://github.com/palladius/orologia.io",
"target": "/workspace"},
{"type": "inline",
"target": "/workspace/.github_token",
"content": gh_token}, # ← secret injection!
]
# The prompt tells the agent exactly what to build
prompt = """
You are an expert full-stack developer agent.
The repo orologia.io is mounted at /workspace.
1. Read docs/PRD.md and implement a beautiful clock-learning game...
2. Make it stunning: analog clock with rotating hands, digital display, ..
3. Optionally screenshot it, then commit and open a PR using the token
at /workspace/.github_token.
""" # Full prompt: https://github.com/palladius/orologia.io/blob/main/solutions/20260615-antigravity-managed-agents/run-agent-prototype.py
# Launch remote stateful sandbox agent
interaction = client.interactions.create(
agent="antigravity-preview-05-2026",
input=prompt,
environment={"type": "remote", "sources": sources}
)
# Download final snapshot locally
url = ...
response = requests.get(url, headers={"x-goog-api-key": api_key}, params={"alt": "media"})
Вместо того чтобы сразу переходить к сложному приложению на Flutter, агент написал быстрый прототип на обычном HTML, CSS и JavaScript. Получив описание поведения часов и их цикла обратной связи за один шаг, агент создал реактивное приложение-часы примерно за минуту. Он также разработал интерактивные опции, соответствующие аналоговому времени, с несколькими цифровыми кнопками ответа.
Это показало ценность быстрого прототипирования с использованием одного агента. Масштабирование за пределы одного прототипа — это уже другая проблема, поскольку реализация полной игры на Flutter с несколькими подагентами одновременно ставит под угрозу работу обычного цикла командной строки. Безопасное решение этой задачи требует использования изолированных рабочих деревьев git и специальной системы оркестрации.
Для чего подходят удаленные агенты
Естественный вопрос заключается в том, для чего на самом деле нужны эти удаленные агенты. Можно утверждать, что всё работает удобнее на localhost. Более интересный подход рассматривает их как первый шаг к созданию «Dockerfiles для агентов». Сначала вы экспериментируете локально, затем постепенно создаете контейнер для агента с собственными скриптами, папкой настройки инструментов и, возможно, ключом обслуживания облачной службы. Вскоре у вас появляется воспроизводимая, самодостаточная и безопасная среда, в которой агент может получать доступ в Интернет, при этом сочетание git clone и ключей API обеспечивает высокую эффективность.
Практические рекомендации:
- Можно обойтись без этого при однократном исследовании — веб-интерфейс или локальная командная строка работают гораздо быстрее.
- Используйте его для повторяющихся рабочих процессов, где настройки значительно превышают объем окончательного запроса. Если вы отправляете пять запросов, при этом первые четыре никогда не меняются, а пятый — всегда, это идеальный случай для его применения.
- Также попробуйте инструменты командной строки Gemini API, описанные Филиппом Шмидом в его руководстве для разработчиков управляемых агентов.
Примером такого повторяющегося случая может служить контейнеризованный планировщик семейных путешествий, где необходимо указать только пункт назначения, даты и ограничения. Он ведет себя примерно как отрегулированная модель, за исключением того, что весь файловая система доступна для наблюдения и изменения, поэтому после этого можно скачать сгенерированный файл index.html. В одной из попыток агент составил полный план путешествия по острову с картой маршрута и проверяемыми ссылками на бронирование, используя три запроса, из которых первые два оставались неизменными.
Меры предосторожности перед применением
Для подобной настройки существует несколько важных проверок:
- Снимок может содержать всё, что видел агент, включая клонированные репозитории и любые учетные данные, которые были подключены. Рассматривайте файл tar как конфиденциальный и не помещайте ключи учетных записей сервиса в песочницы, если это не абсолютно необходимо.
- Название модели здесь является предварительным вариантом. Сознательно фиксируйте его, ожидая изменений в поведении и концах точек доступа.
- Храните идентификатор среды в надежном месте. Его потеря означает потерю возможности повторной настройки.
- Перед тем как полагаться на схемы работы типа «вернусь завтра», узнайте, сколько стоит песочница с сохранением состояния и как долго она существует.
Связанные материалы
- Агенты параллельной обработки с git Worktrees, системой Conductor и Antigravity 2.0 — Как координирующий агент, git Worktrees для каждого агента и треки, основанные на задачах, позволяют разработать десяток функций SRE примерно за пять часов, а также уроки по вопросам HITL и правилам корректного слияния кода.
- Перенос нагрузок Google Apps Script в Linux-сандбокс Gemini Managed Agent — Как Google Apps Script может управлять постоянным Linux-сандбоксом, передавать файлы в Drive с помощью ggsrun, обходить ограничения в 50 МБ и лимиты токенов, а также запускать задачи Playwright, FFmpeg и esbuild.