OpenAI ライブラリを使用して Vertex AI モデルを呼び出す

Chat Completions API を使用すると、Python と REST 用の OpenAI ライブラリを使用して、Vertex AI モデルにリクエストを送信できます。すでに OpenAI ライブラリを使用している場合は、この API を使用して、OpenAI モデルと Vertex AI ホストモデルの呼び出しを切り替えることで、既存のコードを変更することなく、出力、コスト、スケーラビリティを比較できます。OpenAI ライブラリを使用していない場合は、Gemini API を直接呼び出すことをおすすめします。

サポートされているモデル

Chat Completions API は、Gemini モデルと、Model Garden から選択したセルフデプロイ モデルの両方をサポートしています。

Gemini モデル

次の表に、サポートされている Gemini モデルを示します。

モデル バージョン
Gemini 1.5 Flash google/gemini-1.5-flash
Gemini 1.5 Pro google/gemini-1.5-pro
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

Model Garden からセルフデプロイされたモデル

HuggingFace Text Generation Interface(HF TGI)Vertex AI Model Garden のビルド済み vLLM コンテナは、Chat Completions API をサポートしています。ただし、これらのコンテナにデプロイされたすべてのモデルが Chat Completions API をサポートしているわけではありません。次の表に、コンテナ別にサポートされている最も一般的なモデルを示します。

HF TGI

vLLM

認証

OpenAI Python ライブラリを使用するには、OpenAI SDK をインストールします。

pip install openai

Chat Completions API で認証するには、クライアントの設定を変更するか、Google 認証と Vertex AI エンドポイントを使用するように環境構成を変更します。どちらか簡単な方法を選択します。Gemini モデルを呼び出すか、セルフデプロイの Model Garden モデルを呼び出すかによって、設定手順が異なります。

Model Garden の一部のモデルとサポートされている Hugging Face モデルは、リクエストを処理する前に、まず Vertex AI エンドポイントにデプロイする必要があります。Chat Completions API からこれらのセルフデプロイ モデルを呼び出す場合は、エンドポイント ID を指定する必要があります。既存の Vertex AI エンドポイントを一覧取得するには、gcloud ai endpoints list コマンドを使用します。

クライアントのセットアップ

Python で Google 認証情報をプログラムで取得するには、google-auth Python SDK を使用します。

pip install google-auth
pip install requests

Vertex AI チャット補完エンドポイントを参照するように OpenAI SDK を変更します。

# 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)

デフォルトでは、アクセス トークンの有効期間は 1 時間です。アクセス トークンの有効期間を延長するか、トークンを定期的に更新して openai.api_key 変数を更新します。

環境変数

Google Cloud CLI をインストールします。OpenAI ライブラリは、OPENAI_API_KEY 環境変数と OPENAI_BASE_URL 環境変数を読み取って、デフォルト クライアントの認証とエンドポイントを変更できます。以下の変数を設定します。

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

Gemini モデルを呼び出すには、MODEL_ID 変数を設定し、openapi エンドポイントを使用します。

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

Model Garden からセルフデプロイ モデルを呼び出すには、ENDPOINT 変数を設定し、代わりに URL で使用します。

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

次に、クライアントを初期化します。

client = openai.OpenAI()

Gemini Chat Completions API は、OAuth を使用して有効期間の短いアクセス トークンで認証します。デフォルトでは、アクセス トークンの有効期間は 1 時間です。アクセス トークンの有効期間を延長するか、トークンを定期的に更新して OPENAI_API_KEY 環境変数を更新します。

Chat Completions API を使用して Gemini を呼び出す

次のサンプルは、ストリーミング以外のリクエストを送信する方法を示しています。

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

Vertex AI SDK for Python のインストールまたは更新の方法については、Vertex AI SDK for Python をインストールするをご覧ください。 詳細については、Python API リファレンス ドキュメントをご覧ください。

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-002",
    messages=[{"role": "user", "content": "Why is the sky blue?"}],
)

print(response)

次のサンプルは、Chat Completions API を使用して Gemini モデルにストリーミング リクエストを送信する方法を示しています。

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

Vertex AI SDK for Python のインストールまたは更新の方法については、Vertex AI SDK for Python をインストールするをご覧ください。 詳細については、Python API リファレンス ドキュメントをご覧ください。

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-002",
    messages=[{"role": "user", "content": "Why is the sky blue?"}],
    stream=True,
)
for chunk in response:
    print(chunk)

Chat Completions API を使用してセルフデプロイ モデルを呼び出す

次のサンプルは、ストリーミング以外のリクエストを送信する方法を示しています。

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

次のサンプルは、Chat Completions API を使用して、セルフデプロイ モデルにストリーミング リクエストを送信する方法を示しています。

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

サポートされるパラメータ

Google モデルの場合、Chat Completions API は次の OpenAI パラメータをサポートしています。各パラメータの説明については、OpenAI のチャット補完の作成に関するドキュメントをご覧ください。サードパーティ モデルのパラメータのサポートはモデルによって異なります。サポートされているパラメータを確認するには、モデルのドキュメントをご覧ください。

messages
  • System message
  • User message: text タイプと image_url タイプがサポートされています。image_url 型は、Cloud Storage URI または "data:<MIME-TYPE>;base64,<BASE64-ENCODED-BYTES>" 形式の Base64 エンコードで保存された画像をサポートします。Cloud Storage バケットを作成してファイルをアップロードする方法については、オブジェクト ストレージを検出するをご覧ください。detail オプションはサポートされていません。
  • Assistant message
  • Tool message
  • Function message: このフィールドは非推奨ですが、下位互換性確保のためにサポートされています。
model
max_tokens
n
frequency_penalty
presence_penalty
response_format
  • json_object: Gemini API に「application/json」を渡すものとして解釈されます。
  • text: Gemini API に「text/plain」を渡すものとして解釈されます。
  • 他の MIME タイプはそのままモデルに渡されます(「application/json」を直接渡すなど)。
stop
stream
temperature
top_p
tools
  • type
  • function
    • name
    • description
    • parameters: OpenAPI 仕様を使用してパラメータを指定します。これは、JSON Schema オブジェクトとして記述される OpenAI パラメータ フィールドとは異なります。OpenAPI と JSON Schema のキーワードの違いについては、OpenAPI ガイドをご覧ください。
tool_choice
  • none
  • auto
  • required: FunctionCallingConfig のモード ANY に対応します。
function_call このフィールドは非推奨ですが、下位互換性確保のためにサポートされています。
functions このフィールドは非推奨ですが、下位互換性確保のためにサポートされています。

サポートされていないパラメータを渡した場合、そのパラメータは無視されます。

認証情報を更新する

次の例は、必要に応じて認証情報を自動的に更新する方法を示しています。

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-002",
    messages=[{"role": "user", "content": "Why is the sky blue?"}],
)

print(response)

次のステップ