Inicio / Artículos

Sandboxes remotas con estado y agentes gestionados antigravedad, junto con el SDK GenAI

Agentes con control antigravedad mediante el GenAI SDK: mantienen activa una sandbox remota de Ubuntu a lo largo de las turnos, se vuelve a conectar por ID de entorno y recuperan la instantánea del espacio de trabajo.

Editor: REACTAPP.TOP8 min de lectura1737 palabras

Fuentes: Orchestrating with Antigravity: A Crescendo of Agents (Part 1)

Algunos desarrolladores viven en la terminal. Si una herramienta no puede programarse desde bash, la ignoran, y su flujo de trabajo diario con inteligencia artificial se basa en agentes de línea de comandos como gemini-cli y su versión más reciente antigravity-cli (agy). Es el método de trabajo de los “BashOps”, en contraste con los “ClickOps” que prefieren herramientas gráficas.

Ese enfoque choca contra un muro cuando aumenta el trabajo de los agentes. Ejecutar varios agentes de programación al mismo tiempo, gestionar bucles con estado en múltiples pasos y rastrear cambios en archivos puede significar tener que supervisar de seis a doce ventanas de terminal distribuidas en tantos escritorios virtuales como sea necesario, lo cual se convierte rápidamente en una carga mental. La primera solución es la persistencia: proporcionar a cada agente un espacio de trabajo que sobreviva entre llamadas. La segunda, ejecutar subagentes locales en paralelo de forma segura con worktrees de git, es un tema aparte.

Aquí analizamos cómo funcionan los entornos de pruebas remotos con estado junto a los agentes gestionados Antigravity de Google, utilizando el SDK de Google GenAI y el modelo de agente de prueba antigravity-preview-05-2026. Verá cómo volver a conectarse a un entorno de contenedor y cómo recuperar el espacio de trabajo del agente a su propia máquina desde una shell local. La arquitectura y el lado hospedado de los agentes gestionados se tratan en detalle en otros recursos, como el artículo de Philipp Schmid sobre el funcionamiento interno de dichos agentes. El enfoque aquí es utilizarlos de forma programática para crear bucles de automatización.

Agentes con estado en la práctica

En una llamada tradicional a la API de un agente no existe memoria. Se envía un prompt, el agente responde y el espacio de trabajo desaparece. Si se quiere que edite un archivo que creó en la ronda anterior, hay que volver a enviar todo el archivo en el prompt. Eso consume tokens, aumenta la latencia y hace que la generación de código en múltiples rondas sea lenta y costosa.

La solución de Antigravity es la sandbox remota con estado. Se pasa "remote" como parámetro del entorno y el SDK se encarga de lo siguiente:

  1. crea un contenedor privado y seguro de Ubuntu en Google Cloud;
  2. el agente se ejecuta dentro de él;
  3. el contenedor permanece activo después de la llamada, y se devuelve un environment_id para identificarlo;
  4. cualquier llamada posterior puede conectarse al mismo contenedor y encontrar el sistema de archivos intacto.

La forma más sencilla de creerlo es ver el código.

Ejemplo: un analista de OPI expulsado de Python

Para ilustrar la idea, aquí hay un script que organiza una sesión de agente con estado y tres turnos. El agente desempeña el papel de un analista de OPI. En el primer turno, investiga la cotización pública de una empresa y guarda un informe en formato Markdown. En el segundo turno, se vuelve a conectar al mismo contenedor, abre ese informe y lo reconstruye como un panel de control en HTML con su propia hoja de estilo, además de generar una imagen correspondiente. En el tercer turno, el script descarga una captura del estado completo del espacio de trabajo.

Las funcionalidades relacionadas con el estado se logran a través del SDK estándar de Python de Google GenAI, al llamar al modelo del agente de vista previa con 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/")

Qué hace el script, paso a paso:

  1. Arranque e investigación. Google inicia un contenedor en una máquina Ubuntu, una instancia real con un disco real, y el agente comienza su investigación.
  2. Continuación y conversión. En la segunda etapa se convierte el Markdown a HTML. Es una división absurda, ya que la primera etapa podría haber generado HTML directamente, pero demuestra que se puede dejar el trabajo pendiente hoy y retomarlo mañana con la sesión intacta, quizás incluso desde una aplicación de chat.
  3. Recopilación de resultados localmente. Esta es la parte que le da sensación de realismo. El contenedor alberga un espacio de trabajo real, posiblemente con un repositorio clonado y pruebas unitarias adicionales. En esta ejecución contenía el informe en Markdown de la primera etapa, un index.html, un archivo de imagen y una hoja de estilo de la segunda etapa.

Al abrir index.html en un navegador se muestra el panel de control generado, que incluye una sección sobre la situación de los toros frente a los osos para el caso de inversión.

