त्रुटी हाताळणी
अयशस्वी झालेली रिक्वेस्ट HTTP स्टेटस कोड आणि त्रुटीचा प्रकार व संदेश असलेली JSON बॉडी परत करते. हे पान प्रत्येक स्टेटसची यादी देते, प्रत्येक API फॉरमॅटची त्रुटी बॉडी दाखवते आणि कोणत्या त्रुटींनंतर पुन्हा पाठवणे योग्य आहे ते सांगते.
SDK स्टेटस कोड आणि बॉडीची फील्ड्स असलेला एरर ऑब्जेक्ट देतात. ही रिक्वेस्ट अस्तित्वात नसलेले मॉडेल सांगते:
import openai
from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.shannon-ai.com/v1",
)
try:
client.chat.completions.create(
model="no-such-model",
messages=[{"role": "user", "content": "Hello"}],
)
except openai.APIStatusError as error:
print(error.status_code) # 400
print(error.type) # invalid_request_error
print(error.body["message"]) # unknown model: no-such-model
print(error.response.headers.get("x-request-id")) # the id of this request import OpenAI from "openai";
const client = new OpenAI({
apiKey: "YOUR_API_KEY",
baseURL: "https://api.shannon-ai.com/v1",
});
try {
await client.chat.completions.create({
model: "no-such-model",
messages: [{ role: "user", content: "Hello" }],
});
} catch (error) {
if (!(error instanceof OpenAI.APIError)) throw error;
console.log(error.status); // 400
console.log(error.type); // invalid_request_error
console.log(error.error.message); // unknown model: no-such-model
} curl -i https://api.shannon-ai.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "no-such-model",
"messages": [{"role": "user", "content": "Hello"}]
}' ती स्टेटस 400 आणि ही बॉडी परत करते:
{
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} एरर बॉडी
दोन प्रकारच्या बॉडी आहेत. /v1/messages Anthropic फॉरमॅटमध्ये उत्तर देते; इतर प्रत्येक एंडपॉइंट OpenAI फॉरमॅटमध्ये. दोन्हींमध्ये तपशील error.type आणि error.message मध्ये असतो, त्यामुळे एकच रीडर सर्व एंडपॉइंट्ससाठी चालतो.
{
"error": {
"type": "authentication_error",
"message": "Invalid API key",
"code": "invalid_api_key",
"param": null
}
} {
"type": "error",
"error": {
"type": "authentication_error",
"message": "Invalid API key"
}
} | फील्ड | प्रकार | वर्णन |
|---|---|---|
error.type | string | त्रुटीचा प्रकार. खाली Error types पाहा. |
error.message | string | माणसासाठी एक वाक्य. खालील तक्त्यांतील मजकूर त्यांच्या बदलत्या भागांपर्यंत स्थिर आहे; ते भाग <id>, <n> किंवा … असे दाखवले आहेत. |
error.code | string | null | OpenAI फॉरमॅटच्या काही त्रुटींमध्ये असते: 401 सह invalid_api_key, 413 सह request_too_large, संभाषण खूप लांब असल्यास context_length_exceeded, अन्यथा null किंवा नसते. आधी स्टेटस आणि error.type वरून ठरवा आणि code ला अतिरिक्त माहिती समजा. |
error.param | null | code प्रमाणेच त्याच त्रुटींमध्ये असते. नेहमी null. |
type | string | फक्त Anthropic फॉरमॅट. नेहमी error. |
त्रुटी प्रकार
| प्रकार | स्टेटस | वर्णन |
|---|---|---|
invalid_request_error | 400, 413, 415, 422 | रिक्वेस्टच चुकीची आहे: एखादे फील्ड, बॉडी, मॉडेल id किंवा मॉडेल न घेणारे इनपुट. पुन्हा पाठवण्यापूर्वी रिक्वेस्ट बदला. |
authentication_error | 401 | API की नाही, अज्ञात आहे किंवा रद्द केली आहे. |
not_found_error | 404 | पाथ अस्तित्वात नाही. |
rate_limit_error | 429 | बॅलन्स रिक्वेस्टसाठी पुरेसा नाही, फ्लड प्रोटेक्शनने ती थांबवली, किंवा मॉडेल व्यस्त आहे. संदेश कोणते ते सांगतो. |
api_error | 500, 502, 503, 504 | रिक्वेस्ट बरोबर होती आणि बिघाड आमच्या बाजूला आहे. ती पुन्हा पाठवा. |
server_error | 500 | रिक्वेस्ट बरोबर होती आणि बिघाड आमच्या बाजूला आहे. ती पुन्हा पाठवा. |
स्टेटस कोड
| स्टेटस | प्रकार | संदेश | केव्हा |
|---|---|---|---|
400 | invalid_request_error | Failed to parse the request body as JSON: … | बॉडी वैध JSON नाही. |
400 | invalid_request_error | unknown model: <id> | model हा प्रकाशित id नाही. /v1/responses वर model नसतानाही. |
400 | invalid_request_error | No user message provided | Shannon टियर्स: रिक्वेस्टमध्ये वापरकर्त्याचा मजकूर नाही. |
400 | invalid_request_error | <id> does not accept image input | इमेज इनपुट नसलेल्या होस्ट केलेल्या open-weight मॉडेलला इमेज पाठवली. |
400 | invalid_request_error | audio and video input are not supported by any hosted model | होस्ट केलेल्या open-weight मॉडेलला ऑडिओ किंवा व्हिडिओ भाग पाठवला. |
400 | invalid_request_error | <id> does not accept response_format | स्ट्रक्चर्ड आउटपुट न देणाऱ्या होस्ट केलेल्या open-weight मॉडेलकडे ते मागितले. |
400 | invalid_request_error | <id> does not accept response_format json_schema; use json_object | फक्त json_object घेणाऱ्या होस्ट केलेल्या open-weight मॉडेलला JSON स्कीमा पाठवला. |
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | रीझनिंग प्रयास दिलेल्या मूल्यांपैकी नाही. होस्ट केलेली open-weight मॉडेल्स. |
400 | invalid_request_error | count_tokens is available for the hosted open models; unknown model: <id> | होस्ट केलेल्या open-weight मॉडेल्सबाहेरील मॉडेलसाठी टोकन मोजणी मागितली. |
401 | authentication_error | Missing authentication | API की पाठवली नाही. |
401 | authentication_error | Invalid API key | की अज्ञात आहे, नव्या कीने बदलली गेली, किंवा रद्द केली गेली. |
404 | not_found_error | Not Found | पाथ अस्तित्वात नाही, उदाहरणार्थ /v1/embeddings. |
405 | api_error | Method Not Allowed | पाथ अस्तित्वात आहे, पण या HTTP मेथडसह नाही. |
413 | invalid_request_error | Failed to buffer the request body: … | रिक्वेस्ट बॉडी 32 MiB पेक्षा मोठी आहे. |
415 | invalid_request_error | Expected request with `Content-Type: application/json` | Content-Type हेडर नाही किंवा application/json नाही. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | messages सारखे आवश्यक फील्ड नाही, किंवा एखाद्या फील्डचा JSON प्रकार चुकीचा आहे. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | रिक्वेस्टची आउटपुट मर्यादा तुमच्या उरलेल्या बॅलन्सपेक्षा मोठी आहे. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | फ्लड प्रोटेक्शन: तुमच्या अकाउंटवर एका मिनिटात 120 पेक्षा जास्त रिक्वेस्ट्स. <n> म्हणजे मिनिट संपेपर्यंतचे सेकंद. |
429 | rate_limit_error | Shannon Coder call quota reached. Upgrade your plan at shannon-ai.com/plan | /v1/chat/completions आणि /v1/messages वर shannon-coder-1: तुमच्या प्लॅनचे सध्याच्या 4 तासांच्या विंडोमधील Shannon Coder कॉल्स वापरले गेले आहेत. |
429 | rate_limit_error | Shannon routes are temporarily busy. Please retry. | मॉडेल या क्षणी व्यस्त आहे. |
500 | server_error | The model backend failed to answer. Please retry. | मॉडेलने उत्तर तयार केले नाही. |
500 | server_error | An internal error occurred. Please retry. | रिक्वेस्ट तयार करताना अंतर्गत बिघाड. |
502 | api_error | The model backend failed to answer. Please retry. | मॉडेलने उत्तर तयार केले नाही. Shannon 3 कुटुंब आणि होस्ट केलेली open-weight मॉडेल्स. |
503 | api_error | Could not verify your quota right now. Please retry. | तुमचा बॅलन्स या क्षणी वाचता आला नाही. |
503 | api_error | token counting is temporarily unavailable for this model | या मॉडेलसाठी टोकन मोजणी या क्षणी उपलब्ध नाही. |
504 | api_error | upstream timed out | होस्ट केलेल्या open-weight मॉडेलला स्ट्रीम न केलेल्या रिक्वेस्टच्या वेळ मर्यादेपेक्षा जास्त वेळ लागला. |
तपासण्या या क्रमाने चालतात: API की, रिक्वेस्ट बॉडी, मॉडेल id, फ्लड प्रोटेक्शन, बॅलन्स. त्यामुळे चुकीची की आणि चुकीची बॉडी असलेली रिक्वेस्ट 401 परत करते. 4xx स्टेटसने नाकारलेल्या रिक्वेस्टचे शुल्क लागत नाही.
बॅलन्स आणि फ्लड प्रोटेक्शन
प्रत्येक रिक्वेस्टला समान वागणूक मिळते: रेट टियर्स नाहीत आणि वेगळा API कोटा नाही. तरीही दोन गोष्टींमुळे 429 येऊ शकते, दोन्हीचा प्रकार rate_limit_error. संदेशावरून फरक कळतो.
बॅलन्स
तुमचा बॅलन्स म्हणजे आजचा प्लॅन कोटा, जो 00:00 UTC ला रिसेट होतो, आणि त्यानंतर तुम्ही खरेदी केलेले क्रेडिट. चॅट आणि API एकाच बॅलन्समधून वापरतात.
प्रत्येक रिक्वेस्ट आधी तिची आउटपुट मर्यादा राखून ठेवते: max_tokens, किंवा /v1/responses वर max_output_tokens; दोन्ही न पाठवल्यास 4,096. उत्तर पूर्ण झाल्यावर राखून ठेवलेली रक्कम रिक्वेस्टने प्रत्यक्ष वापरलेल्या रकमेने बदलली जाते. ही रक्कम उरलेल्या बॅलन्समध्ये बसत नसेल, तर मॉडेल सुरू होण्यापूर्वीच रिक्वेस्ट Quota exceeded परत करते.
एकाच वेळी चालणाऱ्या रिक्वेस्ट्स प्रत्येकी स्वतःची रक्कम राखून ठेवतात. त्यामुळे जास्त max_tokens असलेल्या अनेक समांतर रिक्वेस्ट्स प्रत्येक उत्तर लहान असले तरी क्षणभर बॅलन्स संपवू शकतात. कमी max_tokens कमी रक्कम राखून ठेवते.
फ्लड प्रोटेक्शन
फ्लड प्रोटेक्शन प्रति अकाउंट प्रति मिनिट 120 रिक्वेस्ट्सना परवानगी देते. ते की नव्हे तर अकाउंट मोजते, आणि /v1/chat/completions, /v1/responses व /v1/messages एकत्र मोजते. मिनिट तुमच्या पहिल्या रिक्वेस्टपासून सुरू होते.
त्या मिनिटातील 121 व्या रिक्वेस्टला Too many requests. Retry in <n>s. मिळते आणि त्यासाठी काहीही शुल्क लागत नाही. नाकारलेल्या रिक्वेस्ट्सही मोजल्या जातात, त्यामुळे न थांबता पुन्हा पाठवणारा क्लायंट मिनिट संपेपर्यंत नाकारला जात राहतो. संदेशातील <n> सेकंद थांबा.
समांतर पाठवलेल्या रिक्वेस्ट्स समांतर असल्यामुळे नाकारल्या जात नाहीत. त्या रांगेत थांबतात आणि क्रमाने उत्तर मिळते.
GET /v1/models आणि टोकन मोजणी एंडपॉइंट्स मोजले जात नाहीत.
मर्यादा आणि बॅलन्सबद्दल अधिक, आणि स्वतःचा बॅलन्स व वापर कुठे पाहायचा: मर्यादा आणि बॅलन्स की आणि वापर
काय पुन्हा करायचे
तीच रिक्वेस्ट यशस्वी होऊ शकत असेल तेव्हाच ती पुन्हा पाठवा. OpenAI आणि Anthropic SDK 429 आणि 5xx उत्तरे आधीच स्वतःहून दोनदा पुन्हा प्रयत्न करतात; ते बदलण्यासाठी max_retries (JavaScript मध्ये maxRetries) सेट करा.
| त्रुटी | पुन्हा पाठवायचे? | कसे |
|---|---|---|
400, 404, 405, 413, 415, 422 | नाही. आधी रिक्वेस्ट दुरुस्त करा. | संदेशात चुकीचे फील्ड, मॉडेल किंवा इनपुट सांगितलेले असते. |
401 | नाही. वैध की वापरा. | Keys & usage पानावर की तयार करा किंवा बदला. |
429 Too many requests | होय, प्रतीक्षेनंतर. | संदेशातील सेकंद इतका वेळ थांबा, मग तीच रिक्वेस्ट पाठवा. |
429 Quota exceeded | जशी आहे तशी नाही. | max_tokens कमी करा, 00:00 UTC ला दैनिक रिसेटची वाट पाहा, किंवा क्रेडिट जोडा. |
429 Shannon Coder call quota reached | होय, पुढच्या विंडोमध्ये. | विंडो 00:00 UTC पासून दर 4 तासांनी सुरू होतात. दुसरे मॉडेल लगेच उत्तर देते. |
429 … temporarily busy | होय. | काही सेकंद थांबा, नंतर प्रत्येक पुढच्या प्रयत्नाला जास्त वेळ. |
500, 502, 503 | होय. | 1 सेकंद थांबा, मग 2, 4 आणि 8. काही प्रयत्नांनंतर थांबा आणि रिक्वेस्ट id कळवा. |
504 | होय. | stream true सेट करून पाठवा: वेळ मर्यादा स्ट्रीम न केलेल्या उत्तरांना लागू होते. |
या तक्त्याचे पालन करणारा रिट्राय लूप:
import re
import time
import openai
from openai import OpenAI
# max_retries=0: this loop does the retrying, the SDK does not add its own.
client = OpenAI(api_key="YOUR_API_KEY", base_url="https://api.shannon-ai.com/v1", max_retries=0)
def create_with_retry(attempts=5, **request):
for attempt in range(attempts):
try:
return client.chat.completions.create(**request)
except openai.RateLimitError as error:
text = str(error)
flood = re.search(r"Retry in (\d+)s", text)
if flood:
time.sleep(int(flood.group(1))) # flood protection: wait out the minute
elif "temporarily busy" in text:
time.sleep(2 ** attempt)
else:
raise # balance: a wait of seconds does not help
except (openai.InternalServerError, openai.APIConnectionError):
time.sleep(2 ** attempt) # 1, 2, 4, 8 seconds
raise RuntimeError("the request failed after all attempts")
response = create_with_retry(
model="shannon-3",
messages=[{"role": "user", "content": "Hello"}],
)
print(response.choices[0].message.content) import OpenAI from "openai";
// maxRetries: 0 — this loop does the retrying, the SDK does not add its own.
const client = new OpenAI({ apiKey: "YOUR_API_KEY", baseURL: "https://api.shannon-ai.com/v1", maxRetries: 0 });
const sleep = (seconds) => new Promise((resolve) => setTimeout(resolve, seconds * 1000));
async function createWithRetry(request, attempts = 5) {
for (let attempt = 0; attempt < attempts; attempt++) {
try {
return await client.chat.completions.create(request);
} catch (error) {
const text = String(error.message);
const flood = text.match(/Retry in (\d+)s/);
if (error.status === 429 && flood) {
await sleep(Number(flood[1])); // flood protection: wait out the minute
} else if (error.status === 429 && text.includes("temporarily busy")) {
await sleep(2 ** attempt);
} else if (error.status >= 500 || error instanceof OpenAI.APIConnectionError) {
await sleep(2 ** attempt); // 1, 2, 4, 8 seconds
} else {
throw error; // wrong request, wrong key or balance
}
}
}
throw new Error("the request failed after all attempts");
}
const response = await createWithRetry({
model: "shannon-3",
messages: [{ role: "user", content: "Hello" }],
});
console.log(response.choices[0].message.content); स्ट्रीममधील त्रुटी
स्ट्रीमचे स्टेटस पहिल्या बाइटपासून 200 असते. त्यानंतरचे अपयश स्ट्रीममध्येच इव्हेंट म्हणून येते: /v1/chat/completions वर error सदस्य असलेला चंक, /v1/messages वर error इव्हेंट, /v1/responses वर response.failed किंवा error इव्हेंट. स्ट्रीमचे समाप्ती इव्हेंट तरीही येतात. असे उत्तर अयशस्वी समजा आणि 5xx स्टेटसप्रमाणे रिक्वेस्ट पुन्हा पाठवा.
मॉडेलच्या कॉन्टेक्स्ट विंडोपेक्षा लांब संभाषण अशाच प्रकारे कळवले जाते, प्रकार invalid_request_error आणि कोड context_length_exceeded सह. पुन्हा पाठवण्यापूर्वी संभाषण लहान करा.
नेमक्या फ्रेम्सचे वर्णन स्ट्रीमिंगसोबत दिले आहे. स्ट्रीमिंग
रिक्वेस्ट id
प्रत्येक उत्तरात, त्रुटींसह, x-request-id हेडर असतो. तुम्ही स्वतःच्या x-request-id हेडरमध्ये पाठवलेले मूल्य तोच असतो, किंवा काहीच पाठवले नसल्यास 12 हेक्साडेसिमल अक्षरे. तो लॉग करा, आणि रिक्वेस्टबद्दल मदत मागताना त्याचा उल्लेख करा.