Llama a los modelos de Vertex AI mediante la biblioteca de OpenAI

La API de Chat Completions te permite enviar solicitudes a los modelos de Vertex AI a través de las bibliotecas de OpenAI para Python y REST. Si ya usas las bibliotecas de OpenAI, puedes usar esta API para alternar entre llamar a modelos de OpenAI y a modelos alojados en Vertex AI para comparar el resultado, el costo y la escalabilidad, sin cambiar tu código existente. Si todavía no usas las bibliotecas de OpenAI, te recomendamos que llames a la API de Gemini directamente.

Modelos compatibles

La API de Chat Completions admite modelos de Gemini y algunos modelos que se autoimplementan de Model Garden.

Modelos de Gemini

En la siguiente tabla, se muestran los modelos de Gemini compatibles:

Modelo Versión
Gemini 1.5 Flash google/gemini-1.5-flash-001
Gemini 1.5 Pro google/gemini-1.5-pro-001
Gemini 1.0 Pro Vision google/gemini-1.0-pro-vision
google/gemini-1.0-pro-vision-001
Gemini 1.0 Pro google/gemini-1.0-pro-002
google/gemini-1.0-pro-001
google/gemini-1.0-pro

Modelos que se implementaron desde Model Garden

Los contenedores de la interfaz de generación de texto de HuggingFace (HF TGI) y vLLM compilado previamente de Vertex AI Model Garden admiten la API de finalización de chat. Sin embargo, no todos los modelos que se implementan en estos contenedores admiten la API de Chat Completions. En la siguiente tabla, se incluyen los modelos compatibles más populares por contenedor:

HF TGI

vLLM

Autenticar

Para usar las bibliotecas de OpenAI para Python, instala el SDK de OpenAI:

pip install openai

Para autenticar con la API de Chat Completions, puedes modificar la configuración del cliente o cambiar el entorno configuración para usar la autenticación de Google y un extremo de Vertex AI. Elige el método que sea más fácil y sigue los pasos para realizar la configuración según si deseas llamar a modelos de Gemini o modelos autoimplementados de Model Garden.

Ciertos modelos en Model Garden y los modelos de Hugging Face compatibles primero deben implementarse en un extremo de Vertex AI antes de que puedan entregarse solicitudes. Cuando llamas a estos modelos implementados por ti desde la API de Chat Completions, debes especificar el ID del extremo. Para enumerar tus extremos existentes de Vertex AI, usa el comando gcloud ai endpoints list.

Configuración del cliente

Para obtener credenciales de Google en Python de manera programática, puedes usar el SDK de Python google-auth:

pip install google-auth
pip install requests

Cambia el SDK de OpenAI para que apunte al extremo de finalización de chat de Vertex AI:

# Programmatically get an access token
creds, project = google.auth.default()
auth_req = google.auth.transport.requests.Request()
creds.refresh(auth_req)
# 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.

# Pass the Vertex endpoint and authentication to the OpenAI SDK
PROJECT_ID = 'PROJECT_ID'
LOCATION = 'LOCATION'

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

# If you are calling a Gemini model, set the MODEL_ID variable and set
# your client's base URL to use openapi.
MODEL_ID = 'MODEL_ID'
client = openai.OpenAI(
    base_url = f'https://{LOCATION}-aiplatform.googleapis.com/v1beta1/projects/{PROJECT_ID}/locations/{LOCATION}/endpoints/openapi',
    api_key = creds.token)

# If you are calling a self-deployed model from Model Garden, set the
# ENDPOINT_ID variable and set your client's base URL to use your endpoint.
MODEL_ID = 'MODEL_ID'
client = openai.OpenAI(
    base_url = f'https://{LOCATION}-aiplatform.googleapis.com/v1beta1/projects/{PROJECT_ID}/locations/{LOCATION}/endpoints/{ENDPOINT}',
    api_key = creds.token)

De forma predeterminada, los tokens de acceso duran 1 hora. Puedes extender la vida útil de tu token de acceso o actualizarlo periódicamente y actualizar la variable openai.api_key.

Variables de entorno

Instala Google Cloud CLI. La biblioteca de OpenAI puede leer las variables de entorno OPENAI_API_KEY y OPENAI_BASE_URL para cambiar la autenticación y el extremo en su cliente predeterminado. Configura las siguientes variables:

$ export PROJECT_ID=PROJECT_ID
$ export LOCATION=LOCATION
$ export OPENAI_API_KEY="$(gcloud auth application-default print-access-token)"

Para llamar a un modelo de Gemini, establece la variable MODEL_ID y usa el extremo openapi:

$ export MODEL_ID=MODEL_ID
$ export OPENAI_BASE_URL="https://${LOCATION}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION}/endpoints/openapi"

Para llamar a un modelo con implementación automática desde Model Garden, configura la variable ENDPOINT y úsala en tu URL:

$ export ENDPOINT=ENDPOINT_ID
$ export OPENAI_BASE_URL="https://${LOCATION}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION}/endpoints/${ENDPOINT}"

Luego, inicializa el cliente:

client = openai.OpenAI()

La API de Gemini Chat Completions usa OAuth para autenticarse con un token de acceso de corta duración. De forma predeterminada, los tokens de acceso duran 1 hora. Puedes extender la vida útil de tu token de acceso o actualizarlo periódicamente y actualizar la variable de entorno OPENAI_API_KEY.

