Skip to content

Especificação de API Antigravity

⚠️ Aviso Importante: Esta é a especificação interna de API do Antigravity, não um documento público. Este tutorial é baseado em testes diretos de API e é destinado a desenvolvedores que precisam entender os detalhes da API em profundidade.

Se você apenas deseja usar o plugin, consulte o Início Rápido e o Guia de Configuração.


O Que Você Aprenderá

  • Entender como funciona a API de gateway unificada do Antigravity
  • Dominar os formatos de requisição/resposta e limitações do JSON Schema
  • Saber como configurar modelos Thinking e chamadas de função
  • Entender os mecanismos de limitação de taxa e tratamento de erros
  • Ser capaz de depurar problemas de chamadas de API

Visão Geral da API Antigravity

Antigravity é a API de gateway unificada do Google que acessa vários modelos de IA como Claude e Gemini através de uma interface no estilo Gemini, fornecendo um formato único e estrutura de resposta unificada.

Diferença do Vertex AI

Antigravity não é uma API de modelo direta do Vertex AI. É um gateway interno que fornece:

  • Formato de API único (todos os modelos são no estilo Gemini)
  • Acesso em nível de projeto (via autenticação Google Cloud)
  • Roteamento interno para backends de modelo (Vertex AI para Claude, Gemini API para Gemini)
  • Formato de resposta unificado (estrutura candidates[])

Características Principais:

CaracterísticaDescrição
Formato de API ÚnicoTodos os modelos usam o array contents no estilo Gemini
Acesso em Nível de ProjetoRequer um Project ID válido do Google Cloud
Roteamento InternoRoteamento automático para o backend correto (Vertex AI ou Gemini API)
Resposta UnificadaTodos os modelos retornam a estrutura candidates[]
Suporte a ThinkingClaude e Gemini 3 suportam raciocínio estendido

Endpoints e Caminhos

Ambiente da API

AmbienteURLStatusUso
Daily (Sandbox)https://daily-cloudcode-pa.sandbox.googleapis.com✅ AtivoEndpoint principal (consistente com CLIProxy)
Productionhttps://cloudcode-pa.googleapis.com✅ AtivoModelos Gemini CLI, loadCodeAssist
Autopush (Sandbox)https://autopush-cloudcode-pa.sandbox.googleapis.com❌ IndisponívelDescontinuado

Localização do Código Fonte: src/constants.ts:32-43

Caminhos da API

AçãoCaminhoDescrição
Gerar Conteúdo/v1internal:generateContentRequisição não streaming
Gerar Streaming/v1internal:streamGenerateContent?alt=sseRequisição streaming (SSE)
Carregar Code Assist/v1internal:loadCodeAssistDescoberta de projeto (obtém Project ID automaticamente)
Integrar Usuário/v1internal:onboardUserIntegração de usuário (geralmente não usado)

Métodos de Autenticação

Fluxo OAuth 2.0

URL de Autorização: https://accounts.google.com/o/oauth2/auth
URL de Token: https://oauth2.googleapis.com/token

Scopes Obrigatórios

http
https://www.googleapis.com/auth/cloud-platform
https://www.googleapis.com/auth/userinfo.email
https://www.googleapis.com/auth/userinfo.profile
https://www.googleapis.com/auth/cclog
https://www.googleapis.com/auth/experimentsandconfigs

Localização do Código Fonte: src/constants.ts:14-20

Headers Obrigatórios

Endpoint Antigravity (Padrão)

http
Authorization: Bearer {access_token}
Content-Type: application/json
User-Agent: antigravity/1.11.5 windows/amd64
X-Goog-Api-Client: google-cloud-sdk vscode_cloudshelleditor/0.1
Client-Metadata: {"ideType":"IDE_UNSPECIFIED","platform":"PLATFORM_UNSPECIFIED","pluginType":"GEMINI"}

Endpoint Gemini CLI (Modelos sem sufixo :antigravity)

http
Authorization: Bearer {access_token}
Content-Type: application/json
User-Agent: google-api-nodejs-client/9.15.1
X-Goog-Api-Client: gl-node/22.17.0
Client-Metadata: ideType=IDE_UNSPECIFIED,platform=PLATFORM_UNSPECIFIED,pluginType=GEMINI

Header Adicional para Requisições Streaming

http
Accept: text/event-stream

Localização do Código Fonte: src/constants.ts:73-83


Formato de Requisição

Estrutura Básica

json
{
  "project": "{project_id}",
  "model": "{model_id}",
  "request": {
    "contents": [...],
    "generationConfig": {...},
    "systemInstruction": {...},
    "tools": [...]
  },
  "userAgent": "antigravity",
  "requestId": "{unique_id}"
}

Array Contents (Obrigatório)

Restrição Importante

