Transparent routing और flight breakdown

पारदर्शी GetVibe राउटर: :alias के माध्यम से स्पष्ट मार्ग या कुंजी की रणनीति के अनुसार स्वचालित मार्ग-चयन। सार्वजनिक उपनाम, विफलता पर वैकल्पिक मार्ग, जानकारी दिखाने/दोष जाँचने के लिए x-getvibe-route हेडर और इतिहास में route/address_as फ़ील्ड।

GetVibe एक transparent router है: आप या तो :alias suffix के ज़रिए स्पष्ट रूप से कोई public variant चुनते हैं, या model name को बिना suffix के छोड़ देते हैं — तब gateway आपकी account/key strategy के अनुसार route चुनता है और failures पर किसी अन्य available variant पर switch हो जाता है। Responses और history में केवल public route identifiers का उपयोग होता है।

दो modes: pin या auto

ParameterTypeविवरण
Explicit pinmodel:alias or model:NRequest हमेशा चुने गए variant से होकर जाता है। Cross-variant failover बंद है: 429/5xx पर error ज्यों का त्यों लौटाया जाता है (उसी variant पर retry की अनुमति है)।
Auto (bare model)केवल model nameGateway variants को account या key settings के हिसाब से चुनता है। 429/5xx और खाली 200 पर यह उसी model के दूसरे variants आज़माता है, cost और input constraints के साथ।
"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)

मूल्य सीमाएँ: max_price और min_price

हर model को अलग-अलग कीमतों पर कई channels serve करते हैं — एक ladder। ये दो request-body parameters बताते हैं कि उस ladder की कौन-सी rungs आपको serve कर सकती हैं। दोनों USD per 1M tokens में हैं — वही unit और वही numbers जो Models page पर दिखते हैं। इनकी तुलना हमारी कीमत से होती है — जो आपसे charge की जाती है — किसी ऐसे wholesale number से कभी नहीं जो आप देख ही नहीं सकते।

ParameterTypeविवरण
max_pricenumber या objectCeiling। एक number दोनों legs को bound करता है; एक object उन्हें अलग-अलग bound करता है: {"input": 0.5, "output": 2}। छोड़ा गया leg unbounded रहता है। Inclusive: published price के बराबर bound उस channel को admit करता है।
min_pricenumber या objectFloor, वही shape। इससे नीचे कीमत वाले channels को अस्वीकार करता है — उन callers के लिए जो book पर सबसे गहरे discount से सर्व नहीं होना चाहते। यह request की लागत केवल बढ़ा सकता है, घटा नहीं सकता।
{
  "model": "deepseek-v4-flash-0731",
  "messages": [{"role": "user", "content": "hi"}],
  "max_price": 0.02,
  "min_price": {"input": 0.001}
}

दोनों legs फिट होने चाहिए, input और output — कभी भी दोनों का औसत नहीं। जो channel input पर सस्ता और output पर महंगा है, वह single-number bound को पूरा नहीं करता।

एक स्थायी सीमा, जो cabinet में एक बार सेट की जाती है

Ceiling को हर call पर दोहराना ज़रूरी नहीं है। Dashboard हर API key और हर model के लिए एक रखता है, साथ ही एक default जो उन सभी models को कवर करता है जिन्हें आपने स्पष्ट रूप से सेट नहीं किया, और API इसे हर request पर पढ़ता है। जो request max_price लेकर आती है वह उस एक call के लिए उसी value का उपयोग करती है; जो request कुछ नहीं लेकर आती वह आपका stored ceiling उपयोग करती है। Precedence, सबसे विशिष्ट पहले:

ParameterTypeविवरण
max_price in the requestप्रति callयह केवल इसी request के लिए stored ceiling को बदलता है — पूरी तरह से, न कि leg दर leg मिलाकर।
key + modelstoredइस model के लिए इस API key की ceiling।
account + modelstoredइस model के लिए आपके account का ceiling, जिसका उपयोग वे keys करती हैं जो कोई ceiling set नहीं करतीं।
key / account defaultstoredहर उस model के लिए catch-all ceiling जिसका अपना कोई ceiling नहीं है।
Ceiling और channel filter दो अलग controls हैं और वे साथ मिलकर काम करते हैं। Channel order और exclusions तय करते हैं कि कौन-से channels आपकी सेवा कर सकते हैं; ceiling तय करता है कि उनके अंदर कौन-सी price rung request भर सकती है। इनमें से कोई एक, दोनों या कोई भी सेट न करें। अकेला channel filter आपकी price को सीमित नहीं कर सकता: एक channel एक ही model को एक साथ कई prices पर दे सकता है, इसलिए channels को बाहर करने से यह कभी तय नहीं होता कि सबसे सस्ता channel आख़िर में कितना charge करेगा।