Llama a Gemini con la API de Chat Completions

En el siguiente ejemplo, se muestra cómo enviar solicitudes sin transmisión:

curl

  curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
  https://${LOCATION}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION}/endpoints/openapi/chat/completions \
  -d '{
    "model": "google/${MODEL_ID}",
    "messages": [{
      "role": "user",
      "content": "Write a story about a magic backpack."
    }]
  }'
  

Python

Si deseas obtener información para instalar o actualizar el SDK de Vertex AI para Python, consulta Instala el SDK de Vertex AI para Python. Si deseas obtener más información, consulta la documentación de referencia de la API de Python.

import vertexai
import openai

from google.auth import default, transport

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

vertexai.init(project=project_id, location=location)

# Programmatically get an access token
credentials, _ = default(scopes=["https://www.googleapis.com/auth/cloud-platform"])
auth_request = transport.requests.Request()
credentials.refresh(auth_request)

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

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

print(response)

En el siguiente ejemplo, se muestra cómo enviar solicitudes de transmisión a un modelo de Gemini a través de la API de Chat Completions:

curl

  curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
  https://${LOCATION}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION}/endpoints/openapi/chat/completions \
  -d '{
    "model": "google/${MODEL_ID}",
    "stream": true,
    "messages": [{
      "role": "user",
      "content": "Write a story about a magic backpack."
    }]
  }'
  

Python

Si deseas obtener información para instalar o actualizar el SDK de Vertex AI para Python, consulta Instala el SDK de Vertex AI para Python. Si deseas obtener más información, consulta la documentación de referencia de la API de Python.

import vertexai
import openai

from google.auth import default, transport

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

vertexai.init(project=project_id, location=location)

# Programmatically get an access token
credentials, _ = default(scopes=["https://www.googleapis.com/auth/cloud-platform"])
auth_request = transport.requests.Request()
credentials.refresh(auth_request)

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

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

Llama a un modelo que se implementó por sí solo con la API de Chat Completions

En el siguiente ejemplo, se muestra cómo enviar solicitudes sin transmisión:

  curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
  https://us-central1-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/us-central1/endpoints/${ENDPOINT}/chat/completions \
  -d '{
    "messages": [{
      "role": "user",
      "content": "Write a story about a magic backpack."
    }]
  }'

En el siguiente ejemplo, se muestra cómo enviar solicitudes de transmisión a un modelo implementado de forma automática mediante la API de finalización de chat:

  curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
  https://us-central1-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/us-central1/endpoints/${ENDPOINT}/chat/completions \
  -d '{
    "stream": true,
    "messages": [{
      "role": "user",
      "content": "Write a story about a magic backpack."
    }]
  }'

Parámetros admitidos

En el caso de los modelos de Google, la API de Chat Completions admite los siguientes parámetros de OpenAI. Para obtener una descripción de cada parámetro, consulta la documentación de OpenAI sobre cómo crear finalizaciones de chat. La compatibilidad de los parámetros con modelos de terceros varía según el modelo. Para ver qué parámetros son compatibles, consulta la documentación del modelo.

messages
  • System message
  • User message: Se admiten los tipos text y image_url. El tipo image_url admite imágenes almacenadas en un URI de Cloud Storage o una codificación base 64 en el formato "data:<MIME-TYPE>;base64,<BASE64-ENCODED-BYTES>". Para obtener información sobre cómo crear un bucket de Cloud Storage y subir un archivo a él, consulta Descubre el almacenamiento de objetos. No se admite la opción detail.
  • Assistant message
  • Tool message
  • Function message: Este campo es obsoleto, pero se admite para versiones anteriores.
model
max_tokens
n
response_format
  • json_object: Se interpreta como pasar “application/json” a la API de Gemini.
  • text: Se interpreta como pasar “text/plain” a la API de Gemini.
  • Cualquier otro tipo de MIME se pasa tal como está al modelo, por ejemplo, pasar “application/json” directamente.
stop
stream
temperature
top_p
tools
  • type
  • function
    • name
    • description
    • parameters: Especifica los parámetros a usando la especificación de OpenAPI. Esto difiere del campo de parámetros de OpenAI, que se describe como un objeto de esquema JSON. Para obtener información sobre las diferencias de palabras clave entre el esquema de OpenAPI y JSON, consulta la guía de OpenAPI.
tool_choice
  • none
  • auto
  • required: Corresponde al modo ANY en FunctionCallingConfig.
function_call Este campo es obsoleto, pero se admite para versiones anteriores.
functions Este campo es obsoleto, pero se admite para versiones anteriores.

Si pasas algún parámetro no admitido, se ignorará.

Actualiza tus credenciales

En el siguiente ejemplo, se muestra cómo actualizar tus credenciales automáticamente según sea necesario:

Python

from typing import Any

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

class OpenAICredentialsRefresher:
    def __init__(self, **kwargs: Any) -> None:
        # Set a dummy key here
        self.client = openai.OpenAI(**kwargs, api_key="DUMMY")
        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:
            auth_req = google.auth.transport.requests.Request()
            self.creds.refresh(auth_req)

            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/v1beta1/projects/{project_id}/locations/{location}/endpoints/openapi",
)

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

print(response)

¿Qué sigue?