Routage transparent et ventilation du vol
Le routeur transparent de GetVibe : route explicite via :alias ou routage automatique selon la stratégie de la clé. Alias publics, basculement, en-têtes de révélation/débogage x-getvibe-route et champs route/address_as dans l’historique.
GetVibe est un routeur transparent : vous sélectionnez explicitement une variante publique via le suffixe :alias, ou vous laissez le nom du modèle sans suffixe ; la passerelle sélectionne alors la route en fonction de la stratégie de votre compte et de votre clé et, en cas d’échec, bascule vers une autre variante disponible. Seuls les identifiants de route publics sont utilisés dans les réponses et l’historique.
Deux modes : pin ou auto
| Paramètre | Type | Description |
|---|---|---|
Explicit pin | model:alias or model:N | La requête passe toujours par la variante choisie. Le basculement entre variantes est désactivé : en cas de 429/5xx, l’erreur est renvoyée telle quelle (une nouvelle tentative sur la même variante est autorisée). |
Auto (bare model) | nom du modèle uniquement | La passerelle sélectionne la variante selon les paramètres du compte ou de la clé. En cas de 429/5xx ou de réponse 200 vide, elle essaie d’autres variantes du même modèle, en tenant compte des contraintes de coût et d’entrée. |
"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)Limites de prix : max_price et min_price
Chaque modèle est fourni par plusieurs canaux à des prix différents, comme une échelle. Ces deux paramètres du corps de la requête indiquent quels échelons de cette échelle peuvent vous servir. Tous deux sont exprimés en USD par million de tokens, avec la même unité et les mêmes chiffres que ceux affichés sur la page Models. Ils sont comparés à notre prix, c’est-à-dire ce qui vous est facturé, et jamais à un prix de gros que vous ne pouvez pas voir.
| Paramètre | Type | Description |
|---|---|---|
max_price | nombre ou objet | Plafond. Un nombre encadre les DEUX volets ; un objet les encadre séparément : {"input": 0.5, "output": 2}. Un volet omis n’est pas plafonné. Inclusif : une limite égale à un tarif publié autorise ce canal. |
min_price | nombre ou objet | Plancher, même forme. Refuse les canaux dont le prix lui est INFÉRIEUR — pour les appelants qui préfèrent ne pas être servis par la remise la plus importante du catalogue. Il ne peut qu'augmenter le coût d'une requête, jamais le réduire. |
{
"model": "deepseek-v4-flash-0731",
"messages": [{"role": "user", "content": "hi"}],
"max_price": 0.02,
"min_price": {"input": 0.001}
}Les deux volets doivent être respectés, entrée et sortie — jamais une moyenne des deux. Un canal peu coûteux en entrée et cher en sortie ne respecte pas une limite exprimée par un seul nombre.
Un plafond permanent, défini une seule fois dans le cabinet
Un plafond n’a pas besoin d’être répété à chaque appel. Le tableau de bord en enregistre un par clé API et par modèle, ainsi qu’une valeur par défaut qui couvre chaque modèle pour lequel vous n’avez rien défini explicitement, et l’API le lit à chaque requête. Une requête qui contient max_price utilise cette valeur pour cet appel uniquement ; une requête qui n’en contient pas utilise votre plafond enregistré. Priorité, de la plus spécifique à la plus générale :
| Paramètre | Type | Description |
|---|---|---|
max_price in the request | par appel | Remplace le plafond enregistré uniquement pour cette requête — entièrement, et non fusionné étape par étape. |
key + model | stored | Plafond de cette clé API pour ce modèle. |
account + model | stored | Plafond de votre compte pour ce modèle, utilisé par les clés qui n’en définissent aucun. |
key / account default | stored | Le plafond applicable à tous les modèles qui n’en ont pas de propre. |
Où consulter les prix que vous encadrez
GET /api/catalog publie un tableau channels pour chaque modèle : une entrée par canal sur lequel une requête peut aboutir, du moins cher au plus cher, chacune indiquant l’adresse avec laquelle vous pouvez le fixer, son prix inputUsd / outputUsd par million de tokens et s’il s’agit du canal par défaut. Ce sont les chiffres exacts auxquels max_price et min_price sont comparés, ainsi que les chiffres exacts qui vous sont facturés : une seule liste, et non trois.
curl -s https://getvibeapi.com/api/catalog | jq '.[] | select(.apiModel=="z-ai/glm-5.3") | .channels'Ce qui vous est facturé
Vous êtes facturé pour le canal qui a effectivement traité la requête, augmenté de notre majoration fixe — et non pour le plafond que vous avez défini, sans jamais le dépasser. Si vous fixez un plafond de prix et que la requête est exécutée sur un niveau moins cher, vous payez le moins cher. L’échelle de la page du modèle affiche une fourchette, et le montant « à partir de » correspond au niveau le moins cher existant : il s’agit d’un prix réel qui peut vous être facturé, et non d’une promesse que cette requête sera exécutée à ce niveau. Définissez max_price lorsque vous avez besoin d’une limite supérieure garantie.
Lorsque rien ne convient
La requête est refusée : HTTP 422 avec "type": "price_bound_no_lane", indiquant les prix les plus bas et les plus élevés des canaux pour ce modèle ainsi que la liste complète des channels, afin que vous puissiez choisir une limite à partir des valeurs au lieu de la deviner. lowest_passing_usd_per_million est la limite minimale qui permet d’admettre un canal à cet instant : la propre paire d’un canal ; son envoi réussit donc (les deux branches cheapest peuvent provenir de canaux différents). Le même champ apparaît lorsque l’échange lui-même a refusé votre limite : il s’agit alors du niveau de prix suivant disposant encore d’une offre, et il n’est jamais inférieur à la limite que vous avez envoyée. Lorsque votre limite n’était pas le facteur limitant, mais que le plafond d’achat appliqué par nos soins au canal l’était, et que les offres situées en dessous étaient occupées ou épuisées, la réponse est à la place HTTP 503 "type": "no_seller_available" avec Retry-After et sans prix suggéré : augmenter max_price ne servirait à rien, mais réessayer dans un court instant pourrait fonctionner. Le niveau le moins cher ne contient souvent qu’une seule offre, déjà occupée ; pour obtenir des résultats fiables, définissez donc la limite au niveau ou au-dessus du priceTypical du modèle, là où se trouve la majorité de l’offre. Nous ne fournissons jamais discrètement un canal plus cher et nous ne remplaçons jamais le modèle par un autre. Une valeur mal formée, comme une chaîne, zéro, une valeur négative ou un champ inconnu, est 400 invalid_request_error et n’est jamais ignorée silencieusement.
{
"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}
]
}
}Noms de pools que vous pouvez épingler
Les canaux desservis par un pool d’abonnement fournisseur peuvent être adressés par leur nom. Écrivez le nom après deux-points, exactement comme pour tout autre alias :
"model": "gpt-6.1-sol:codex" // pin a subscription pool
"model": "claude-opus-5.5:claude-code" // pin the Claude Code pool| Paramètre | Type | Description |
|---|---|---|
:codex | pool | Adressez ce pool par son nom. Également accepté : :openai-codex. |
:qwencloud | pool | Adressez ce pool par son nom. Également accepté : :alibaba-qwencloud. |
:zai | pool | Adressez ce pool par son nom. Également accepté : :z-ai-glm-coding-plan. |
:claude-code | pool | Adressez ce pool par son nom. |
:antigravity | pool | Adressez ce pool par son nom. |
:grok | pool | Adressez ce pool par son nom. |
:codebuddy | pool | Adressez ce pool par son nom. |
:codebuddy-cn | pool | Adressez ce pool par son nom. |
:clinepass | pool | Adressez ce pool par son nom. |
:command-code | pool | Adressez ce pool par son nom. Également accepté : :commandcode. |
:opencode | pool | Adressez ce pool par son nom. Également accepté : :opencode-go. |
:mimo | pool | Adressez ce pool par son nom. |
:kiro-pool | pool | Adressez ce pool par son nom. |
:meta-ai | pool | Adressez ce pool par son nom. |
:minimax-cn | pool | Adressez ce pool par son nom. |
:qwencloud-alibaba-cn | pool | Adressez ce pool par son nom. |
:marketplace | pool | Adressez ce pool par son nom. Également accepté : :bare-marketplace-alias. |
:nous | pool | Adressez ce pool par son nom. |
x-pv-deprecated-alias / x-pv-use-instead), mais elle n’est jamais affichée ici et les nouvelles intégrations doivent utiliser le nom. Chaque pool constitue un canal avec sa propre grille tarifaire ; une ancienne graphie de tranche se terminant par un chiffre (:claude-code-2) continue d’être résolue vers ce pool.Alias publics (:alias)
Le suffixe après les deux-points est un identifiant de route public, et non un nom fourni en amont. La liste complète pour un modèle spécifique se trouve dans le catalogue (Models, colonne « In API »). Principaux alias :
| Paramètre | Type | Description |
|---|---|---|
:yellow | alias | Une variante publique proposée pour de nombreux modèles ; son prix figure dans le catalogue. |
:codex / :claude-code / … | alias | Pools d’abonnements, répertoriés par nom dans « Noms des pools que vous pouvez épingler » ci-dessus. |
:pixel / :flow | alias | Routes multimédias (images/vidéo), pas de chat. |
Paramètres de clé
Pour les requêtes auto (modèle nu), les éléments suivants sont définis pour chaque clé API (tableau de bord → clés API) :
| Paramètre | Type | Description |
|---|---|---|
routingStrategy | string | priority (par défaut) — l’ordre de providerPriority, sinon la première variante du catalogue ; price — la variante la moins chère pour nous ; latency — la plus rapide selon les mesures récentes ; default — strictement la première variante éligible. |
providerPriority | list | Priorité des balises de fournisseurs internes (noms lisibles dans le tableau de bord). Utilisée avec strategy=priority. |
disabledProviders | list | Exclure des fournisseurs du routage automatique. Un :alias explicite reste appelable si la variante existe. |
cacheOnly | boolean | Uniquement les variantes prenant en charge prompt-cache : adaptées à un préfixe répété. |
allowedModels et les limites du tableau ci-dessous.Stratégie de routage
| Paramètre | Type | Description |
|---|---|---|
priority (default) | strategy | La route par défaut habituelle. |
price | strategy | Choisissez la variante au prix le plus bas parmi celles disponibles pour le modèle. |
latency | strategy | Choisissez la variante la plus rapide selon les mesures récentes. |
cacheOnly | boolean | Uniquement les variantes avec cache activé : adaptées à un préfixe de prompt répété. |
:yellow) elle est toujours respectée et le routage ne la remplace pas. Configurée par clé dans tableau de bord → clés API.Sélection explicite du fournisseur
Ajoutez un alias de fournisseur après deux-points : il est respecté quelle que soit la stratégie de routage. La liste complète des alias et des exemples se trouve dans la section 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 channelLimites principales
Pour chaque clé API, vous pouvez définir les éléments suivants dans le tableau de bord :
| Paramètre | Type | Description |
|---|---|---|
allowedModels | liste des modèles | Liste blanche des modèles que cette clé peut appeler. Vide — tous sont autorisés. Une requête pour un modèle absent de la liste renvoie 403. |
routingStrategy / cacheOnly | override | La stratégie et le filtre de cache pour cette clé. |
limitRub | limite de dépenses | Limite de dépenses pour la clé. |
allowedIps | Liste blanche d’adresses IP | Restriction d’adresse IP (voir la section « Authentification »). |
Basculement de secours (automatique uniquement)
Avec un modèle nu, la passerelle peut basculer vers une autre variante publique du même modèle si la variante actuelle a renvoyé 429, 5xx ou un 200 vide sans contenu. Contraintes :
- Les requêtes contenant des images/PDF ne sont pas basculées vers un autre fournisseur (compatibilité vision).
- Le basculement de secours ne passe pas à une variante nettement plus chère (sauf strategy=price).
- Le nombre de tentatives par requête client est plafonné.
- Avec pin (
:alias), le basculement entre fournisseurs est désactivé — vous obtenez l’erreur de la route choisie.
La nouvelle tentative avec temporisation exponentielle sur 429 est décrite dans Erreurs et limites.
Détail du routage — quelle route a traité la requête
Pour les clients de confiance destinés à la révélation et au débogage, une fois la requête terminée (y compris en mode automatique), des en-têtes indiquent quelle variante publique a réellement été exécutée. Ces données ne sont pas transmises aux clients ordinaires.
En-têtes de réponse pour les clients de confiance chargés de la révélation et du débogage (chat / messages / responses)
| Paramètre | Type | Description |
|---|---|---|
x-getvibe-route | string | L’alias de la route publique : yellow, codex, claude-code, … |
x-getvibe-model | string | La valeur de model pour réépingler : base ou base:alias (par exemple gpt-6.1-sol:yellow). Avec un épinglage explicite, elle correspond à votre choix. |
x-pv-generation-id | string | ID de l’enregistrement d’historique (non-stream). Voir Solde et historique. |
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:yellowHistorique de l’utilisation
Dans GET /v1/generations, GET /v1/usage et le tableau de bord, chaque enregistrement comporte les champs suivants :
| Paramètre | Type | Description |
|---|---|---|
model | string | Le nom de base du modèle (sans suffixes internes). |
route | string | null | L’alias public :alias de la route gagnante. |
address_as | string | La valeur exacte du champ model lors d’un nouveau pinning (comme addressAs dans le catalogue). |
cost_detail | object | Comment le montant a été calculé : lignes de tokens avec leur tarif par 1M (lignes), majorations (ajustements) et total. Un canal marketplace facture le niveau de prix (échelon) du vendeur qui a traité la requête ; lorsque celui-ci diffère du tarif affiché, rateBasis vaut "tier", les lignes sont affichées au tarif de ce niveau et leur somme correspond au montant facturé, et tier indique le tarif. realisedRate {input, output} correspond au prix par 1M effectivement facturé pour la requête ; consultez-le dans la grille tarifaire du modèle (/api/model-ladder) pour voir quel échelon a traité la requête ; minimumCharge vaut true (et realisedRate vaut null) lorsque la requête a été facturée au minimum par requête. Envoyez max_price pour plafonner l’échelon. |
model et cost_usd restent masqués (sauf pour les clients bénéficiant d’une exception de révélation). La ventilation des routes figure uniquement dans les en-têtes et l’historique, sans perturber les SDK.Limitations
GetVibe ne fournit pas de liste « raw » des fournisseurs en amont dans le corps de la requête. Le contrôle s’effectue via :alias public, la stratégie de clé et l’auto-basculement au sein du catalogue de modèles. Il n’existe pas d’API distincte « ignore providers » ni d’indicateurs ZDR de routage.