सामग्रीमा जानुहोस्
त्रुटि व्यवस्थापन

त्रुटि व्यवस्थापन

असफल अनुरोधले 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

यसले स्टेटस 400 र यो बडी फर्काउँछ:

400 JSON
{
  "error": {
    "type": "invalid_request_error",
    "message": "unknown model: no-such-model"
  }
}

त्रुटि बडी

दुई प्रकारका बडी छन्। /v1/messages ले Anthropic ढाँचामा जवाफ दिन्छ; अरू हरेक इन्डपोइन्टले OpenAI ढाँचामा। दुवैमा विवरण error.type र error.message मा हुन्छ, त्यसैले एउटै रिडरले सबै इन्डपोइन्टलाई पुग्छ।

401 OpenAI ढाँचा
{
  "error": {
    "type": "authentication_error",
    "message": "Invalid API key",
    "code": "invalid_api_key",
    "param": null
  }
}
401 Anthropic ढाँचा
{
  "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)

स्ट्रिमभित्रका त्रुटिहरू

स्ट्रिमको स्टेटस पहिलो बाइटदेखि नै 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 हेक्साडेसिमल अक्षर। यसलाई लग गर्नुहोस्, र अनुरोधबारे मद्दत माग्दा उल्लेख गर्नुहोस्।