Deve usar o formato no estilo Gemini. Arrays no estilo Anthropic messages não são suportados.

Formato Correto:

json
{
  "contents": [
    {
      "role": "user",
      "parts": [
        { "text": "Sua mensagem aqui" }
      ]
    },
    {
      "role": "model",
      "parts": [
        { "text": "Resposta do assistente" }
      ]
    }
  ]
}

Valores de Role:

  • user - Mensagem do usuário/humano
  • model - Resposta do modelo (não assistant)

Generation Config

json
{
  "generationConfig": {
    "maxOutputTokens": 1000,
    "temperature": 0.7,
    "topP": 0.95,
    "topK": 40,
    "stopSequences": ["STOP"],
    "thinkingConfig": {
      "thinkingBudget": 8000,
      "includeThoughts": true
    }
  }
}
CampoTipoDescrição
maxOutputTokensnumberNúmero máximo de tokens na resposta
temperaturenumberAleatoriedade (0.0 - 2.0)
topPnumberLimiar de nucleus sampling
topKnumberTop-K sampling
stopSequencesstring[]Palavras-gatilho para parar a geração
thinkingConfigobjectConfiguração de raciocínio estendido (modelos Thinking)

System Instructions

Restrição de Formato

A Instrução do Sistema deve ser um objeto contendo parts, não pode ser uma string pura.

json
// ✅ Correto
{
  "systemInstruction": {
    "parts": [
      { "text": "Você é um assistente útil." }
    ]
  }
}

// ❌ Errado - retornará erro 400
{
  "systemInstruction": "Você é um assistente útil."
}

Tools / Function Calling

json
{
  "tools": [
    {
      "functionDeclarations": [
        {
          "name": "get_weather",
          "description": "Obter clima para uma localização",
          "parameters": {
            "type": "object",
            "properties": {
              "location": {
                "type": "string",
                "description": "Nome da cidade"
              }
            },
            "required": ["location"]
          }
        }
      ]
    }
  ]
}

Regras de Nomenclatura de Funções

