> ## AI Agent Context > Get the complete documentation index at: https://aistudio.google.com/docs/llms.txt > Use this file to discover all available pages. > For the full documentation in a single file, fetch: https://aistudio.google.com/docs/llms-full.txt # Antigravity agent The Antigravity agent is a general-purpose managed agent on the Gemini API. A single API call gives you an agent that reasons, executes code, manages files, and browses the web inside your own secure Linux sandbox, hosted by Google. It is built with Gemini 3.8 Flash and uses the same harness as the Antigravity IDE. You can configure the underlying Gemini model using `agent_config`. Available through the [Interactions API](/docs/interactions-overview) and [Google AI Studio](https://aistudio.google.com). {% tabs %} {% tab filename="sample.py" label="Python" %} ```py from google import genai client = genai.Client() interaction = client.interactions.create( agent="antigravity-preview-09-2026", input="Read Hacker News, summarize the top 10 stories, and save the results as a PDF.", environment="remote", ) print(interaction.output_text) ``` {% /tab %} {% tab filename="sample.js" label="JavaScript" %} ```javascript import { GoogleGenAI } from "@google/genai"; const client = new GoogleGenAI({}); const interaction = await client.interactions.create({ agent: "antigravity-preview-09-2026", input: "Read Hacker News, summarize the top 10 stories, and save the results as a PDF.", environment: "remote", }, { timeout: 300000 }); console.log(interaction.output_text); ``` {% /tab %} {% tab filename="sample.sh" label="REST" %} ```shell curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \ -H "Content-Type: application/json" \ -H "x-goog-api-key: $GEMINI_API_KEY" \ -d '{ "agent": "antigravity-preview-09-2026", "input": "Read Hacker News, summarize the top 10 stories, and save the results as a PDF.", "environment": "remote" }' ``` {% /tab %} {% tab label="Java" %} ```java import com.google.genai.Client; import com.google.genai.gaos.models.interactions.AgentOption; import com.google.genai.gaos.models.interactions.CreateAgentInteraction; import com.google.genai.gaos.models.interactions.CreateAgentInteractionEnvironment; import com.google.genai.gaos.models.interactions.Interaction; import com.google.genai.gaos.models.interactions.InteractionsInput; import com.google.genai.gaos.models.operations.CreateInteractionRequestBody; Client client = new Client(); CreateAgentInteraction params = CreateAgentInteraction.builder() .agent(AgentOption.of("antigravity-preview-09-2026")) .input(InteractionsInput.of("Read Hacker News, summarize the top 10 stories, and save the results as a PDF.")) .environment(CreateAgentInteractionEnvironment.of("remote")) .build(); Interaction interaction = client.interactions.create(CreateInteractionRequestBody.of(params)).interaction().get(); System.out.println(interaction.outputText().orElse("")); ``` {% /tab %} {% tab label="Go" %} ```go package main import ( "context" "fmt" "log" "google.golang.org/genai" "google.golang.org/genai/interactions/models/interactions" "google.golang.org/genai/interactions/models/operations" ) func main() { ctx := context.Background() client, err := genai.NewClient(ctx, nil) if err != nil { log.Fatal(err) } res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{ Body: operations.NewCreateInteractionRequestBody(interactions.CreateAgentInteraction{ Agent: interactions.AgentOption("antigravity-preview-09-2026"), Input: interactions.NewInteractionsInput("Read Hacker News, summarize the top 10 stories, and save the results as a PDF."), Environment: genai.Ptr(interactions.NewCreateAgentInteractionEnvironment("remote")), }), }) if err != nil { log.Fatal(err) } if res.Interaction.OutputText != nil { fmt.Println(*res.Interaction.OutputText) } } ``` {% /tab %} {% /tabs %} ## Capabilities {% id="capabilities" %} Each call can provision a Linux sandbox and starts a tool-use loop. The agent plans, acts, observes results, and repeats until the task is done. - **Code execution:** Run Bash, Python, and Node.js commands. Install packages, run tests, build apps. - **File management:** Read, write, edit, search, and list files in the sandbox. Files persist across interactions. - **Web access:** Google Search and URL fetching for data. - **Context compaction:** Automatic context compaction (triggered at ~135k tokens) to support long-running, multi-turn sessions without losing context or hitting token limits. See the [Quickstart](/docs/managed-agents-quickstart) for multi-turn usage and streaming. ## Supported tools {% id="supported-tools" %} By default, the agent has access to `code_execution`, `google_search`, and `url_context`. Filesystem tools are enabled automatically when you specify the `environment` parameter. You can also define **custom functions** to connect the agent to your own APIs and tools. You only need to specify the `tools` parameter when customizing or restricting the default set, or when adding custom functions. | Tool | Type value | Description | | :--- | :--- | :--- | | Code Execution | `code_execution` | Run shell commands (bash, Python, Node) with stdout/stderr capture. | | Google Search | `google_search` | Search the public web. | | URL Context | `url_context` | Fetch and read web pages. | | Filesystem | *(enabled via `environment`)* | Read, write, edit, search, and list files in the sandbox. The system enables these tools automatically when you set the `environment`. | | Custom Functions | `function` | Define custom functions that the agent can request to execute. See [Function calling](/docs/antigravity-agent#function-calling). | | Remote MCP Server | `mcp_server` | Register external Model Context Protocol (MCP) servers as tools. See [MCP servers](/docs/antigravity-agent#mcp-servers). | You can intercept and validate `code_execution` and `filesystem` tool execution right inside the remote sandbox using synchronous [Hooks](/docs/agent-hooks). To limit the agent to specific tools, pass only the ones you need: {% tabs %} {% tab filename="sample.py" label="Python" %} ```py from google import genai client = genai.Client() interaction = client.interactions.create( agent="antigravity-preview-09-2026", input="Search for the latest AI research papers on reasoning and summarize them.", environment="remote", tools=[ {"type": "google_search"}, {"type": "url_context"}, ], ) print(interaction.output_text) ``` {% /tab %} {% tab filename="sample.js" label="JavaScript" %} ```javascript import { GoogleGenAI } from "@google/genai"; const client = new GoogleGenAI({}); const interaction = await client.interactions.create({ agent: "antigravity-preview-09-2026", input: "Search for the latest AI research papers on reasoning and summarize them.", environment: "remote", tools: [ { type: "google_search" }, { type: "url_context" }, ], }, { timeout: 300000 }); console.log(interaction.output_text); ``` {% /tab %} {% tab filename="sample.sh" label="REST" %} ```shell curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \ -H "Content-Type: application/json" \ -H "x-goog-api-key: $GEMINI_API_KEY" \ -d '{ "agent": "antigravity-preview-09-2026", "input": "Search for the latest AI research papers on reasoning and summarize them.", "environment": "remote", "tools": [ {"type": "google_search"}, {"type": "url_context"} ] }' ``` {% /tab %} {% tab label="Java" %} ```java import com.google.genai.Client; import com.google.genai.gaos.models.interactions.AgentOption; import com.google.genai.gaos.models.interactions.CreateAgentInteraction; import com.google.genai.gaos.models.interactions.CreateAgentInteractionEnvironment; import com.google.genai.gaos.models.interactions.GoogleSearch; import com.google.genai.gaos.models.interactions.Interaction; import com.google.genai.gaos.models.interactions.InteractionsInput; import com.google.genai.gaos.models.interactions.URLContext; import com.google.genai.gaos.models.operations.CreateInteractionRequestBody; import java.util.List; Client client = new Client(); CreateAgentInteraction params = CreateAgentInteraction.builder() .agent(AgentOption.of("antigravity-preview-09-2026")) .input(InteractionsInput.of("Search for the latest AI research papers on reasoning and summarize them.")) .environment(CreateAgentInteractionEnvironment.of("remote")) .tools(List.of( GoogleSearch.builder().build(), URLContext.builder().build() )) .build(); Interaction interaction = client.interactions.create(CreateInteractionRequestBody.of(params)).interaction().get(); System.out.println(interaction.outputText().orElse("")); ``` {% /tab %} {% tab label="Go" %} ```go package main import ( "context" "fmt" "log" "google.golang.org/genai" "google.golang.org/genai/interactions/models/interactions" "google.golang.org/genai/interactions/models/operations" ) func main() { ctx := context.Background() client, err := genai.NewClient(ctx, nil) if err != nil { log.Fatal(err) } res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{ Body: operations.NewCreateInteractionRequestBody(interactions.CreateAgentInteraction{ Agent: interactions.AgentOption("antigravity-preview-09-2026"), Input: interactions.NewInteractionsInput("Search for the latest AI research papers on reasoning and summarize them."), Environment: genai.Ptr(interactions.NewCreateAgentInteractionEnvironment("remote")), Tools: []interactions.Tool{ interactions.NewTool(interactions.GoogleSearch{}), interactions.NewTool(interactions.URLContext{}), }, }), }) if err != nil { log.Fatal(err) } if res.Interaction.OutputText != nil { fmt.Println(*res.Interaction.OutputText) } } ``` {% /tab %} {% /tabs %} ## Multimodal Input {% id="multimodal-input" %} The Antigravity agent supports multimodal inputs. Currently, only `text` and `image` inputs are supported. Images must be supplied as inline base64-encoded strings (`data`). {% tabs %} {% tab filename="sample.py" label="Python" %} ```py import base64 from google import genai client = genai.Client() with open("path/to/chart.png", "rb") as f: image_bytes = f.read() interaction_inline = client.interactions.create( agent="antigravity-preview-09-2026", input=[ {"type": "text", "text": "Analyze this chart and summarize the trends."}, { "type": "image", "data": base64.b64encode(image_bytes).decode("utf-8"), "mime_type": "image/png", }, ], environment="remote", ) ``` {% /tab %} {% tab filename="sample.js" label="JavaScript" %} ```javascript import { GoogleGenAI } from "@google/genai"; import * as fs from "node:fs"; const client = new GoogleGenAI({}); const base64Image = fs.readFileSync("path/to/chart.png", { encoding: "base64" }); const interactionInline = await client.interactions.create({ agent: "antigravity-preview-09-2026", input: [ { type: "text", text: "Analyze this chart and summarize the trends." }, { type: "image", data: base64Image, mime_type: "image/png", }, ], environment: "remote", }, { timeout: 300000 }); ``` {% /tab %} {% tab filename="sample.sh" label="REST" %} ```shell BASE64_IMAGE=$(base64 -w0 /path/to/chart.png) curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \ -H "Content-Type: application/json" \ -H "x-goog-api-key: $GEMINI_API_KEY" \ -d "{ \"agent\": \"antigravity-preview-09-2026\", \"input\": [ {\"type\": \"text\", \"text\": \"Analyze this chart and summarize the trends.\"}, { \"type\": \"image\", \"mime_type\": \"image/png\", \"data\": \"$BASE64_IMAGE\" } ], \"environment\": \"remote\" }" ``` {% /tab %} {% tab label="Java" %} ```java import com.google.genai.Client; import com.google.genai.gaos.models.interactions.AgentOption; import com.google.genai.gaos.models.interactions.CreateAgentInteraction; import com.google.genai.gaos.models.interactions.CreateAgentInteractionEnvironment; import com.google.genai.gaos.models.interactions.ImageContent; import com.google.genai.gaos.models.interactions.ImageContentMimeType; import com.google.genai.gaos.models.interactions.Interaction; import com.google.genai.gaos.models.interactions.InteractionsInput; import com.google.genai.gaos.models.interactions.TextContent; import com.google.genai.gaos.models.operations.CreateInteractionRequestBody; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Base64; import java.util.List; Client client = new Client(); byte[] imageBytes = Files.readAllBytes(Paths.get("path/to/chart.png")); String base64Image = Base64.getEncoder().encodeToString(imageBytes); CreateAgentInteraction params = CreateAgentInteraction.builder() .agent(AgentOption.of("antigravity-preview-09-2026")) .input(InteractionsInput.ofContent(List.of( TextContent.builder().text("Analyze this chart and summarize the trends.").build(), ImageContent.builder() .data(base64Image) .mimeType(ImageContentMimeType.IMAGE_PNG) .build() ))) .environment(CreateAgentInteractionEnvironment.of("remote")) .build(); Interaction interactionInline = client.interactions.create(CreateInteractionRequestBody.of(params)).interaction().get(); System.out.println(interactionInline.outputText().orElse("")); ``` {% /tab %} {% tab label="Go" %} ```go package main import ( "context" "encoding/base64" "fmt" "log" "os" "google.golang.org/genai" "google.golang.org/genai/interactions/models/interactions" "google.golang.org/genai/interactions/models/operations" ) func main() { ctx := context.Background() client, err := genai.NewClient(ctx, nil) if err != nil { log.Fatal(err) } imageBytes, err := os.ReadFile("path/to/chart.png") if err != nil { log.Fatal(err) } base64Image := base64.StdEncoding.EncodeToString(imageBytes) res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{ Body: operations.NewCreateInteractionRequestBody(interactions.CreateAgentInteraction{ Agent: interactions.AgentOption("antigravity-preview-09-2026"), Input: interactions.NewInteractionsInput([]interactions.Content{ interactions.NewContent(interactions.TextContent{ Text: "Analyze this chart and summarize the trends.", }), interactions.NewContent(interactions.ImageContent{ Data: genai.Ptr(base64Image), MimeType: interactions.ImageContentMimeTypeImagePng.ToPointer(), }), }), Environment: genai.Ptr(interactions.NewCreateAgentInteractionEnvironment("remote")), }), }) if err != nil { log.Fatal(err) } if res.Interaction.OutputText != nil { fmt.Println(*res.Interaction.OutputText) } } ``` {% /tab %} {% /tabs %} ## Function calling {% id="function-calling" %} Function calling allows you to connect the Antigravity agent to external APIs and databases by defining custom tools the agent can invoke. For general concepts, see [Function calling with the Gemini API](/docs/function-calling). The following example demonstrates a 2-turn interaction. The agent first requests a custom `get_weather` function call, and the client executes it and returns the result in the second turn. {% tabs %} {% tab filename="sample.py" label="Python" %} ```python from google import genai client = genai.Client() # 1. Define the custom function get_weather_tool = { "type": "function", "name": "get_weather", "description": "Gets the current weather for a given location.", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "The city and country, e.g. San Francisco, USA", } }, "required": ["location"], }, } # 2. Call the agent with the custom tool (Turn 1) interaction = client.interactions.create( agent="antigravity-preview-09-2026", input="What is the weather in Tokyo?", environment="remote", tools=[ {"type": "code_execution"}, # Enable default code execution get_weather_tool, # Add custom function ], ) # Check if the agent requested a function call if interaction.status == "requires_action": # Find function calls that do not have a matching function result. # Filesystem tools (like write_to_file) are also represented as function calls # but are executed automatically by the environment. executed_calls = {step.call_id for step in interaction.steps if step.type == "function_result"} pending_calls = [step for step in interaction.steps if step.type == "function_call" and step.id not in executed_calls] if pending_calls: fc_step = pending_calls[0] print(f"Function to call: {fc_step.name} (ID: {fc_step.id})") print(f"Arguments: {fc_step.arguments}") # 3. Execute the function locally (simulated get_weather()) and send the result back (Turn 2) function_result = { "temperature": 23, "unit": "celsius" } final_interaction = client.interactions.create( agent="antigravity-preview-09-2026", previous_interaction_id=interaction.id, # Reference the interaction ID environment=interaction.environment_id, input=[ { "type": "function_result", "name": fc_step.name, "call_id": fc_step.id, "result": function_result, } ], ) print(final_interaction.output_text) # Output: The current weather in Tokyo, Japan is 23°C (Celsius). else: print("No pending function calls.") else: print(f"Interaction completed with status: {interaction.status}") ``` {% /tab %} {% tab filename="sample.js" label="JavaScript" %} ```javascript import { GoogleGenAI } from "@google/genai"; const client = new GoogleGenAI({}); // 1. Call the agent with the custom tool (Turn 1) const interaction = await client.interactions.create({ agent: "antigravity-preview-09-2026", input: "What is the weather in Tokyo?", environment: "remote", tools: [ { type: "code_execution" }, { type: "function", name: "get_weather", description: "Gets the current weather for a given location.", parameters: { type: "object", properties: { location: { type: "string", description: "The city and country, e.g. San Francisco, USA", }, }, required: ["location"], }, }, ], }, { timeout: 300000 }); if (interaction.status === "requires_action") { // Find function calls that do not have a matching function result. // Filesystem tools (like write_to_file) are also represented as function calls // but are executed automatically by the environment. const executedCalls = new Set( (interaction.steps || []) .filter(s => s.type === "function_result") .map(s => s.call_id) ); const pendingCalls = (interaction.steps || []).filter( s => s.type === "function_call" && !executedCalls.has(s.id) ); if (pendingCalls.length > 0) { const fcStep = pendingCalls[0]; if (fcStep.type === "function_call") { console.log(`Function to call: ${fcStep.name} (ID: ${fcStep.id})`); // Execute the function locally (simulated get_weather()) and send the result back (Turn 2) const functionResult = { temperature: 23, unit: "celsius" }; const finalInteraction = await client.interactions.create({ agent: "antigravity-preview-09-2026", previous_interaction_id: interaction.id, // Reference the interaction ID environment: interaction.environment_id, input: [ { type: "function_result", name: fcStep.name, call_id: fcStep.id, result: functionResult, } ], }, { timeout: 300000 }); console.log(finalInteraction.output_text); } } else { console.log("No pending function calls."); } } else { console.log(`Interaction completed with status: ${interaction.status}`); } ``` {% /tab %} {% tab filename="sample.sh" label="REST" %} ```shell # 1. Turn 1: Request function call RESPONSE=$(curl -s -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \ -H "Content-Type: application/json" \ -H "x-goog-api-key: $GEMINI_API_KEY" \ -d '{ "agent": "antigravity-preview-09-2026", "input": "What is the weather in Tokyo?", "environment": "remote", "tools": [ {"type": "code_execution"}, { "type": "function", "name": "get_weather", "description": "Gets the current weather for a given location.", "parameters": { "type": "object", "properties": { "location": {"type": "string"} }, "required": ["location"] } } ] }') # Extract interaction ID, environment ID, and call ID (requires jq) INTERACTION_ID=$(echo $RESPONSE | jq -r '.id') ENVIRONMENT_ID=$(echo $RESPONSE | jq -r '.environment_id') CALL_ID=$(echo $RESPONSE | jq -r '.steps[] | select(.type=="function_call") | .id') # 2. Turn 2: Send function result back using variables curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \ -H "Content-Type: application/json" \ -H "x-goog-api-key: $GEMINI_API_KEY" \ -d "{ \"agent\": \"antigravity-preview-09-2026\", \"previous_interaction_id\": \"$INTERACTION_ID\", \"environment\": \"$ENVIRONMENT_ID\", \"input\": [ { \"type\": \"function_result\", \"name\": \"get_weather\", \"call_id\": \"$CALL_ID\", \"result\": { \"temperature\": 23, \"unit\": \"celsius\" } } ] }" ``` {% /tab %} {% tab label="Java" %} ```java import com.google.genai.Client; import com.google.genai.gaos.models.interactions.AgentOption; import com.google.genai.gaos.models.interactions.CodeExecution; import com.google.genai.gaos.models.interactions.CreateAgentInteraction; import com.google.genai.gaos.models.interactions.CreateAgentInteractionEnvironment; import com.google.genai.gaos.models.interactions.Function; import com.google.genai.gaos.models.interactions.FunctionCallStep; import com.google.genai.gaos.models.interactions.FunctionResultStep; import com.google.genai.gaos.models.interactions.FunctionResultStepResultUnion; import com.google.genai.gaos.models.interactions.Interaction; import com.google.genai.gaos.models.interactions.InteractionStatus; import com.google.genai.gaos.models.interactions.InteractionsInput; import com.google.genai.gaos.models.interactions.Step; import com.google.genai.gaos.models.operations.CreateInteractionRequestBody; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; Client client = new Client(); // 1. Define the custom function Function getWeatherTool = Function.builder() .name("get_weather") .description("Gets the current weather for a given location.") .parameters(Map.of( "type", "object", "properties", Map.of( "location", Map.of( "type", "string", "description", "The city and country, e.g. San Francisco, USA" ) ), "required", List.of("location") )) .build(); // 2. Call the agent with the custom tool (Turn 1) CreateAgentInteraction params = CreateAgentInteraction.builder() .agent(AgentOption.of("antigravity-preview-09-2026")) .input(InteractionsInput.of("What is the weather in Tokyo?")) .environment(CreateAgentInteractionEnvironment.of("remote")) .tools(List.of( CodeExecution.builder().build(), // Enable default code execution getWeatherTool // Add custom function )) .build(); Interaction interaction = client.interactions.create(CreateInteractionRequestBody.of(params)).interaction().get(); // Check if the agent requested a function call if (interaction.status().orElse(null) == InteractionStatus.REQUIRES_ACTION) { // Find function calls that do not have a matching function result. List steps = interaction.steps().orElse(List.of()); Set executedCalls = steps.stream() .filter(step -> step instanceof FunctionResultStep) .map(step -> ((FunctionResultStep) step).callId().orElse("")) .collect(Collectors.toSet()); List pendingCalls = steps.stream() .filter(step -> step instanceof FunctionCallStep) .map(step -> (FunctionCallStep) step) .filter(fc -> !executedCalls.contains(fc.id().orElse(""))) .collect(Collectors.toList()); if (!pendingCalls.isEmpty()) { FunctionCallStep fcStep = pendingCalls.get(0); System.out.println("Function to call: " + fcStep.name().orElse("") + " (ID: " + fcStep.id().orElse("") + ")"); System.out.println("Arguments: " + fcStep.arguments().orElse(Map.of())); // 3. Execute the function locally (simulated get_weather()) and send the result back (Turn 2) FunctionResultStep resultStep = FunctionResultStep.builder() .name(fcStep.name().orElse("")) .callId(fcStep.id().orElse("")) .result(FunctionResultStepResultUnion.of("{\"temperature\": 23, \"unit\": \"celsius\"}")) .build(); CreateAgentInteraction followupParams = CreateAgentInteraction.builder() .agent(AgentOption.of("antigravity-preview-09-2026")) .previousInteractionId(interaction.id().orElse("")) .environment(CreateAgentInteractionEnvironment.of(interaction.environmentId().orElse(""))) .input(InteractionsInput.ofStep(List.of(resultStep))) .build(); Interaction finalInteraction = client.interactions.create(CreateInteractionRequestBody.of(followupParams)).interaction().get(); System.out.println(finalInteraction.outputText().orElse("")); // Output: The current weather in Tokyo, Japan is 23°C (Celsius). } else { System.out.println("No pending function calls."); } } else { System.out.println("Interaction completed with status: " + interaction.status().orElse(null)); } ``` {% /tab %} {% tab label="Go" %} ```go package main import ( "context" "fmt" "log" "google.golang.org/genai" "google.golang.org/genai/interactions/models/interactions" "google.golang.org/genai/interactions/models/operations" ) func main() { ctx := context.Background() client, err := genai.NewClient(ctx, nil) if err != nil { log.Fatal(err) } // 1. Define the custom function getWeatherTool := interactions.NewTool(interactions.Function{ Name: genai.Ptr("get_weather"), Description: genai.Ptr("Gets the current weather for a given location."), Parameters: map[string]any{ "type": "object", "properties": map[string]any{ "location": map[string]any{ "type": "string", "description": "The city and country, e.g. San Francisco, USA", }, }, "required": []string{"location"}, }, }) // 2. Call the agent with the custom tool (Turn 1) res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{ Body: operations.NewCreateInteractionRequestBody(interactions.CreateAgentInteraction{ Agent: interactions.AgentOption("antigravity-preview-09-2026"), Input: interactions.NewInteractionsInput("What is the weather in Tokyo?"), Environment: genai.Ptr(interactions.NewCreateAgentInteractionEnvironment("remote")), Tools: []interactions.Tool{ interactions.NewTool(interactions.CodeExecution{}), // Enable default code execution getWeatherTool, // Add custom function }, }), }) if err != nil { log.Fatal(err) } interaction := res.Interaction // Check if the agent requested a function call if interaction.Status == interactions.InteractionStatusRequiresAction { executedCalls := make(map[string]bool) for _, step := range interaction.Steps { if fr := step.FunctionResultStep; fr != nil { executedCalls[fr.CallID] = true } } var pendingCalls []*interactions.FunctionCallStep for _, step := range interaction.Steps { if fc := step.FunctionCallStep; fc != nil && !executedCalls[fc.ID] { pendingCalls = append(pendingCalls, fc) } } if len(pendingCalls) > 0 { fcStep := pendingCalls[0] fmt.Printf("Function to call: %s (ID: %s)\n", fcStep.Name, fcStep.ID) fmt.Printf("Arguments: %v\n", fcStep.Arguments) // 3. Execute the function locally (simulated get_weather()) and send the result back (Turn 2) resultStep := interactions.FunctionResultStep{ Name: genai.Ptr(fcStep.Name), CallID: fcStep.ID, Result: interactions.NewFunctionResultStepResultUnion(`{"temperature": 23, "unit": "celsius"}`), } followupRes, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{ Body: operations.NewCreateInteractionRequestBody(interactions.CreateAgentInteraction{ Agent: interactions.AgentOption("antigravity-preview-09-2026"), PreviousInteractionID: interaction.ID, Environment: genai.Ptr(interactions.NewCreateAgentInteractionEnvironment(*interaction.EnvironmentID)), Input: interactions.NewInteractionsInput([]interactions.Step{ interactions.NewStep(resultStep), }), }), }) if err != nil { log.Fatal(err) } if followupRes.Interaction.OutputText != nil { fmt.Println(*followupRes.Interaction.OutputText) } } else { fmt.Println("No pending function calls.") } } else { fmt.Printf("Interaction completed with status: %s\n", interaction.Status) } } ``` {% /tab %} {% /tabs %} ## MCP servers {% id="mcp-servers" %} You can connect the Antigravity agent to external tools by registering remote Model Context Protocol (MCP) servers. The agent supports remote MCP servers over streamable HTTP. When registering an MCP server, you must specify the following fields in the `tools` array: | Field | Type | Required | Description | | :--- | :--- | :--- | :--- | | `type` | string | Yes | Must be `"mcp_server"`. | | `name` | string | Yes | A unique identifier for the server. Must be strictly lowercase and alphanumeric (matching `^[a-z0-9_-]+$`). | | `url` | string | Yes | The endpoint URL of the remote MCP server. | | `headers` | object | No | Custom headers (e.g., authentication) sent with requests. | | `allowed_tools` | array | No | List of tool names allowed to be executed. If omitted, all tools are allowed. | {% tabs %} {% tab filename="sample.py" label="Python" %} ```py from google import genai client = genai.Client() # Register a remote HTTP MCP server interaction = client.interactions.create( agent="antigravity-preview-09-2026", input="What is the weather in Tokyo?", environment="remote", tools=[{ "type": "mcp_server", "name": "weather", # Must be lowercase "url": "https://gemini-api-demos.uc.r.appspot.com/mcp" }] ) print(interaction.output_text) ``` {% /tab %} {% tab filename="sample.js" label="JavaScript" %} ```javascript import { GoogleGenAI } from "@google/genai"; const client = new GoogleGenAI({}); const interaction = await client.interactions.create({ agent: "antigravity-preview-09-2026", input: "What is the weather in Tokyo?", environment: "remote", tools: [{ type: "mcp_server", name: "weather", // Must be lowercase url: "https://gemini-api-demos.uc.r.appspot.com/mcp" }] }, { timeout: 300000 }); console.log(interaction.output_text); ``` {% /tab %} {% tab filename="sample.sh" label="REST" %} ```shell curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \ -H "Content-Type: application/json" \ -H "x-goog-api-key: $GEMINI_API_KEY" \ -d '{ "agent": "antigravity-preview-09-2026", "input": "What is the weather in Tokyo?", "environment": "remote", "tools": [{ "type": "mcp_server", "name": "weather", "url": "https://gemini-api-demos.uc.r.appspot.com/mcp" }] }' ``` {% /tab %} {% tab label="Java" %} ```java import com.google.genai.Client; import com.google.genai.gaos.models.interactions.AgentOption; import com.google.genai.gaos.models.interactions.CreateAgentInteraction; import com.google.genai.gaos.models.interactions.CreateAgentInteractionEnvironment; import com.google.genai.gaos.models.interactions.Interaction; import com.google.genai.gaos.models.interactions.InteractionsInput; import com.google.genai.gaos.models.interactions.MCPServer; import com.google.genai.gaos.models.operations.CreateInteractionRequestBody; import java.util.List; Client client = new Client(); // Register a remote HTTP MCP server CreateAgentInteraction params = CreateAgentInteraction.builder() .agent(AgentOption.of("antigravity-preview-09-2026")) .input(InteractionsInput.of("What is the weather in Tokyo?")) .environment(CreateAgentInteractionEnvironment.of("remote")) .tools(List.of( MCPServer.builder() .name("weather") // Must be lowercase .url("https://gemini-api-demos.uc.r.appspot.com/mcp") .build() )) .build(); Interaction interaction = client.interactions.create(CreateInteractionRequestBody.of(params)).interaction().get(); System.out.println(interaction.outputText().orElse("")); ``` {% /tab %} {% tab label="Go" %} ```go package main import ( "context" "fmt" "log" "google.golang.org/genai" "google.golang.org/genai/interactions/models/interactions" "google.golang.org/genai/interactions/models/operations" ) func main() { ctx := context.Background() client, err := genai.NewClient(ctx, nil) if err != nil { log.Fatal(err) } // Register a remote HTTP MCP server res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{ Body: operations.NewCreateInteractionRequestBody(interactions.CreateAgentInteraction{ Agent: interactions.AgentOption("antigravity-preview-09-2026"), Input: interactions.NewInteractionsInput("What is the weather in Tokyo?"), Environment: genai.Ptr(interactions.NewCreateAgentInteractionEnvironment("remote")), Tools: []interactions.Tool{ interactions.NewTool(interactions.MCPServer{ Name: genai.Ptr("weather"), // Must be lowercase URL: genai.Ptr("https://gemini-api-demos.uc.r.appspot.com/mcp"), }), }, }), }) if err != nil { log.Fatal(err) } if res.Interaction.OutputText != nil { fmt.Println(*res.Interaction.OutputText) } } ``` {% /tab %} {% /tabs %} ## Model selection {% id="model-selection" %} For `antigravity-preview-09-2026`, the default model is **Gemini 3.8 Flash** (`gemini-3.8-flash`). If you omit `agent_config`, the agent defaults to `gemini-3.8-flash`. You can configure the underlying Gemini model using `agent_config` to optimize for speed, cost, or reasoning capability. For example, set `model` to **Gemini 4 Argon** (`gemini-4-argon`) for complex software engineering and reasoning tasks: {% tabs %} {% tab filename="sample.py" label="Python" %} ```python from google import genai client = genai.Client() interaction = client.interactions.create( agent="antigravity-preview-09-2026", input="Summarize the key differences between functional and object-oriented programming.", environment="remote", agent_config={ "type": "antigravity", "model": "gemini-4-argon", }, ) print(interaction.output_text) ``` {% /tab %} {% tab filename="sample.js" label="JavaScript" %} ```javascript import { GoogleGenAI } from "@google/genai"; const client = new GoogleGenAI({}); const interaction = await client.interactions.create({ agent: "antigravity-preview-09-2026", input: "Summarize the key differences between functional and object-oriented programming.", environment: "remote", agent_config: { type: "antigravity", model: "gemini-4-argon", }, }, { timeout: 300000 }); console.log(interaction.output_text); ``` {% /tab %} {% tab filename="sample.sh" label="REST" %} ```shell curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \ -H "Content-Type: application/json" \ -H "x-goog-api-key: $GEMINI_API_KEY" \ -d '{ "agent": "antigravity-preview-09-2026", "input": "Summarize the key differences between functional and object-oriented programming.", "environment": "remote", "agent_config": { "type": "antigravity", "model": "gemini-4-argon" } }' ``` {% /tab %} {% tab label="Java" %} ```java import com.google.genai.Client; import com.google.genai.gaos.models.interactions.AgentOption; import com.google.genai.gaos.models.interactions.AntigravityAgentConfig; import com.google.genai.gaos.models.interactions.CreateAgentInteraction; import com.google.genai.gaos.models.interactions.CreateAgentInteractionEnvironment; import com.google.genai.gaos.models.interactions.Interaction; import com.google.genai.gaos.models.interactions.InteractionsInput; import com.google.genai.gaos.models.operations.CreateInteractionRequestBody; Client client = new Client(); CreateAgentInteraction params = CreateAgentInteraction.builder() .agent(AgentOption.of("antigravity-preview-09-2026")) .input(InteractionsInput.of("Summarize the key differences between functional and object-oriented programming.")) .environment(CreateAgentInteractionEnvironment.of("remote")) .agentConfig( AntigravityAgentConfig.builder() .model("gemini-4-argon") .build() ) .build(); Interaction interaction = client.interactions.create(CreateInteractionRequestBody.of(params)).interaction().get(); System.out.println(interaction.outputText().orElse("")); ``` {% /tab %} {% tab label="Go" %} ```go package main import ( "context" "fmt" "log" "google.golang.org/genai" "google.golang.org/genai/interactions/models/interactions" "google.golang.org/genai/interactions/models/operations" ) func main() { ctx := context.Background() client, err := genai.NewClient(ctx, nil) if err != nil { log.Fatal(err) } res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{ Body: operations.NewCreateInteractionRequestBody(interactions.CreateAgentInteraction{ Agent: interactions.AgentOption("antigravity-preview-09-2026"), Input: interactions.NewInteractionsInput("Summarize the key differences between functional and object-oriented programming."), Environment: genai.Ptr(interactions.NewCreateAgentInteractionEnvironment("remote")), AgentConfig: genai.Ptr(interactions.NewCreateAgentInteractionAgentConfig(interactions.AntigravityAgentConfig{ Model: genai.Ptr("gemini-4-argon"), })), }), }) if err != nil { log.Fatal(err) } if res.Interaction.OutputText != nil { fmt.Println(*res.Interaction.OutputText) } } ``` {% /tab %} {% /tabs %} The supported values for `agent_config.model` are: | Model | Value in `agent_config.model` | Description | | :--- | :--- | :--- | | **Gemini 3.8 Flash** (default) | `gemini-3.8-flash` | Default balanced model for reasoning, coding, and tool use. | | **Gemini 4 Argon** | `gemini-4-argon` | Frontier reasoning model for complex software engineering, deep problem solving, and long-horizon agentic tasks. | | **Gemini 3.6 Flash** | `gemini-3.6-flash` | Balanced Flash model for general agentic workflows. | | **Gemini 3.5 Flash-Lite** | `gemini-3.5-flash-lite` | Lightweight model optimized for low latency and cost-sensitive tasks. | When creating a managed agent with `agents.create`, you configure the model in the exact same way by passing `base_agent` and `agent_config`. Notice that you cannot override the model at interaction time for a managed agent created with `agents.create`. The model is locked to what was set when the agent was created. This ensures predictable tool calling behavior, consistent debugging, and adherence to security boundaries. ## Customizing the agent {% id="customizing-the-agent" %} You can extend the Antigravity agent by customizing its instructions, tools, and environment. The agent supports a filesystem-native approach to customization: you can mount files like `AGENTS.md` for instructions and skills under `.agents/skills/` directly into the sandbox, or pass configuration inline at interaction time. You can iterate on your configuration inline and then save it as a managed agent when you are ready. For full details on how to build custom agents, see [Building Managed Agents](/docs/custom-agents). ## Background execution {% id="background-execution" %} Agent tasks that involve multi-step reasoning, code execution, or file operations can take minutes to complete. Use `background=True` to run the interaction asynchronously. The API returns immediately with an interaction ID that you poll until the status is `completed` or `failed`. {% tabs %} {% tab filename="sample.py" label="Python" %} ```python import time from google import genai client = genai.Client() # 1. Start the interaction in the background interaction = client.interactions.create( agent="antigravity-preview-09-2026", input="Run a complex analysis on the repository.", environment="remote", background=True, ) print(f"Interaction started in background: {interaction.id}") # 2. Poll for completion while interaction.status == "in_progress": time.sleep(5) interaction = client.interactions.get(id=interaction.id) if interaction.status == "completed": print(interaction.output_text) else: print(f"Finished with status: {interaction.status}") ``` {% /tab %} {% tab filename="sample.js" label="JavaScript" %} ```javascript import { GoogleGenAI } from "@google/genai"; const client = new GoogleGenAI({}); const interaction = await client.interactions.create({ agent: "antigravity-preview-09-2026", input: "Run a complex analysis on the repository.", environment: "remote", background: true, }); console.log(`Interaction started in background: ${interaction.id}`); let result = interaction; while (result.status === "in_progress") { await new Promise(resolve => setTimeout(resolve, 5000)); result = await client.interactions.get(interaction.id); } if (result.status === "completed") { console.log(result.output_text); } else { console.log(`Finished with status: ${result.status}`); } ``` {% /tab %} {% tab filename="sample.sh" label="REST" %} ```shell # 1. Start the interaction in the background RESPONSE=$(curl -s -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \ -H "Content-Type: application/json" \ -H "x-goog-api-key: $GEMINI_API_KEY" \ -H "Api-Revision: 2026-05-20" \ -d '{ "agent": "antigravity-preview-09-2026", "input": "Run a complex analysis on the repository.", "environment": "remote", "background": true }') INTERACTION_ID=$(echo $RESPONSE | jq -r '.id') # 2. Poll for results (repeat until status is "completed") curl -s -X GET "https://generativelanguage.googleapis.com/v1beta/interactions/$INTERACTION_ID" \ -H "x-goog-api-key: $GEMINI_API_KEY" ``` {% /tab %} {% tab label="Java" %} ```java import com.google.genai.Client; import com.google.genai.gaos.models.interactions.AgentOption; import com.google.genai.gaos.models.interactions.CreateAgentInteraction; import com.google.genai.gaos.models.interactions.CreateAgentInteractionEnvironment; import com.google.genai.gaos.models.interactions.Interaction; import com.google.genai.gaos.models.interactions.InteractionStatus; import com.google.genai.gaos.models.interactions.InteractionsInput; import com.google.genai.gaos.models.operations.CreateInteractionRequestBody; import com.google.genai.gaos.models.operations.GetInteractionByIdRequest; Client client = new Client(); // 1. Start the interaction in the background CreateAgentInteraction params = CreateAgentInteraction.builder() .agent(AgentOption.of("antigravity-preview-09-2026")) .input(InteractionsInput.of("Run a complex analysis on the repository.")) .environment(CreateAgentInteractionEnvironment.of("remote")) .background(true) .build(); Interaction interaction = client.interactions.create(CreateInteractionRequestBody.of(params)).interaction().get(); System.out.println("Interaction started in background: " + interaction.id().orElse("")); // 2. Poll for completion while (interaction.status().orElse(null) == InteractionStatus.IN_PROGRESS) { Thread.sleep(5000); interaction = client.interactions.get(new GetInteractionByIdRequest(interaction.id().orElse(""))).interaction().get(); } if (interaction.status().orElse(null) == InteractionStatus.COMPLETED) { System.out.println(interaction.outputText().orElse("")); } else { System.out.println("Finished with status: " + interaction.status().orElse(null)); } ``` {% /tab %} {% tab label="Go" %} ```go package main import ( "context" "fmt" "log" "time" "google.golang.org/genai" "google.golang.org/genai/interactions/models/interactions" "google.golang.org/genai/interactions/models/operations" ) func main() { ctx := context.Background() client, err := genai.NewClient(ctx, nil) if err != nil { log.Fatal(err) } // 1. Start the interaction in the background res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{ Body: operations.NewCreateInteractionRequestBody(interactions.CreateAgentInteraction{ Agent: interactions.AgentOption("antigravity-preview-09-2026"), Input: interactions.NewInteractionsInput("Run a complex analysis on the repository."), Environment: genai.Ptr(interactions.NewCreateAgentInteractionEnvironment("remote")), Background: genai.Ptr(true), }), }) if err != nil { log.Fatal(err) } interaction := res.Interaction fmt.Printf("Interaction started in background: %s\n", *interaction.ID) // 2. Poll for completion for interaction.Status == interactions.InteractionStatusInProgress { time.Sleep(5 * time.Second) getRes, err := client.Interactions.Get(ctx, operations.GetInteractionByIDRequest{ ID: *interaction.ID, }) if err != nil { log.Fatal(err) } interaction = getRes.Interaction } if interaction.Status == interactions.InteractionStatusCompleted { if interaction.OutputText != nil { fmt.Println(*interaction.OutputText) } } else { fmt.Printf("Finished with status: %s\n", interaction.Status) } } ``` {% /tab %} {% /tabs %} Background execution requires `store=True`, which is the default. For real-time progress updates during background execution, see [Streaming background interactions](/docs/background-execution#streaming-pattern). You can cancel a running background interaction using the `cancel` method. {% tabs %} {% tab filename="sample.py" label="Python" %} ```python client.interactions.cancel(id="INTERACTION_ID") ``` {% /tab %} {% tab filename="sample.js" label="JavaScript" %} ```javascript await client.interactions.cancel("INTERACTION_ID"); ``` {% /tab %} {% tab filename="sample.sh" label="REST" %} ```shell curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions/INTERACTION_ID:cancel" \ -H "x-goog-api-key: $GEMINI_API_KEY" ``` {% /tab %} {% tab label="Java" %} ```java import com.google.genai.Client; Client client = new Client(); client.interactions.cancel("INTERACTION_ID"); ``` {% /tab %} {% tab label="Go" %} ```go package main import ( "context" "log" "google.golang.org/genai" "google.golang.org/genai/interactions/models/operations" ) func main() { ctx := context.Background() client, err := genai.NewClient(ctx, nil) if err != nil { log.Fatal(err) } _, err = client.Interactions.Cancel(ctx, operations.CancelInteractionByIDRequest{ ID: "INTERACTION_ID", }) if err != nil { log.Fatal(err) } } ``` {% /tab %} {% /tabs %} **Multi-turn with background execution** When a background interaction involves stateful tools (like code execution in a sandbox), use the `environment_id` from the completed interaction to continue in the same environment. This ensures the agent picks up where it left off with all files and state intact. {% tabs %} {% tab filename="sample.py" label="Python" %} ```python import time from google import genai client = genai.Client() # First turn: run a task in the background interaction = client.interactions.create( agent="antigravity-preview-09-2026", input="Clone https://github.com/google/generative-ai-python and run its tests.", environment="remote", background=True, ) while interaction.status == "in_progress": time.sleep(5) interaction = client.interactions.get(id=interaction.id) # Second turn: continue in the same environment followup = client.interactions.create( agent="antigravity-preview-09-2026", input="Fix any failing tests and re-run them.", previous_interaction_id=interaction.id, environment=interaction.environment_id, background=True, ) while followup.status == "in_progress": time.sleep(5) followup = client.interactions.get(id=followup.id) print(followup.output_text) ``` {% /tab %} {% tab filename="sample.js" label="JavaScript" %} ```javascript import { GoogleGenAI } from "@google/genai"; const client = new GoogleGenAI({}); // First turn: run a task in the background let interaction = await client.interactions.create({ agent: "antigravity-preview-09-2026", input: "Clone https://github.com/google/generative-ai-python and run its tests.", environment: "remote", background: true, }); while (interaction.status === "in_progress") { await new Promise(resolve => setTimeout(resolve, 5000)); interaction = await client.interactions.get(interaction.id); } // Second turn: continue in the same environment let followup = await client.interactions.create({ agent: "antigravity-preview-09-2026", input: "Fix any failing tests and re-run them.", previous_interaction_id: interaction.id, environment: interaction.environment_id, background: true, }); while (followup.status === "in_progress") { await new Promise(resolve => setTimeout(resolve, 5000)); followup = await client.interactions.get(followup.id); } console.log(followup.output_text); ``` {% /tab %} {% tab filename="sample.sh" label="REST" %} ```shell # 1. Start first interaction in the background RESPONSE=$(curl -s -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \ -H "Content-Type: application/json" \ -H "x-goog-api-key: $GEMINI_API_KEY" \ -H "Api-Revision: 2026-05-20" \ -d '{ "agent": "antigravity-preview-09-2026", "input": "Clone https://github.com/google/generative-ai-python and run its tests.", "environment": "remote", "background": true }') INTERACTION_ID=$(echo $RESPONSE | jq -r '.id') # 2. Poll until completed (repeat until status is "completed") RESULT=$(curl -s -X GET "https://generativelanguage.googleapis.com/v1beta/interactions/$INTERACTION_ID" \ -H "x-goog-api-key: $GEMINI_API_KEY") ENVIRONMENT_ID=$(echo $RESULT | jq -r '.environment_id') # 3. Continue in the same environment curl -s -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \ -H "Content-Type: application/json" \ -H "x-goog-api-key: $GEMINI_API_KEY" \ -H "Api-Revision: 2026-05-20" \ -d "{ \"agent\": \"antigravity-preview-09-2026\", \"input\": \"Fix any failing tests and re-run them.\", \"previous_interaction_id\": \"$INTERACTION_ID\", \"environment\": \"$ENVIRONMENT_ID\", \"background\": true }" ``` {% /tab %} {% tab label="Java" %} ```java import com.google.genai.Client; import com.google.genai.gaos.models.interactions.AgentOption; import com.google.genai.gaos.models.interactions.CreateAgentInteraction; import com.google.genai.gaos.models.interactions.CreateAgentInteractionEnvironment; import com.google.genai.gaos.models.interactions.Interaction; import com.google.genai.gaos.models.interactions.InteractionStatus; import com.google.genai.gaos.models.interactions.InteractionsInput; import com.google.genai.gaos.models.operations.CreateInteractionRequestBody; import com.google.genai.gaos.models.operations.GetInteractionByIdRequest; Client client = new Client(); // First turn: run a task in the background CreateAgentInteraction params = CreateAgentInteraction.builder() .agent(AgentOption.of("antigravity-preview-09-2026")) .input(InteractionsInput.of("Clone https://github.com/google/generative-ai-python and run its tests.")) .environment(CreateAgentInteractionEnvironment.of("remote")) .background(true) .build(); Interaction interaction = client.interactions.create(CreateInteractionRequestBody.of(params)).interaction().get(); while (interaction.status().orElse(null) == InteractionStatus.IN_PROGRESS) { Thread.sleep(5000); interaction = client.interactions.get(new GetInteractionByIdRequest(interaction.id().orElse(""))).interaction().get(); } // Second turn: continue in the same environment CreateAgentInteraction followupParams = CreateAgentInteraction.builder() .agent(AgentOption.of("antigravity-preview-09-2026")) .input(InteractionsInput.of("Fix any failing tests and re-run them.")) .previousInteractionId(interaction.id().orElse("")) .environment(CreateAgentInteractionEnvironment.of(interaction.environmentId().orElse(""))) .background(true) .build(); Interaction followup = client.interactions.create(CreateInteractionRequestBody.of(followupParams)).interaction().get(); while (followup.status().orElse(null) == InteractionStatus.IN_PROGRESS) { Thread.sleep(5000); followup = client.interactions.get(new GetInteractionByIdRequest(followup.id().orElse(""))).interaction().get(); } System.out.println(followup.outputText().orElse("")); ``` {% /tab %} {% tab label="Go" %} ```go package main import ( "context" "fmt" "log" "time" "google.golang.org/genai" "google.golang.org/genai/interactions/models/interactions" "google.golang.org/genai/interactions/models/operations" ) func main() { ctx := context.Background() client, err := genai.NewClient(ctx, nil) if err != nil { log.Fatal(err) } // First turn: run a task in the background res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{ Body: operations.NewCreateInteractionRequestBody(interactions.CreateAgentInteraction{ Agent: interactions.AgentOption("antigravity-preview-09-2026"), Input: interactions.NewInteractionsInput("Clone https://github.com/google/generative-ai-python and run its tests."), Environment: genai.Ptr(interactions.NewCreateAgentInteractionEnvironment("remote")), Background: genai.Ptr(true), }), }) if err != nil { log.Fatal(err) } interaction := res.Interaction for interaction.Status == interactions.InteractionStatusInProgress { time.Sleep(5 * time.Second) getRes, err := client.Interactions.Get(ctx, operations.GetInteractionByIDRequest{ ID: *interaction.ID, }) if err != nil { log.Fatal(err) } interaction = getRes.Interaction } // Second turn: continue in the same environment followupRes, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{ Body: operations.NewCreateInteractionRequestBody(interactions.CreateAgentInteraction{ Agent: interactions.AgentOption("antigravity-preview-09-2026"), Input: interactions.NewInteractionsInput("Fix any failing tests and re-run them."), PreviousInteractionID: interaction.ID, Environment: genai.Ptr(interactions.NewCreateAgentInteractionEnvironment(*interaction.EnvironmentID)), Background: genai.Ptr(true), }), }) if err != nil { log.Fatal(err) } followup := followupRes.Interaction for followup.Status == interactions.InteractionStatusInProgress { time.Sleep(5 * time.Second) getRes, err := client.Interactions.Get(ctx, operations.GetInteractionByIDRequest{ ID: *followup.ID, }) if err != nil { log.Fatal(err) } followup = getRes.Interaction } if followup.OutputText != nil { fmt.Println(*followup.OutputText) } } ``` {% /tab %} {% /tabs %} ## Environments {% id="environments" %} Each call creates or reuses a Linux sandbox. The `environment` parameter takes three forms: | Form | Description | | :--- | :--- | | `"remote"` | Provision a fresh sandbox with default settings. | | `"env_abc123"` | Reuse an existing environment by ID, preserving all files and state. | | `{...}` | Full `EnvironmentConfig` with custom sources and network rules. | See [Environments](/docs/agent-environment) for details on sources (Git, GCS, inline), networking, lifecycle, and resource limits. ## Triggers {% id="triggers" %} Triggers let you schedule an agent to run automatically on a cron schedule. A trigger binds an agent, environment, prompt, and schedule into a persistent resource that fires without manual intervention. Each execution reuses the same environment, so files created in one run persist and are visible to the next. ### Create a trigger Create a trigger by specifying a cron schedule, time zone, and the interaction configuration. The trigger starts in `active` status and will fire on the next matching cron time. Save the returned `id` to manage the trigger in subsequent calls. Because a trigger runs unattended on a schedule, reference a stored [credential](/docs/agent-credentials) rather than an inline token. The egress proxy resolves it on every run, and you rotate the secret without touching the trigger. Inline `transform` rules work here too, they just need you to update the trigger whenever the value changes. {% tabs %} {% tab filename="sample.py" label="Python" %} ```python from google import genai client = genai.Client() trigger = client.triggers.create( schedule="0 9 * * *", time_zone="America/Argentina/Buenos_Aires", display_name="issue-solver", interaction={ "agent": "antigravity-preview-09-2026", "input": "Review open PRs in my-org/my-app for new comments and address feedback. Close issues whose PRs were merged. Then check for new issues labeled 'accepted', skip any already tracked in /workspace/solved-issues/, fix the rest, and open a PR for each. Save reports to /workspace/solved-issues/.", "environment": { "type": "remote", "network": { "allowlist": [ { "domain": "api.github.com", "credential": "github-production", }, {"domain": "github.com"}, ] }, }, }, ) print(f"Trigger created: {trigger.id}") print(f"Next run: {trigger.next_run_time}") ``` {% /tab %} {% tab filename="sample.js" label="JavaScript" %} ```javascript import { GoogleGenAI } from "@google/genai"; const client = new GoogleGenAI({}); const trigger = await client.triggers.create({ schedule: "0 9 * * *", time_zone: "America/Argentina/Buenos_Aires", display_name: "issue-solver", interaction: { agent: "antigravity-preview-09-2026", input: [{ type: "text", text: "Review open PRs in my-org/my-app for new comments and address feedback. Close issues whose PRs were merged. Then check for new issues labeled 'accepted', skip any already tracked in /workspace/solved-issues/, fix the rest, and open a PR for each. Save reports to /workspace/solved-issues/.", }], environment: { type: "remote", network: { allowlist: [ { domain: "api.github.com", credential: "github-production", }, { domain: "github.com" }, ], }, }, }, }); console.log(`Trigger created: ${trigger.id}`); console.log(`Next run: ${trigger.next_run_time}`); ``` {% /tab %} {% tab filename="sample.sh" label="REST" %} ```shell curl -X POST "https://generativelanguage.googleapis.com/v1beta/triggers" \ -H "Content-Type: application/json" \ -H "x-goog-api-key: $GEMINI_API_KEY" \ -d '{ "schedule": "0 9 * * *", "time_zone": "America/Argentina/Buenos_Aires", "display_name": "issue-solver", "interaction": { "agent": "antigravity-preview-09-2026", "input": [{"type": "text", "text": "Review open PRs in my-org/my-app for new comments and address feedback. Close issues whose PRs were merged. Then check for new issues labeled accepted, skip any already tracked in /workspace/solved-issues/, fix the rest, and open a PR for each. Save reports to /workspace/solved-issues/."}], "environment": { "type": "remote", "network": { "allowlist": [ { "domain": "api.github.com", "credential": "github-production" }, {"domain": "github.com"} ] } } } }' ``` {% /tab %} {% tab label="Java" %} ```java import com.google.genai.gaos.GenAI; import com.google.genai.gaos.models.interactions.AgentOption; import com.google.genai.gaos.models.interactions.Allowlist; import com.google.genai.gaos.models.interactions.AllowlistEntry; import com.google.genai.gaos.models.interactions.CreateAgentInteraction; import com.google.genai.gaos.models.interactions.CreateAgentInteractionEnvironment; import com.google.genai.gaos.models.interactions.Environment; import com.google.genai.gaos.models.interactions.EnvironmentNetworkEgressAllowlist; import com.google.genai.gaos.models.interactions.InteractionsInput; import com.google.genai.gaos.models.interactions.Network; import com.google.genai.gaos.models.interactions.Transform; import com.google.genai.gaos.models.shared.Security; import com.google.genai.gaos.models.triggers.Trigger; import com.google.genai.gaos.models.triggers.TriggerCreateParams; import java.util.List; import java.util.Map; GenAI client = GenAI.builder() .security(Security.builder().apiKey(System.getenv("GEMINI_API_KEY")).build()) .build(); Environment env = Environment.builder() .network(Network.of( EnvironmentNetworkEgressAllowlist.builder() .allowlist(Allowlist.of(List.of( AllowlistEntry.builder() .domain("api.github.com") .transform(Transform.of(Map.of( "Authorization", "Bearer ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ))) .build(), AllowlistEntry.builder() .domain("github.com") .build() ))) .build() )) .build(); CreateAgentInteraction interactionTemplate = CreateAgentInteraction.builder() .agent(AgentOption.of("antigravity-preview-09-2026")) .input(InteractionsInput.of("Review open PRs in my-org/my-app for new comments and address feedback. Close issues whose PRs were merged. Then check for new issues labeled 'accepted', skip any already tracked in /workspace/solved-issues/, fix the rest, and open a PR for each. Save reports to /workspace/solved-issues/.")) .environment(CreateAgentInteractionEnvironment.of(env)) .build(); TriggerCreateParams params = TriggerCreateParams.builder() .schedule("0 9 * * *") .timeZone("America/Argentina/Buenos_Aires") .displayName("issue-solver") .interaction(interactionTemplate) .build(); Trigger trigger = client.triggers().create(params).trigger().get(); System.out.println("Trigger created: " + trigger.id().orElse("")); System.out.println("Next run: " + trigger.nextRunTime().orElse(null)); ``` {% /tab %} {% tab label="Go" %} ```go package main import ( "context" "fmt" "log" "os" "google.golang.org/genai" interactionssdk "google.golang.org/genai/interactions" "google.golang.org/genai/interactions/models/components" "google.golang.org/genai/interactions/models/interactions" "google.golang.org/genai/interactions/models/operations" "google.golang.org/genai/interactions/models/triggers" ) func main() { ctx := context.Background() sdk := interactionssdk.New(interactionssdk.WithSecurity(components.Security{ APIKey: genai.Ptr(os.Getenv("GEMINI_API_KEY")), })) env := interactions.Environment{ Network: genai.Ptr(interactions.NewNetwork(interactions.EnvironmentNetworkEgressAllowlist{ Allowlist: genai.Ptr(interactions.NewAllowlist([]interactions.AllowlistEntry{ { Domain: "api.github.com", Transform: genai.Ptr(interactions.NewTransform(map[string]string{ "Authorization": "Bearer ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", })), }, { Domain: "github.com", }, })), })), } interactionTemplate := interactions.CreateAgentInteraction{ Agent: interactions.AgentOption("antigravity-preview-09-2026"), Input: interactions.NewInteractionsInput("Review open PRs in my-org/my-app for new comments and address feedback. Close issues whose PRs were merged. Then check for new issues labeled 'accepted', skip any already tracked in /workspace/solved-issues/, fix the rest, and open a PR for each. Save reports to /workspace/solved-issues/."), Environment: genai.Ptr(interactions.NewCreateAgentInteractionEnvironment(env)), } res, err := sdk.Triggers.Create(ctx, operations.CreateTriggerRequest{ Body: triggers.TriggerCreateParams{ Schedule: "0 9 * * *", TimeZone: "America/Argentina/Buenos_Aires", DisplayName: genai.Ptr("issue-solver"), Interaction: interactionTemplate, }, }) if err != nil { log.Fatal(err) } trigger := res.Trigger fmt.Printf("Trigger created: %s\n", trigger.ID) fmt.Printf("Next run: %v\n", trigger.NextRunTime) } ``` {% /tab %} {% /tabs %} The `CreateTrigger` request accepts the following fields: | Field | Type | Required | Description | | :--- | :--- | :--- | :--- | | `schedule` | string | Yes | Cron expression (e.g., `0 * * * *` for hourly, `0 9 * * 1-5` for weekday mornings). | | `time_zone` | string | Yes | IANA time zone (e.g., `UTC`, `America/Argentina/Buenos_Aires`). | | `display_name` | string | No | Human-readable name for the trigger. | | `max_consecutive_failures` | integer | No | Max failures before the trigger is automatically paused. Default: 5. | | `execution_timeout_seconds` | integer | No | Timeout per execution in seconds. Default: 600. | | `interaction` | object | Yes | A `CreateInteractionRequest` defining the agent, input, tools, and environment. | The response includes the following key fields: | Field | Type | Description | | :--- | :--- | :--- | | `id` | string | Unique identifier for the trigger. Use this in all subsequent operations. | | `status` | string | Current state: `active`, `paused`, or `disabled`. | | `next_run_time` | string | ISO 8601 timestamp of the next scheduled execution. | | `consecutive_failure_count` | integer | Number of consecutive failed executions since the last success. | ### List triggers Retrieve all triggers associated with your project. {% tabs %} {% tab filename="sample.py" label="Python" %} ```python triggers = client.triggers.list() for trigger in triggers.triggers: print(f"{trigger.id}: {trigger.display_name} ({trigger.status})") ``` {% /tab %} {% tab filename="sample.js" label="JavaScript" %} ```javascript const triggers = await client.triggers.list(); for (const trigger of triggers.triggers) { console.log(`${trigger.id}: ${trigger.display_name} (${trigger.status})`); } ``` {% /tab %} {% tab filename="sample.sh" label="REST" %} ```shell curl -X GET "https://generativelanguage.googleapis.com/v1beta/triggers" \ -H "x-goog-api-key: $GEMINI_API_KEY" ``` {% /tab %} {% tab label="Java" %} ```java import com.google.genai.gaos.GenAI; import com.google.genai.gaos.models.shared.Security; import com.google.genai.gaos.models.triggers.Trigger; import java.util.List; GenAI client = GenAI.builder() .security(Security.builder().apiKey(System.getenv("GEMINI_API_KEY")).build()) .build(); List triggers = client.triggers().listDirect().listTriggersResponse().get().triggers().orElse(List.of()); for (Trigger trigger : triggers) { System.out.println(trigger.id().orElse("") + ": " + trigger.displayName().orElse("") + " (" + trigger.status().orElse(null) + ")"); } ``` {% /tab %} {% tab label="Go" %} ```go package main import ( "context" "fmt" "log" "os" "google.golang.org/genai" interactionssdk "google.golang.org/genai/interactions" "google.golang.org/genai/interactions/models/components" "google.golang.org/genai/interactions/models/operations" ) func main() { ctx := context.Background() sdk := interactionssdk.New(interactionssdk.WithSecurity(components.Security{ APIKey: genai.Ptr(os.Getenv("GEMINI_API_KEY")), })) res, err := sdk.Triggers.List(ctx, operations.ListTriggersRequest{}) if err != nil { log.Fatal(err) } if res.ListTriggersResponse != nil { for _, trigger := range res.ListTriggersResponse.Triggers { fmt.Printf("%s: %s (%v)\n", trigger.ID, *trigger.GetDisplayName(), trigger.Status) } } } ``` {% /tab %} {% /tabs %} ### Get a trigger Fetch the full configuration and current state of a single trigger. {% tabs %} {% tab filename="sample.py" label="Python" %} ```python trigger = client.triggers.get(id="TRIGGER_ID") print(f"Schedule: {trigger.schedule}") print(f"Next run: {trigger.next_run_time}") ``` {% /tab %} {% tab filename="sample.js" label="JavaScript" %} ```javascript const trigger = await client.triggers.get("TRIGGER_ID"); console.log(`Schedule: ${trigger.schedule}`); console.log(`Next run: ${trigger.next_run_time}`); ``` {% /tab %} {% tab filename="sample.sh" label="REST" %} ```shell curl -X GET "https://generativelanguage.googleapis.com/v1beta/triggers/TRIGGER_ID" \ -H "x-goog-api-key: $GEMINI_API_KEY" ``` {% /tab %} {% tab label="Java" %} ```java import com.google.genai.gaos.GenAI; import com.google.genai.gaos.models.shared.Security; import com.google.genai.gaos.models.triggers.Trigger; GenAI client = GenAI.builder() .security(Security.builder().apiKey(System.getenv("GEMINI_API_KEY")).build()) .build(); Trigger trigger = client.triggers().get("TRIGGER_ID").trigger().get(); System.out.println("Schedule: " + trigger.schedule().orElse("")); System.out.println("Next run: " + trigger.nextRunTime().orElse(null)); ``` {% /tab %} {% tab label="Go" %} ```go package main import ( "context" "fmt" "log" "os" "google.golang.org/genai" interactionssdk "google.golang.org/genai/interactions" "google.golang.org/genai/interactions/models/components" "google.golang.org/genai/interactions/models/operations" ) func main() { ctx := context.Background() sdk := interactionssdk.New(interactionssdk.WithSecurity(components.Security{ APIKey: genai.Ptr(os.Getenv("GEMINI_API_KEY")), })) res, err := sdk.Triggers.Get(ctx, operations.GetTriggerRequest{ ID: "TRIGGER_ID", }) if err != nil { log.Fatal(err) } fmt.Printf("Schedule: %s\n", res.Trigger.Schedule) fmt.Printf("Next run: %v\n", res.Trigger.NextRunTime) } ``` {% /tab %} {% /tabs %} ### Pause and resume You can pause a trigger to stop scheduled executions, and resume it to reactivate the schedule. Pausing does not affect manual executions. {% tabs %} {% tab filename="sample.py" label="Python" %} ```python # Pause client.triggers.update(id="TRIGGER_ID", status="paused") # Resume client.triggers.update(id="TRIGGER_ID", status="active") ``` {% /tab %} {% tab filename="sample.js" label="JavaScript" %} ```javascript // Pause await client.triggers.update("TRIGGER_ID", { status: "paused" }); // Resume await client.triggers.update("TRIGGER_ID", { status: "active" }); ``` {% /tab %} {% tab filename="sample.sh" label="REST" %} ```shell # Pause curl -X PATCH "https://generativelanguage.googleapis.com/v1beta/triggers/TRIGGER_ID" \ -H "Content-Type: application/json" \ -H "x-goog-api-key: $GEMINI_API_KEY" \ -d '{"status": "paused"}' # Resume curl -X PATCH "https://generativelanguage.googleapis.com/v1beta/triggers/TRIGGER_ID" \ -H "Content-Type: application/json" \ -H "x-goog-api-key: $GEMINI_API_KEY" \ -d '{"status": "active"}' ``` {% /tab %} {% tab label="Java" %} ```java import com.google.genai.gaos.GenAI; import com.google.genai.gaos.models.shared.Security; import com.google.genai.gaos.models.triggers.TriggerUpdate; import com.google.genai.gaos.models.triggers.TriggerUpdateStatus; GenAI client = GenAI.builder() .security(Security.builder().apiKey(System.getenv("GEMINI_API_KEY")).build()) .build(); // Pause client.triggers().update("TRIGGER_ID", TriggerUpdate.builder().status(TriggerUpdateStatus.PAUSED).build()); // Resume client.triggers().update("TRIGGER_ID", TriggerUpdate.builder().status(TriggerUpdateStatus.ACTIVE).build()); ``` {% /tab %} {% tab label="Go" %} ```go package main import ( "context" "log" "os" "google.golang.org/genai" interactionssdk "google.golang.org/genai/interactions" "google.golang.org/genai/interactions/models/components" "google.golang.org/genai/interactions/models/operations" "google.golang.org/genai/interactions/models/triggers" ) func main() { ctx := context.Background() sdk := interactionssdk.New(interactionssdk.WithSecurity(components.Security{ APIKey: genai.Ptr(os.Getenv("GEMINI_API_KEY")), })) // Pause _, err := sdk.Triggers.Update(ctx, operations.UpdateTriggerRequest{ ID: "TRIGGER_ID", Body: triggers.TriggerUpdate{ Status: triggers.TriggerUpdateStatusPaused.ToPointer(), }, }) if err != nil { log.Fatal(err) } // Resume _, err = sdk.Triggers.Update(ctx, operations.UpdateTriggerRequest{ ID: "TRIGGER_ID", Body: triggers.TriggerUpdate{ Status: triggers.TriggerUpdateStatusActive.ToPointer(), }, }) if err != nil { log.Fatal(err) } } ``` {% /tab %} {% /tabs %} ### Delete a trigger Permanently remove a trigger. Past execution history is not deleted. {% tabs %} {% tab filename="sample.py" label="Python" %} ```python client.triggers.delete(id="TRIGGER_ID") ``` {% /tab %} {% tab filename="sample.js" label="JavaScript" %} ```javascript await client.triggers.delete("TRIGGER_ID"); ``` {% /tab %} {% tab filename="sample.sh" label="REST" %} ```shell curl -X DELETE "https://generativelanguage.googleapis.com/v1beta/triggers/TRIGGER_ID" \ -H "x-goog-api-key: $GEMINI_API_KEY" ``` {% /tab %} {% tab label="Java" %} ```java import com.google.genai.gaos.GenAI; import com.google.genai.gaos.models.shared.Security; GenAI client = GenAI.builder() .security(Security.builder().apiKey(System.getenv("GEMINI_API_KEY")).build()) .build(); client.triggers().delete("TRIGGER_ID"); ``` {% /tab %} {% tab label="Go" %} ```go package main import ( "context" "log" "os" "google.golang.org/genai" interactionssdk "google.golang.org/genai/interactions" "google.golang.org/genai/interactions/models/components" "google.golang.org/genai/interactions/models/operations" ) func main() { ctx := context.Background() sdk := interactionssdk.New(interactionssdk.WithSecurity(components.Security{ APIKey: genai.Ptr(os.Getenv("GEMINI_API_KEY")), })) _, err := sdk.Triggers.Delete(ctx, operations.DeleteTriggerRequest{ ID: "TRIGGER_ID", }) if err != nil { log.Fatal(err) } } ``` {% /tab %} {% /tabs %} ### Run a trigger immediately Fire a trigger on demand without waiting for the next scheduled time. This works even if the trigger is paused. {% tabs %} {% tab filename="sample.py" label="Python" %} ```python client.triggers.run(trigger_id="TRIGGER_ID") ``` {% /tab %} {% tab filename="sample.js" label="JavaScript" %} ```javascript await client.triggers.run("TRIGGER_ID"); ``` {% /tab %} {% tab filename="sample.sh" label="REST" %} ```shell curl -X POST "https://generativelanguage.googleapis.com/v1beta/triggers/TRIGGER_ID/executions" \ -H "x-goog-api-key: $GEMINI_API_KEY" ``` {% /tab %} {% tab label="Java" %} ```java import com.google.genai.gaos.GenAI; import com.google.genai.gaos.models.shared.Security; GenAI client = GenAI.builder() .security(Security.builder().apiKey(System.getenv("GEMINI_API_KEY")).build()) .build(); client.triggers().run("TRIGGER_ID"); ``` {% /tab %} {% tab label="Go" %} ```go package main import ( "context" "log" "os" "google.golang.org/genai" interactionssdk "google.golang.org/genai/interactions" "google.golang.org/genai/interactions/models/components" "google.golang.org/genai/interactions/models/operations" ) func main() { ctx := context.Background() sdk := interactionssdk.New(interactionssdk.WithSecurity(components.Security{ APIKey: genai.Ptr(os.Getenv("GEMINI_API_KEY")), })) _, err := sdk.Triggers.Run(ctx, operations.RunTriggerRequest{ TriggerID: "TRIGGER_ID", }) if err != nil { log.Fatal(err) } } ``` {% /tab %} {% /tabs %} ### List executions View the execution history for a trigger. Each execution includes a `status`, timestamps, an `interaction_id` you can use to fetch the full interaction output, and an `environment_id` confirming that all runs share the same sandbox. {% tabs %} {% tab filename="sample.py" label="Python" %} ```python executions = client.triggers.list_executions(trigger_id="TRIGGER_ID") for ex in executions.trigger_executions: print(f"{ex.id}: {ex.status} ({ex.start_time} - {ex.end_time})") # Fetch the full interaction for an execution interaction = client.interactions.get(id=ex.interaction_id) print(interaction.output_text) ``` {% /tab %} {% tab filename="sample.js" label="JavaScript" %} ```javascript const executions = await client.triggers.listExecutions("TRIGGER_ID"); for (const ex of executions.trigger_executions) { console.log(`${ex.id}: ${ex.status} (${ex.start_time} - ${ex.end_time})`); } // Fetch the full interaction for an execution const interaction = await client.interactions.get(ex.interaction_id); console.log(interaction.output_text); ``` {% /tab %} {% tab filename="sample.sh" label="REST" %} ```shell curl -X GET "https://generativelanguage.googleapis.com/v1beta/triggers/TRIGGER_ID/executions" \ -H "x-goog-api-key: $GEMINI_API_KEY" ``` {% /tab %} {% tab label="Java" %} ```java import com.google.genai.gaos.GenAI; import com.google.genai.gaos.models.interactions.Interaction; import com.google.genai.gaos.models.operations.GetInteractionByIdRequest; import com.google.genai.gaos.models.shared.Security; import com.google.genai.gaos.models.triggers.TriggerExecution; import java.util.List; GenAI client = GenAI.builder() .security(Security.builder().apiKey(System.getenv("GEMINI_API_KEY")).build()) .build(); List executions = client.triggers().listExecutions("TRIGGER_ID") .listTriggerExecutionsResponse().get() .triggerExecutions().orElse(List.of()); for (TriggerExecution ex : executions) { System.out.println(ex.id().orElse("") + ": " + ex.status().orElse(null) + " (" + ex.startTime().orElse(null) + " - " + ex.endTime().orElse(null) + ")"); // Fetch the full interaction for an execution if (ex.interactionId().isPresent()) { Interaction interaction = client.interactions().get(new GetInteractionByIdRequest(ex.interactionId().get())).interaction().get(); System.out.println(interaction.outputText().orElse("")); } } ``` {% /tab %} {% tab label="Go" %} ```go package main import ( "context" "fmt" "log" "os" "google.golang.org/genai" interactionssdk "google.golang.org/genai/interactions" "google.golang.org/genai/interactions/models/components" "google.golang.org/genai/interactions/models/operations" ) func main() { ctx := context.Background() sdk := interactionssdk.New(interactionssdk.WithSecurity(components.Security{ APIKey: genai.Ptr(os.Getenv("GEMINI_API_KEY")), })) res, err := sdk.Triggers.ListExecutions(ctx, operations.ListTriggerExecutionsRequest{ TriggerID: "TRIGGER_ID", }) if err != nil { log.Fatal(err) } if res.ListTriggerExecutionsResponse != nil { for _, ex := range res.ListTriggerExecutionsResponse.TriggerExecutions { fmt.Printf("%s: %v (%v - %v)\n", ex.ID, ex.Status, ex.StartTime, ex.EndTime) // Fetch the full interaction for an execution if ex.InteractionID != nil { intRes, err := sdk.Interactions.Get(ctx, operations.GetInteractionByIDRequest{ ID: *ex.InteractionID, }) if err != nil { log.Fatal(err) } if intRes.Interaction.OutputText != nil { fmt.Println(*intRes.Interaction.OutputText) } } } } } ``` {% /tab %} {% /tabs %} ## Availability and pricing {% id="availability-and-pricing" %} Antigravity agent is available in preview through the [Interactions API](/docs/interactions-overview) in Google AI Studio and the Gemini API for both free tier and paid tier projects. Pricing follows a [pay-as-you-go model](/docs/pricing#pricing-for-agents) based on the underlying Gemini model tokens and the tools the agent uses. Unlike a standard chat request that produces a single output, an Antigravity interaction is an agentic workflow. A single request triggers an autonomous loop of reasoning, tool execution, code running, and file management. Free tier projects include a free rate limit and usage quota. Antigravity interactions run multi-turn autonomous loops and can consume significant tokens. Set [budget controls](/docs/antigravity-agent#budget-controls) on your request to limit token usage. You can also monitor progress in real time with [SSE streaming](/docs/streaming), or cancel running requests. ### Budget controls {% id="budget-controls" %} In addition to [model selection](/docs/antigravity-agent#model-selection), set `max_total_tokens` inside `agent_config` (with `"type": "antigravity"`) to limit the total number of tokens (input + output + thinking) an interaction can consume. Cached tokens do not count toward this limit. When the agent reaches the limit, the interaction stops and returns with `status: "incomplete"`. The limit is best-effort: actual usage may slightly exceed it depending on when the agent checks the budget between steps. Set the budget on the interaction request in `agent_config` alongside `agent` and `input`. {% tabs %} {% tab filename="sample.py" label="Python" %} ```python from google import genai client = genai.Client() interaction = client.interactions.create( agent="antigravity-preview-09-2026", input="Analyze the dataset in /workspace/data.csv and generate a summary report.", agent_config={ "type": "antigravity", "max_total_tokens": 50000 }, environment={ "type": "remote", "sources": [ { "type": "inline", "target": "/workspace/data.csv", "content": "id,name,value\n1,alpha,100\n2,beta,200\n", } ], } ) print(f"Status: {interaction.status}") # "incomplete" if budget was hit print(f"Tokens used: {interaction.usage.total_tokens}") ``` {% /tab %} {% tab filename="sample.js" label="JavaScript" %} ```javascript import { GoogleGenAI } from "@google/genai"; const client = new GoogleGenAI({}); const interaction = await client.interactions.create({ agent: "antigravity-preview-09-2026", input: "Analyze the dataset in /workspace/data.csv and generate a summary report.", agent_config: { type: "antigravity", max_total_tokens: "50000" }, environment: { type: "remote", sources: [ { type: "inline", target: "/workspace/data.csv", content: "id,name,value\n1,alpha,100\n2,beta,200\n", }, ], }, }); console.log(`Status: ${interaction.status}`); console.log(`Tokens used: ${interaction.usage?.total_tokens}`); ``` {% /tab %} {% tab filename="sample.sh" label="REST" %} ```shell curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \ -H "Content-Type: application/json" \ -H "x-goog-api-key: $GEMINI_API_KEY" \ -d '{ "agent": "antigravity-preview-09-2026", "input": "Analyze the dataset in /workspace/data.csv and generate a summary report.", "agent_config": { "type": "antigravity", "max_total_tokens": 50000 }, "environment": { "type": "remote", "sources": [ { "type": "inline", "target": "/workspace/data.csv", "content": "id,name,value\n1,alpha,100\n2,beta,200\n" } ] } }' ``` {% /tab %} {% tab label="Java" %} ```java import com.google.genai.Client; import com.google.genai.gaos.models.interactions.AgentOption; import com.google.genai.gaos.models.interactions.AntigravityAgentConfig; import com.google.genai.gaos.models.interactions.CreateAgentInteraction; import com.google.genai.gaos.models.interactions.CreateAgentInteractionEnvironment; import com.google.genai.gaos.models.interactions.Environment; import com.google.genai.gaos.models.interactions.Interaction; import com.google.genai.gaos.models.interactions.InteractionsInput; import com.google.genai.gaos.models.interactions.Source; import com.google.genai.gaos.models.interactions.SourceType; import com.google.genai.gaos.models.operations.CreateInteractionRequestBody; import java.util.List; Client client = new Client(); Environment env = Environment.builder() .sources(List.of( Source.builder() .type(SourceType.INLINE) .target("/workspace/data.csv") .content("id,name,value\n1,alpha,100\n2,beta,200\n") .build() )) .build(); CreateAgentInteraction params = CreateAgentInteraction.builder() .agent(AgentOption.of("antigravity-preview-09-2026")) .input(InteractionsInput.of("Analyze the dataset in /workspace/data.csv and generate a summary report.")) .agentConfig( AntigravityAgentConfig.builder() .maxTotalTokens("50000") .build() ) .environment(CreateAgentInteractionEnvironment.of(env)) .build(); Interaction interaction = client.interactions.create(CreateInteractionRequestBody.of(params)).interaction().get(); System.out.println("Status: " + interaction.status().orElse(null)); // "incomplete" if budget was hit interaction.usage().ifPresent(usage -> System.out.println("Tokens used: " + usage.totalTokens().orElse(0))); ``` {% /tab %} {% tab label="Go" %} ```go package main import ( "context" "fmt" "log" "google.golang.org/genai" "google.golang.org/genai/interactions/models/interactions" "google.golang.org/genai/interactions/models/operations" ) func main() { ctx := context.Background() client, err := genai.NewClient(ctx, nil) if err != nil { log.Fatal(err) } env := interactions.Environment{ Sources: []interactions.Source{ { Type: interactions.SourceTypeInline.ToPointer(), Target: genai.Ptr("/workspace/data.csv"), Content: genai.Ptr("id,name,value\n1,alpha,100\n2,beta,200\n"), }, }, } res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{ Body: operations.NewCreateInteractionRequestBody(interactions.CreateAgentInteraction{ Agent: interactions.AgentOption("antigravity-preview-09-2026"), Input: interactions.NewInteractionsInput("Analyze the dataset in /workspace/data.csv and generate a summary report."), AgentConfig: genai.Ptr(interactions.NewCreateAgentInteractionAgentConfig(interactions.AntigravityAgentConfig{ MaxTotalTokens: genai.Ptr(int64(50000)), })), Environment: genai.Ptr(interactions.NewCreateAgentInteractionEnvironment(env)), }), }) if err != nil { log.Fatal(err) } interaction := res.Interaction fmt.Printf("Status: %s\n", interaction.Status) // "incomplete" if budget was hit if interaction.Usage != nil && interaction.Usage.TotalTokens != nil { fmt.Printf("Tokens used: %d\n", *interaction.Usage.TotalTokens) } } ``` {% /tab %} {% /tabs %} #### Continuing an incomplete interaction {% id="continuing-incomplete-interaction" %} When an interaction returns `status: "incomplete"`, the agent's work and context are preserved. Send a new interaction referencing the original interaction `id` and `environment_id` to pick up where it left off. The new interaction gets its own `max_total_tokens` budget. {% tabs %} {% tab filename="sample.py" label="Python" %} ```python # Continue from where the agent stopped continuation = client.interactions.create( agent="antigravity-preview-09-2026", input="continue", previous_interaction_id=interaction.id, environment=interaction.environment_id, agent_config={ "type": "antigravity", "max_total_tokens": 50000 } ) print(f"Status: {continuation.status}") ``` {% /tab %} {% tab filename="sample.js" label="JavaScript" %} ```javascript const continuation = await client.interactions.create({ agent: "antigravity-preview-09-2026", input: "continue", previous_interaction_id: interaction.id, environment: interaction.environment_id, agent_config: { type: "antigravity", max_total_tokens: "50000" } }); console.log(`Status: ${continuation.status}`); ``` {% /tab %} {% tab filename="sample.sh" label="REST" %} ```shell curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \ -H "Content-Type: application/json" \ -H "x-goog-api-key: $GEMINI_API_KEY" \ -d '{ "agent": "antigravity-preview-09-2026", "input": "continue", "previous_interaction_id": "INTERACTION_ID", "environment": "ENVIRONMENT_ID", "agent_config": { "type": "antigravity", "max_total_tokens": 50000 } }' ``` {% /tab %} {% tab label="Java" %} ```java import com.google.genai.Client; import com.google.genai.gaos.models.interactions.AgentOption; import com.google.genai.gaos.models.interactions.AntigravityAgentConfig; import com.google.genai.gaos.models.interactions.CreateAgentInteraction; import com.google.genai.gaos.models.interactions.CreateAgentInteractionEnvironment; import com.google.genai.gaos.models.interactions.Interaction; import com.google.genai.gaos.models.interactions.InteractionsInput; import com.google.genai.gaos.models.operations.CreateInteractionRequestBody; Client client = new Client(); String interactionId = "INTERACTION_ID"; String environmentId = "ENVIRONMENT_ID"; // Continue from where the agent stopped CreateAgentInteraction params = CreateAgentInteraction.builder() .agent(AgentOption.of("antigravity-preview-09-2026")) .input(InteractionsInput.of("continue")) .previousInteractionId(interactionId) .environment(CreateAgentInteractionEnvironment.of(environmentId)) .agentConfig( AntigravityAgentConfig.builder() .maxTotalTokens("50000") .build() ) .build(); Interaction continuation = client.interactions.create(CreateInteractionRequestBody.of(params)).interaction().get(); System.out.println("Status: " + continuation.status().orElse(null)); ``` {% /tab %} {% tab label="Go" %} ```go package main import ( "context" "fmt" "log" "google.golang.org/genai" "google.golang.org/genai/interactions/models/interactions" "google.golang.org/genai/interactions/models/operations" ) func main() { ctx := context.Background() client, err := genai.NewClient(ctx, nil) if err != nil { log.Fatal(err) } interactionID := "INTERACTION_ID" environmentID := "ENVIRONMENT_ID" // Continue from where the agent stopped res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{ Body: operations.NewCreateInteractionRequestBody(interactions.CreateAgentInteraction{ Agent: interactions.AgentOption("antigravity-preview-09-2026"), Input: interactions.NewInteractionsInput("continue"), PreviousInteractionID: genai.Ptr(interactionID), Environment: genai.Ptr(interactions.NewCreateAgentInteractionEnvironment(environmentID)), AgentConfig: genai.Ptr(interactions.NewCreateAgentInteractionAgentConfig(interactions.AntigravityAgentConfig{ MaxTotalTokens: genai.Ptr(int64(50000)), })), }), }) if err != nil { log.Fatal(err) } fmt.Printf("Status: %s\n", res.Interaction.Status) } ``` {% /tab %} {% /tabs %} ### Estimated costs Costs vary based on task complexity. The agent autonomously determines how many tool calls, code executions, and file operations are needed. The following estimates are based on runs. | Task category | Input tokens | Output tokens | Typical cost | | :--- | :--- | :--- | :--- | | **Research & information synthesis** | 100k–500k | 10k–40k | $0.30–$1.00 | | **Document & content generation** | 100k–500k | 15k–50k | $0.30–$1.30 | | **Process & system design** | 100k–400k | 10k–30k | $0.25–$0.80 | | **Data processing & analysis** | 300k–3M | 30k–150k | $0.70–$3.25 | 50–70% of input tokens are typically cached. Complex agentic workflows with many tool calls can accumulate 3–5 million tokens in a single interaction, with costs up to \~$5. **Environment compute** (CPU, memory, sandbox execution) is **not billed** during the preview period. ## Limitations {% id="limitations" %} - **Preview status:** The Antigravity agent and the Interactions API. Features and schemas may change. - **Unsupported generation config:** The following parameters are not supported and return a 400 error: `temperature`, `top_p`, `top_k`, `stop_sequences`, `max_output_tokens`. - **Structured output:** The Antigravity agent does not support structured outputs. - **Unavailable tools:** `file_search`, `computer_use`, and `google_maps` are not yet supported. - **Remote MCP limitations:** Server-Sent Events (SSE) transport is not supported (use Streamable HTTP). Additionally, the server `name` must be strictly lowercase and alphanumeric (using uppercase letters triggers a generic `400 Bad Request` error). - **Filesystem tool:** There is no filesystem tool at the moment. It is part of the `environment`. - **Store requirement:** Agent execution using `background=True` requires `store=True`. - **Stateful only function calling:** Function calling is only supported in stateful mode. You must use `previous_interaction_id` to continue the turn; reconstructing history manually (stateless mode) is not supported. - **Unsupported multimodal types.** Audio, video, and document inputs are not supported at the moment. Only text and image are allowed. ## What's next {% id="whats-next" %} - [Quickstart](/docs/managed-agents-quickstart): multi-turn conversations and streaming. - [Building Custom Agents](/docs/custom-agents): custom instructions, skills, and saving agents. - [Environments](/docs/agent-environment): sandbox configuration, sources, networking. - [Hooks](/docs/agent-hooks): enforce security gates and side-effect validation inside the sandbox. - [Deep Research agent](/docs/deep-research): long-form research tasks. - [Interactions API](/docs/interactions-overview): the underlying API.