A API Interactions oferece uma interface unificada e com estado para criar aplicativos de IA generativa com modelos do Gemini e agentes autônomos na Gemini Enterprise Agent Platform. Use a API Interactions para gerenciar o armazenamento de sessões e conversas de vários turnos, transmitir respostas em tempo real, aplicar saídas estruturadas, invocar ferramentas e embasamento integrados, executar chamadas de função e orquestrar tarefas em segundo plano de longa duração.
Este guia mostra como instalar o SDK de IA generativa do Google, autenticar seu cliente e implementar fluxos de trabalho de interação comuns. Para detalhes conceituais sobre o ciclo de vida da interação, consulte a visão geral da API Interactions.
Antes de começar
Antes de enviar solicitações para a API Interactions, configure seu projeto do Google Cloud e o ambiente de desenvolvimento:
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Agent Platform API, if it is not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
Make sure that you have the following role or roles on the project: Agent Platform User (
roles/aiplatform.user)Check for the roles
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
-
In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.
- For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.
Grant the roles
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
- Click Grant access.
-
In the New principals field, enter your user identifier. This is typically the identifier for a user in a workforce identity pool. For details, see Represent workforce pool users in IAM policies, or contact your administrator.
- Click Select a role, then search for the role.
- To grant additional roles, click Add another role and add each additional role.
- Click Save.
-
Principais conceitos
Confira os conceitos a seguir para entender como a API Interactions gerencia o estado e as respostas:
Interaction: a API Interactions se concentra em um recurso principal: umaInteraction. UmInteractionrepresenta uma rodada completa em uma conversa ou tarefa, acompanhando a cronologia dos pensamentos do modelo, chamadas de ferramentas e saídas finais. Ele fornece um envelope unificado para interações de comando-resposta e Agentic Workflows complexos e de várias etapas.Retenção com estado: as interações são armazenadas do lado do servidor por padrão (
store=Trueem Python oustore: trueem TypeScript/JavaScript). As interações armazenadas persistem por sete dias e são excluídas automaticamente após esse período. Definirstore=Falseativa o modo sem estado, que desativa a retenção de dados do lado do servidor e obedece à retenção zero de dados (ZDR). O modo sem estado também desativa o encadeamento deprevious_interaction_ide a execução assíncrona (background=True).Auxiliares de resposta: a versão
2.3.0e mais recentes do SDK de IA Generativa do Google oferecem propriedades de conveniência na resposta de interação, incluindointeraction.output_text,interaction.output_imageeinteraction.output_audio. Useinteraction.output_textpara ler respostas de texto em vez de indexar manualmente na matriz de etapas (comointeraction.steps[-1].content[0].text).
Requisitos
Verifique se o ambiente e as solicitações atendem aos seguintes requisitos antes de fazer a integração com a API Interactions:
Suporte à versão do SDK: use uma das bibliotecas do SDK de IA generativa do Google compatíveis.
Modelos compatíveis: use modelos compatíveis do Gemini 3 ou mais recentes. As famílias de modelos anteriores não são compatíveis com essa API. Para uma lista completa de modelos compatíveis, consulte Modelos compatíveis e Migrar para as versões mais recentes do modelo.
Parâmetros com escopo de turno: parâmetros de configuração como
tools,system_instructionegeneration_configse aplicam apenas ao turno atual. Transmita esses parâmetros em cada turno de interação subsequente se o fluxo de trabalho exigir isso em uma conversa com várias interações.Decodificações longas no Gemini 4 Argon: para gerar saídas de turno único que excedam 65.536 tokens (até 1.048.576 tokens menos tokens de entrada) em
gemini-4-argonougemini-4-argon-cyber-permissive, use a continuação automática do SDK de IA generativa do Google (google-genai >= 2.34.0para Python,@google/genai >= 2.32.0para TypeScript/JavaScript, Go>= 1.77.0, Java>= 1.80.0),background=Trueoucontinuation_tokenno endpointv1beta1. Para exemplos de código e regras de continuação, consulte Decodificações longas no guia para desenvolvedores do Gemini 4 Argon.
Instalar o SDK de IA generativa do Google
Instale ou faça upgrade do SDK de IA generativa do Google para sua linguagem preferida:
Python
pip install --upgrade "google-genai>=2.3.0"
TypeScript / JavaScript
npm install "@google/genai>=2.3.0"
Go
go get google.golang.org/genai
Java
<dependencies>
<dependency>
<groupId>com.google.genai</groupId>
<artifactId>google-genai</artifactId>
<version>1.78.0</version>
</dependency>
</dependencies>
Autenticar o cliente
É possível se conectar à API Interactions na Agent Platform usando um dos seguintes métodos de autenticação:
Conectar-se usando um projeto do Google Cloud com o Application Default Credentials (ADC)
Use esse método de autenticação para cargas de trabalho corporativas e implantações de produção no Google Cloud. Para autenticar com o Application Default Credentials (ADC), inicialize o cliente com as seguintes propriedades:
enterprise=Trueproject="PROJECT_ID"location="global"
Se você ainda não configurou as credenciais locais, execute
gcloud auth application-default login.
No exemplo de código a seguir, substitua PROJECT_ID pelo ID do projeto doGoogle Cloud .
Python
from google import genai
client = genai.Client(
enterprise=True,
project="PROJECT_ID",
location="global",
)
interaction = client.interactions.create(
model="gemini-3.8-flash",
input="Explain serverless computing in one sentence.",
)
print(interaction.output_text)
TypeScript / JavaScript
import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI({
enterprise: true,
project: "PROJECT_ID",
location: "global",
});
const interaction = await ai.interactions.create({
model: "gemini-3.8-flash",
input: "Explain serverless computing in one sentence.",
});
console.log(interaction.output_text);
REST
curl -X POST "https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/interactions" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.8-flash",
"input": [{
"type": "user_input",
"content": [{
"type": "text",
"text": "Explain serverless computing in one sentence."
}]
}]
}'
Conectar usando o modo expresso (chave de API)
Use esse método de autenticação para prototipagem rápida, scripts leves ou
ambientes que se autenticam com uma chave de API. Transmita sua chave de API ao
inicializar o cliente ou no cabeçalho HTTP x-goog-api-key.
No exemplo de código a seguir, substitua API_KEY pela sua chave de API e PROJECT_ID pelo ID do projeto do Google Cloud .
Python
from google import genai
client = genai.Client(
enterprise=True,
api_key="API_KEY",
)
interaction = client.interactions.create(
model="gemini-3.8-flash",
input="Explain serverless computing in one sentence.",
)
print(interaction.output_text)
TypeScript / JavaScript
import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI({
enterprise: true,
apiKey: "API_KEY",
});
const interaction = await ai.interactions.create({
model: "gemini-3.8-flash",
input: "Explain serverless computing in one sentence.",
});
console.log(interaction.output_text);
REST
curl -X POST "https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/interactions" \
-H "x-goog-api-key: API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.8-flash",
"input": [{
"type": "user_input",
"content": [{
"type": "text",
"text": "Explain serverless computing in one sentence."
}]
}]
}'
Fluxos de trabalho de interação comuns
Depois de configurar o cliente, use o método interactions.create para
gerenciar o armazenamento de sessões e as conversas de vários turnos, transmitir tokens de saída em
tempo real, gerar JSON validado por esquema, invocar ferramentas e embasamento integrados,
chamar funções externas e executar agentes autônomos.
Gerenciar o armazenamento da sessão e o estado da conversa
A API Interactions oferece suporte ao armazenamento com estado no servidor
(store=True, padrão) e à execução sem estado gerenciada pelo cliente (store=False).
A tabela a seguir compara os modos de interação com e sem estado:
| Recurso | Modo com estado (store=true, padrão) |
Modo sem estado (store=false) |
|---|---|---|
| Persistência do lado do servidor | Armazena entradas, etapas intermediárias e saídas no servidor por sete dias. | Desativa o armazenamento de interações do lado do servidor para oferecer suporte a fluxos de trabalho de retenção zero de dados (ZDR). |
| Contexto multiturno |
Encadeia as interações transmitindo a interação anterior id em
previous_interaction_id.
|
Requer a transmissão da matriz completa da conversa anterior steps
em input em cada turno. Transmitir
previous_interaction_id retorna um erro 400 Bad
Request.
|
Execução em segundo plano (background=true)
|
Compatível com interações de longa duração de modelos e agentes. | Incompatível. A execução assíncrona em segundo plano requer persistência de estado do lado do servidor. |
| Métodos de ciclo de vida da sessão |
Oferece suporte à recuperação (get), listagem (list),
cancelamento (cancel) e exclusão (delete)
de interações.
|
Não é possível recuperar após a conclusão da resposta síncrona ou de streaming. |
| Criptografia em repouso |
Criptografados por padrão com um Google-owned and Google-managed encryption keyou com
chaves de criptografia gerenciadas pelo cliente (CMEK) nas
multirregiões us e eu.
|
Nenhum estado de interação é armazenado em repouso. |
Executar conversas multiturno com estado
Por padrão, a API Interactions armazena o estado da conversa no servidor
(store=True em Python ou store: true em TypeScript/JavaScript). Para continuar
uma conversa, transmita o id da interação anterior para o
parâmetro previous_interaction_id. A Agent Platform recupera o contexto de conversa armazenado, adiciona a nova rodada e reutiliza os tokens de prefixo armazenados em cache.
Ao encadear interações entre endpoints, observe as seguintes regras de local:
Mesmo local: é possível encadear interações no mesmo local (como
globalparaglobal,usparausoueuparaeu).Em locais diferentes: não é possível encadear em locais de endpoint diferentes (entre
globaleusoueu, ou entreuseeu). Cada endpoint armazena o estado da interação em um armazenamento isolado. Portanto, referenciar um ID de interação criado em outro local retorna um erro404 Not Found.
No exemplo a seguir, substitua PROJECT_ID pelo ID do projeto do Google Cloud:
Python
from google import genai
client = genai.Client(
enterprise=True,
project="PROJECT_ID",
location="global",
)
# Turn 1: Start a stateful conversation (store=True by default)
turn1 = client.interactions.create(
model="gemini-3.8-flash",
input="Hi! My name is John. I am working on AI agents.",
store=True,
)
print(f"Turn 1: {turn1.output_text}")
# Turn 2: Reference the stored conversation state using previous_interaction_id
turn2 = client.interactions.create(
model="gemini-3.8-flash",
input="What is my name?",
previous_interaction_id=turn1.id,
)
print(f"Turn 2: {turn2.output_text}")
TypeScript / JavaScript
import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI({
enterprise: true,
project: "PROJECT_ID",
location: "global",
});
// Turn 1: Start a stateful conversation (store: true by default)
const turn1 = await ai.interactions.create({
model: "gemini-3.8-flash",
input: "Hi! My name is John. I am working on AI agents.",
store: true,
});
console.log(`Turn 1: ${turn1.output_text}`);
// Turn 2: Reference the stored conversation state using previous_interaction_id
const turn2 = await ai.interactions.create({
model: "gemini-3.8-flash",
input: "What is my name?",
previous_interaction_id: turn1.id,
});
console.log(`Turn 2: ${turn2.output_text}`);
Java
import com.google.genai.Client;
import com.google.genai.gaos.models.interactions.CreateModelInteraction;
import com.google.genai.gaos.models.interactions.Interaction;
import com.google.genai.gaos.models.interactions.InteractionsInput;
import com.google.genai.gaos.models.interactions.Model;
import com.google.genai.gaos.models.operations.CreateInteractionRequestBody;
Client client =
Client.builder()
.enterprise(true)
.project("PROJECT_ID")
.location("global")
.build();
// Turn 1: Start a stateful conversation (store is true by default)
CreateModelInteraction req1 =
CreateModelInteraction.builder()
.model(Model.of("gemini-3.8-flash"))
.input(InteractionsInput.of("Hi! My name is John. I am working on AI agents."))
.store(true)
.build();
Interaction turn1 =
client.interactions.create(CreateInteractionRequestBody.of(req1)).interaction().orElseThrow();
System.out.println("Turn 1: " + turn1.outputText().orElse(""));
// Turn 2: Reference the stored conversation state using previousInteractionId
CreateModelInteraction req2 =
CreateModelInteraction.builder()
.model(Model.of("gemini-3.8-flash"))
.previousInteractionId(turn1.id().orElseThrow())
.input(InteractionsInput.of("What is my name?"))
.build();
Interaction turn2 =
client.interactions.create(CreateInteractionRequestBody.of(req2)).interaction().orElseThrow();
System.out.println("Turn 2: " + turn2.outputText().orElse(""));
REST
# Turn 1: Start a stateful conversation
curl -X POST "https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/interactions" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.8-flash",
"store": true,
"input": "Hi! My name is John. I am working on AI agents."
}'
# Turn 2: Pass the interaction ID from Turn 1 in previous_interaction_id
curl -X POST "https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/interactions" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.8-flash",
"previous_interaction_id": "PREVIOUS_INTERACTION_ID",
"input": "What is my name?"
}'
Executar conversas multiturno sem estado
Se a carga de trabalho exigir retenção de dados zero (ZDR), defina explicitamente store=False (store: false em
TypeScript/JavaScript ou "store": false em REST) em cada solicitação.
No modo sem estado, você gerencia o histórico de conversas no cliente mantendo
uma lista de objetos Step
(user_input, thought, function_call, function_result e
model_output) e enviando a matriz steps acumulada em input a cada
turno:
Python
from google import genai
client = genai.Client(
enterprise=True,
project="PROJECT_ID",
location="global",
)
history = [
{
"type": "user_input",
"content": [{"type": "text", "text": "Hi! My name is John."}],
}
]
# Turn 1: Stateless request (store=False)
turn1 = client.interactions.create(
model="gemini-3.8-flash",
input=history,
store=False,
)
print(f"Turn 1: {turn1.output_text}")
# Append the model's generated steps and the next user turn to local history
history.extend(turn1.steps)
history.append(
{
"type": "user_input",
"content": [{"type": "text", "text": "What is my name?"}],
}
)
# Turn 2: Send the full step history with store=False
turn2 = client.interactions.create(
model="gemini-3.8-flash",
input=history,
store=False,
)
print(f"Turn 2: {turn2.output_text}")
TypeScript / JavaScript
import { GoogleGenAI, Step } from "@google/genai";
const ai = new GoogleGenAI({
enterprise: true,
project: "PROJECT_ID",
location: "global",
});
const history: Step[] = [
{
type: "user_input",
content: [{ type: "text", text: "Hi! My name is John." }],
},
];
// Turn 1: Stateless request (store: false)
const turn1 = await ai.interactions.create({
model: "gemini-3.8-flash",
input: history,
store: false,
});
console.log(`Turn 1: ${turn1.output_text}`);
// Append the model's generated steps and the next user turn to local history
if (turn1.steps) {
history.push(...turn1.steps);
}
history.push({
type: "user_input",
content: [{ type: "text", text: "What is my name?" }],
});
// Turn 2: Send the full step history with store: false
const turn2 = await ai.interactions.create({
model: "gemini-3.8-flash",
input: history,
store: false,
});
console.log(`Turn 2: ${turn2.output_text}`);
Java
import com.google.genai.Client;
import com.google.genai.gaos.models.interactions.CreateModelInteraction;
import com.google.genai.gaos.models.interactions.Interaction;
import com.google.genai.gaos.models.interactions.InteractionsInput;
import com.google.genai.gaos.models.interactions.Model;
import com.google.genai.gaos.models.interactions.Step;
import com.google.genai.gaos.models.interactions.TextContent;
import com.google.genai.gaos.models.interactions.UserInputContent;
import com.google.genai.gaos.models.interactions.UserInputStep;
import com.google.genai.gaos.models.operations.CreateInteractionRequestBody;
import java.util.ArrayList;
import java.util.List;
Client client =
Client.builder()
.enterprise(true)
.project("PROJECT_ID")
.location("global")
.build();
List<Step> history = new ArrayList<>();
history.add(
Step.of(
UserInputStep.builder()
.content(
List.of(
UserInputContent.of(
TextContent.builder().text("Hi! My name is John.").build())))
.build()));
// Turn 1: Stateless request (store(false))
CreateModelInteraction req1 =
CreateModelInteraction.builder()
.model(Model.of("gemini-3.8-flash"))
.input(InteractionsInput.ofSteps(history))
.store(false)
.build();
Interaction turn1 =
client.interactions.create(CreateInteractionRequestBody.of(req1)).interaction().orElseThrow();
System.out.println("Turn 1: " + turn1.outputText().orElse(""));
// Append the model's generated steps and the next user turn to local history
turn1.steps().ifPresent(history::addAll);
history.add(
Step.of(
UserInputStep.builder()
.content(
List.of(
UserInputContent.of(
TextContent.builder().text("What is my name?").build())))
.build()));
// Turn 2: Send the full step history with store(false)
CreateModelInteraction req2 =
CreateModelInteraction.builder()
.model(Model.of("gemini-3.8-flash"))
.input(InteractionsInput.ofSteps(history))
.store(false)
.build();
Interaction turn2 =
client.interactions.create(CreateInteractionRequestBody.of(req2)).interaction().orElseThrow();
System.out.println("Turn 2: " + turn2.outputText().orElse(""));
REST
curl -X POST "https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/interactions" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.8-flash",
"store": false,
"input": [
{
"type": "user_input",
"content": [{"type": "text", "text": "Hi! My name is John."}]
},
{
"type": "model_output",
"content": [{"type": "text", "text": "Hello John! How can I help you today?"}]
},
{
"type": "user_input",
"content": [{"type": "text", "text": "What is my name?"}]
}
]
}'
Retenção e ciclo de vida da sessão
As interações armazenadas (store=True) seguem estas regras de retenção e ramificação:
Time to live (TTL) de 7 dias: cada interação armazenada persiste por 7 dias a partir do carimbo de data/hora
createde é excluída automaticamente quando o TTL de 7 dias expira.Armazenamento independente de pai e filho: quando você encadeia uma nova rodada usando
previous_interaction_id, a plataforma de agentes copia o histórico de conversas do ancestral para o novo registro de interação. Como cada turno armazena a própria cópia do histórico da conversa, expirar ou excluir um turno anterior tem os seguintes efeitos:A continuação de um turno posterior é bem-sucedida: se o turno 1 (
interaction_1) expirar ou for excluído depois que o turno 2 (interaction_2) já tiver sido criado, você ainda poderá criar o turno 3 usandoprevious_interaction_id=interaction_2.idaté que o própriointeraction_2expire ou seja excluído.A ramificação de uma rodada expirada ou excluída falha: tentar criar uma nova interação que faça referência direta a um ID de interação expirado ou excluído em
previous_interaction_idretorna um erro400 Bad Request(Previous Interaction ID not found).
Recuperar, listar, cancelar e excluir interações armazenadas
É possível inspecionar e gerenciar as interações armazenadas durante todo o ciclo de vida delas usando os seguintes métodos:
Recuperar uma interação (
interactions.get): busca o recursoInteractioncompleto porid, incluindo as etapas deuser_input,thoughtintermediárias e de ferramenta, além das etapas demodel_output. Definastream=True(e, opcionalmente,last_event_id) para transmitir ou retomar uma interação em andamento.Listar interações (
interactions.list): consulta os IDs de interação armazenados no projeto por REST usandopage_size(padrão10, máximo500) epage_token. Retorna uma lista de recursosInteractionMetadata.Cancelar uma interação em andamento (
interactions.cancel): interrompe uma interação assíncrona em segundo plano (background=True) que está no estadoin_progressourequires_actione muda o status paracancelled. Você vai precisar pagar por todos os tokens gerados antes do cancelamento.Excluir uma interação armazenada (
interactions.delete): remove permanentemente uma interação armazenada antes que o TTL de sete dias expire. Somente interações em um estado terminal (completed,failedoucancelled) podem ser excluídas. Se uma interação ainda estiver em execução em segundo plano, cancele-a antes de excluí-la.
No exemplo a seguir, substitua PROJECT_ID pelo ID do projeto do Google Cloud e INTERACTION_ID pelo ID da interação de destino:
Python
from google import genai
client = genai.Client(
enterprise=True,
project="PROJECT_ID",
location="global",
)
# Retrieve a stored interaction by ID
interaction = client.interactions.get(id="INTERACTION_ID")
print(f"Status: {interaction.status}")
# Cancel an in-progress background interaction
cancelled = client.interactions.cancel(id="INTERACTION_ID")
print(f"After cancel: {cancelled.status}")
# Delete a completed, failed, or cancelled interaction before its 7-day TTL
client.interactions.delete(id="INTERACTION_ID")
print("Interaction deleted.")
TypeScript / JavaScript
import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI({
enterprise: true,
project: "PROJECT_ID",
location: "global",
});
// Retrieve a stored interaction by ID
const interaction = await ai.interactions.get("INTERACTION_ID");
console.log(`Status: ${interaction.status}`);
// Cancel an in-progress background interaction
const cancelled = await ai.interactions.cancel("INTERACTION_ID");
console.log(`After cancel: ${cancelled.status}`);
// Delete a completed, failed, or cancelled interaction before its 7-day TTL
await ai.interactions.delete("INTERACTION_ID");
console.log("Interaction deleted.");
Java
import com.google.genai.Client;
import com.google.genai.gaos.models.interactions.Interaction;
import com.google.genai.gaos.models.interactions.InteractionStatus;
import com.google.genai.gaos.models.operations.CancelInteractionByIdResponse;
import com.google.genai.gaos.models.operations.GetInteractionByIdRequest;
import com.google.genai.gaos.models.operations.GetInteractionByIdResponse;
Client client =
Client.builder()
.enterprise(true)
.project("PROJECT_ID")
.location("global")
.build();
String interactionId = "INTERACTION_ID";
// Retrieve a stored interaction by ID
GetInteractionByIdResponse getResponse =
client.interactions.get(new GetInteractionByIdRequest(interactionId));
Interaction interaction = getResponse.interaction().orElseThrow();
System.out.println("Status: " + interaction.status().map(InteractionStatus::value).orElse(""));
// Cancel an in-progress background interaction
CancelInteractionByIdResponse cancelResponse = client.interactions.cancel(interactionId);
Interaction cancelled = cancelResponse.interaction().orElseThrow();
System.out.println("After cancel: " + cancelled.status().map(InteractionStatus::value).orElse(""));
// Delete a completed, failed, or cancelled interaction before its 7-day TTL
client.interactions.delete(interactionId);
System.out.println("Interaction deleted.");
REST
# Retrieve a stored interaction by ID
curl -X GET "https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/interactions/INTERACTION_ID" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)"
# List stored interactions (up to 500 per page)
curl -X GET "https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/interactions?page_size=10" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)"
# Cancel an in-progress background interaction
curl -X POST "https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/interactions/INTERACTION_ID/cancel" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)"
# Delete a completed, failed, or cancelled interaction
curl -X DELETE "https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/interactions/INTERACTION_ID" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)"
Cotas e limites de armazenamento com estado
Além dos limites de token de modelo e taxa de solicitação, as interações com estado
(store=True) estão sujeitas aos seguintes limites de armazenamento e
simultaneidade para envolvidos no projeto:
| Cota ou limite do sistema | Limite padrão (por projeto) | Descrição |
|---|---|---|
| Capacidade de criação de interações com estado por dia | 240 GiB por dia |
Volume total máximo de dados de interação gravados no armazenamento do lado do servidor por dia em solicitações de interactions.create com store=true. |
| Capacidade de recuperação de interações com estado por dia | 480 GiB por dia |
Volume total máximo de dados de interação armazenados lidos por dia em solicitações interactions.get e solicitações de várias interações que carregam interações anteriores usando previous_interaction_id. |
| Interações simultâneas com estado | 500 interações simultâneas |
Número máximo de interações com estado ativas em execução simultânea em um projeto. |
Para mais informações sobre como visualizar e gerenciar cotas na Plataforma de Agentes, consulte Cotas e limites do sistema.
Respostas de streaming em tempo real
Para reduzir a latência percebida em aplicativos interativos, é possível transmitir as respostas do modelo
conforme elas são geradas. Defina stream=True (stream: true em
TypeScript/JavaScript) ao chamar interactions.create para receber um stream iterável
de eventos enviados pelo servidor. Filtre os eventos step.delta para renderizar
blocos de texto incrementais conforme eles chegam:
Python
response = client.interactions.create(
model="gemini-3.8-flash",
input="Write a short poem about debugging.",
stream=True,
)
for event in response:
if event.event_type == "step.delta" and hasattr(event.delta, "text"):
print(event.delta.text, end="", flush=True)
print()
TypeScript / JavaScript
const responseStream = await ai.interactions.create({
model: "gemini-3.8-flash",
input: "Write a short poem about debugging.",
stream: true,
});
for await (const event of responseStream) {
if (event.event_type === "step.delta" && event.delta && "text" in event.delta) {
process.stdout.write(event.delta.text);
}
}
console.log();
Gerar saída estruturada
Quando o aplicativo exige respostas em um formato previsível e legível por máquina,
é possível restringir a saída do modelo para que ela corresponda a um esquema JSON específico. Transmita
o esquema de destino, como um esquema JSON de modelo Pydantic em Python ou um objeto de esquema
Type em TypeScript/JavaScript, diretamente para o parâmetro polimórfico
response_format:
Python
from pydantic import BaseModel, Field
class Book(BaseModel):
title: str = Field(description="The title of the book")
author: str = Field(description="The book's author")
year_published: int
interaction = client.interactions.create(
model="gemini-3.8-flash",
input="Recommend one famous sci-fi book.",
response_format=Book.model_json_schema(),
)
# The output text is valid JSON matching the Book schema
print(interaction.output_text)
TypeScript / JavaScript
import { Type } from "@google/genai";
const BookSchema = {
type: Type.OBJECT,
properties: {
title: { type: Type.STRING, description: "The title of the book" },
author: { type: Type.STRING, description: "The book's author" },
yearPublished: { type: Type.INTEGER },
},
required: ["title", "author", "yearPublished"],
};
const interaction = await ai.interactions.create({
model: "gemini-3.8-flash",
input: "Recommend one famous sci-fi book.",
response_format: BookSchema,
});
console.log(interaction.output_text);
Usar chamada de função (uso de ferramentas)
A chamada de função permite que um modelo solicite a execução de funções personalizadas ou APIs externas para coletar informações antes de formular uma resposta final. Em um fluxo de trabalho de interação com estado, a chamada de função segue um padrão de dois turnos:
Declarar e transmitir ferramentas: forneça as declarações de função no parâmetro
toolsna solicitação inicial.Executar e retornar resultados: inspecione as etapas de resposta (
interaction.steps) para as etapasfunction_call, execute a função local usando oargumentsfornecido pelo modelo e envie uma interação de acompanhamento contendo um itemfunction_resultvinculado porcall_ideprevious_interaction_id.
Python
# Define a declarative function tool schema
stock_tool = {
"type": "function",
"name": "get_stock_price",
"description": "Gets the stock price for a given ticker symbol.",
"parameters": {
"type": "object",
"properties": {
"ticker": {"type": "string", "description": "The stock ticker symbol"}
},
"required": ["ticker"],
},
}
def get_stock_price(ticker: str) -> float:
"""Executes the local tool function."""
if ticker.upper() == "GOOG":
return 175.50
return 100.0
# Turn 1: Pass the tool declaration to the model
interaction = client.interactions.create(
model="gemini-3.8-flash",
input="What is the stock price of GOOG?",
tools=[stock_tool],
)
# Inspect the interaction steps for function call requests
for step in interaction.steps:
if step.type == "function_call" and step.name == "get_stock_price":
ticker_arg = step.arguments.get("ticker")
price = get_stock_price(ticker_arg)
# Turn 2: Submit the function execution result to the conversation
final_turn = client.interactions.create(
model="gemini-3.8-flash",
input=[{
"type": "function_result",
"call_id": step.id,
"result": {"price": price},
}],
previous_interaction_id=interaction.id,
)
print(final_turn.output_text)
TypeScript / JavaScript
// Define a declarative function tool schema
const stockTool = {
type: "function",
name: "getStockPrice",
description: "Gets the stock price for a given ticker symbol.",
parameters: {
type: "object",
properties: {
ticker: { type: "string", description: "The stock ticker symbol" },
},
required: ["ticker"],
},
};
function getStockPrice({ ticker }: { ticker: string }): number {
if (ticker.toUpperCase() === "GOOG") return 175.50;
return 100.00;
}
// Turn 1: Pass the tool declaration to the model
const interaction = await ai.interactions.create({
model: "gemini-3.8-flash",
input: "What is the stock price of GOOG?",
tools: [stockTool],
});
// Inspect the interaction steps for function call requests
for (const step of interaction.steps ?? []) {
if (step.type === "function_call" && step.name === "getStockPrice") {
const tickerArg = step.arguments.ticker as string;
const price = getStockPrice({ ticker: tickerArg });
// Turn 2: Submit the function execution result to the conversation
const finalTurn = await ai.interactions.create({
model: "gemini-3.8-flash",
input: [{
type: "function_result",
call_id: step.id,
result: { price },
}],
previous_interaction_id: interaction.id,
});
console.log(finalTurn.output_text);
}
}
Usar ferramentas integradas
Além da chamada de função do lado do cliente, a
API Interactions oferece suporte a ferramentas integradas do lado do servidor para
modelos do Gemini 3. Quando você ativa uma ferramenta integrada no parâmetro tools, a Agent Platform executa a ferramenta no servidor durante uma única chamada interactions.create e registra as etapas de invocação (*_call) e saída (*_result) da ferramenta em interaction.steps.
A API Interactions é compatível com as seguintes ferramentas integradas:
Execução de código (
{"type": "code_execution"}): gera e executa código Python em um ambiente de sandbox para realizar cálculos, análise de dados e raciocínio baseado em código. Para saber mais sobre bibliotecas, faturamento e limitações, consulte Execução de código.Contexto de URL (
{"type": "url_context"}): recupera e analisa o conteúdo de URLs públicos da Web incluídos no comando. Para detalhes sobre armazenamento em cache de índice, buscas em tempo real e combinação de contexto de URL com pesquisa, consulte Contexto de URL.Embasamento com a Pesquisa Google (
{"type": "google_search"}): embasa as respostas do modelo em informações da Web em tempo real e retorna citações inline. Consulte Embasar respostas com a Pesquisa Google.Uso do computador (
{"type": "computer_use"}): permite fluxos de trabalho de automação do navegador e da interface do usuário. Para controles de configuração e segurança, consulte Uso do computador.
Executar código Python
Para ativar a execução de código, inclua {"type": "code_execution"} na lista
tools. A matriz interaction.steps retornada contém etapas code_execution_call (com arguments.code e arguments.language), etapas code_execution_result (com result e is_error) e a etapa final model_output.
No exemplo a seguir, substitua PROJECT_ID pelo ID do projeto do Google Cloud:
Python
from google import genai
client = genai.Client(
enterprise=True,
project="PROJECT_ID",
location="global",
)
interaction = client.interactions.create(
model="gemini-3.8-flash",
input="Calculate the 50th Fibonacci number and find its closest prime.",
tools=[{"type": "code_execution"}],
)
for step in interaction.steps:
if step.type == "code_execution_call":
print(f"Generated code:\n{step.arguments.code}")
elif step.type == "code_execution_result":
print(f"Execution result:\n{step.result}")
elif step.type == "model_output":
for content in step.content:
if content.type == "text":
print(content.text)
TypeScript / JavaScript
import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI({
enterprise: true,
project: "PROJECT_ID",
location: "global",
});
const interaction = await ai.interactions.create({
model: "gemini-3.8-flash",
input: "Calculate the 50th Fibonacci number and find its closest prime.",
tools: [{ type: "code_execution" }],
});
for (const step of interaction.steps ?? []) {
if (step.type === "code_execution_call") {
console.log(`Generated code:\n${step.arguments?.code}`);
} else if (step.type === "code_execution_result") {
console.log(`Execution result:\n${step.result}`);
} else if (step.type === "model_output") {
for (const content of step.content ?? []) {
if (content.type === "text") {
console.log(content.text);
}
}
}
}
Java
import com.google.genai.Client;
import com.google.genai.gaos.models.interactions.CodeExecution;
import com.google.genai.gaos.models.interactions.CodeExecutionCallStep;
import com.google.genai.gaos.models.interactions.CodeExecutionResultStep;
import com.google.genai.gaos.models.interactions.CreateModelInteraction;
import com.google.genai.gaos.models.interactions.Interaction;
import com.google.genai.gaos.models.interactions.InteractionsInput;
import com.google.genai.gaos.models.interactions.Model;
import com.google.genai.gaos.models.interactions.Step;
import com.google.genai.gaos.models.operations.CreateInteractionRequestBody;
import java.util.List;
Client client =
Client.builder()
.enterprise(true)
.project("PROJECT_ID")
.location("global")
.build();
CreateModelInteraction request =
CreateModelInteraction.builder()
.model(Model.of("gemini-3.8-flash"))
.input(
InteractionsInput.of(
"Calculate the 50th Fibonacci number and find its closest prime."))
.tools(List.of(CodeExecution.builder().build()))
.build();
Interaction interaction =
client.interactions.create(CreateInteractionRequestBody.of(request)).interaction().orElseThrow();
for (Step step : interaction.steps().orElse(List.of())) {
if (step instanceof CodeExecutionCallStep callStep) {
callStep
.arguments()
.flatMap(args -> args.code())
.ifPresent(code -> System.out.println("Generated code:\n" + code));
} else if (step instanceof CodeExecutionResultStep resultStep) {
resultStep
.result()
.ifPresent(res -> System.out.println("Execution result:\n" + res));
}
}
System.out.println(interaction.outputText().orElse(""));
REST
curl -X POST "https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/interactions" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.8-flash",
"input": "Calculate the 50th Fibonacci number and find its closest prime.",
"tools": [{"type": "code_execution"}]
}'
Recuperar conteúdo de páginas da Web com contexto de URL
Para permitir que o modelo busque e analise páginas da Web referenciadas no comando,
inclua {"type": "url_context"} na lista tools. A API registra os
URLs buscados nas etapas url_context_call e url_context_result e anexa
anotações url_citation ao texto gerado em model_output.
No exemplo a seguir, substitua PROJECT_ID pelo ID do projeto do Google Cloud e YOUR_URL_1 e YOUR_URL_2 pelos URLs públicos a serem comparados:
Python
from google import genai
client = genai.Client(
enterprise=True,
project="PROJECT_ID",
location="global",
)
interaction = client.interactions.create(
model="gemini-3.8-flash",
input="Compare the key findings from YOUR_URL_1 and YOUR_URL_2.",
tools=[{"type": "url_context"}],
)
print(interaction.output_text)
TypeScript / JavaScript
import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI({
enterprise: true,
project: "PROJECT_ID",
location: "global",
});
const interaction = await ai.interactions.create({
model: "gemini-3.8-flash",
input: "Compare the key findings from YOUR_URL_1 and YOUR_URL_2.",
tools: [{ type: "url_context" }],
});
console.log(interaction.output_text);
Java
import com.google.genai.Client;
import com.google.genai.gaos.models.interactions.CreateModelInteraction;
import com.google.genai.gaos.models.interactions.Interaction;
import com.google.genai.gaos.models.interactions.InteractionsInput;
import com.google.genai.gaos.models.interactions.Model;
import com.google.genai.gaos.models.interactions.URLContext;
import com.google.genai.gaos.models.operations.CreateInteractionRequestBody;
import java.util.List;
Client client =
Client.builder()
.enterprise(true)
.project("PROJECT_ID")
.location("global")
.build();
CreateModelInteraction request =
CreateModelInteraction.builder()
.model(Model.of("gemini-3.8-flash"))
.input(
InteractionsInput.of(
"Compare the key findings from YOUR_URL_1 and YOUR_URL_2."))
.tools(List.of(URLContext.builder().build()))
.build();
Interaction interaction =
client.interactions.create(CreateInteractionRequestBody.of(request)).interaction().orElseThrow();
System.out.println(interaction.outputText().orElse(""));
REST
curl -X POST "https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/interactions" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.8-flash",
"input": "Compare the key findings from YOUR_URL_1 and YOUR_URL_2.",
"tools": [{"type": "url_context"}]
}'
Embasar respostas com a Pesquisa Google
O embasamento conecta os modelos do Gemini a fontes externas verificáveis para reduzir as alucinações e fornecer respostas atualizadas com citações. Para uma visão geral das opções de embasamento na Agent Platform, consulte a Visão geral do embasamento, Embasamento com a Pesquisa Google e Embasamento na Web para empresas.
Quando você ativa o embasamento com a Pesquisa Google transmitindo
{"type": "google_search"} na lista tools, a API Interactions retorna
dados de pesquisa e atribuição diretamente na linha do tempo interaction.steps:
google_search_call: contém as consultas de pesquisa emitidas pelo modelo (step.arguments.queries).google_search_result: contém sugestões de pesquisa (result[].search_suggestions), um snippet HTML/CSS usado para renderizar sugestões de pesquisa em interfaces do usuário. Os recursos da Web com URLs de origem e títulos são fornecidos como anotações inlineurl_citationem blocos de textomodel_output.Anotações inline
url_citation: cada bloco de conteúdotext(TextContent) em uma etapamodel_outputpode incluir uma matrizannotations. Cada anotaçãourl_citationidentifica o intervalo de caracteres ou bytes (start_indexeend_index) no texto de resposta, junto com a origemtitleeurl.
No exemplo a seguir, substitua PROJECT_ID pelo ID do projeto do Google Cloud:
Python
from google import genai
client = genai.Client(
enterprise=True,
project="PROJECT_ID",
location="global",
)
interaction = client.interactions.create(
model="gemini-3.8-flash",
input="Who won the 2026 Super Bowl?",
tools=[{"type": "google_search"}],
)
print(interaction.output_text)
# Parse inline url_citation annotations from model_output steps
print("\nSources:")
for step in interaction.steps:
if step.type == "model_output" and step.content:
for content in step.content:
if content.type == "text" and getattr(content, "annotations", None):
for annotation in content.annotations:
if annotation.type == "url_citation":
span = content.text[annotation.start_index:annotation.end_index]
print(f"- [{annotation.title}]({annotation.url}) (cited text: {span!r})")
TypeScript / JavaScript
import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI({
enterprise: true,
project: "PROJECT_ID",
location: "global",
});
const interaction = await ai.interactions.create({
model: "gemini-3.8-flash",
input: "Who won the 2026 Super Bowl?",
tools: [{ type: "google_search" }],
});
console.log(interaction.output_text);
// Parse inline url_citation annotations from model_output steps
console.log("\nSources:");
for (const step of interaction.steps ?? []) {
if (step.type === "model_output") {
for (const content of step.content ?? []) {
if (content.type === "text" && content.annotations) {
for (const annotation of content.annotations) {
if (annotation.type === "url_citation") {
const span = content.text.slice(
annotation.start_index,
annotation.end_index,
);
console.log(
`- [${annotation.title}](${annotation.url}) (cited text: "${span}")`,
);
}
}
}
}
}
}
Java
import com.google.genai.Client;
import com.google.genai.gaos.models.interactions.Annotation;
import com.google.genai.gaos.models.interactions.Content;
import com.google.genai.gaos.models.interactions.CreateModelInteraction;
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.Model;
import com.google.genai.gaos.models.interactions.ModelOutputStep;
import com.google.genai.gaos.models.interactions.Step;
import com.google.genai.gaos.models.interactions.TextContent;
import com.google.genai.gaos.models.interactions.URLCitation;
import com.google.genai.gaos.models.operations.CreateInteractionRequestBody;
import java.util.List;
Client client =
Client.builder()
.enterprise(true)
.project("PROJECT_ID")
.location("global")
.build();
CreateModelInteraction request =
CreateModelInteraction.builder()
.model(Model.of("gemini-3.8-flash"))
.input(InteractionsInput.of("Who won the 2026 Super Bowl?"))
.tools(List.of(GoogleSearch.builder().build()))
.build();
Interaction interaction =
client.interactions.create(CreateInteractionRequestBody.of(request)).interaction().orElseThrow();
System.out.println(interaction.outputText().orElse(""));
// Parse inline URLCitation annotations from ModelOutputStep blocks
System.out.println("\nSources:");
for (Step step : interaction.steps().orElse(List.of())) {
if (step instanceof ModelOutputStep outputStep) {
for (Content content : outputStep.content().orElse(List.of())) {
if (content instanceof TextContent textContent) {
for (Annotation annotation : textContent.annotations().orElse(List.of())) {
if (annotation instanceof URLCitation citation) {
System.out.printf(
"- %s: %s (span: %d..%d)%n",
citation.title().orElse(""),
citation.url().orElse(""),
citation.startIndex().orElse(0L),
citation.endIndex().orElse(0L));
}
}
}
}
}
}
REST
# Request
curl -X POST "https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/interactions" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.8-flash",
"input": "Who won the 2026 Super Bowl?",
"tools": [{"type": "google_search"}]
}'
A resposta inclui as etapas google_search_call, google_search_result e
model_output com anotações url_citation inline:
{
"id": "v1_ChdPU0F4YWFtNkFwS2kxZThQZ05lbXdROA",
"model": "gemini-3.8-flash",
"status": "completed",
"steps": [
{
"type": "google_search_call",
"id": "search_call_1",
"arguments": {
"queries": ["2026 Super Bowl winner"]
}
},
{
"type": "google_search_result",
"call_id": "search_call_1",
"result": [
{
"search_suggestions": "<!-- HTML and CSS for search suggestions -->"
}
]
},
{
"type": "model_output",
"content": [
{
"type": "text",
"text": "The Seattle Seahawks won Super Bowl LX on February 8, 2026.",
"annotations": [
{
"type": "url_citation",
"start_index": 0,
"end_index": 59,
"title": "Super Bowl LX",
"url": "https://example.com/super-bowl-lx"
}
]
}
]
}
]
}
Executar agentes e tarefas em segundo plano de longa duração
Além dos modelos de fundação, a API Interactions permite invocar
agentes autônomos especializados usando o parâmetro agent:
antigravity-preview-05-2026: agente gerenciado de uso geral com execução de código, gerenciamento de arquivos e navegação na Web em um ambiente Linux seguro em sandbox. Para mais informações, consulte Interagir com agentes.deep-research-preview-04-2026: agente Deep Research do Gemini, que planeja e executa tarefas de pesquisa na Web em várias etapas e sintetiza descobertas de várias fontes em relatórios abrangentes. Para mais informações, consulte Usar o agente do Deep Research do Gemini.- Agentes personalizados: recursos de agentes personalizados configurados e provisionados com
client.agents.create().
Como os Agentic Workflows geralmente levam vários minutos para serem concluídos, execute-os de maneira assíncrona em segundo plano definindo background=True. A API
retorna imediatamente um objeto Interaction com um id que pode ser consultado usando
client.interactions.get() até que interaction.status faça a transição para
completed:
Antes de testar este exemplo, substitua PROJECT_ID pelo ID do projeto doGoogle Cloud .
import time
from google import genai
client = genai.Client(
enterprise=True,
project="PROJECT_ID",
location="global",
)
interaction = client.interactions.create(
input="Analyze competitive positioning for solar energy providers.",
agent="deep-research-preview-04-2026",
background=True,
)
print(f"Research started: {interaction.id}")
while True:
interaction = client.interactions.get(interaction.id)
if interaction.status == "completed":
print(interaction.output_text)
break
elif interaction.status in ("failed", "cancelled"):
print(f"Research ended with status: {interaction.status}")
break
time.sleep(10)
Acessar arquivos enviados do Cloud Storage
É possível usar a API Interactions para acessar arquivos do Cloud Storage enviados. No exemplo a seguir, substitua PROJECT_ID pelo ID do projeto doGoogle Cloud :
from google import genai
# Credentials must belong to an identity with storage.objects.get permissions
client = genai.Client(
enterprise=True,
project="PROJECT_ID",
location="global",
)
interaction = client.interactions.create(
model="gemini-3.8-flash",
input=[
{
"type": "user_input",
"content": [
{"type": "text", "text": "Summarize the attached document:"},
{
"type": "document",
"uri": "gs://my-secure-bucket/quarterly_report.pdf",
"mime_type": "application/pdf",
},
],
}
],
)
print(interaction.output_text)
Ao transmitir URIs do Cloud Storage (por exemplo,
gs://bucket-name/path/to/file) para a API Interactions, as solicitações
verificam o acesso de leitura usando as credenciais do autor da chamada antes que o agente de serviço da plataforma de agentes
(service-PROJECT_NUMBER@gcp-sa-aiplatform.)
do projeto de chamada busque o objeto no Cloud Storage.
Para transmitir arquivos do Cloud Storage em uma solicitação de interação, o principal
chamador (conta de usuário, conta de serviço ou identidade federada) precisa ter a
permissão storage.objects.get para todos os objetos referenciados. Para buckets do Cloud Storage entre projetos ou buckets do Cloud Storage com políticas de IAM personalizadas, conceda acesso de leitura ao principal de chamada e ao agente de serviço do projeto de chamada.
Cada solicitação de interação do modelo padrão do Gemini aceita até
100 URIs distintos do Cloud Storage (gs://) (até 2 GiB menos 500 KiB
por arquivo). Quando você encadeia turnos com estado usando previous_interaction_id,
a Agent Platform conta os URIs gs:// distintos de forma cumulativa no
histórico de conversas e no turno atual. As interações de agentes gerenciados (solicitações
que definem agent em vez de model), os modelos Gemini Omni e
os modelos Lyria 3 estão excluídos desse limite de 100 URIs.
Configurar papéis do IAM para acessar arquivos do Cloud Storage
Conceda um dos papéis predefinidos padrão que incluem a permissão storage.objects.get:
Leitor de objetos do Storage (
roles/storage.objectViewer): acesso de leitura a objetos (recomendado).Usuário de objetos do Storage (
roles/storage.objectUser): acesso de leitura e gravação a objetos.
Para conceder acesso a uma conta de usuário usando a Google Cloud CLI, use o seguinte comando:
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
--member="user:user-email@example.com" \
--role="roles/storage.objectViewer"
Para conceder acesso a uma conta de serviço de chamada específica, use o seguinte comando:
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
--member="serviceAccount:sa-name@PROJECT_ID." \
--role="roles/storage.objectViewer"
Resolver problemas de acesso a arquivos do Cloud Storage
Se o principal que faz a chamada não tiver permissões suficientes, a API Interactions
vai retornar um erro 403 Forbidden semelhante ao seguinte:
Access error:
PERMISSION_DENIED - 403 Forbidden: Calling principal lacks
storage.objects.get on one or more Cloud Storage URIs.
Para resolver esse problema, conceda o papel de Leitor de objetos do Storage
(roles/storage.objectViewer) no bucket ou objeto do Cloud Storage ao
autor da chamada autenticado (e ao agente de serviço da plataforma de agentes do projeto de chamada para buckets do Cloud Storage
entre projetos ou personalizados do IAM).
Se o objeto especificado não existir ou se as permissões do bucket impedirem que o
autor da chamada veja se o objeto existe, a API Interactions vai retornar um
erro 404 Not Found semelhante ao seguinte:
Access error:
NOT_FOUND - 404 Not Found: The object does not exist, or bucket
permissions prevent revealing object existence.
Para resolver esse problema, verifique se o URI do Cloud Storage está correto e confirme se o autor da chamada autenticado tem acesso de leitura ao bucket.
Se uma solicitação de interação do modelo fizer referência a mais de 100 URIs distintos do Cloud Storage na rodada atual e em qualquer histórico de previous_interaction_id vinculado, a API Interactions vai retornar um erro 400 Bad Request semelhante ao seguinte:
INVALID_ARGUMENT - 400 Bad Request: Request references 101 distinct gs:// URIs, which exceeds the maximum of 100.
Para resolver o problema, siga um destes procedimentos:
- Inicie uma nova interação sem
previous_interaction_idquando os arquivos de interações anteriores não forem mais necessários. - Combine documentos menores ou transmita outros arquivos inline dentro do
limite de payload da solicitação (256 MiB compactados para solicitações síncronas ou de streaming,
ou 9,75 MiB descompactados quando
service_tierestiver definido comodeferredcombackgroundestoredefinidos comotrue). - Use
generateContentpara solicitações que referenciam URIs dogs://até os limites de itens do modelo por modalidade (3.000 imagens e PDFs combinados, 1.000 arquivos de áudio e 10 vídeos ou até 6.500 arquivos, incluindo arquivos de texto simples).
Criptografar dados de interação com CMEK
As interações com estado (store=True em Python ou store: true em TypeScript/JavaScript) armazenam dados de interação em repouso por até 7 dias. Para
proteger esses dados com sua própria chave de criptografia em vez de uma
Google-owned and Google-managed encryption key, use um perfil de exibição. Um perfil de exibição
vincula uma chave do Cloud Key Management Service a um projeto, local e escopo de API. Enquanto um
perfil de veiculação existir, a Agent Platform vai criptografar automaticamente os dados de interação
armazenados. O formato da solicitação de interação não muda.
A CMEK do perfil de veiculação para a API Interactions é compatível com as multirregiões us e eu. A região global não é compatível.
Para configurar a CMEK para a API Interactions, faça o seguinte:
- Ative a API Cloud KMS e a API Agent Platform no seu projeto. Consulte Antes de começar.
- Crie uma chave do Cloud KMS na multirregião
usoueu. Consulte Criar um keyring e uma chave. - Conceda ao agente de serviço da Gemini Enterprise Agent Platform o papel
roles/cloudkms.cryptoKeyEncrypterDecrypterna chave. Consulte Conceder permissões da Agent Platform. Crie um perfil de exibição na mesma multirregião (
usoueu) que definescopecomoINTERACTIONS_APIecmekConfig.encryptionSpec.kmsKeyNamecomo sua chave:curl -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json" \ "https://aiplatform.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/servingProfiles?servingProfileId=SERVING_PROFILE_ID" \ -d '{ "displayName": "Interactions API CMEK profile", "description": "CMEK for Interactions API", "scope": "INTERACTIONS_API", "cmekConfig": { "encryptionSpec": { "kmsKeyName": "projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/KEY_NAME" } } }'Aguarde a conclusão da operação de criação de longa duração (
"done": true). Para mais detalhes sobre como gerenciar, atualizar ou excluir perfis de veiculação, consulte Criar um perfil de veiculação.Envie suas solicitações de interação para a mesma multirregião
usoueudo seu perfil de veiculação. A CMEK do perfil de veiculação não está disponível no endpointglobal.- SDK de IA generativa do Google: inicialize o cliente com
location="us"oulocation="eu"(location: "us"oulocation: "eu"em TypeScript/JavaScript). - REST: envie solicitações para o endpoint multirregional
https://aiplatform.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/interactions, em que LOCATION éusoueu.
Se você desativar a chave ou revogar o acesso do agente de serviço, as solicitações que criam ou leem interações armazenadas vão falhar com um erro
FAILED_PRECONDITION.- SDK de IA generativa do Google: inicialize o cliente com
Fluxos de trabalho REST avançados
Para automação baseada em shell, pipelines de CI/CD ou ambientes sem um ambiente de execução do Python ou
TypeScript/JavaScript, é possível chamar a API Interactions diretamente por
HTTP usando curl.
Endpoint REST
Envie solicitações POST para o seguinte endpoint de API Interactions:
POST https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/interactions
Substitua as seguintes variáveis nas suas solicitações:
- PROJECT_ID: o ID do projeto do Google Cloud .
- LOCATION: defina como
global(ouusoueucom o host multirregionalhttps://aiplatform.LOCATION.rep.googleapis.compara residência de dados ou CMEK).
Definir variáveis de ambiente e autenticação
Antes de executar os exemplos de curl nas seções a seguir, exporte o ID do projeto, o modelo de destino ou o ID do agente e um token de acesso do OAuth 2.0 gerado pelo Application Default Credentials:
PROJECT_ID="PROJECT_ID"
MODEL_ID="gemini-3.8-flash"
AGENT_ID="deep-research-preview-04-2026"
ACCESS_TOKEN=$(gcloud auth print-access-token)
Formato de resposta síncrona
Uma solicitação síncrona POST retorna um objeto JSON interaction que inclui
os metadados exclusivos de interação id, execução status, conversa steps e
token usage:
{
"id": "your-interaction-id",
"status": "completed",
"steps": [
{
"type": "model_output",
"content": [
{
"type": "text",
"text": "Serverless computing is a cloud execution model where the cloud provider dynamically manages the allocation and provisioning of servers, charging customers based on actual usage rather than pre-purchased capacity."
}
]
}
],
"usage": {
"total_tokens": 24751,
"total_input_tokens": 23894,
"total_output_tokens": 857
},
"created": "2026-05-08T10:44:43Z",
"updated": "2026-05-08T10:44:43Z",
"environment_id": "your-environment-id",
"object": "interaction"
}
Continuar uma interação multiturno com estado
Para continuar uma conversa armazenada por REST, transmita o id de uma resposta anterior no campo previous_interaction_id do corpo da solicitação JSON.
Antes de testar este exemplo, substitua PREVIOUS_INTERACTION_ID pelo
id retornado por uma interação anterior.
curl -X POST "https://aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/global/interactions" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"model": "'"${MODEL_ID}"'",
"store": true,
"previous_interaction_id": "PREVIOUS_INTERACTION_ID",
"input": [{
"type": "user_input",
"content": [{
"type": "text",
"text": "Can you elaborate on that?"
}]
}]
}'
Saída de stream com eventos enviados pelo servidor
Para transmitir atualizações incrementais por REST, inclua "stream": true no corpo da solicitação JSON:
curl -X POST "https://aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/global/interactions" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"model": "'"${MODEL_ID}"'",
"stream": true,
"input": [{
"type": "user_input",
"content": [{
"type": "text",
"text": "Write a long story about space travel."
}]
}]
}'
Quando "stream": true é definido, o servidor responde com
Transfer-Encoding: chunked e Content-Type: text/event-stream (eventos enviados pelo
servidor). Cada evento no stream inclui um prefixo data: que contém um payload JSON com o conteúdo de event_type e o delta da etapa. O curl mantém
automaticamente a conexão HTTP aberta e grava os blocos recebidos em stdout em tempo
real até que a interação seja concluída.
Executar um agente gerenciado em segundo plano
Para iniciar uma tarefa de agente gerenciado de longa duração de forma assíncrona por REST, especifique
o agent de destino, defina "background": true e configure
"environment": "remote":
curl -X POST "https://aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/global/interactions" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"agent": "'"${AGENT_ID}"'",
"environment": "remote",
"background": true,
"input": [{
"type": "user_input",
"content": [{
"type": "text",
"text": "Analyze competitive positioning for commercial solar energy providers."
}]
}]
}'
A seguir
Confira os recursos a seguir para saber mais sobre a API Interactions, as ferramentas integradas e o embasamento:
Saiba mais sobre os principais conceitos na visão geral da API Interactions.
Confira os esquemas de solicitação e resposta na referência da API Interactions.
Saiba mais sobre a execução de código, o contexto de URL e o embasamento com a Pesquisa Google.
Saiba como interagir com agentes gerenciados e usar o agente Deep Research do Gemini.