त्रुटि व्यवस्थापन
असफल अनुरोधले 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.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 | छवि इनपुट नभएको होस्ट गरिएको ओपन-वेट मोडलमा छवि पठाइयो। |
400 | invalid_request_error | audio and video input are not supported by any hosted model | होस्ट गरिएको ओपन-वेट मोडलमा अडियो वा भिडियो भाग पठाइयो। |
400 | invalid_request_error | <id> does not accept response_format | स्ट्रक्चर्ड आउटपुट नलिने होस्ट गरिएको ओपन-वेट मोडलसँग त्यो माग गरियो। |
400 | invalid_request_error | <id> does not accept response_format json_schema; use json_object | json_object मात्र लिने होस्ट गरिएको ओपन-वेट मोडलमा JSON स्कीमा पठाइयो। |
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | रिजनिङ प्रयास सूचीबद्ध मानहरूमध्ये कुनै होइन। होस्ट गरिएका ओपन-वेट मोडलहरू। |
400 | invalid_request_error | count_tokens is available for the hosted open models; unknown model: <id> | होस्ट गरिएका ओपन-वेट मोडलहरूबाहिरको मोडलका लागि टोकन गणना माग गरियो। |
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 परिवार र होस्ट गरिएका ओपन-वेट मोडलहरू। |
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 | होस्ट गरिएको ओपन-वेट मोडलले स्ट्रिम नगरिने अनुरोधको समय सीमाभन्दा बढी समय लियो। |
जाँच यो क्रममा चल्छ: 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 हेक्साडेसिमल अक्षर। यसलाई लग गर्नुहोस्, र अनुरोधबारे मद्दत माग्दा उल्लेख गर्नुहोस्।