त्रुटियाँ और सीमाएँ
GetVibe API error codes: 401 (key), 402 (balance), 403 (IP), 429 (rate limit)। Errors को कैसे handle करें और exponential backoff के साथ retry कैसे करें।
/v1/* पर GetVibe द्वारा produce किए गए errors का एक JSON envelope होता है जिसमें error.message, error.type और error.code होते हैं। message text या third-party service headers को contract की तरह न मानें।
त्रुटि प्रारूप
{
"error": {
"message": "insufficient balance",
"type": "insufficient_quota",
"code": 402,
"request_id": "8d4b6b3a-..."
}
}प्रतिक्रिया कोड
| Parameter | Type | विवरण |
|---|---|---|
401 | authentication_error / 401 | की गुम या विकृत है, या की निष्क्रिय कर दी गई है। क्रेडेंशियल ठीक होने तक पुनः प्रयास न करें। |
402 | insufficient_quota / 402 | कोई उपलब्ध balance या limit नहीं — प्रतीक्षा करने से यह ठीक नहीं होगा। 402 कभी Retry-After नहीं देता और उसका पुनः प्रयास नहीं करना चाहिए: top up करें, या subscription window के reset होने की प्रतीक्षा करें। |
403 | permission_error or policy type / 403 | IP, model या policy request की अनुमति नहीं देती। request या settings बदले बिना दोबारा प्रयास न करें। |
429 | rate_limit_exceeded, inflight_client_cap or rate_limit_error / 429 | आपकी rate limit, आपकी concurrency limit, आपके ही concurrent requests द्वारा कुछ समय के लिए रोका गया balance reservation (कारण reserved_in_flight), या कोई supplier limit। केवल Retry-After के बाद retry करें; 429 का यह अर्थ कभी नहीं कि आपका balance खत्म हो गया है। |
410 | media_endpoint_retired / media_endpoint_retired | केवल /v1/images/edits, /v1/video/generations और /v1/videos (सेवा से हटाए गए)। पुनः प्रयास न करें; /api/media/generate पर स्विच करें। /v1/images/generations सेवा में है। |
413 | invalid_request_error / 413 | केवल Files API: फ़ाइल 50 MiB से बड़ी है। फ़ाइल छोटी करें, फिर नया request बनाएँ। |
503 | overloaded / 503 | Global edge overload। Retry-After: 2 के बाद retry करें। अन्य 503s model या request बदले बिना retryable नहीं हो सकते। |
अनुरोध त्रुटियाँ (400, 413, 422): कोड और समाधान
हर अनुरोध त्रुटि में नीचे दी गई तालिका से एक स्थिर error.code, संबंधित फ़ील्ड वाला error.param (जब मॉडल ने किसी फ़ील्ड का नाम नहीं दिया हो तो null), और error.message के अंत में संबंधित पंक्ति का एक लिंक होता है — Codex और अन्य CLI केवल संदेश दिखाते हैं, इसलिए लिंक भी वहीं दिखाई देता है।
| error.code | error.param | क्या करें |
|---|---|---|
unsupported_parameter | फ़ील्ड का नाम | चयनित मॉडल या चैनल इस पैरामीटर को स्वीकार नहीं करता। इसे अनुरोध से हटाएँ (Codex/IDEs में, config से) और फिर से प्रयास करें। |
invalid_parameter_value | फ़ील्ड का नाम | पैरामीटर मौजूद है, लेकिन इस मॉडल के लिए इसका मान अनुमत नहीं है: उदाहरण के लिए, reasoning चालू होने पर 1 के अलावा temperature, अधिकतम सीमा से ऊपर max_tokens, या जहाँ reasoning बंद नहीं किया जा सकता वहाँ effort "none"। संदेश के अनुसार मान ठीक करें। |
missing_parameter | फ़ील्ड का नाम | एक आवश्यक फ़ील्ड अनुपस्थित या खाली है। इसे जोड़ें। |
invalid_tool_schema | tools[].function.* | टूल परिभाषा अस्वीकार कर दी गई: नामों में केवल लैटिन अक्षर, अंक, "_" और "-" का उपयोग किया जा सकता है; पैरामीटर एक ऐसा JSON Schema होना चाहिए जिसकी रूट `type: "object"` हो। या मॉडल का कोई दूसरा संस्करण चुनें। |
tool_choice_unsupported | tool_choice | मॉडल बाध्य टूल चयन का समर्थन नहीं करता। tool_choice "auto" या "none" भेजें। |
invalid_tool_history | messages / input | इतिहास में परिणाम के बिना एक टूल कॉल है। उसी id के साथ परिणाम जोड़ें, या इतिहास छोटा करते समय कॉल और उसके परिणाम—दोनों को हटा दें। |
invalid_image | — | छवि पढ़ी नहीं जा सकी। पूरी PNG, JPEG, WebP या GIF फ़ाइल भेजें (BMP, TIFF, AVIF और SVG स्वीकार नहीं किए जाते)। |
unsupported_input_modality | — | मॉडल इस प्रकार के अटैचमेंट (PDF, ऑडियो, वीडियो, छवियाँ) स्वीकार नहीं करता। इसे हटाएँ या ऐसा मॉडल चुनें जिसकी कैटलॉग प्रविष्टि में वह इनपुट सूचीबद्ध हो। |
conversation_state_unreadable | — | इतिहास में reasoning किसी दूसरे चैनल द्वारा बनाया गया था। अनुरोध मान्य है; इसे फिर से आज़माएँ और यदि त्रुटि दोबारा होती है, तो नई बातचीत शुरू करें। |
invalid_json | — | अनुरोध का मुख्य भाग JSON नहीं है या अधूरा पहुँचा है। छवियों वाली बहुत लंबी बातचीत के लिए नई बातचीत शुरू करें या इतिहास को संक्षिप्त करें। |
request_too_large | — | अनुरोध बहुत बड़ा है। अटैचमेंट या इतिहास कम करें। |
request_rejected_by_channel | — | मॉडल चैनल ने कारण बताए बिना अनुरोध अस्वीकार कर दिया; अनुरोध स्वयं संभवतः मान्य है। इसे फिर से आज़माएँ; यदि अस्वीकृति दोबारा होती है, तो मॉडल का कोई दूसरा संस्करण (कोलन के बाद वाला प्रत्यय) या बिना प्रत्यय वाला मॉडल चुनें। यदि इससे सहायता न मिले, तो request_id के साथ सहायता से संपर्क करें। |
model_not_available_on_route | — | इस मॉडल के लिए मार्ग सेट अप नहीं किया गया है। कोई दूसरा मॉडल या संस्करण चुनें। |
context_length_exceeded | messages / input / prompt | अनुरोध संदर्भ विंडो में समा नहीं रहा है। इतिहास को संक्षिप्त करें (Codex में: /compact) या बड़ी विंडो वाला मॉडल चुनें। |
content_moderation | — | प्रदाता के सामग्री फ़िल्टर ने अनुरोध या उत्तर को रोक दिया। इसे अलग शब्दों में लिखें या कोई दूसरा मॉडल चुनें। |
invalid_request | — | कारण पहचाना नहीं जा सका। API संदर्भ के अनुसार अनुरोध की जाँच करें; यदि यह सही है, तो प्रतिक्रिया में दिए गए request_id के साथ सहायता से संपर्क करें। |
प्रतिक्रिया हेडर
| Parameter | Type | विवरण |
|---|---|---|
x-pv-cost-rub | string | रूबल लागत का best-effort अनुमान। streams में, x-pv-cost-rub तब उपलब्ध होता है जब input अनुमान ज्ञात हो; अंतिम usage event में pv_cost_rub के लिए x-pv-cost: 1 आवश्यक है। usage history में वास्तविक debit होता है। |
x-pv-generation-id | string | Usage-history record id (GET /v1/generations/{id})। सिर्फ़ non-streaming chat/completions requests के लिए return होता है। |
x-pv-dropped-params | string | Comma से अलग किए गए request parameters जिन्हें चुना गया route स्वीकार नहीं करता और इसलिए वे model को नहीं भेजे गए (जैसे temperature,top_p)। सिर्फ़ तब मौजूद होता है जब कुछ वाक़ई रोका गया हो, answers और errors दोनों पर। हम कभी कोई parameter चुपचाप नहीं हटाते: कोई header न होने का मतलब है कि आपने जो भेजा वह पूरा model तक बिना बदलाव पहुँचा। |
Retry-After | integer | प्रतीक्षा के seconds। Edge इसे 429 rate, 429 concurrency (5), 503 global overload (2) और कुछ transient 402s पर set करता है। हर 429/503 के लिए इसे मान नहीं लिया जाता। |
Response शुरू होने से पहले और बाद के errors
एक slow stream (stream: true) को 5 सेकंड की silence के बाद 200 और : pv-keepalive comments मिलते हैं ताकि connection मृत न लगे; किसी लंबी non-stream request को उसके पहले token के बाद 200 और whitespace मिलते हैं। उसके बाद status बदल नहीं सकता और error body में आती है। अगर आपका client किसी HTTP error पर दूसरे supplier पर fall back करता है, तो x-pv-honest-errors: 1 भेजें (या support से इसे account के लिए enable करने को कहें): तब न कोई keepalive होता है और न पहले response byte से पहले कोई early 200, और हर failure एक सामान्य HTTP status होती है जिसमें JSON body होती है। कीमत पहले token तक silent socket की है; आपका header timeout उसे cover करना चाहिए।
response शुरू होने के बाद आने वाली error एक terminal event होती है: chat के लिए event: error with {"error":{message,type,code,status},"choices":[{"finish_reason":"error"}]} followed by data: [DONE]; /v1/responses के लिए event: response.failed जिसमें वही error होता है; /v1/messages के लिए Anthropic का event: error। code machine cause है और status वह HTTP status है जो response शुरू होने से पहले error का होता।
stream: true) के लिए x-pv-generation-id वापस नहीं किया जाता, क्योंकि billing stream खत्म होने के बाद पूरी होती है। GET /v1/generations के ज़रिए request history देखें।Rate और concurrency limits
दोनों सीमाएँ खाते की वर्तमान शेष राशि पर निर्भर करती हैं और उसकी सभी API कुंजियों पर संयुक्त रूप से लागू होती हैं। श्रेणी की गणना अपने-आप दोबारा होती है: राशि जोड़ने पर सीमा बढ़ जाती है; शेष राशि किसी निर्धारित स्तर से नीचे जाने पर श्रेणी घट जाती है। प्रति मिनट टोकन (TPM) की कोई सीमा नहीं है।
| न्यूनतम शेष राशि | प्रति मिनट अनुरोध (RPM) | समवर्ती अनुरोध |
|---|---|---|
| 0 $ | 300 | 10 |
| 1 $ | 1 100 | 50 |
| 2 $ | 6 600 | 300 |
| 4 $ | 19 800 | 900 |
| 12 $ | 44 000 | 2 000 |
| Parameter | Type | विवरण |
|---|---|---|
429 rate_limit_exceeded | RPM | खाते ने पिछले 60 सेकंड (खिसकती समयावधि) में उतने अनुरोध भेज दिए हैं, जितने उसकी श्रेणी में अनुमत हैं। Retry-After उस समयावधि में कोई स्थान खाली होने तक शेष सेकंडों की संख्या है (कम से कम 1); x-ratelimit-limit-requests आपकी वर्तमान RPM सीमा है। मुख्य भाग: error.cause = key_rate_limited, error.details = { enforced_by: "getvibe", limit, unit: "requests_per_minute", retry_after_seconds }। |
429 inflight_client_cap | concurrency | श्रेणी में जितने अनुरोधों की अनुमति है, उतने पहले से चल रहे हैं। कोई अनुरोध पूरा होने तक अपना स्थान घेरे रखता है; स्ट्रीम अपने अंतिम इवेंट तक उसे घेरे रखती है। Retry-After: 5। मुख्य भाग: error.cause = account_concurrency_limited, error.details = { enforced_by: "getvibe", limit, unit: "parallel_requests", retry_after_seconds: 5 }। |
Personal limit | RPM | यदि खाते के लिए अनुरोधों की व्यक्तिगत सीमा निर्धारित है, तो वह श्रेणी की RPM सीमा को केवल कम कर सकती है, कभी बढ़ा नहीं सकती। |
503 overloaded | service | यह आपकी सीमा नहीं, बल्कि सेवा की सुरक्षा का उपाय है: Retry-After: 2 सभी खातों पर लागू वैश्विक सीमा है, जबकि Retry-After: 1 का अर्थ है कि एक सर्वर व्यस्त है। विराम के बाद फिर प्रयास करें। |
429 from a provider | upstream | error.cause = supplier_rate_limited का अर्थ है कि मॉडल प्रदाता ने अनुरोध पर दर सीमा लागू की है और आपकी अपनी सीमा समाप्त नहीं हुई है; channel_rate_limited किसी प्रदाता चैनल की साझा सीमा है (Retry-After: 10, कुछ भी नहीं भेजा गया)। |
अनुरोधों का पुनः प्रयास
retryable response के लिए पहले Retry-After इस्तेमाल करें, अगर मौजूद हो। header के बिना, किसी भी 429 या 503 को अपने आप retryable न मानें: HTTP status और public error.type जाँचें, non-retryable कारण ठीक करें और केवल transient error के लिए bounded backoff इस्तेमाल करें।
import time, requests
def call_with_retry(url, headers, payload, max_retries=5):
for attempt in range(max_retries):
r = requests.post(url, headers=headers, json=payload)
if r.status_code == 429:
# honor Retry-After, otherwise exponential backoff
wait = int(r.headers.get("Retry-After", 2 ** attempt))
time.sleep(wait)
continue
return r
return r