配置模型路由
本页介绍了如何使用 OpenAPI 3.x 规范在 API Gateway 中配置、部署和测试模型路由。
准备工作
在配置模型路由之前,请检查您的环境是否满足以下前提条件:
- 检查 IAM 权限:检查您是否拥有 API Gateway 管理平面和 Vertex AI Model Garden 的访问权限。您必须拥有 API Gateway Admin (
roles/apigateway.admin) 角色才能创建 API 配置和网关。此外,API 网关使用的服务账号(默认 Compute Engine 服务账号或创建 API 配置时指定的用户代管式服务账号)必须被授予 Vertex AI User (roles/aiplatform.user) 角色,才能访问目标模型。 - 检查模型可用性和端点访问权限:检查您的可路由模型是否已预部署为 Vertex AI Model Garden 中的模型即服务 (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,就必须在x-google-api-management内定义ai.models.routing.routers块。 - 您无法在同一 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方案的有效网址。为了保护在公共或远程端点之间传输的提示载荷和身份验证凭据,请在定义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)必须共享相同的主机名和网址协议。管理平面会拒绝同一路由器中具有不同主机名或不一致方案(http与https)的配置,从而确保路由器将所有请求调度到一致的上游服务端点。
目标模型验证
targetModel字符串(google、openai或anthropic)的<provider>部分和<provider>/<model>标识符格式都会在配置创建(部署)时进行验证。如果targetModel的格式不是<provider>/<model>,或者其提供方不是google、openai或anthropic,管理平面会在部署期间拒绝该targetModel,并显示InvalidArgument: unsupported publisher错误。
第 1 步:确定目标模型
确定目标基础模型及其对应的 Vertex AI 端点网址。路由器中的所有可路由模型必须共用一个主机名(对于 MaaS 开放模型,此主机名为 aiplatform.googleapis.com)。
端点网址路径因模型提供商而异:
- Google Gemini:使用
:generateContent方法。 - Anthropic Claude:使用
:rawPredict方法。 - OpenAI:使用
/endpoints/openapi/chat/completions端点路径。
下表列出了本部分后面的 OpenAPI 规范示例中使用的 MaaS 端点:
| 模型 | 端点网址 |
|---|---|
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 规范,以定义后端端点和模型路由配置。
以下示例展示了一个 OpenAPI 3.0.3 规范,其中定义了两个不同的模型路由器。为防止出现横向滚动,较长的后端地址网址使用 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,包含命名路由器的映射。每个映射条目定义一个模型路由器,其中键表示路由器的名称(例如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错误。