Configura el enrutamiento de modelos
En esta página, se describe cómo configurar, implementar y probar el enrutamiento de modelos en API Gateway con las especificaciones de OpenAPI 3.x.
Antes de comenzar
Antes de configurar el enrutamiento de modelos, verifica que tu entorno cumpla con los siguientes requisitos previos:
- Verifica los permisos de IAM: Verifica que tengas acceso al plano de administración de API Gateway y a Vertex AI Model Garden. Debes tener el rol de administrador de API Gateway (
roles/apigateway.admin) para crear configuraciones de API y puertas de enlace. Además, la cuenta de servicio que usa tu puerta de enlace de API (ya sea la cuenta de servicio predeterminada de Compute Engine o una cuenta de servicio administrada por el usuario especificada cuando se crea la configuración de la API) debe tener el rol de usuario de Vertex AI (roles/aiplatform.user) para acceder a los modelos de destino. - Verifica la disponibilidad del modelo y el acceso al extremo: Verifica que tus modelos enrutables sean modelos abiertos implementados previamente para el modelo como servicio (MaaS) en Vertex AI Model Garden. Todos los modelos a los que hace referencia un solo router deben compartir exactamente el mismo nombre de host. Elige el extremo global (
aiplatform.googleapis.com) o un solo extremo regional (por ejemplo,us-central1-aiplatform.googleapis.com) para cada modelo al que se hace referencia dentro de ese router. - Verifica la elegibilidad de la implementación de la puerta de enlace: No puedes actualizar una puerta de enlace existente implementada sin enrutamiento de modelos para habilitar el enrutamiento de modelos, ni puedes actualizar una puerta de enlace implementada con enrutamiento de modelos para inhabilitar o quitar el enrutamiento de modelos. Para cambiar los modos de enrutamiento, debes crear e implementar una nueva configuración de API y una instancia de puerta de enlace.
- Verifica los Controles del servicio de VPC y la compatibilidad de extremos: Las puertas de enlace de enrutamiento de modelos no admiten los Controles del servicio de VPC ni las configuraciones de extremos de Private Service Connect (PSC). Verifica que tu proyecto de destino y las instancias de API Gateway no estén restringidos por los perímetros de los Controles del servicio de VPC y que tus modelos usen extremos regionales o globales públicos.
Validación de la configuración
Cuando implementas una configuración de API, el plano de administración de API Gateway valida tu especificación de OpenAPI. El plano de administración rechaza las configuraciones no válidas durante la implementación con un error de validación informativo. El proceso de validación aplica las siguientes reglas:
Verificaciones estructurales y de ubicación
- La extensión
x-google-api-managementy sus bloques asociados (backends,ai.models.routing.routers, routers individuales yrules) deben estar bien formados. Las claves deben coincidir con sus tipos de datos esperados (mapa, lista o cadena). El plano de administración rechaza las discrepancias de tipo con un errorexpected map/list/string. - La extensión
x-google-api-managementdebe contener un bloquebackendsválido cuando se habilita el enrutamiento de modelos. - La extensión
x-google-model-routersolo se admite en las especificaciones de OpenAPI 3.x (no se admite en OpenAPI 2.0 / Swagger). - La extensión
x-google-model-routersolo se puede especificar a nivel de la operación. El plano de administración rechaza explícitamente las definiciones dex-google-model-routercolocadas en el nivel de ruta de acceso o en el nivel raíz (superior). - El bloque
ai.models.routing.routersdebe definirse dentro dex-google-api-managementcada vez que una operación haga referencia ax-google-model-router. - No puedes especificar
x-google-model-routeryx-google-backenden la misma operación de API. - Una especificación de OpenAPI no puede contener una combinación de operaciones de enrutamiento de modelos y de no enrutamiento de modelos. No puedes especificar extensiones de enrutamiento estándar (como
x-google-backend) en algunas operaciones mientras usasx-google-model-routeren otras operaciones dentro de la misma especificación de API.
Verificación del método HTTP
- La extensión
x-google-model-routersolo se puede aplicar a las operaciones que usan el método HTTPPOST. El plano de administración rechaza el enrutamiento de modelos en cualquier otro método HTTP (comoGET,PUToDELETE).
Validez del backend
- Cada backend definido en
x-google-api-management.backendsdebe incluir un campoaddressno vacío. - La
addressdel backend debe ser una URL válida que use el esquemahttpohttps. Para proteger las cargas útiles de instrucciones y las credenciales de autenticación en tránsito a través de extremos públicos o remotos, siempre especifica el esquemahttpscuando definas el campoaddress. - Cada backend definido en
x-google-api-management.backendsy al que hace referencia un router de modelos debe usarpathTranslation: CONSTANT_ADDRESS. El plano de administración rechaza las configuraciones que usanpathTranslation: APPEND_PATH_TO_ADDRESSpara los backends de enrutamiento de modelos porque la traducción de ruta de acceso se ignora en la ruta de acceso del entorno de ejecución del router de modelos. - Los backends de enrutamiento de modelos no admiten los Controles del servicio de VPC ni las configuraciones de extremos de Private Service Connect (PSC). Todos los campos
addressdel backend deben apuntar a extremos de modelos abiertos de MaaS regionales o globales públicos.
Resolución de referencias del router
- El nombre del router al que hace referencia el
x-google-model-routerde una operación debe coincidir con una clave de router válida definida enai.models.routing.routers. - El
backendal que hace referencia eldefaultModelde un router debe coincidir con un backend válido definido enx-google-api-management.backends. - El
backendal que hace referencia cada regla de un router debe coincidir con un backend válido definido enx-google-api-management.backends.
Contenido del router
- Cada router debe definir un
defaultModel. - El
defaultModeldebe incluir un campobackendválido. - El
defaultModeldebe incluir un campotargetModelno vacío. - Cada entrada en
rulesdebe incluir un campomodelno vacío. El valor de cadenadefaultestá reservado y no se puede usar como valormodelde una regla. - Cada entrada en
rulesdebe incluir un campotargetModelno vacío. - Los valores
modeldefinidos en todas las reglas dentro de un solo router deben ser únicos. El plano de administración rechaza los valoresmodelduplicados dentro del mismo router.
Coherencia del host y el esquema del backend
- Todos los backends a los que hace referencia un solo router (incluidos
defaultModel.backendy elbackendde cada regla) deben compartir el mismo nombre de host y esquema de URL. El plano de administración rechaza las configuraciones con nombres de host diferentes o esquemas incoherentes (httpen comparación conhttps) dentro del mismo router, lo que garantiza que el router envíe todas las solicitudes a un extremo de servicio ascendente coherente.
Validación del modelo de destino
- La parte
<provider>de la cadenatargetModel(google,openaioanthropic) y el formato del identificador<provider>/<model>se validan en el momento de la creación de la configuración (implementación). El plano de administración rechaza untargetModelque no tiene el formato<provider>/<model>o cuyo proveedor no esgoogle,openaioanthropiccon un errorInvalidArgument: unsupported publisherdurante la implementación.
Paso 1: Identifica los modelos de destino
Identifica los modelos base de destino y sus URLs de extremos de Vertex AI correspondientes. Todos los modelos enrutables dentro de un router deben compartir un solo nombre de host (para los modelos abiertos de MaaS, este nombre de host es aiplatform.googleapis.com).
Las rutas de acceso de la URL del extremo varían según el proveedor del modelo:
- Google Gemini: Usa el método
:generateContent. - Anthropic Claude: Usa el método
:rawPredict. - OpenAI: Usa la ruta de acceso del extremo
/endpoints/openapi/chat/completions.
En la siguiente tabla, se enumeran los extremos de MaaS que se usan en el ejemplo de especificación de OpenAPI más adelante en esta sección:
| Modelo | URL del extremo |
|---|---|
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 |
Reemplaza YOUR_PROJECT_ID por el ID del Google Cloud proyecto de.
Paso 2: Configura la especificación de OpenAPI 3.x
Crea o actualiza tu especificación de OpenAPI 3.x para definir tus extremos de backend y las configuraciones de enrutamiento de modelos.
En el siguiente ejemplo, se muestra una especificación de OpenAPI 3.0.3 que define dos routers de modelos distintos. Para evitar el desplazamiento horizontal, las URLs largas de direcciones de backend usan la continuación de cadenas de varias líneas entre comillas dobles de 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"
Propiedades de configuración
backends: El objetobackendsenx-google-api-managementdefine todos los extremos de modelos enrutables. Cada nombre de backend representa un nombre de modelo simbólico (por ejemplo,gemini-35-flashlite) que contiene laaddressde destino. El campobackendses una extensión de OpenAPI de Google existente.ai.models.routing: La configuración de enrutamiento de modelos reside enx-google-api-managementcomoai.models.routing, que contiene un mapa de routers con nombre. Cada entrada de mapa define un router de modelos, en el que la clave representa el nombre del router (por ejemplo,gemini-claude-router) y el valor contiene lo siguiente:defaultModel: El destino del modelo de resguardo obligatorio que se usa cuando una carga útil de solicitud entrante no coincide con ninguna regla explícita. Comparte la estructura exacta de una entrada de regla, pero omite el campo de coincidenciamodel. Para las rutas compatibles con OpenAI, cuando una solicitud recurre adefaultModel, el valor detargetModelse reenvía como el atributomodelsaliente en el cuerpo de la solicitud que se envía a Vertex AI.rules: Es un array opcional en el que cada elemento asigna una cadena de modelo de carga útil del cliente a un backend de destino y un modelo de destino.
- Propiedades de la regla: Cada entrada dentro de
rules(y eldefaultModel) define las siguientes propiedades:model(solo reglas): Es el valor de cadena que coincide con el atributomodeldentro de la carga útil de la instrucción JSON entrante del cliente. El router compara el valormodelde la carga útil entrante con esta cadena. Si no coincide con ninguna regla, el router selecciona eldefaultModel. Para las rutas compatibles con OpenAI (en las que el backend de destino es/openapi/chat/completions), esta cadena se reenvía directamente como el atributomodelsaliente en el cuerpo de la solicitud que se envía a Vertex AI. Por lo tanto, para las rutas compatibles con OpenAI, el selectormodeldebe ser un identificador de modelo de publicador válido (por ejemplo,openai/gpt-oss-120b-maas); el uso de un alias comogpt-ossgenera un error400 Malformed publisher modelde Vertex AI.backend: Es el nombre simbólico del backend definido enx-google-api-management.backendsen el que la puerta de enlace envía la instrucción.targetModel: Es el identificador del modelo de destino con el formato<provider>/<model-id>. El router de modelos usa esta cadena para traducir solicitudes y respuestas para el modelo de destino. El prefijo<provider>debe ser exactamentegoogle,openai, oanthropic. El<model-id>debe ser un identificador de modelo de publicador de Vertex AI Model Garden válido. La puerta de enlace repite esta cadena en el campomodelde la respuesta que se muestra al cliente. Los valores de ejemplo incluyen lo siguiente:google/gemini-3.5-flash-litegoogle/gemini-2.5-proopenai/gpt-oss-120b-maasanthropic/claude-opus-4-7
x-google-model-router: Para adjuntar un router de modelos a una ruta de acceso de operación de API, especifica el nombre del router con el atributox-google-model-router. En el ejemplo anterior, una solicitudPOSTenviada a/v1/chat/gemini-claudeinvocagemini-claude-router, que enruta la instrucción según el nombre del modelo especificado en la carga útil de JSON.
Paso 3: Crea e implementa la configuración de la API
Crea una configuración de API con tu especificación de OpenAPI 3.x creada y, luego, implementa la configuración en tu instancia de API Gateway como se describe en Implementa una API en una puerta de enlace.
El plano de administración de API Gateway procesa la configuración de enrutamiento de modelos y activa la capa de enrutamiento. Cuando se completa la implementación de la puerta de enlace, esta está lista para recibir solicitudes de instrucciones con el formato de cargas útiles de JSON compatibles con OpenAI.
Paso 4: Prueba el comportamiento de enrutamiento
Antes de probar tu puerta de enlace, espera a que alcance el estado ACTIVE y, luego, recupera su URL:
gcloud api-gateway gateways describe GATEWAY_ID \
--location=GATEWAY_LOCATION \
--project=PROJECT_ID \
--format='value(defaultHostname)'
Durante la vista previa pública, las puertas de enlace de enrutamiento de modelos muestran un nombre de host *.run.app. Recupera el nombre de host solo después de que la puerta de enlace esté ACTIVE; el valor informado mientras se crea la puerta de enlace no es la URL final.
Prueba el comportamiento de enrutamiento de tu puerta de enlace con curl para enviar solicitudes de instrucciones compatibles con OpenAI a la URL de tu puerta de enlace (https://GATEWAY_URL). En los siguientes ejemplos, $TOKEN representa un token de autenticación válido obtenido con cualquiera de los métodos descritos en Elige un método de autenticación.
Prueba el enrutamiento de reglas explícitas
Envía una instrucción que solicite el modelo de 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."
}
]
}'
Si envías la solicitud a /v1/chat/gemini-claude, se invoca gemini-claude-router. El atributo "model": "claude-opus-4-7" dentro de la carga útil de JSON coincide con la regla explícita en gemini-claude-router, lo que indica a la puerta de enlace que enrute la solicitud al backend anthropic-claude-opus-47.
Prueba el resguardo del modelo predeterminado
Envía una instrucción que especifique un nombre de modelo no coincidente para probar el enrutamiento de resguardo:
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
}'
Si envías la solicitud a /v1/chat/gemini-claude, se invoca gemini-claude-router. Debido a que el atributo "model": "unrecognized-model" no coincide con ninguna regla explícita, la puerta de enlace envía la solicitud al defaultModel configurado del router, el backend gemini-35-flashlite.
Prueba la ruta de acceso alternativa del router
Envía una instrucción que solicite Gemini a través del extremo del router secundario:
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."
}
]
}'
Si envías la solicitud a /v1/chat/openai-gemini, se invoca openai-gemini-router. El atributo "model": "gemini-3.5-flash-lite" coincide con la regla explícita en ese router, lo que indica a la puerta de enlace que enrute la solicitud al backend gemini-35-flashlite. Se puede hacer referencia a un solo backend en varios routers; en esta configuración, gemini-35-flashlite funciona como un destino de regla explícito en openai-gemini-router y como el defaultModel de resguardo en gemini-claude-router.
Observabilidad
El router de modelos está instrumentado para que puedas verificar que tu puerta de enlace esté entregando tráfico, inspeccionar los metadatos por solicitud con Cloud Logging y diagnosticar fallas con Cloud Monitoring.
Cloud Logging
Cada solicitud enrutada a través de la puerta de enlace genera una entrada en el registro de solicitudes estándar de API Gateway ubicado en tu Google Cloud proyecto en:
projects/YOUR_PROJECT_ID/logs/apigateway.googleapis.com%2Frequests
En cada entrada de registro, se incluyen los siguientes campos:
httpRequest.requestUrl,httpRequest.status,httpRequest.latencyapi,apiConfig,apiMethodbackendRequest.hostname: Es el nombre de host del backend de Vertex AI al que se envió la solicitud por proxy.responseDetails: Se propaga con una categoría de error de marca en las fallas del router de modelos (consulta Soluciona problemas de fallas del router de modelos justo debajo).
Para encontrar solicitudes recientes enviadas a una puerta de enlace específica, usa el siguiente filtro de consulta de Cloud Logging:
(resource.type="apigateway.googleapis.com/Gateway" OR resource.type="api")
logName="projects/YOUR_PROJECT_ID/logs/apigateway.googleapis.com%2Frequests"
Cloud Monitoring
La métrica estándar de API Gateway apigateway.googleapis.com/proxy/request_count (BETA) informa el volumen de tráfico de la puerta de enlace desglosado de la siguiente manera:
response_code_class: Uno de2xx,3xx,4xxo5xx.api_config: El nombre de la configuración de la API que usa la puerta de enlace.
Esta métrica te permite verificar el volumen de tráfico general y las tasas de error. Se agregarán métricas específicas del router de modelos (como desgloses por router o por modelo de destino) en una versión futura.
Para hacer un seguimiento de la latencia agregada de las solicitudes, puedes crear una métrica basada en registros a partir del campo httpRequest.latency en el registro de solicitudes.
Soluciona problemas de fallas del router de modelos
Cuando falla una solicitud enrutada a través del router de modelos, el campo responseDetails en la entrada de registro de solicitudes correspondiente indica si la falla ocurrió dentro de la capa del router de modelos. El router de modelos muestra cuatro categorías de marca:
Valor de responseDetails |
Significado | Solución habitual |
|---|---|---|
model_router_application_error |
No se pudo enrutar la solicitud. Por lo general, esto indica una regla faltante, una carga útil que contiene un valor model que no coincide con ninguna regla (sin un defaultModel configurado) o una carga útil de solicitud con formato incorrecto. |
Lado del cliente: Verifica que el parámetro model de tu carga útil coincida con una de las cadenas rule.model en la configuración de tu router o que se defina un resguardo defaultModel. Verifica que el cuerpo de la solicitud sea un JSON válido compatible con OpenAI y que incluya explícitamente un atributo model (durante la versión preliminar pública, un atributo model faltante en la carga útil de la solicitud se procesa de forma incorrecta en lugar de rechazarse). |
model_router_timeout |
El router de modelos superó el tiempo de espera por solicitud. Es posible que la solicitud sea inusualmente grande o compleja, o que haya un cuello de botella de capacidad. | Verifica la complejidad de la solicitud y la configuración de tiempo de espera en los backends. Si el problema persiste en las cargas útiles normales, comunícate con el equipo de asistencia con la marca de tiempo de la solicitud y una muestra de registro.Google Cloud |
model_router_upstream_error |
El modelo de destino ascendente mostró un error HTTP a la puerta de enlace. | Lado del servicio ascendente: Verifica el código de estado y la carga útil del extremo de servicio de Vertex AI de destino. Si esto es inesperado para las solicitudes válidas, abre un caso de asistencia. |
model_router_unavailable |
No se pudo acceder al router de modelos desde la puerta de enlace debido a una falla de transporte o conectividad. | Lado de la plataforma: Abre un caso de asistencia con el Google Cloud equipo de asistencia. |
¿Qué sigue?
- Revisa la arquitectura y los conceptos de enrutamiento de modelos.
- Explora las extensiones de OpenAPI 3.x.