मजकुराकडे जा
त्रुटी हाताळणी

त्रुटी हाताळणी

अयशस्वी झालेली रिक्वेस्ट 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 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)

स्ट्रीममधील त्रुटी

स्ट्रीमचे स्टेटस पहिल्या बाइटपासून 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 हेक्साडेसिमल अक्षरे. तो लॉग करा, आणि रिक्वेस्टबद्दल मदत मागताना त्याचा उल्लेख करा.