Главная / Статьи

Состоянийные удаленные сандбоксы с управляемыми агентами типа «антигравитация» и SDK GenAI

Агенты с управлением антигравитацией с помощью GenAI SDK: поддерживают работу удаленной среды Ubuntu в режиме «сандбокс» на протяжении нескольких ходов, восстанавливают подключение по идентификатору среды и загружают снимок рабочего пространства.

Издатель: REACTAPP.TOP8 мин чтения1737 слов

Источники: 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 само займется следующим:

  1. оно создает закрытый контейнер Ubuntu в Google Cloud;
  2. агент выполняется внутри него;
  3. контейнер остается активным после завершения вызова, и возвращается environment_id для его идентификации;
  4. любой последующий вызов может подключиться к тому же контейнеру и обнаружить, что файловая система осталась нетронутой.

Самый простой способ убедиться в этом — посмотреть код.

Пример: аналитик 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/")

Что делает скрипт, шаг за шагом:

  1. Запуск и исследование. Google запускает контейнер на машине с Ubuntu — реальной машине с реальным диском — и агент начинает свои исследования.
  2. Продолжение и преобразование. На втором этапе Markdown преобразуется в HTML. Это странное разделение, поскольку на первом этапе можно было бы сразу получить HTML, но это демонстрирует возможность временно приостановить работу и возобновить её завтра с сохранённой сессией, возможно, даже из чат-приложения.
  3. Загрузка результатов локально. Именно этот этап придаёт всему ощущение реальности. В контейнере находится реальное рабочее пространство, возможно, с клонированным репозиторием и добавленными тестами. В ходе этого запуска там был отчёт в формате 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 как конфиденциальный и не помещайте ключи учетных записей сервиса в песочницы, если это не абсолютно необходимо.
  • Название модели здесь является предварительным вариантом. Сознательно фиксируйте его, ожидая изменений в поведении и концах точек доступа.
  • Храните идентификатор среды в надежном месте. Его потеря означает потерю возможности повторной настройки.
  • Перед тем как полагаться на схемы работы типа «вернусь завтра», узнайте, сколько стоит песочница с сохранением состояния и как долго она существует.

Связанные материалы

  • Инженерия агентов и внешняя схема: где находятся Antigravity и Agents CLI — Технические спецификации, методы оценки и ограничения определяют принципы инженерии агентов. Рассмотрение инструмента Agents CLI от Google, его производственного слоя в GCP, а также отличий Antigravity от других инструментов программирования.