Enrutamiento transparente y desglose de la ejecución
El enrutador transparente de GetVibe: especifica la ruta mediante :alias o selecciona la ruta automáticamente según la estrategia de claves. Alias públicos, conmutación por error y los encabezados de revelación/depuración x-getvibe-route, además de los campos route/address_as en el historial.
GetVibe es un enrutador transparente: puedes elegir explícitamente una variante pública mediante el sufijo :alias, o dejar el nombre del modelo sin sufijo; en ese caso, la puerta de enlace elige la ruta según la estrategia de tu cuenta o clave y, cuando se producen errores, cambia a otra variante disponible. En las respuestas y el historial solo se utilizan identificadores de ruta públicos.
Dos modos: pin o auto
| Parámetro | Tipo | Descripción |
|---|---|---|
Explicit pin | model:alias or model:N | La solicitud siempre pasa por la variante elegida. La conmutación por error entre variantes está desactivada: ante 429/5xx, el error se devuelve tal cual (se permite reintentar con la misma variante). |
Auto (bare model) | solo el nombre del modelo | La gateway elige la variante según la cuenta o la configuración de la clave. En respuestas 429/5xx y 200 vacías, intenta usar otras variantes del mismo modelo, teniendo en cuenta las restricciones de costo y entrada. |
"model": "claude-opus-4.8" // auto — key strategy
"model": "claude-opus-4.8:yellow" // pin — :yellow only, no switching to other channels
"model": "claude-opus-4.8:2" // pin — catalog variant #2 (legacy :N syntax)Límites de precio: max_price y min_price
Cada modelo se ofrece a través de varios canales con distintos precios: una escalera. Estos dos parámetros del cuerpo de la solicitud indican qué peldaños de esa escalera pueden atenderte. Ambos están expresados en USD por 1M de tokens, la misma unidad y los mismos números que muestra la página Models. Se comparan con el precio de nuestro servicio, es decir, lo que se te cobra, nunca con un precio mayorista que no puedes ver.
| Parámetro | Tipo | Descripción |
|---|---|---|
max_price | número u objeto | Límite máximo. Un número establece el límite para AMBOS tramos; un objeto los establece por separado: {"input": 0.5, "output": 2}. Un tramo omitido no tiene límite. Es inclusivo: un límite igual a un precio publicado permite ese canal. |
min_price | número u objeto | Piso, con la misma forma. Rechaza los canales con un precio INFERIOR a él, para quienes prefieren no ser atendidos por el mayor descuento disponible. Solo puede hacer que una solicitud cueste más, nunca menos. |
{
"model": "deepseek-v4-flash-0731",
"messages": [{"role": "user", "content": "hi"}],
"max_price": 0.02,
"min_price": {"input": 0.001}
}Ambas partes deben cumplir, entrada y salida, nunca un promedio de las dos. Un canal barato en entrada y caro en salida no cumple un límite de un solo número.
Un límite máximo permanente, establecido una sola vez en el gabinete
No es necesario repetir un límite en cada llamada. El panel almacena uno por clave de API y por modelo, además de un valor predeterminado que cubre todos los modelos que no hayas configurado explícitamente, y la API lo lee en cada solicitud. Una solicitud que incluya max_price usa ese valor en su lugar para esa única llamada; una solicitud que no incluya ninguno usa tu límite almacenado. Prioridad, de la más específica a la menos específica:
| Parámetro | Tipo | Descripción |
|---|---|---|
max_price in the request | por llamada | Reemplaza el límite máximo almacenado solo para esta solicitud: por completo, no fusionado tramo por tramo. |
key + model | stored | Límite máximo de esta clave de API para este modelo. |
account + model | stored | El límite máximo de tu cuenta para este modelo, utilizado por las claves que no establecen ninguno. |
key / account default | stored | El límite general para todos los modelos que no tienen uno propio. |
Dónde consultar los precios que estás delimitando
GET /api/catalog publica un arreglo channels para cada modelo: una entrada por cada canal en el que puede terminar una solicitud, ordenados del más barato al más caro, cada uno con la dirección mediante la que puedes fijarlo, su precio inputUsd / outputUsd por 1M de tokens y si es el predeterminado. Esos son los números exactos contra los que se comparan max_price y min_price, y los números exactos que se te cobran: una lista, no tres.
curl -s https://getvibeapi.com/api/catalog | jq '.[] | select(.apiModel=="z-ai/glm-5.3") | .channels'Qué se te cobra
Se te cobra por el canal que realmente atendió la solicitud, más nuestro margen fijo, no por el límite máximo que estableciste, y nunca más que eso. Si estableces un límite de precio y la solicitud se completa en un nivel más barato, pagas el más barato. La escala de la página del modelo muestra un rango, y la cifra “desde” es el nivel más barato existente: es un precio real que se te podría cobrar, no una promesa de que esta solicitud llegará a ese nivel. Establece max_price cuando necesites un límite superior garantizado.
Cuando nada encaja
La solicitud es rechazada: HTTP 422 con "type": "price_bound_no_lane", indicando los precios más bajo y más alto de los canales para ese modelo y la lista completa de channels, para que puedas elegir un límite a partir de los números en lugar de adivinarlo. lowest_passing_usd_per_million es el límite mínimo que admite un canal en este momento: el par propio de un canal, por lo que enviarlo funciona (los dos tramos de cheapest pueden provenir de canales diferentes). El mismo campo aparece cuando el propio intercambio rechazó tu límite: en ese caso, es el siguiente nivel de precio que aún tiene disponibilidad y nunca es inferior al límite que enviaste. Cuando tu límite no era el motivo: el techo de compra propio del canal sí lo era, y las ofertas por debajo estaban ocupadas o agotadas, la respuesta es HTTP 503 "type": "no_seller_available" con Retry-After y sin un precio sugerido: aumentar max_price no ayudaría; volver a intentarlo en breve podría funcionar. El escalón más barato suele contener una sola oferta que está ocupada, así que, para obtener resultados de forma fiable, establece el límite en el priceTypical del modelo o por encima, donde se concentra la mayor parte de la oferta. Nunca servimos silenciosamente un canal más caro ni sustituimos otro modelo. Un valor mal formado, como una cadena, un cero, un número negativo o un campo desconocido, es 400 invalid_request_error y nunca se ignora silenciosamente.
{
"error": {
"message": "No channel of model "deepseek-v4-flash-0731" is priced within your max_price $0.0001 in / $0.0001 out...",
"type": "price_bound_no_lane",
"code": 422,
"param": "max_price",
"cheapest_usd_per_million": {"input": 0.0065, "output": 0.013},
"dearest_usd_per_million": {"input": 0.0528, "output": 0.1584},
"lowest_passing_usd_per_million": {"input": 0.0205, "output": 0.0613},
"channels": [
{"address": "deepseek/deepseek-v4-flash-0731:codebuddy-cn", "label": "codebuddy-cn", "inputUsd": 0.0205, "outputUsd": 0.0613, "isDefault": true},
{"address": "deepseek/deepseek-v4-flash-0731:qwencloud", "label": "qwencloud", "inputUsd": 0.0378, "outputUsd": 0.1132, "isDefault": false}
]
}
}Nombres de grupos que puedes fijar
Los canales servidos desde un grupo de suscripción de un proveedor se pueden direccionar por nombre. Escribe el nombre después de dos puntos, exactamente como cualquier otro alias:
"model": "gpt-6.1-sol:codex" // pin a subscription pool
"model": "claude-opus-5.5:claude-code" // pin the Claude Code pool| Parámetro | Tipo | Descripción |
|---|---|---|
:codex | pool | Dirígete a este grupo por su nombre. También se acepta: :openai-codex. |
:qwencloud | pool | Dirígete a este grupo por su nombre. También se acepta: :alibaba-qwencloud. |
:zai | pool | Dirígete a este grupo por su nombre. También se acepta: :z-ai-glm-coding-plan. |
:claude-code | pool | Dirígete a este grupo por su nombre. |
:antigravity | pool | Dirígete a este grupo por su nombre. |
:grok | pool | Dirígete a este grupo por su nombre. |
:codebuddy | pool | Dirígete a este grupo por su nombre. |
:codebuddy-cn | pool | Dirígete a este grupo por su nombre. |
:clinepass | pool | Dirígete a este grupo por su nombre. |
:command-code | pool | Dirígete a este grupo por su nombre. También se acepta: :commandcode. |
:opencode | pool | Dirígete a este grupo por su nombre. También se acepta: :opencode-go. |
:mimo | pool | Dirígete a este grupo por su nombre. |
:kiro-pool | pool | Dirígete a este grupo por su nombre. |
:meta-ai | pool | Dirígete a este grupo por su nombre. |
:minimax-cn | pool | Dirígete a este grupo por su nombre. |
:qwencloud-alibaba-cn | pool | Dirígete a este grupo por su nombre. |
:marketplace | pool | Dirígete a este grupo por su nombre. También se acepta: :bare-marketplace-alias. |
:nous | pool | Dirígete a este grupo por su nombre. |
x-pv-deprecated-alias / x-pv-use-instead), pero nunca se muestra aquí y las nuevas integraciones deben usar el nombre. Cada grupo es un canal con su propia escala de precios; una forma de escritura de banda más antigua que termina en un dígito (:claude-code-2) aún se resuelve en ese grupo.Alias públicos (:alias)
El sufijo después de los dos puntos es un identificador de ruta público, no un nombre del proveedor ascendente. La lista completa para un modelo específico está en el catálogo (Models, la columna «In API»). Alias principales:
| Parámetro | Tipo | Descripción |
|---|---|---|
:yellow | alias | Una variante pública disponible para muchos modelos; su precio figura en el catálogo. |
:codex / :claude-code / … | alias | Pools de suscripción, enumerados por nombre en «Nombres de pools que puedes fijar» más arriba. |
:pixel / :flow | alias | Rutas multimedia (imágenes/video), no chat. |
Configuración de la clave
Para las solicitudes auto (modelo sin sufijo), se configura lo siguiente en cada clave de API (panel → Claves de API):
| Parámetro | Tipo | Descripción |
|---|---|---|
routingStrategy | string | priority (predeterminado): el orden de providerPriority o, en su defecto, la primera variante del catálogo; price: la variante más barata para nosotros; latency: la más rápida según las mediciones recientes; default: estrictamente la primera variante elegible. |
providerPriority | list | Prioridad de las etiquetas internas de los proveedores (nombres legibles en el panel). Se usa con strategy=priority. |
disabledProviders | list | Excluye proveedores del enrutamiento automático. Un :alias explícito se puede seguir invocando si la variante existe. |
cacheOnly | boolean | Solo variantes compatibles con prompt-cache; ideales para un prefijo repetido. |
allowedModels y los límites de la tabla de abajo.Estrategia de enrutamiento
| Parámetro | Tipo | Descripción |
|---|---|---|
priority (default) | strategy | La ruta predeterminada habitual. |
price | strategy | Elige la variante con el precio más bajo entre las disponibles para el modelo. |
latency | strategy | Elige la variante más rápida según las mediciones recientes. |
cacheOnly | boolean | Solo variantes con caché habilitada; ideales para un prefijo de prompt repetido. |
:yellow), siempre se respeta y el enrutamiento no la sustituye. Se configura por clave en el panel → Claves de API.Selección explícita del proveedor
Agrega un alias de proveedor después de dos puntos: se respeta independientemente de la estrategia de enrutamiento. La lista completa de alias y ejemplos está en la sección Models → Providers.
"model": "claude-opus-4.8" // auto — key strategy
"model": "claude-opus-4.8:yellow" // explicitly pin the :yellow channel
"model": "claude-opus-4.8:kiro-pool" // explicitly pin the :kiro-pool channelLímites clave
Para cada clave de API puedes configurar en el panel:
| Parámetro | Tipo | Descripción |
|---|---|---|
allowedModels | lista de modelos | Lista de modelos que esta clave puede usar. Vacía: todos están permitidos. Una solicitud para un modelo que no está en la lista recibe 403. |
routingStrategy / cacheOnly | override | La estrategia y el filtro de caché para esta clave. |
limitRub | límite de gasto | Límite de gasto para la clave. |
allowedIps | Lista blanca de IP | Restricción de IP (consulta la sección «Authentication»). |
Conmutación por error (solo automática)
Con un modelo sin especificar, la pasarela puede cambiar a otra variante pública del mismo modelo si la actual devolvió 429, 5xx o un 200 vacío sin contenido. Restricciones:
- Las solicitudes con imágenes/PDF no se cambian a otro proveedor (compatibilidad con visión).
- La conmutación por error no cambia a una variante significativamente más cara (excepto con strategy=price).
- Existe un límite superior para el número de intentos por solicitud del cliente.
- Con pin (
:alias), la conmutación por error entre proveedores está desactivada: recibes el error de la ruta elegida.
El reintento con retroceso exponencial en 429 se describe en Errores y límites.
Desglose del vuelo: qué ruta atendió la solicitud
Para clientes de confianza de revelación/depuración, después de que se completa la solicitud (incluido auto), los encabezados están disponibles y muestran qué variante pública se ejecutó realmente. Los clientes normales no reciben estos datos.
Encabezados de respuesta para clientes de depuración/revelación confiables (chat / messages / responses)
| Parámetro | Tipo | Descripción |
|---|---|---|
x-getvibe-route | string | El alias de la ruta pública: yellow, codex, claude-code, … |
x-getvibe-model | string | El valor de model para volver a fijar: base o base:alias (p. ej., gpt-6.1-sol:yellow). Con una fijación explícita, coincide con tu elección. |
x-pv-generation-id | string | ID del registro del historial (sin streaming). Consulta Balance and history. |
curl -sD - https://getvibeapi.com/v1/chat/completions \
-H "Authorization: Bearer $GETVIBE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-6.1-sol","messages":[{"role":"user","content":"ping"}],"max_tokens":8}' \
-o /dev/null | grep -i getvibe
# x-getvibe-route: yellow
# x-getvibe-model: gpt-6.1-sol:yellowHistorial de uso
En GET /v1/generations, GET /v1/usage y el panel, cada registro tiene los campos:
| Parámetro | Tipo | Descripción |
|---|---|---|
model | string | El nombre del modelo base (sin sufijos internos). |
route | string | null | El :alias público de la ruta ganadora. |
address_as | string | El valor exacto del campo de modelo al volver a fijarlo (como addressAs en el catálogo). |
cost_detail | object | Cómo se calculó el cargo: líneas de tokens con su tarifa por 1M (lines), recargos (adjustments) y el total. Un canal de marketplace cobra el nivel de precio (escalón) cuyo vendedor completó la solicitud; por eso, cuando difiere de la tarifa de lista, rateBasis es "tier", las líneas se muestran con la tarifa de ese nivel y suman el cargo, y tier indica la tarifa. realisedRate {input, output} es el precio por 1M que se cobró realmente por la solicitud; encuéntralo en la escalera de precios del modelo (/api/model-ladder) para ver qué escalón la completó. minimumCharge es true (y realisedRate es null) cuando, en su lugar, a la solicitud se le cobró el mínimo por solicitud. Envía max_price para limitar el escalón. |
model y cost_usd permanecen ocultos (salvo para los clientes con una excepción que los muestra). El desglose de vuelos solo aparece en los encabezados y el historial, sin afectar a los SDK.Limitaciones
GetVibe no proporciona una lista «raw» en cascada de los proveedores ascendentes en el cuerpo de la solicitud. El control se realiza mediante :alias público, la estrategia de claves y el auto-failover dentro del catálogo de modelos. No existe una API independiente de «ignorar proveedores» ni indicadores ZDR de enrutamiento.