Ejemplo: prototipado de un juego infantil sencillo

El mismo patrón se aplica para desarrollar software. Considere un juego para niños sobre leer relojes. El problema que resuelve es concreto: un niño bueno en aritmética aún puede tener dificultades para convertir la cara de un reloj analógico, por ejemplo uno que marca las 19:45, en la cadena numérica correspondiente a esa hora. Una vez que se tiene la forma digital, calcular diferencias como 08:45 más o menos 20 minutos es sencillo. El obstáculo es puramente visual, por lo que un juego que conecte ambas formas es útil.

La ambición era crear un juego móvil multiplataforma en Flutter, en parte porque los viajes frecuentes hacen que una aplicación que funcione sin conexión en el teléfono durante un vuelo sea muy útil. Para comenzar, un único script con estado generó el primer prototipo. Se le proporcionó una instrucción detallada en varios pasos que le indicaba leer un archivo con requisitos del producto, implementar el juego, iniciar un servidor local, tomar una captura de pantalla y abrir una solicitud de integración en GitHub.

El núcleo de ese script utiliza la SDK google-genai para configurar el entorno remoto, montar el repositorio de git y, a continuación, descargar y extraer la captura final del espacio de trabajo:

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"})

En lugar de pasar directamente a una aplicación Flutter compleja, el agente creó un prototipo rápido y temporal utilizando HTML, CSS y JavaScript estándar. Con una descripción del comportamiento del reloj y su bucle de retroalimentación en una sola iteración, el agente desarrolló una aplicación de reloj responsive en aproximadamente un minuto. También diseñó opciones interactivas que asociaban la hora analógica con varios botones de respuesta digitales.

Eso demostró el valor del prototipado rápido con un solo agente. Escalar más allá de un prototipo es un problema distinto, ya que implementar el juego completo en Flutter con varios subagentes al mismo tiempo es donde un bucle CLI simple comienza a presentar dificultades. Gestionar esto de forma segura requiere árboles de trabajo git aislados y una configuración de orquestación dedicada.

Para qué son útiles los agentes remotos

La pregunta lógica es para qué sirven realmente estos agentes remotos. Se podría argumentar que todo es más cómodo en localhost. Una interpretación más interesante los considera como el primer paso hacia los “Dockerfiles para agentes”. Se comienza experimentando localmente y, gradualmente, se crea un contenedor de agente con los propios scripts, una carpeta de configuración de herramientas y quizás una clave de cuenta de servicio en la nube. En poco tiempo se dispone de un entorno aislado, seguro y reutilizable donde el agente puede acceder a Internet, con una combinación poderosa de git clone y claves API.

Guía práctica:

  • Omite este método para investigaciones puntuales. La interfaz web o una CLI local son mucho más rápidas.
  • Úselo para flujos de trabajo repetibles en los que la configuración inicial es mucho más extensa que el prompt final. Si ejecutas cinco prompts y los cuatro primeros nunca cambian mientras que el quinto sí lo hace, ese es el escenario ideal.
  • Prueba también las herramientas de línea de comandos de la API Gemini, que Philipp Schmid describe en su guía para desarrolladores de agentes gestionados.

Un ejemplo de caso repetible es un planificador de viajes familiar en contenedor, donde solo se indican el destino, las fechas y las restricciones. Funciona un poco como un modelo afinado, excepto que todo el sistema de archivos es observable y ajustable, por lo que puedes descargar el index.html generado posteriormente. En una sola ejecución, un agente creó un plan completo de viaje a una isla, con un mapa del itinerario y enlaces de reserva verificables, a partir de tres prompts, de los cuales los dos primeros permanecieron constantes.

Precauciones antes de adoptarlo

Existen algunas verificaciones importantes para cualquier configuración de este tipo:

  • Una instantánea puede contener todo lo que vio el agente, incluidos los repositorios clonados y cualquier credencial que se haya montado. Trate el archivo tar como información sensible y mantenga las claves de la cuenta de servicio fuera de los entornos de pruebas a menos que sean estrictamente necesarias.
  • El nombre del modelo aquí es una versión preliminar obsoleta. Fíjelo intencionadamente, pero tenga en cuenta que el comportamiento y los puntos de conexión pueden cambiar.
  • Guarde el ID del entorno en un lugar fiable. Perderlo significa perder la posibilidad de volver a conectarse a él.
  • Verifique cuánto cuesta un entorno de pruebas con estado y cuánto tiempo dura antes de confiar en flujos de trabajo tipo “volveré mañana”.

Leer más

  • Engineering de agentes y el bucle exterior: dónde encajan Antigravity y Agents CLI — Las especificaciones, las evaluaciones y las restricciones definen el engineering de agentes. Un análisis de la Agents CLI de Google, su capa de producción en GCP, y cómo Antigravity difiere de otras herramientas de programación.