जिन prices को आप bound कर रहे हैं, उन्हें कहाँ पढ़ें

GET /api/catalog हर model के लिए एक channels array प्रकाशित करता है: हर उस channel के लिए एक entry जिस पर कोई request पहुँच सकती है, सबसे सस्ता पहले, हर एक के साथ वह address जिससे आप उसे pin कर सकते हैं, उसका प्रति 1M tokens inputUsd / outputUsd price और क्या वह default है। यही वे exact numbers हैं जिनसे max_price और min_price की तुलना होती है, और यही वे exact numbers हैं जिन पर आपसे billing होती है — एक list, तीन नहीं।

curl -s https://getvibeapi.com/api/catalog   | jq '.[] | select(.apiModel=="z-ai/glm-5.3") | .channels'

आपसे किस बात का बिल लिया जाता है

आपको उस channel के लिए bill किया जाता है जिसने वास्तव में request serve की, साथ में हमारा fixed markup — उस ceiling के लिए नहीं जो आपने set किया, और कभी उससे ज़्यादा नहीं। अगर आप किसी price पर cap करते हैं और request किसी सस्ते rung पर fill हो जाती है, तो आप सस्ते वाले का भुगतान करते हैं। Model page पर ladder एक range दिखाता है, और “from” वाला figure सबसे सस्ता rung है जो मौजूद है — यह एक असली price है जो आपसे charge हो सकती है, यह वादा नहीं कि यह request उसी पर पड़ेगी। जब आपको guaranteed upper bound चाहिए तो max_price set करें।

जब कुछ भी फ़िट न हो

Request refused है: HTTP 422 के साथ "type": "price_bound_no_lane", जिसमें उस model के लिए सबसे सस्ते और सबसे महँगे channel की कीमतें और पूरी channels सूची दी जाती है, ताकि आप अनुमान लगाने के बजाय संख्याओं से bound चुन सकें। lowest_passing_usd_per_million वह सबसे छोटा bound है जो अभी किसी channel को स्वीकार करता है — एक ही channel की अपनी जोड़ी, इसलिए इसे भेजने पर पास हो जाता है (दोनों cheapest legs अलग-अलग channels से आ सकते हैं)। यही field तब भी दिखाई देता है जब exchange ने खुद आपका bound अस्वीकार कर दिया हो: तब यह अगला price level होता है जिसमें अब भी supply है, और यह कभी भी आपके भेजे गए bound से कम नहीं होता। जब आपका bound नहीं limit था — channel के लिए हमारी अपनी purchase ceiling थी, और उसके नीचे के offers busy या drained थे — तो जवाब इसके बजाय HTTP 503 "type": "no_seller_available" होता है, जिसमें Retry-After होता है और कोई suggested price नहीं: max_price बढ़ाने से मदद नहीं मिलेगी, थोड़ी देर बाद retry करने से मिल सकती है। सबसे सस्ती rung में अक्सर एक ही offer होता है जो busy होता है, इसलिए भरोसेमंद fills के लिए bound को model के priceTypical पर या उससे ऊपर सेट करें, जहाँ ज़्यादातर supply होती है। हम कभी चुपचाप कोई महँगा channel serve नहीं करते, और कभी किसी दूसरे model को substitute नहीं करते। Malformed value — कोई string, शून्य, ऋणात्मक संख्या, अज्ञात field — 400 invalid_request_error होती है, कभी चुपचाप नज़रअंदाज़ नहीं की जाती।

{
  "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}
    ]
  }
}
मूल्य सीमाएँ बेयर मॉडल और स्पष्ट pin दोनों पर लागू होती हैं। ऐसे pin पर जो स्वयं सीमा से बाहर है, आपको pin का नाम लेते हुए वही 422 मिलता है — आपके लिए pin को कभी किसी अन्य channel पर नहीं भेजा जाता।

वे pool नाम जिन्हें आप पिन कर सकते हैं

Vendor subscription pool से served channels नाम से addressable हैं। नाम को colon के बाद लिखें, बिल्कुल किसी अन्य alias की तरह:

