モデル ルーティングを構成する
このページでは、OpenAPI 3.x 仕様を使用して API Gateway でモデル ルーティングを構成、デプロイ、テストする方法について説明します。
始める前に
モデル ルーティングを構成する前に、環境が次の前提条件を満たしていることを確認してください。
- IAM 権限を確認する: API Gateway 管理プレーンと Gemini Enterprise Agent Platform Model Garden にアクセスできることを確認します。API 構成とゲートウェイを作成するには、API Gateway 管理者(
roles/apigateway.admin)ロールが必要です。また、ゲートウェイで使用するサービス アカウント(デフォルトの Compute Engine サービス アカウント、または API 構成の作成時に指定したユーザー管理のサービス アカウント)には、ターゲット モデルにアクセスするための Agent Platform ユーザー(roles/aiplatform.user)ロールが付与されている必要があります。 - モデルの可用性とエンドポイント アクセスを確認する: ルーティング可能なモデルが、Agent Platform 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フィールドを含める必要があります。- 単一のルーター内のすべてのルールで定義された
model値は一意である必要があります。管理プレーンは、同じルーター内の重複するmodel値を拒否します。
バックエンドのホストとスキームの一貫性
- 単一のルーターで参照されるすべてのバックエンド(
defaultModel.backendとすべてのルールのbackendを含む)は、同一のホスト名と URL スキームを共有する必要があります。管理プレーンは、同じルーター内で異なるホスト名または一貫性のないスキーム(httpとhttps)を使用する構成を拒否し、ルーターがすべてのリクエストを一貫したアップストリーム サービス エンドポイントにディスパッチするようにします。
ターゲット モデルの検証
targetModel文字列(google、openai、anthropic)の<provider>部分と<provider>/<model>識別子形式は、構成の作成(デプロイ)時に検証されます。管理プレーンは、targetModelとしてフォーマットされていない、またはプロバイダがgoogle、openai、anthropicではない<provider>/<model>を、デプロイ時にInvalidArgument: unsupported publisherエラーで拒否します。
ステップ 1: ターゲット モデルを特定する
ターゲットの基盤モデルと、対応する Agent Platform エンドポイント 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の値は、Agent Platform に送信されるリクエスト本文の送信model属性として転送されます。rules: 各要素がクライアント ペイロード モデル文字列を宛先バックエンドとターゲット モデルにマッピングする、省略可能な配列。
- ルールのプロパ 1 ティ:
rules(およびdefaultModel)内の各エントリは、次のプロパティを定義します:model(ルールのみ): クライアントの受信 JSON プロンプト ペイロード内のmodel属性と照合される文字列値。 ルーターは、受信ペイロードのmodel値をこの文字列と比較します。一致するルールがない場合、ルーターはdefaultModelを選択します。OpenAI 互換のルート(宛先バックエンドが/openapi/chat/completionsの場合)では、この文字列は、Agent Platform に送信されるリクエスト本文の送信model属性として直接転送されます。したがって、OpenAI 互換のルートの場合、modelセレクタ自体が有効なパブリッシャー モデル識別子(たとえば、openai/gpt-oss-120b-maas)である必要があります。gpt-ossなどのエイリアスを使用すると、Agent Platform から400 Malformed publisher modelエラーが返されます。backend: ゲートウェイがプロンプトを送信するx-google-api-management.backendsで定義されたシンボリック バックエンド名。targetModel:<provider>/<model-id>としてフォーマットされたターゲット モデル識別子。モデル ルーターは、この文字列を使用して、宛先モデルのリクエストとレスポンスを変換します。<provider>接頭辞は、google、openai、anthropicと完全に一致する必要があります。<model-id>は、有効な Agent Platform 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 ホスト名を使用していました。2026 年 9 月 3 日以降、新しいモデル ルーティング ゲートウェイでは、gateway.dev 形式の https://GATEWAY_ID-PROJECT_NUMBER.REGION.gateway.dev デフォルト ホスト名(https://my-gateway-123456789012.us-central1.gateway.dev など)を使用する場合があります。デフォルトのホスト名は不変で、作成時に割り当てられます。run.app ホスト名と gateway.dev ホスト名のどちらの形式が割り当てられても、ゲートウェイはその形式を永続的に保持します。
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 バックエンドにルーティングするように指示します。単一のバックエンドは複数のルーターから参照できます。この構成では、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: リクエストがプロキシされた Agent Platform バックエンドのホスト名。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 エラーをゲートウェイに返しました。 | アップストリーム サービス側: ターゲット Agent Platform サービス エンドポイントのステータス コードとペイロードを確認します。有効なリクエストで予期しない動作が発生した場合は、サポートケースを開いてください。 |
model_router_unavailable |
転送または接続の失敗により、ゲートウェイからモデル ルーターに到達できませんでした。 | プラットフォーム側: Google Cloud サポートにサポートケースを開いてください。 |
次のステップ
- モデル ルーティングのアーキテクチャとコンセプトを確認する
- OpenAPI 3.x 拡張機能を調べる