RegraDescrição
Primeiro caractereDeve ser letra (a-z, A-Z) ou sublinhado (_)
Caracteres permitidosa-zA-Z0-9、sublinhado (_)、ponto (.)、dois-pontos (😃、hífen (-)
Comprimento máximo64 caracteres
Não permitidoBarra (/)、espaços、outros caracteres especiais

Exemplos:

  • get_weather - Válido
  • mcp:mongodb.query - Válido (permite dois-pontos e ponto)
  • read-file - Válido (permite hífen)
  • mcp/query - Inválido (não permite barra)
  • 123_tool - Inválido (deve começar com letra ou sublinhado)

Suporte JSON Schema

Funcionalidades Suportadas

FuncionalidadeStatusDescrição
type✅ Suportadoobjectstringnumberintegerbooleanarray
properties✅ SuportadoPropriedades de objeto
required✅ SuportadoArray de campos obrigatórios
description✅ SuportadoDescrição de campo
enum✅ SuportadoValores enumerados
items✅ SuportadoSchema de elementos de array
anyOf✅ SuportadoConvertido internamente para any_of
allOf✅ SuportadoConvertido internamente para all_of
oneOf✅ SuportadoConvertido internamente para one_of
additionalProperties✅ SuportadoSchema de propriedades adicionais

Funcionalidades Não Suportadas (causam erro 400)

Os seguintes campos causarão erro 400

  • const - Use enum: [value] em vez disso
  • $ref - Definição de schema inline
  • $defs / definitions - Definição inline
  • $schema - Remova estes campos de metadados
  • $id - Remova estes campos de metadados
  • default - Remova estes campos de documentação
  • examples - Remova estes campos de documentação
  • title (aninhado) - ⚠️ Pode causar problemas em objetos aninhados
json
// ❌ Errado - retornará erro 400
{ "type": { "const": "email" } }

// ✅ Correto - use enum em vez disso
{ "type": { "enum": ["email"] } }

Processamento Automático do Plugin: O plugin processa automaticamente estas conversões através da função cleanJSONSchemaForAntigravity() em request-helpers.ts.


Formato de Resposta

Resposta Não Streaming

json
{
  "response": {
    "candidates": [
      {
        "content": {
          "role": "model",
          "parts": [
            { "text": "Texto da resposta aqui" }
          ]
        },
        "finishReason": "STOP"
      }
    ],
    "usageMetadata": {
      "promptTokenCount": 16,
      "candidatesTokenCount": 4,
      "totalTokenCount": 20
    },
    "modelVersion": "claude-sonnet-4-5",
    "responseId": "msg_vrtx_..."
  },
  "traceId": "abc123..."
}

Resposta Streaming (SSE)

Content-Type: text/event-stream

data: {"response": {"candidates": [{"content": {"role": "model", "parts": [{"text": "Olá"}]}}], "usageMetadata": {...}, "modelVersion": "...", "responseId": "..."}, "traceId": "..."}

data: {"response": {"candidates": [{"content": {"role": "model", "parts": [{"text": " mundo"]}, "finishReason": "STOP"}], "usageMetadata": {...}}, "traceId": "..."}

Descrição dos Campos de Resposta

CampoDescrição
response.candidatesArray de candidatos de resposta
response.candidates[].content.roleSempre "model"
response.candidates[].content.partsArray de partes de conteúdo
response.candidates[].finishReasonSTOPMAX_TOKENSOTHER
response.usageMetadata.promptTokenCountNúmero de tokens de entrada
response.usageMetadata.candidatesTokenCountNúmero de tokens de saída
response.usageMetadata.totalTokenCountNúmero total de tokens
response.usageMetadata.thoughtsTokenCountNúmero de tokens de Thinking (Gemini)
response.modelVersionModelo real usado
response.responseIdID da requisição (formato varia por modelo)
traceIdID de rastreamento para depuração

Formato do Response ID

Tipo de ModeloFormatoExemplo
Claudemsg_vrtx_...msg_vrtx_01UDKZG8PWPj9mjajje8d7u7
GeminiEstilo Base64ypM9abPqFKWl0-kPvamgqQw
GPT-OSSEstilo Base64y5M9aZaSKq6z2roPoJ7pEA

Resposta de Function Call

Quando o modelo deseja chamar uma função:

json
{
  "response": {
    "candidates": [
      {
        "content": {
          "role": "model",
          "parts": [
            {
              "functionCall": {
                "name": "get_weather",
                "args": {
                  "location": "Paris"
                },
                "id": "toolu_vrtx_01PDbPTJgBJ3AJ8BCnSXvUqk"
              }
            }
          ]
        },
        "finishReason": "OTHER"
      }
    ]
  }
}

Fornecer Resultado da Função

json
{
  "contents": [
    { "role": "user", "parts": [{ "text": "Qual o clima?" }] },
    { "role": "model", "parts": [{ "functionCall": { "name": "get_weather", "args": {...}, "id": "..." } }] },
    { "role": "user", "parts": [{ "functionResponse": { "name": "get_weather", "id": "...", "response": { "temperature": "22C" } } }] }
  ]
}

Thinking / Raciocínio Estendido

Configuração de Thinking

Para modelos que suportam Thinking (*-thinking):

json
{
  "generationConfig": {
    "maxOutputTokens": 10000,
    "thinkingConfig": {
      "thinkingBudget": 8000,
      "includeThoughts": true
    }
  }
}

Restrição Importante

maxOutputTokens deve ser maior que thinkingBudget

Resposta de Thinking (Gemini)

Modelos Gemini retornam thinking com assinatura:

json
{
  "parts": [
    {
      "thoughtSignature": "ErADCq0DAXLI2nx...",
      "text": "Deixe-me pensar sobre isso..."
    },
    {
      "text": "A resposta é..."
    }
  ]
}

Resposta de Thinking (Claude)

Modelos Claude thinking podem conter partes thought: true:

json
{
  "parts": [
    {
      "thought": true,
      "text": "Processo de raciocínio...",
      "thoughtSignature": "..."
    },
    {
      "text": "Resposta final..."
    }
  ]
}

Processamento do Plugin: O plugin armazena automaticamente em cache assinaturas de thinking para evitar erros de assinatura em conversas de múltiplas rodadas. Consulte advanced/session-recovery/ para mais detalhes.


Respostas de Erro

Estrutura de Erro

json
{
  "error": {
    "code": 400,
    "message": "Descrição do erro",
    "status": "INVALID_ARGUMENT",
    "details": [...]
  }
}

Códigos de Erro Comuns

CódigoStatusDescrição
400INVALID_ARGUMENTFormato de requisição inválido
401UNAUTHENTICATEDToken inválido ou expirado
403PERMISSION_DENIEDSem permissão para acessar recurso
404NOT_FOUNDModelo não encontrado
429RESOURCE_EXHAUSTEDLimite de taxa excedido

Resposta de Limite de Taxa

json
{
  "error": {
    "code": 429,
    "message": "Você esgotou sua capacidade neste modelo. Sua cota será redefinida após 3s.",
    "status": "RESOURCE_EXHAUSTED",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.RetryInfo",
        "retryDelay": "3.957525076s"
      }
    ]
  }
}

Processamento do Plugin: O plugin detecta automaticamente erros 429, alterna contas ou aguarda o tempo de redefinição. Consulte advanced/rate-limit-handling/ para mais detalhes.


Funcionalidades Não Suportadas

As seguintes funcionalidades Anthropic/Vertex AI não são suportadas:

