モデルのルーティングを構成する
このページでは、OpenAPI 3.x 仕様を使用して API Gateway でモデル ルーティングを構成、デプロイ、テストする方法について説明します。
始める前に
モデルのルーティングを構成する前に、環境が次の前提条件を満たしていることを確認してください。
- IAM 権限を確認する: API Gateway 管理プレーンと Vertex AI Model Garden にアクセスできることを確認します。API 構成とゲートウェイを作成するには、API Gateway 管理者(
roles/apigateway.admin)ロールが必要です。また、API ゲートウェイで使用されるサービス アカウント(デフォルトの Compute Engine サービス アカウント、または API 構成の作成時に指定されたユーザー管理のサービス アカウント)には、ターゲット モデルにアクセスするための Vertex AI ユーザー(roles/aiplatform.user)ロールが付与されている必要があります。 - モデルの可用性とエンドポイント アクセスを確認する: ルーティング可能なモデルが、Vertex AI Model Garden の Model as a Service(MaaS)用のオープンモデルとして事前デプロイされていることを確認します。単一のルーターで参照されるすべてのモデルは、まったく同じホスト名を共有する必要があります。そのルーター内で参照されるすべてのモデルに対して、グローバル エンドポイント(
aiplatform.googleapis.com)または単一のリージョン エンドポイント(us-central1-aiplatform.googleapis.comなど)のいずれかを選択します。 - ゲートウェイのデプロイの適格性を確認する: モデル ルーティングなしでデプロイされた既存のゲートウェイを更新してモデル ルーティングを有効にすることはできません。また、モデル ルーティングを使用してデプロイされたゲートウェイを更新してモデル ルーティングを無効にしたり削除したりすることもできません。ルーティング モードを切り替えるには、新しい API 構成とゲートウェイ インスタンスを作成してデプロイする必要があります。
- VPC Service Controls とエンドポイントの互換性を確認する: モデル ルーティング ゲートウェイは、VPC Service Controls または Private Service Connect(PSC)エンドポイントの構成をサポートしていません。ターゲット プロジェクトと API Gateway インスタンスが VPC Service Controls 境界によって制限されておらず、モデルがパブリック リージョン エンドポイントまたはグローバル エンドポイントを使用していることを確認します。
構成の検証
API 構成をデプロイすると、API Gateway 管理プレーンが OpenAPI 仕様を検証します。管理プレーンは、デプロイ中に無効な構成を情報検証エラーで拒否します。検証プロセスでは、次のルールが適用されます。
構造と位置情報のチェック
x-google-api-management拡張機能とそれに関連付けられたブロック(backends、ai.models.routing.routers、個々のルーター、rules)は、整形式である必要があります。キーは、想定されるデータ型(マップ、リスト、文字列)と一致する必要があります。管理プレーンは、型不一致をexpected map/list/stringエラーで拒否します。- モデル ルーティングが有効になっている場合、
x-google-api-management拡張機能には有効なbackendsブロックが含まれている必要があります。 x-google-model-router拡張機能は OpenAPI 3.x 仕様でのみサポートされています(OpenAPI 2.0 / Swagger ではサポートされていません)。x-google-model-router拡張機能はオペレーション レベルでのみ指定できます。管理プレーンは、パスレベルまたはルート(最上位)レベルに配置されたx-google-model-router定義を明示的に拒否します。- オペレーションが
x-google-model-routerを参照する場合は、ai.models.routing.routersブロックをx-google-api-management内で定義する必要があります。 - 同じ API オペレーションに
x-google-model-routerとx-google-backendの両方を指定することはできません。 - OpenAPI 仕様に、モデル ルーティング オペレーションとモデル以外のルーティング オペレーションを混在させることはできません。同じ API 仕様内で、一部のオペレーションで
x-google-model-routerを使用しながら、他のオペレーションで標準ルーティング拡張機能(x-google-backendなど)を指定することはできません。
HTTP メソッドのチェック
x-google-model-router拡張機能は、POSTHTTP メソッドを使用するオペレーションにのみ適用できます。管理プレーンは、他の HTTP メソッド(GET、PUT、DELETEなど)でのモデル ルーティングを拒否します。
バックエンドの有効性
x-google-api-management.backendsで定義されたすべてのバックエンドに、空でないaddressフィールドを含める必要があります。- バックエンド
addressは、httpまたはhttpsスキームを使用する有効な URL である必要があります。公共またはリモート エンドポイント間で転送されるプロンプト ペイロードと認証情報を保護するには、addressフィールドを定義するときに常にhttpsスキームを指定します。 x-google-api-management.backendsで定義され、モデルルーターで参照されるすべてのバックエンドはpathTranslation: CONSTANT_ADDRESSを使用する必要があります。モデル ルーティング バックエンドにpathTranslation: APPEND_PATH_TO_ADDRESSを使用する構成は、モデルルーターのランタイム パスでパス変換が無視されるため、管理プレーンによって拒否されます。- モデル ルーティング バックエンドは、VPC Service Controls または Private Service Connect(PSC)エンドポイント構成をサポートしていません。すべてのバックエンド
addressフィールドは、パブリック リージョンまたはグローバル MaaS オープンモデル エンドポイントを指している必要があります。
ルーター参照の解決
- オペレーションの
x-google-model-routerで参照されるルーター名は、ai.models.routing.routersで定義された有効なルーターキーと一致する必要があります。 - ルーターの
defaultModelで参照されるbackendは、x-google-api-management.backendsで定義された有効なバックエンドと一致する必要があります。 - ルーターの各ルールで参照される
backendは、x-google-api-management.backendsで定義された有効なバックエンドと一致する必要があります。
ルーターのコンテンツ
- 各ルーターで
defaultModelを定義する必要があります。 defaultModelには有効なbackendフィールドを含める必要があります。defaultModelには、空でないtargetModelフィールドを含める必要があります。rulesの各エントリには、空でないmodelフィールドを含める必要があります。文字列値defaultは予約済みのため、ルールのmodel値として使用できません。rulesの各エントリには、空でないtargetModelフィールドを含める必要があります。- 1 つのルーター内のすべてのルールで定義された
model値は一意である必要があります。管理プレーンは、同じルーター内の重複するmodel値を拒否します。
バックエンド ホストとスキームの一貫性
- 単一のルーターで参照されるすべてのバックエンド(
defaultModel.backendとすべてのルールのbackendを含む)は、同じホスト名と URL スキームを共有する必要があります。管理プレーンは、同じルーター内でホスト名が異なる構成やスキームが一致しない構成(httpとhttps)を拒否し、ルーターがすべてのリクエストを一貫したアップストリーム サービス エンドポイントにディスパッチするようにします。
ターゲット モデルの検証
targetModel文字列の<provider>部分(google、openai、anthropic)と<provider>/<model>識別子形式は、構成作成(デプロイ)時に検証されます。管理プレーンは、<provider>/<model>としてフォーマットされていないtargetModel、またはプロバイダがgoogle、openai、anthropicではないtargetModelを、デプロイ中にInvalidArgument: unsupported publisherエラーで拒否します。
ステップ 1: ターゲット モデルを特定する
ターゲットの基盤モデルと、対応する Vertex AI エンドポイント URL を特定します。ルーター内のすべてのルーティング可能なモデルは、単一のホスト名を共有する必要があります(MaaS オープンモデルの場合、このホスト名は aiplatform.googleapis.com です)。
エンドポイント URL パスは、モデル プロバイダによって異なります。
- Google Gemini:
:generateContentメソッドを使用します。 - Anthropic Claude:
:rawPredictメソッドを使用します。 - OpenAI:
/endpoints/openapi/chat/completionsエンドポイント パスを使用します。
次の表に、このセクションの後半の OpenAPI 仕様の例で使用される MaaS エンドポイントを示します。
| モデル | エンドポイント URL |
|---|---|
google/gemini-3.5-flash-lite |
https://aiplatform.googleapis.com/v1/projects/YOUR_PROJECT_ID/locations/global/publishers/google/models/gemini-3.5-flash-lite:generateContent |
anthropic/claude-opus-4-7 |
https://aiplatform.googleapis.com/v1/projects/YOUR_PROJECT_ID/locations/global/publishers/anthropic/models/claude-opus-4-7:rawPredict |
openai/gpt-oss-120b-maas |
https://aiplatform.googleapis.com/v1/projects/YOUR_PROJECT_ID/locations/global/endpoints/openapi/chat/completions |
YOUR_PROJECT_ID は、実際の Google Cloud プロジェクト ID に置き換えます。
ステップ 2: OpenAPI 3.x 仕様を構成する
OpenAPI 3.x 仕様を作成または更新して、バックエンド エンドポイントとモデル ルーティング構成を定義します。
次の例は、2 つの異なるモデルルーターを定義する OpenAPI 3.0.3 仕様を示しています。水平スクロールを防ぐため、長いバックエンド アドレス URL では YAML の二重引用符で囲まれた複数行の文字列継続(``)を使用します。
openapi: 3.0.3
info:
title: OpenAPI 3.x spec using Model Routing
description: Using Model Routing in an OAS 3.x spec
version: 1.0.0
x-google-api-management:
backends:
gemini-35-flashlite:
address: "https://aiplatform.googleapis.com/v1/projects/\
YOUR_PROJECT_ID/locations/global/publishers/google/\
models/gemini-3.5-flash-lite:generateContent"
deadline: 60.0
pathTranslation: CONSTANT_ADDRESS
anthropic-claude-opus-47:
address: "https://aiplatform.googleapis.com/v1/projects/\
YOUR_PROJECT_ID/locations/global/publishers/anthropic/\
models/claude-opus-4-7:rawPredict"
deadline: 60.0
pathTranslation: CONSTANT_ADDRESS
openai-gpt-oss-120b:
address: "https://aiplatform.googleapis.com/v1/projects/\
YOUR_PROJECT_ID/locations/global/endpoints/openapi/\
chat/completions"
deadline: 60.0
pathTranslation: CONSTANT_ADDRESS
ai:
models:
routing:
routers:
# Router 1: route between Gemini (default) and Claude.
gemini-claude-router:
defaultModel:
backend: gemini-35-flashlite
targetModel: google/gemini-3.5-flash-lite
rules:
- model: "claude-opus-4-7"
backend: anthropic-claude-opus-47
targetModel: anthropic/claude-opus-4-7
# Router 2: route between OpenAI GPT (default) and Gemini.
openai-gemini-router:
defaultModel:
backend: openai-gpt-oss-120b
targetModel: openai/gpt-oss-120b-maas
rules:
- model: "gemini-3.5-flash-lite"
backend: gemini-35-flashlite
targetModel: google/gemini-3.5-flash-lite
servers:
- url: "https://my-gateway-url.com"
paths:
/v1/chat/gemini-claude:
post:
summary: "Endpoint:defaults to Gemini & Claude as an option."
operationId: "chatGeminiClaude"
x-google-model-router: gemini-claude-router
responses:
'200':
description: "OK"
/v1/chat/openai-gemini:
post:
summary: "Endpoint:defaults to OpenAI & Gemini as an option."
operationId: "chatOpenAIGemini"
x-google-model-router: openai-gemini-router
responses:
'200':
description: "OK"
構成プロパティ
backends:x-google-api-managementのbackendsオブジェクトは、すべてのルーティング可能なモデル エンドポイントを定義します。各バックエンド名は、宛先addressを含むシンボリック モデル名(gemini-35-flashliteなど)を表します。backendsフィールドは既存の Google OpenAPI 拡張機能です。ai.models.routing: モデル ルーティング構成はx-google-api-managementのai.models.routingにあり、名前付きルーターのマップが含まれています。各マップ エントリは 1 つのモデルルーターを定義します。キーはルーターの名前(gemini-claude-routerなど)を表し、値には次のものが含まれます。defaultModel: 受信リクエスト ペイロードが明示的なルールと一致しない場合に使用される、必須のフォールバック モデルの宛先。ルール エントリとまったく同じ構造ですが、modelマッチング フィールドは省略されています。OpenAI 互換ルートの場合、リクエストがdefaultModelにフォールバックすると、targetModelの値は、Vertex AI に送信されるリクエスト本文の送信model属性として転送されます。rules: 省略可能な配列。各要素は、クライアント ペイロード モデル文字列を宛先バックエンドとターゲット モデルにマッピングします。
- ルールのプロパティ:
rules(およびdefaultModel)内の各エントリは、次のプロパティを定義します。model(ルールのみ): クライアントの受信 JSON プロンプト ペイロード内のmodel属性と照合される文字列値。ルーターは、受信ペイロードのmodel値をこの文字列と比較します。ルールが一致しない場合、ルーターはdefaultModelを選択します。OpenAI 互換のルート(宛先バックエンドが/openapi/chat/completionsの場合)、この文字列は、Vertex AI に送信されるリクエスト本文の送信model属性として直接転送されます。したがって、OpenAI 互換ルートの場合、modelセレクタ自体が有効なパブリッシャー モデル識別子(openai/gpt-oss-120b-maasなど)である必要があります。gpt-ossなどのエイリアスを使用すると、Vertex AI から400 Malformed publisher modelエラーが返されます。backend:x-google-api-management.backendsで定義されたシンボリック バックエンド名。ゲートウェイがプロンプトを送信します。targetModel:<provider>/<model-id>形式のターゲット モデル識別子。モデルルーターは、この文字列を使用して、宛先モデルのリクエストとレスポンスを変換します。<provider>接頭辞は、google、openai、anthropicのいずれかにする必要があります。<model-id>は、有効な Vertex AI Model Garden パブリッシャー モデル識別子である必要があります。ゲートウェイは、クライアントに返されるレスポンスのmodelフィールド内でこの文字列をエコーバックします。値の例は次のとおりです。google/gemini-3.5-flash-litegoogle/gemini-2.5-proopenai/gpt-oss-120b-maasanthropic/claude-opus-4-7
x-google-model-router: モデルルーターを API オペレーション パスに関連付けるには、x-google-model-router属性を使用してルーター名を指定します。前の例では、/v1/chat/gemini-claudeに送信されたPOSTリクエストがgemini-claude-routerを呼び出し、JSON ペイロードで指定されたモデル名に基づいてプロンプトをルーティングします。
ステップ 3: API 構成を作成してデプロイする
作成した OpenAPI 3.x 仕様を使用して API 構成を作成し、ゲートウェイへの API のデプロイの説明に沿って、構成を API Gateway インスタンスにデプロイします。
API Gateway 管理プレーンは、モデルのルーティング構成を処理し、ルーティング レイヤを有効にします。ゲートウェイのデプロイが完了すると、ゲートウェイは OpenAI 互換の JSON ペイロードとしてフォーマットされたプロンプト リクエストを受け取る準備が整います。
ステップ 4: ルーティングの動作をテストする
ゲートウェイをテストする前に、ゲートウェイが ACTIVE 状態になるまで待ってから、その URL を取得します。
gcloud api-gateway gateways describe GATEWAY_ID \
--location=GATEWAY_LOCATION \
--project=PROJECT_ID \
--format='value(defaultHostname)'
公開プレビュー期間中、モデル ルーティング ゲートウェイは *.run.app ホスト名を返します。ホスト名を取得するのは、ゲートウェイが ACTIVE になってからのみです。ゲートウェイの作成中にレポートされる値は最終的な URL ではありません。
curl を使用して、OpenAI 互換のプロンプト リクエストをゲートウェイ URL(https://GATEWAY_URL)に送信し、ゲートウェイのルーティング動作をテストします。次の例では、$TOKEN は、認証方法の選択で説明されているいずれかの方法で取得した有効な認証トークンを表します。
明示的なルール ルーティングをテストする
Claude モデル anthropic/claude-opus-4-7 をリクエストするプロンプトを送信します。
curl https://GATEWAY_URL/v1/chat/gemini-claude \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{
"model": "claude-opus-4-7",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "Explain the concept of recursion in one sentence."
}
]
}'
/v1/chat/gemini-claude にリクエストを送信すると、gemini-claude-router が呼び出されます。JSON ペイロード内の属性 "model": "claude-opus-4-7" が gemini-claude-router の明示的なルールと一致し、ゲートウェイに anthropic-claude-opus-47 バックエンドにリクエストを転送するように指示します。
デフォルト モデルのフォールバックをテストする
一致しないモデル名を指定するプロンプトを送信して、フォールバック ルーティングをテストします。
curl https://GATEWAY_URL/v1/chat/gemini-claude \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{
"model": "unrecognized-model",
"messages": [
{
"role": "user",
"content": "Write a short poem about the ocean."
}
],
"stream": true
}'
/v1/chat/gemini-claude にリクエストを送信すると、gemini-claude-router が呼び出されます。属性 "model": "unrecognized-model" が明示的なルールと一致しないため、ゲートウェイはリクエストをルーターの構成済み defaultModel(gemini-35-flashlite バックエンド)にディスパッチします。
代替ルーターパスをテストする
セカンダリ ルーター エンドポイントを介して Gemini をリクエストするプロンプトを送信します。
curl https://GATEWAY_URL/v1/chat/openai-gemini \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{
"model": "gemini-3.5-flash-lite",
"messages": [
{
"role": "user",
"content": "List the three largest cities in the world."
}
]
}'
/v1/chat/openai-gemini にリクエストを送信すると、openai-gemini-router が呼び出されます。属性 "model": "gemini-3.5-flash-lite" は、そのルーターの明示的なルールと一致し、ゲートウェイに gemini-35-flashlite バックエンドにリクエストをルーティングするように指示します。1 つのバックエンドを複数のルーターで参照できます。この構成では、gemini-35-flashlite は openai-gemini-router の明示的なルール ターゲットとして機能し、gemini-claude-router のフォールバック defaultModel として機能します。
オブザーバビリティ
モデルルーターは、ゲートウェイがトラフィックを処理していることを確認し、Cloud Logging を使用してリクエストごとのメタデータを検査し、Cloud Monitoring を使用して障害を診断できるように計測されています。
Cloud Logging
ゲートウェイを介してルーティングされるすべてのリクエストは、 Google Cloud プロジェクトの次の場所にある標準の API Gateway リクエストログにエントリを生成します。
projects/YOUR_PROJECT_ID/logs/apigateway.googleapis.com%2Frequests
各ログエントリには次のフィールドが含まれています。
httpRequest.requestUrl、httpRequest.status、httpRequest.latencyapi、apiConfig、apiMethodbackendRequest.hostname: リクエストがプロキシされた Vertex AI バックエンドのホスト名。responseDetails: モデルルーターの障害時にブランド化されたエラー カテゴリが入力されます(すぐ下のモデルルーターの障害のトラブルシューティングを参照)。
特定のゲートウェイに送信された最近のリクエストを見つけるには、次の Cloud Logging クエリフィルタを使用します。
(resource.type="apigateway.googleapis.com/Gateway" OR resource.type="api")
logName="projects/YOUR_PROJECT_ID/logs/apigateway.googleapis.com%2Frequests"
Cloud Monitoring
標準の API Gateway 指標 apigateway.googleapis.com/proxy/request_count(ベータ版)は、次の分類でゲートウェイ トラフィック量をレポートします。
response_code_class:2xx、3xx、4xx、5xxのいずれか。api_config: ゲートウェイが使用している API 構成名。
この指標を使用すると、全体的なトラフィック量とエラー率を確認できます。モデルルーター固有の指標(ルーター別またはターゲット モデル別の内訳など)は、今後のリリースで追加される予定です。
集計されたリクエスト レイテンシを追跡するには、リクエストログの httpRequest.latency フィールドからログベースの指標を作成します。
モデルルーターの障害のトラブルシューティング
モデルルーターを介してルーティングされたリクエストが失敗すると、対応するリクエスト ログエントリの responseDetails フィールドは、モデルルーター レイヤ内で障害が発生したかどうかを示します。モデルルーターには、次の 4 つのブランド カテゴリが表示されます。
responseDetails 値 |
意味 | 一般的な解決策 |
|---|---|---|
model_router_application_error |
リクエストを転送できませんでした。これは通常、ルールがない、ルールと一致しない model 値を含むペイロード(defaultModel が構成されていない)、またはリクエスト ペイロードの形式が正しくないことを示します。 |
お客様側: ペイロードの model パラメータがルーター構成の rule.model 文字列のいずれかと一致するか、defaultModel フォールバックが定義されていることを確認します。リクエスト本文が有効な OpenAI 互換の JSON であり、model 属性が明示的に含まれていることを確認します(パブリック プレビュー期間中は、リクエスト ペイロードに model 属性がない場合、拒否されずに誤って処理されます)。 |
model_router_timeout |
モデルルーターがリクエストごとのタイムアウトを超過しました。リクエストが異常に大きいか複雑であるか、容量のボトルネックが発生している可能性があります。 | バックエンド全体でリクエストの複雑さとタイムアウトの設定を確認します。通常のペイロードでも問題が解決しない場合は、リクエストのタイムスタンプとログのサンプルを添えて Google Cloud サポートにお問い合わせください。 |
model_router_upstream_error |
アップストリーム ターゲット モデルがゲートウェイに HTTP エラーを返しました。 | アップストリーム サービス側: ターゲットの Vertex AI サービス エンドポイントからステータス コードとペイロードを確認します。有効なリクエストでこの結果が予期しないものである場合は、サポートケースを登録してください。 |
model_router_unavailable |
トランスポートまたは接続の障害により、モデルルーターにゲートウェイからアクセスできませんでした。 | プラットフォーム側: Google Cloud サポートにサポートケースを登録します。 |