Autenticar

Para usar as bibliotecas OpenAI Python com a Vertex AI, você precisa fazer a autenticação usando as credenciais do Google e configurar seu cliente para usar um endpoint da Vertex AI. Este documento mostra como configurar seu ambiente e fazer a autenticação usando dois métodos diferentes.

Antes de começar

Pré-requisitos

1. Instalar SDKs

Instale os SDKs OpenAI e Google Auth:

pip install openai google-auth requests

2. Configurar a autenticação

Para autenticar na Vertex AI, configure o Application Default Credentials (ADC). Para mais informações, consulte Configurar o Application Default Credentials.

3. Identificar o endpoint

O endpoint depende do tipo de modelo que você está chamando:

  • Modelos do Gemini:use openapi como o ID do endpoint.
  • Modelos autoimplantados:alguns modelos no Model Garden e modelos Hugging Face com suporte precisam ser implantados antes de veicular solicitações. Ao chamar esses modelos, é necessário especificar o ID exclusivo do endpoint da sua implantação.

Métodos de autenticação

É possível fazer a autenticação configurando o objeto cliente diretamente no código ou definindo variáveis de ambiente. O fluxo de trabalho a seguir descreve o processo.

Fluxograma

Escolha o método mais adequado ao seu caso de uso.

Método Vantagens Desvantagens Ideal para
Configuração do cliente Programática e flexível. Permite o gerenciamento dinâmico de credenciais no aplicativo. Requer mais código para gerenciar credenciais e endpoints diretamente. Aplicativos que precisam gerenciar vários clientes ou atualizar credenciais dinamicamente.
Variáveis de ambiente Configuração simples que separa a configuração do código. Ideal para desenvolvimento e teste locais. Menos seguro se não for gerenciado corretamente. Menos flexível para mudanças dinâmicas de credenciais. Guias de início rápido, desenvolvimento local e implantações em contêineres em que as variáveis de ambiente são padrão.

Configuração do cliente

É possível receber credenciais do Google e configurar o cliente OpenAI no código Python de maneira programática. Por padrão, os tokens de acesso expiram após uma hora. Para aplicativos de longa duração, consulte como atualizar suas credenciais.

Conferir o código Python para a configuração do cliente

import openai

from google.auth import default
import google.auth.transport.requests

# TODO(developer): Update and un-comment below lines
# project_id = "PROJECT_ID"
# location = "us-central1"

# Programmatically get an access token
credentials, _ = default(scopes=["https://www.googleapis.com/auth/cloud-platform"])
credentials.refresh(google.auth.transport.requests.Request())
# Note: the credential lives for 1 hour by default (https://cloud.google.com/docs/authentication/token-types#at-lifetime); after expiration, it must be refreshed.

##############################
# Choose one of the following:
##############################

# If you are calling a Gemini model, set the ENDPOINT_ID variable to use openapi.
ENDPOINT_ID = "openapi"

# If you are calling a self-deployed model from Model Garden, set the
# ENDPOINT_ID variable and set the client's base URL to use your endpoint.
# ENDPOINT_ID = "YOUR_ENDPOINT_ID"

# OpenAI Client
client = openai.OpenAI(
    base_url=f"https://{location}-aiplatform.googleapis.com/v1/projects/{project_id}/locations/{location}/endpoints/{ENDPOINT_ID}",
    api_key=credentials.token,
)
    

Variáveis de ambiente

Use a Google Cloud CLI para receber um token de acesso. A biblioteca OpenAI lê automaticamente as variáveis de ambiente OPENAI_API_KEY e OPENAI_BASE_URL para configurar o cliente padrão.

  1. Defina variáveis de ambiente comuns:

    export PROJECT_ID=PROJECT_ID
    export LOCATION=LOCATION
    export OPENAI_API_KEY="$(gcloud auth application-default print-access-token)"
            
  2. Defina o URL base do tipo de modelo:

    • Para um modelo Gemini:

      export MODEL_ID=MODEL_ID
      export OPENAI_BASE_URL="https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/endpoints/openapi"
                  
    • Para um modelo autoimplantado do Model Garden:

      export ENDPOINT=ENDPOINT_ID
      export OPENAI_BASE_URL="https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/endpoints/${ENDPOINT}"
                  
  3. Inicializar o cliente:

    O cliente usa as variáveis de ambiente que você definiu.

    client = openai.OpenAI()
            

Por padrão, os tokens de acesso expiram após uma hora. É necessário atualizar o token periodicamente e a variável de ambiente OPENAI_API_KEY.

Atualizar suas credenciais

Os tokens de acesso recebidos do Application Default Credentials expiram após uma hora. Para serviços ou aplicativos de longa duração, implemente um mecanismo para atualizar o token. O exemplo a seguir mostra uma classe wrapper que atualiza automaticamente o token quando ele expira.

Confira um exemplo de classe de atualização de credenciais

from typing import Any

import google.auth
import google.auth.transport.requests
import openai


class OpenAICredentialsRefresher:
    def __init__(self, **kwargs: Any) -> None:
        # Set a placeholder key here
        self.client = openai.OpenAI(**kwargs, api_key="PLACEHOLDER")
        self.creds, self.project = google.auth.default(
            scopes=["https://www.googleapis.com/auth/cloud-platform"]
        )

    def __getattr__(self, name: str) -> Any:
        if not self.creds.valid:
            self.creds.refresh(google.auth.transport.requests.Request())

            if not self.creds.valid:
                raise RuntimeError("Unable to refresh auth")

            self.client.api_key = self.creds.token
        return getattr(self.client, name)



# TODO(developer): Update and un-comment below lines
# project_id = "PROJECT_ID"
# location = "us-central1"

client = OpenAICredentialsRefresher(
    base_url=f"https://{location}-aiplatform.googleapis.com/v1/projects/{project_id}/locations/{location}/endpoints/openapi",
)

response = client.chat.completions.create(
    model="google/gemini-2.0-flash-001",
    messages=[{"role": "user", "content": "Why is the sky blue?"}],
)

print(response)
    

A seguir