FuncionalidadeErro
anthropic_versionCampo desconhecido
Array messagesCampo desconhecido (deve usar contents)
max_tokensCampo desconhecido (deve usar maxOutputTokens)
systemInstruction string puraValor inválido (deve usar formato de objeto)
system_instruction (snake_case raiz)Campo desconhecido
const do JSON SchemaCampo desconhecido (use enum: [value] em vez disso)
$ref do JSON SchemaNão suportado (definição inline)
$defs do JSON SchemaNão suportado (definição inline)
Nome de Tool contendo /Inválido (use _ ou : em vez disso)
Nome de Tool começando com númeroInválido (deve começar com letra ou sublinhado)

Exemplo Completo de Requisição

json
{
  "project": "my-project-id",
  "model": "claude-sonnet-4-5",
  "request": {
    "contents": [
      {
        "role": "user",
        "parts": [
          { "text": "Olá, como você está?" }
        ]
      }
    ],
    "systemInstruction": {
      "parts": [
        { "text": "Você é um assistente útil." }
      ]
    },
    "generationConfig": {
      "maxOutputTokens": 1000,
      "temperature": 0.7
    }
  },
  "userAgent": "antigravity",
  "requestId": "agent-abc123"
}

Headers de Resposta

HeaderDescrição
x-cloudaicompanion-trace-idID de rastreamento para depuração
server-timingDuração da requisição

Antigravity vs Vertex AI Anthropic

CaracterísticaAntigravityVertex AI Anthropic
Endpointcloudcode-pa.googleapis.comaiplatform.googleapis.com
Formato de Requisiçãocontents no estilo Geminimessages no estilo Anthropic
anthropic_versionNão usadoObrigatório
Nome do ModeloSimples (claude-sonnet-4-5)Versionado (claude-4-5@date)
Formato de Respostacandidates[]content[] no estilo Anthropic
Suporte a Múltiplos ModelosSim (Claude, Gemini, etc.)Apenas Anthropic

Resumo da Aula

Este tutorial apresentou detalhadamente a especificação interna da API de gateway unificada Antigravity:

  • Endpoints: Três ambientes (Daily, Production, Autopush), Daily Sandbox é o endpoint principal
  • Autenticação: OAuth 2.0 + Bearer Token, scopes e headers obrigatórios
  • Formato de Requisição: Array contents no estilo Gemini, suporta System Instruction e Tools
  • JSON Schema: Suporta funcionalidades comuns, mas não suporta const, $ref, $defs
  • Formato de Resposta: Estrutura candidates[], suporta streaming SSE
  • Thinking: Claude e Gemini 3 suportam raciocínio estendido, requer thinkingConfig
  • Tratamento de Erros: Formato de erro padrão, 429 inclui atraso de retry

Se você está depurando problemas de chamadas de API, pode usar o modo de depuração do plugin:

bash
OPENCODE_ANTIGRAVITY_DEBUG=1 opencode

Prévia da Próxima Aula

Esta é a última aula do capítulo de apêndice. Se você quiser saber mais detalhes técnicos, pode consultar:

Se você precisar voltar à fase de introdução, pode começar novamente em O Que É Antigravity Auth.


Apêndice: Referência do Código Fonte

Clique para expandir e ver a localização do código fonte

Última atualização: 2026-01-23

FuncionalidadeCaminho do ArquivoLinhas
Constantes de Endpoint da APIsrc/constants.ts:32-4332-43
Headers Antigravitysrc/constants.ts:73-7773-77
Headers Gemini CLIsrc/constants.ts:79-8379-83
Scopes OAuthsrc/constants.ts:14-2014-20
Lógica Principal de Conversão de Requisiçãosrc/plugin/request.ts:11-2000+
Limpeza de JSON Schemasrc/plugin/request-helpers.tsArquivo completo
Cache de Assinatura de Thinkingsrc/plugin/cache.tsArquivo completo

Constantes Principais:

  • ANTIGRAVITY_ENDPOINT_DAILY = "https://daily-cloudcode-pa.sandbox.googleapis.com" - Endpoint Daily Sandbox
  • ANTIGRAVITY_ENDPOINT_PROD = "https://cloudcode-pa.googleapis.com" - Endpoint Production
  • ANTIGRAVITY_DEFAULT_PROJECT_ID = "rising-fact-p41fc" - Project ID padrão
  • SKIP_THOUGHT_SIGNATURE = "skip_thought_signature_validator" - Valor sentinela para pular validação de assinatura de thinking

Funções Principais:

  • cleanJSONSchemaForAntigravity(schema) - Limpa JSON Schema para atender aos requisitos da API Antigravity
  • prepareAntigravityRequest(request) - Prepara e envia requisição da API Antigravity
  • createStreamingTransformer() - Cria transformador de resposta streaming