メインコンテンツまでスキップ

PowerShell で Vertex AI Gemini API を叩く

· 約4分

Google Cloud の Vertex AI 経由で Gemini モデルを PowerShell から呼び出す方法をまとめる。OpenAI 互換エンドポイントとネイティブ Gemini エンドポイントの 2 種類を紹介する。

認証方法

gcloud auth(推奨)

API キー不要。既存の Google Cloud 認証情報をそのまま利用できる。

$accessToken = (gcloud auth print-access-token)

API キー

$apiKey = $env:VERTEX_API_KEY

エンドポイント

OpenAI 互換エンドポイント(gcloud auth 認証)

https://{region}-aiplatform.googleapis.com/v1beta1/projects/{projectId}/locations/{region}/endpoints/openapi/chat/completions

リクエスト・レスポンス形式が OpenAI API と同じ。モデル名に google/ プレフィックスが必要(例: google/gemini-2.5-flash-lite)。

ネイティブ Gemini エンドポイント(API キー認証)

https://{region}-aiplatform.googleapis.com/v1/projects/{projectId}/locations/{region}/publishers/google/models/{model}:generateContent

ストリーミングが必要な場合は :streamGenerateContent を使用する。

基本的な呼び出し

OpenAI 互換(gcloud auth)

$projectId   = "your-project-id"
$region = "us-central1"
$model = "google/gemini-2.5-flash-lite"
$accessToken = (gcloud auth print-access-token)

$body = @{
model = $model
messages = @(
@{
role = "user"
content = "東京の人口は?"
}
)
} | ConvertTo-Json -Depth 10

$uri = "https://$region-aiplatform.googleapis.com/v1beta1/projects/$projectId/locations/$region/endpoints/openapi/chat/completions"

$response = Invoke-RestMethod `
-Uri $uri `
-Method Post `
-ContentType "application/json" `
-Headers @{ Authorization = "Bearer $accessToken" } `
-Body $body

$response.choices[0].message.content

ネイティブ Gemini(API キー)

$projectId = "your-project-id"
$region = "us-central1"
$model = "gemini-2.5-flash-lite"
$apiKey = $env:VERTEX_API_KEY

$body = @{
contents = @(
@{
role = "user"
parts = @(
@{ text = "東京の人口は?" }
)
}
)
} | ConvertTo-Json -Depth 10

$uri = "https://$region-aiplatform.googleapis.com/v1/projects/$projectId/locations/$region/publishers/google/models/${model}:generateContent?key=$apiKey"

$response = Invoke-RestMethod `
-Uri $uri `
-Method Post `
-ContentType "application/json" `
-Body $body

$response.candidates[0].content.parts[0].text

レスポンス構造

OpenAI 互換

$response.choices[0].message.content  # 生成テキスト
$response.usage.total_tokens # 合計トークン数
$response.model # 使用モデル

ネイティブ Gemini

$response.candidates[0].content.parts[0].text  # 生成テキスト
$response.usageMetadata.totalTokenCount # 合計トークン数
$response.modelVersion # 使用モデルバージョン

ストリーミング(streamGenerateContent)の場合は複数チャンクの配列が返るため、テキストを結合して取り出す。

$fullText = ($response | ForEach-Object {
$_.candidates[0].content.parts[0].text
}) -join ""

システムプロンプトを追加する

OpenAI 互換

$body = @{
model = $model
messages = @(
@{
role = "system"
content = "日本語で回答する AI アシスタントです。簡潔に答えてください。"
}
@{
role = "user"
content = "What is the speed of light?"
}
)
} | ConvertTo-Json -Depth 10

ネイティブ Gemini

$body = @{
system_instruction = @{
parts = @(
@{ text = "日本語で回答する AI アシスタントです。簡潔に答えてください。" }
)
}
contents = @(
@{
role = "user"
parts = @(@{ text = "What is the speed of light?" })
}
)
} | ConvertTo-Json -Depth 10

マルチターン会話

これまでの会話履歴を配列に並べることでマルチターン会話が実現できる。

OpenAI 互換

$body = @{
model = $model
messages = @(
@{ role = "user"; content = "猫と犬、どちらが好きですか?" }
@{ role = "assistant"; content = "私は猫が好きです。" }
@{ role = "user"; content = "その理由は?" }
)
} | ConvertTo-Json -Depth 10

ネイティブ Gemini

アシスタントのロールは "model" を指定する。

$body = @{
contents = @(
@{
role = "user"
parts = @(@{ text = "猫と犬、どちらが好きですか?" })
}
@{
role = "model"
parts = @(@{ text = "私は猫が好きです。" })
}
@{
role = "user"
parts = @(@{ text = "その理由は?" })
}
)
} | ConvertTo-Json -Depth 10

利用可能なモデル

モデルOpenAI 互換名特徴
gemini-2.5-flash-litegoogle/gemini-2.5-flash-lite軽量・高速・低コスト
gemini-2.5-flashgoogle/gemini-2.5-flashバランス型
gemini-2.5-progoogle/gemini-2.5-pro高精度・複雑なタスク向け

方式の選択基準

状況推奨方式
GCP 認証済み環境(開発・CI など)OpenAI 互換 + gcloud auth
API キーのみ利用可能ネイティブ Gemini
OpenAI から移行中OpenAI 互換(コード変更を最小化)
ストリーミングが必要ネイティブ Gemini

注意事項

  • API キーはスクリプトにハードコードせず、環境変数 ($env:VERTEX_API_KEY) から読み込むこと。
  • gcloud auth の場合、トークンの有効期限は約 1 時間。長時間スクリプトでは都度再取得が必要。
  • レート制限やクォータはプロジェクトごとに設定されている。大量リクエストを送る場合は事前に確認すること。

コメント

読み込み中...

コメントを投稿する