Appeler des modèles Vertex AI à l'aide de la bibliothèque OpenAI

L'API Chat Completions vous permet d'envoyer des requêtes aux modèles Vertex AI à l'aide des bibliothèques OpenAI pour Python et REST. Si vous utilisez déjà les bibliothèques OpenAI, vous pouvez utiliser cette API pour passer de l'appel de modèles OpenAI à l'appel de modèles hébergés par Vertex AI afin de comparer la sortie, les coûts et l'évolutivité, sans modifier votre code existant. Si vous n'utilisez pas déjà les bibliothèques OpenAI, nous vous recommandons d'appeler directement l'API Gemini.

Modèles compatibles

L'API Chat Completions est compatible avec les modèles Gemini et sélectionne les modèles autodéployés à partir de Model Garden.

Modèles Gemini

Le tableau suivant présente les modèles Gemini compatibles :

Modèle Version
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

Modèles autodéployés à partir de Model Garden

Les conteneurs HuggingFace de génération de texte (HF TGI) et VLLM prédéfinis pour le jardin de modèles Vertex AI sont compatibles avec l'API Chat Completions. Toutefois, tous les modèles déployés dans ces conteneurs ne sont pas compatibles avec l'API Chat Completions. Le tableau suivant inclut les modèles compatibles les plus populaires par conteneur :

HF TGI

vLLM

Authentifier

Pour utiliser les bibliothèques Python OpenAI, installez le SDK OpenAI :

pip install openai

Pour vous authentifier auprès de l'API Chat Completions, vous pouvez modifier la configuration de votre client ou modifier la configuration de votre environnement afin d'utiliser l'authentification Google et un point de terminaison Vertex AI. Choisissez la méthode la plus simple et suivez la procédure de configuration selon que vous souhaitez appeler des modèles Gemini ou des modèles Model Garden auto-déployés.

Certains modèles de Model Garden et des modèles Hugging Face compatibles doivent d'abord être déployés sur un point de terminaison Vertex AI avant de pouvoir diffuser des requêtes. Lorsque vous appelez ces modèles autodéployés à partir de l'API Chat Completions, vous devez spécifier l'ID du point de terminaison. Pour lister vos points de terminaison Vertex AI existants, exécutez la commande gcloud ai endpoints list.

Configuration du client

Pour obtenir des identifiants Google de manière programmatique dans Python, vous pouvez utiliser le SDK Python google-auth:

pip install google-auth
pip install requests

Modifiez le SDK OpenAI de sorte qu'il pointe vers le point de terminaison des achèvements du chat 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)

Par défaut, les jetons d'accès durent une heure. Vous pouvez prolonger la durée de vie de votre jeton d'accès ou actualiser régulièrement votre jeton et mettre à jour la variable openai.api_key.

Variables d'environnement

Installez Google Cloud CLI. La bibliothèque OpenAI peut lire les variables d'environnement OPENAI_API_KEY et OPENAI_BASE_URL pour modifier l'authentification et le point de terminaison dans leur client par défaut. Définissez ces variables :

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

Pour appeler un modèle Gemini, définissez la variable MODEL_ID et utilisez le point de terminaison openapi :

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

Pour appeler un modèle autodéployé à partir de Model Garden, définissez la variable ENDPOINT et utilisez-la dans votre URL à la place :

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

Ensuite, initialisez le client :

client = openai.OpenAI()

L'API Gemini Chat Completions utilise OAuth pour s'authentifier avec un jeton d'accès de courte durée. Par défaut, les jetons d'accès durent une heure. Vous pouvez prolonger la durée de vie de votre jeton d'accès ou actualiser régulièrement votre jeton et mettre à jour la variable d'environnement OPENAI_API_KEY.

Appeler Gemini avec l'API Chat Completions

L'exemple suivant montre comment envoyer des requêtes qui ne sont pas en streaming :

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

Pour savoir comment installer ou mettre à jour le SDK Vertex AI pour Python, consultez la section Installer le SDK Vertex AI pour Python. Pour en savoir plus, consultez la documentation de référence de l'API 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)

L'exemple suivant vous montre comment envoyer des requêtes en streaming à un modèle Gemini à l'aide de l'API 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

Pour savoir comment installer ou mettre à jour le SDK Vertex AI pour Python, consultez la section Installer le SDK Vertex AI pour Python. Pour en savoir plus, consultez la documentation de référence de l'API 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)

Appeler un modèle autodéployé avec l'API Chat Completions

L'exemple suivant montre comment envoyer des requêtes qui ne sont pas en streaming :

  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."
    }]
  }'

L'exemple suivant montre comment envoyer des requêtes en streaming à un modèle auto-déployé à l'aide de l'API Chat Completions :

  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."
    }]
  }'

Paramètres possibles

Pour les modèles Google, l'API Chat Completions accepte les paramètres OpenAI suivants. Pour obtenir une description de chaque paramètre, consultez la documentation d'OpenAI sur la création de complétion de chat. La compatibilité des paramètres avec les modèles tiers varie selon le modèle. Pour connaître les paramètres compatibles, consultez la documentation du modèle.

messages
  • System message
  • User message : les types text et image_url sont acceptés. Le type image_url est compatible avec les images stockées dans un URI Cloud Storage ou un encodage base64 au format "data:<MIME-TYPE>;base64,<BASE64-ENCODED-BYTES>". Pour savoir comment créer un bucket Cloud Storage et y importer un fichier, consultez la section Découvrir le stockage d'objets. L'option detail n'est pas prise en charge.
  • Assistant message
  • Tool message
  • Function message : ce champ est obsolète, mais compatible avec les versions antérieures.
model
max_tokens
n
frequency_penalty
response_format
  • json_object : interprété comme une transmission de "application/json" à l'API Gemini.
  • text : interprété comme une transmission de "text/plain" à l'API Gemini.
  • Tout autre type MIME est transmis tel quel au modèle, tel que la transmission de "application/json" directement.
stop
stream
temperature
top_p
tools
  • type
  • function
    • name
    • description
    • parameters : spécifiez les paramètres à l'aide de la spécification OpenAPI. Cela diffère du champ de paramètres OpenAI, qui est décrit comme un objet de schéma JSON. Pour en savoir plus sur les différences de mots clés entre OpenAPI et le schéma JSON, consultez le guide OpenAPI.
tool_choice
  • none
  • auto
  • required : correspond au mode ANY dans FunctionCallingConfig.
function_call Ce champ est obsolète, mais compatible avec les versions antérieures.
functions Ce champ est obsolète, mais compatible avec les versions antérieures.

Si vous transmettez un paramètre non compatible, il est ignoré.

Actualiser vos identifiants

L'exemple suivant montre comment actualiser automatiquement vos identifiants si nécessaire :

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)

Étape suivante