"model": "gpt-6.1-sol:codex"         // pin a subscription pool
"model": "claude-opus-5.5:claude-code"  // pin the Claude Code pool
पता-निर्धारण योग्य पूल
ParameterTypeविवरण
:codexpoolइस pool को नाम से address करें। :openai-codex भी स्वीकार्य है।
:qwencloudpoolइस pool को नाम से address करें। :alibaba-qwencloud भी स्वीकार्य है।
:zaipoolइस pool को नाम से address करें। :z-ai-glm-coding-plan भी स्वीकार्य है।
:claude-codepoolइस pool को नाम से address करें।
:antigravitypoolइस pool को नाम से address करें।
:grokpoolइस pool को नाम से address करें।
:codebuddypoolइस pool को नाम से address करें।
:codebuddy-cnpoolइस pool को नाम से address करें।
:clinepasspoolइस pool को नाम से address करें।
:command-codepoolइस pool को नाम से address करें। :commandcode भी स्वीकार्य है।
:opencodepoolइस pool को नाम से address करें। :opencode-go भी स्वीकार्य है।
:mimopoolइस pool को नाम से address करें।
:kiro-poolpoolइस pool को नाम से address करें।
:meta-aipoolइस pool को नाम से address करें।
:minimax-cnpoolइस pool को नाम से address करें।
:qwencloud-alibaba-cnpoolइस pool को नाम से address करें।
:marketplacepoolइस pool को नाम से address करें। :bare-marketplace-alias भी स्वीकार्य है।
:nouspoolइस pool को नाम से address करें।
ये पठनीय नाम ही इस deployment द्वारा घोषित एकमात्र spellings हैं। migration window के दौरान एक पुराना छोटा letter रूप अब भी resolve होता है और हर response पर घोषित किया जाता है (x-pv-deprecated-alias / x-pv-use-instead), लेकिन यहाँ कभी नहीं दिखाया जाता और नई integrations को नाम का ही उपयोग करना चाहिए। प्रत्येक pool एक channel है जिसकी अपनी price ladder है; अंक पर समाप्त होने वाली एक पुरानी band spelling (:claude-code-2) अब भी उसी pool पर resolve होती है।

सार्वजनिक उपनाम (:alias)

Colon के बाद का suffix एक public route identifier है, कोई upstream नाम नहीं। किसी विशिष्ट model की पूरी सूची catalog में है (Models, «In API» column)। मुख्य aliases:

ParameterTypeविवरण
:yellowaliasकई मॉडलों के लिए उपलब्ध एक सार्वजनिक प्रकार; इसकी कीमत सूची में है।
:codex / :claude-code / …aliasसदस्यता पूल, जिनके नाम ऊपर “पूल के नाम जिन्हें आप पिन कर सकते हैं” में दिए गए हैं।
:pixel / :flowaliasMedia routes (images/video), chat नहीं।
किसी एक model के variants के बारे में अधिक जानकारी — Models → Providers अनुभाग में। यदि किसी model के लिए suffix उपलब्ध नहीं है, तो request 400 लौटाता है।

कुंजी की सेटिंग्स

auto अनुरोधों (केवल मॉडल नाम) के लिए प्रत्येक API कुंजी पर निम्नलिखित सेट किए जाते हैं (डैशबोर्ड → API कुंजियाँ):

ParameterTypeविवरण
routingStrategystringpriority (default) — providerPriority का क्रम, अन्यथा catalog में पहला variant; price — हमारे लिए सबसे सस्ता variant; latency — हाल के measurements के अनुसार सबसे तेज़; default — सख़्ती से पहला eligible variant।
providerPrioritylistआंतरिक प्रदाता टैग की प्राथमिकता (डैशबोर्ड में आसानी से पढ़े जा सकने वाले नाम)। strategy=priority के साथ उपयोग की जाती है।
disabledProviderslistप्रदाताओं को स्वचालित रूटिंग से बाहर रखें। यदि वैरिएंट मौजूद है, तो स्पष्ट रूप से दिए गए :alias को अब भी कॉल किया जा सकता है।
cacheOnlybooleanकेवल prompt-cache support वाले variants — दोहराए जाने वाले prefix के लिए अच्छे।
सेटिंग्स केवल स्पष्ट प्रत्यय के बिना किए गए अनुरोधों पर लागू होती हैं। कुंजी का फ़ील्ड खाली होने का अर्थ है कि डिफ़ॉल्ट लागू होगा। allowedModels और नीचे दी गई तालिका में सीमाएँ भी देखें।

रूटिंग रणनीति

ParameterTypeविवरण
priority (default)strategyसामान्य default route।
pricestrategyमॉडल के लिए उपलब्ध वेरिएंट्स में से सबसे कम कीमत वाला चुनें।
latencystrategyहाल के मापों के आधार पर सबसे तेज़ variant चुनें।
cacheOnlybooleanकेवल cache-enabled variants — दोहराए जाने वाले prompt prefix के लिए अच्छे।
रणनीति केवल डिफ़ॉल्ट अनुरोधों पर लागू होती है। यदि आप प्रत्यय के साथ स्पष्ट रूप से कोई वैरिएंट सेट करते हैं (जैसे :yellow), तो उसे हमेशा मान्य रखा जाता है और रूटिंग उसे नहीं बदलती। इसे डैशबोर्ड → API कुंजियाँ में प्रत्येक कुंजी के लिए कॉन्फ़िगर किया जाता है।

