Roteamento transparente e detalhamento da execução
O roteador transparente da GetVibe: rota explícita via :alias ou roteamento automático pela estratégia da chave. Aliases públicos, failover, cabeçalhos de exibição/depuração x-getvibe-route e campos route/address_as no histórico.
A GetVibe é um roteador transparente: você escolhe explicitamente uma variante pública por meio do sufixo :alias, ou deixa o nome do modelo sem sufixo; nesse caso, o gateway escolhe a rota de acordo com a estratégia da sua conta/chave e, em caso de falhas, muda para outra variante disponível. Somente identificadores de rota públicos são usados nas respostas e no histórico.
Dois modos: pin ou auto
| Parâmetro | Tipo | Descrição |
|---|---|---|
Explicit pin | model:alias or model:N | A solicitação sempre passa pela variante escolhida. O failover entre variantes está desativado: em caso de 429/5xx, o erro é retornado como está (é permitido repetir a tentativa na mesma variante). |
Auto (bare model) | apenas o nome do modelo | O gateway escolhe a variante de acordo com as configurações da conta ou da chave. Em 429/5xx e em respostas 200 vazias, ele tenta outras variantes do mesmo modelo, respeitando as restrições de custo e 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)Limites de preço: max_price e min_price
Cada modelo é fornecido por vários canais com preços diferentes, formando uma escada. Esses dois parâmetros do corpo da solicitação informam quais degraus dessa escada podem atender você. Ambos são USD por 1M de tokens, a mesma unidade e os mesmos números exibidos na página Models. Eles são comparados com o preço que cobramos de você, nunca com um valor de atacado que você não pode ver.
| Parâmetro | Tipo | Descrição |
|---|---|---|
max_price | número ou objeto | Limite máximo. Um número limita AMBAS as etapas; um objeto as limita separadamente: {"input": 0.5, "output": 2}. Uma etapa omitida não tem limite. Inclusivo: um limite igual a um preço publicado permite esse canal. |
min_price | número ou objeto | Piso, mesma forma. Recusa canais com preço ABAIXO dele — para quem prefere não ser atendido pelo maior desconto disponível. Ele só pode tornar uma solicitação mais cara, nunca mais barata. |
{
"model": "deepseek-v4-flash-0731",
"messages": [{"role": "user", "content": "hi"}],
"max_price": 0.02,
"min_price": {"input": 0.001}
}As duas partes precisam se encaixar, entrada e saída — nunca uma média entre as duas. Um canal barato na entrada e caro na saída não atende a um limite de valor único.
Um limite permanente, definido uma vez no painel
Um teto não precisa ser repetido em todas as chamadas. O dashboard armazena um por chave de API e por modelo, além de um padrão que abrange todos os modelos para os quais você não definiu um valor explicitamente, e a API o lê em todas as solicitações. Uma solicitação que inclui max_price usa esse valor em vez disso apenas nessa chamada; uma solicitação que não inclui nenhum valor usa o teto armazenado. Precedência, da mais específica para a menos específica:
| Parâmetro | Tipo | Descrição |
|---|---|---|
max_price in the request | por chamada | Substitui o limite máximo armazenado somente para esta solicitação — integralmente, sem mesclá-lo etapa por etapa. |
key + model | stored | O limite máximo desta chave de API para este modelo. |
account + model | stored | O teto da sua conta para este modelo, usado pelas chaves que não definem nenhum. |
key / account default | stored | O teto geral para todos os modelos que não têm um teto próprio. |
Onde ler os preços que você está delimitando
GET /api/catalog publica um array channels para cada modelo: uma entrada por canal em que uma solicitação pode ser processada, do mais barato ao mais caro, cada uma com o endereço pelo qual você pode fixá-la, seu preço de inputUsd / outputUsd por 1M de tokens e se é o padrão. Esses são os números exatos contra os quais max_price e min_price são comparados e os números exatos pelos quais você é cobrado — uma lista, não três.
curl -s https://getvibeapi.com/api/catalog | jq '.[] | select(.apiModel=="z-ai/glm-5.3") | .channels'O que é cobrado de você
Você é cobrado pelo canal que realmente atendeu à solicitação, mais nossa margem fixa — não pelo teto que você definiu, e nunca mais do que ele. Se você limitar a um preço e a solicitação for atendida em um nível mais barato, pagará o preço mais barato. A escala na página do modelo mostra uma faixa, e o valor “a partir de” é o nível mais barato existente — é um preço real que poderia ser cobrado de você, não uma promessa de que esta solicitação chegará a ele. Defina max_price quando precisar de um limite superior garantido.
Quando nada se encaixa
A solicitação é recusada: HTTP 422 com "type": "price_bound_no_lane", citando os preços mais baixo e mais alto dos canais para esse modelo e a lista completa de channels, para que você possa escolher um limite com base nos números em vez de tentar adivinhar um. lowest_passing_usd_per_million é o menor limite que admite um canal neste momento — o próprio par de um canal; portanto, enviá-lo funciona (as duas etapas cheapest podem vir de canais diferentes). O mesmo campo aparece quando a própria exchange recusou seu limite: nesse caso, ele é o próximo nível de preço que ainda tem oferta e nunca é inferior ao limite enviado. Quando seu limite não era o fator limitante — o nosso próprio teto de compra para o canal era, e as ofertas abaixo dele estavam ocupadas ou esgotadas — a resposta é HTTP 503 "type": "no_seller_available" com Retry-After e sem preço sugerido: aumentar max_price não ajudaria; tentar novamente em breve talvez ajude. O degrau mais barato geralmente contém uma única oferta que está ocupada; portanto, para preenchimentos confiáveis, defina o limite no nível ou acima do priceTypical do modelo, onde está a maior parte da oferta. Nunca fornecemos silenciosamente um canal mais caro e nunca substituímos outro modelo. Um valor malformado — uma string, zero, um número negativo ou um campo desconhecido — é 400 invalid_request_error, nunca ignorado 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}
]
}
}Nomes de pool que você pode fixar
Os canais atendidos por um pool de assinatura do fornecedor podem ser endereçados pelo nome. Escreva o nome depois de dois-pontos, exatamente como qualquer outro 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 | Descrição |
|---|---|---|
:codex | pool | Acesse este pool pelo nome. Também aceito: :openai-codex. |
:qwencloud | pool | Acesse este pool pelo nome. Também aceito: :alibaba-qwencloud. |
:zai | pool | Acesse este pool pelo nome. Também aceito: :z-ai-glm-coding-plan. |
:claude-code | pool | Acesse este pool pelo nome. |
:antigravity | pool | Acesse este pool pelo nome. |
:grok | pool | Acesse este pool pelo nome. |
:codebuddy | pool | Acesse este pool pelo nome. |
:codebuddy-cn | pool | Acesse este pool pelo nome. |
:clinepass | pool | Acesse este pool pelo nome. |
:command-code | pool | Acesse este pool pelo nome. Também aceito: :commandcode. |
:opencode | pool | Acesse este pool pelo nome. Também aceito: :opencode-go. |
:mimo | pool | Acesse este pool pelo nome. |
:kiro-pool | pool | Acesse este pool pelo nome. |
:meta-ai | pool | Acesse este pool pelo nome. |
:minimax-cn | pool | Acesse este pool pelo nome. |
:qwencloud-alibaba-cn | pool | Acesse este pool pelo nome. |
:marketplace | pool | Acesse este pool pelo nome. Também aceito: :bare-marketplace-alias. |
:nous | pool | Acesse este pool pelo nome. |
x-pv-deprecated-alias / x-pv-use-instead), mas nunca é exibida aqui, e as novas integrações devem usar o nome. Cada pool é um canal com sua própria faixa de preços; uma grafia antiga da faixa terminada em um dígito (:claude-code-2) ainda é resolvida para esse pool.Aliases públicos (:alias)
O sufixo após os dois-pontos é um identificador de rota público, não um nome upstream. A lista completa para um modelo específico está no catálogo (Models, na coluna «In API»). Principais aliases:
| Parâmetro | Tipo | Descrição |
|---|---|---|
:yellow | alias | Uma variante pública oferecida para muitos modelos; o preço está no catálogo. |
:codex / :claude-code / … | alias | Pools de assinatura, listados por nome em “Nomes de pools que você pode fixar” acima. |
:pixel / :flow | alias | Rotas de mídia (imagens/vídeo), não chat. |
Configurações da chave
Para solicitações auto (modelo sem especificação), os itens a seguir são definidos em cada chave de API (dashboard → API keys):
| Parâmetro | Tipo | Descrição |
|---|---|---|
routingStrategy | string | priority (padrão) — a ordem de providerPriority; caso contrário, a primeira variante no catálogo; price — a variante mais barata para nós; latency — a mais rápida segundo medições recentes; default — rigorosamente a primeira variante elegível. |
providerPriority | list | Prioridade das tags internas dos provedores (nomes legíveis exibidos no dashboard). Usada com strategy=priority. |
disabledProviders | list | Exclua provedores do roteamento automático. Um :alias explícito ainda pode ser chamado se a variante existir. |
cacheOnly | boolean | Somente variantes com suporte a prompt-cache — ideais para um prefixo repetido. |
allowedModels e os limites na tabela abaixo.Estratégia de roteamento
| Parâmetro | Tipo | Descrição |
|---|---|---|
priority (default) | strategy | A rota padrão usual. |
price | strategy | Escolha a variante com o menor preço entre as disponíveis para o modelo. |
latency | strategy | Escolha a variante mais rápida com base nas medições recentes. |
cacheOnly | boolean | Somente variantes com cache ativado — ideais para um prefixo de prompt repetido. |
:yellow), ela sempre será respeitada, e o roteamento não a substituirá. Configurada por chave em dashboard → API keys.Seleção explícita de provedor
Adicione um alias de fornecedor após dois-pontos — ele será respeitado independentemente da estratégia de roteamento. A lista completa de aliases e exemplos está na seção 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 principais
Para cada chave de API, você pode definir no dashboard:
| Parâmetro | Tipo | Descrição |
|---|---|---|
allowedModels | lista de modelos | Lista de permissões de modelos que esta chave pode chamar. Vazia — todos são permitidos. Uma solicitação para um modelo fora da lista recebe 403. |
routingStrategy / cacheOnly | override | A estratégia e o filtro de cache desta chave. |
limitRub | limite de gastos | Limite de gastos da chave. |
allowedIps | Lista branca de IP | Restrição de IP (consulte a seção «Autenticação»). |
Failover (somente automático)
Com um modelo simples, o gateway pode mudar para outra variante pública do mesmo modelo se a atual retornar 429, 5xx ou um 200 vazio sem conteúdo. Restrições:
- Solicitações com imagens/PDF não são direcionadas a outro provedor (compatibilidade com visão).
- O failover não usa uma variante significativamente mais cara (exceto strategy=price).
- Há um limite superior para o número de tentativas por solicitação do cliente.
- Com pin (
:alias), o failover entre fornecedores fica desativado — você recebe o erro da rota escolhida.
A tentativa novamente com espera exponencial em 429 é descrita em Erros e limites.
Detalhamento do voo — qual rota atendeu à solicitação
Para clientes confiáveis de reveal/debug, após a conclusão da solicitação (incluindo auto), os cabeçalhos ficam disponíveis e mostram qual variante pública foi realmente executada. Clientes comuns não recebem esses dados.
Cabeçalhos de resposta para clientes confiáveis de reveal/debug (chat / messages / responses)
| Parâmetro | Tipo | Descrição |
|---|---|---|
x-getvibe-route | string | O alias da rota pública: yellow, codex, claude-code, … |
x-getvibe-model | string | O valor de model para refixar: base ou base:alias (por exemplo, gpt-6.1-sol:yellow). Com uma fixação explícita, ele corresponde à sua escolha. |
x-pv-generation-id | string | ID do registro do histórico (sem stream). Consulte Saldo e histórico. |
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:yellowHistórico de uso
Em GET /v1/generations, GET /v1/usage e no dashboard, cada registro tem os campos:
| Parâmetro | Tipo | Descrição |
|---|---|---|
model | string | O nome base do modelo (sem sufixos internos). |
route | string | null | O :alias público da rota vencedora. |
address_as | string | O valor exato do campo de modelo ao fixá-lo novamente (como addressAs no catálogo). |
cost_detail | object | Como a cobrança foi calculada: linhas de tokens com a tarifa por 1M (linhas), sobretaxas (ajustes) e o total. Um canal de marketplace cobra o nível de preço (degrau da escada) cujo vendedor atendeu à solicitação; portanto, quando ele é diferente da tarifa de tabela, rateBasis é "tier", as linhas são exibidas com a tarifa desse nível e somam o valor cobrado, e tier identifica a tarifa. realisedRate {input, output} é o preço por 1M pelo qual a solicitação foi efetivamente cobrada — encontre-o na escada de preços do modelo (/api/model-ladder) para ver qual degrau atendeu à solicitação; minimumCharge é true (e realisedRate é null) quando a solicitação foi cobrada pelo mínimo por solicitação. Envie max_price para limitar o degrau. |
model e cost_usd permanecem ocultos (exceto para clientes com uma exceção de revelação). O detalhamento do flight aparece apenas nos headers e no histórico, sem interromper os SDKs.Limitações
A GetVibe não fornece uma listagem «raw» em cascata dos provedores upstream no corpo da solicitação. O controle é feito por meio de :alias público, estratégia de chave e failover automático dentro do catálogo de modelos. Não existe uma API separada de «ignorar provedores» nem flags de ZDR de roteamento.