स्पष्ट provider चयन

Colon के बाद एक provider alias जोड़ें — routing strategy की परवाह किए बिना इसका पालन होता है। Aliases की पूरी सूची और उदाहरण — Models → Providers section में।

"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 channel

Key सीमाएँ

प्रत्येक API key के लिए आप dashboard में सेट कर सकते हैं:

ParameterTypeविवरण
allowedModelsमॉडल सूचीइस key से call किए जा सकने वाले models की whitelist। खाली — सभी allowed। सूची से बाहर के model का request 403 पाता है।
routingStrategy / cacheOnlyoverrideइस कुंजी के लिए रणनीति और कैश फ़िल्टर।
limitRubखर्च सीमाkey के लिए spend limit।
allowedIpsIP श्वेतसूचीIP restriction («Authentication» section देखें)।
यह teams और integrations को keys सौंपने के लिए सुविधाजनक है: एक key — केवल सस्ते models के लिए, दूसरी — spend limit के साथ, तीसरी — अपनी strategy के साथ। सब कुछ dashboard में configure होता है।

Failover (केवल auto)

bare model के साथ gateway उसी model के किसी अन्य public variant पर switch कर सकता है, अगर मौजूदा variant ने 429, 5xx या बिना content वाला खाली 200 लौटाया हो। Constraints:

  • images/PDF वाली requests किसी अन्य provider पर switch नहीं की जातीं (vision compatibility)।
  • Failover किसी काफ़ी महँगे variant पर नहीं जाता (strategy=price को छोड़कर)।
  • प्रति client request attempts की संख्या पर एक upper bound है।
  • pin (:alias) के साथ cross-provider failover बंद है — आपको चुने गए route की error मिलती है।

429 पर exponential backoff के साथ retrying का वर्णन Errors and limits में किया गया है।

Flight breakdown — किस route ने request सर्व की

trusted reveal/debug clients के लिए, request पूरी होने के बाद (auto सहित) ऐसे headers उपलब्ध होते हैं जो बताते हैं कि वास्तव में कौन-सा public variant चला। सामान्य clients को यह डेटा नहीं दिया जाता।

विश्वसनीय प्रकटीकरण/डिबग क्लाइंट के लिए प्रतिक्रिया हेडर (चैट / संदेश / प्रतिक्रियाएँ)

ParameterTypeविवरण
x-getvibe-routestringसार्वजनिक मार्ग का उपनाम: yellow, codex, claude-code, …
x-getvibe-modelstringफिर से पिन करने के लिए मॉडल का मान: base या base:alias (जैसे gpt-6.1-sol:yellow)। स्पष्ट रूप से पिन करने पर यह आपकी पसंद से मेल खाता है।
x-pv-generation-idstringHistory record id (non-stream)। 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:yellow

उपयोग इतिहास

GET /v1/generations, GET /v1/usage और dashboard में प्रत्येक record में ये fields होते हैं:

ParameterTypeविवरण
modelstringbase model name (बिना internal suffixes)।
routestring | nullविजेता route का public :alias।
address_asstringRe-pinning के समय model field का ठीक value (जैसे catalog में addressAs)।
cost_detailobjectशुल्क की गणना कैसे हुई: token lines उनकी rate per 1M (lines) के साथ, surcharges (adjustments) और कुल। कोई marketplace channel उस price tier (ladder rung) का बिल लगाता है जिसके seller ने request पूरी की, इसलिए जब वह list rate से भिन्न हो, तो rateBasis "tier" होता है, lines उस tier की rate पर दिखाई जाती हैं और charge तक जुड़ती हैं, और tier उस rate का नाम बताता है। realisedRate {input, output} वह price per 1M है जिस पर request का वास्तव में बिल लगा — इसे model के price ladder (/api/model-ladder) पर खोजें ताकि पता चले कि कौन-सी rung ने request पूरी की; minimumCharge true होता है (और realisedRate null) जब request पर per-request minimum का बिल लगा हो। rung को cap करने के लिए max_price भेजें।
OpenAI-compatible endpoints के response body में upstream brands के model और cost_usd में internal suffixes hidden रहते हैं (reveal exception वाले clients को छोड़कर)। Flight breakdown केवल headers और history में होता है, SDKs को तोड़े बिना।

सीमाएँ

GetVibe request body में upstream providers की «raw» waterfall listing प्रदान नहीं करता। नियंत्रण public :alias, key strategy और model catalog के भीतर auto-failover से होता है। कोई अलग «ignore providers» API या routing ZDR flags नहीं हैं।

GetVibe रूटिंग — :alias, auto-route, फ़ेलओवर, फ़्लाइट विवरण | GetVibe API