கையாளுவதில் பிழை
தோல்வியடையும் கோரிக்கை ஒரு HTTP நிலைக் குறியீட்டையும், பிழை வகை மற்றும் செய்தி கொண்ட JSON body-யையும் தரும். இந்தப் பக்கம் ஒவ்வொரு நிலையையும் பட்டியலிடுகிறது, ஒவ்வொரு API வடிவத்தின் பிழை body-யைக் காட்டுகிறது, எந்தப் பிழைகளை மீண்டும் அனுப்பலாம் என்பதையும் கூறுகிறது.
SDK-கள் நிலைக் குறியீட்டையும் body-யின் புலங்களையும் கொண்ட பிழை object-ஐ எழுப்பும். இந்தக் கோரிக்கை இல்லாத ஒரு மாடலைக் குறிப்பிடுகிறது:
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 மற்றும் இந்த body-யைத் தரும்:
{
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} பிழை body
இரண்டு body-கள் உள்ளன. /v1/messages Anthropic வடிவத்தில் பதிலளிக்கும்; மற்ற ஒவ்வொரு endpoint-ம் OpenAI வடிவத்தில் பதிலளிக்கும். இரண்டிலும் விவரங்கள் error.type மற்றும் error.message-ல் உள்ளன, எனவே ஒரே reader எல்லா endpoint-களுக்கும் போதும்.
{
"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 | கோரிக்கையே தவறு: ஒரு புலம், body, மாடல் id அல்லது மாடல் ஏற்காத உள்ளீடு. மீண்டும் அனுப்பும் முன் கோரிக்கையை மாற்றுங்கள். |
authentication_error | 401 | API key இல்லை, தெரியாதது அல்லது ரத்து செய்யப்பட்டது. |
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: … | body செல்லுபடியாகும் 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 schema அனுப்பப்பட்டது. |
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | reasoning effort பட்டியலிடப்பட்ட மதிப்புகளில் ஒன்றல்ல. ஹோஸ்ட் செய்யப்பட்ட 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 key அனுப்பப்படவில்லை. |
401 | authentication_error | Invalid API key | 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: … | கோரிக்கை body 32 MiB-ஐ விடப் பெரியது. |
415 | invalid_request_error | Expected request with `Content-Type: application/json` | Content-Type header இல்லை, அல்லது அது 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 | stream செய்யாத கோரிக்கையின் நேர வரம்பை விட ஹோஸ்ட் செய்யப்பட்ட open-weight மாடல் அதிக நேரம் எடுத்தது. |
சரிபார்ப்புகள் இந்த வரிசையில் நடக்கும்: API key, கோரிக்கை body, மாடல் id, ஃப்ளட் பாதுகாப்பு, இருப்பு. எனவே தவறான key-யும் தவறான body-யும் கொண்ட கோரிக்கை 401 தரும். 4xx நிலையுடன் மறுக்கப்படும் கோரிக்கைக்குக் கட்டணம் இல்லை.
இருப்பும் ஃப்ளட் பாதுகாப்பும்
ஒவ்வொரு கோரிக்கையும் சமமாக வழங்கப்படுகிறது: rate நிலைகளும் இல்லை, தனி 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 மூன்றையும் சேர்த்து, key-யை அல்ல கணக்கை எண்ணும். நிமிடம் உங்கள் முதல் கோரிக்கையுடன் தொடங்கும்.
அந்த நிமிடத்துக்குள் 121-வது கோரிக்கை Too many requests. Retry in <n>s. தரும், கட்டணம் இல்லை. மறுக்கப்பட்ட கோரிக்கைகளும் கணக்கில் சேரும், எனவே காத்திருக்காமல் மீண்டும் அனுப்பும் கிளையன்ட் நிமிடம் முடியும் வரை மறுக்கப்பட்டுக்கொண்டே இருக்கும். செய்தியில் உள்ள <n> வினாடிகள் காத்திருங்கள்.
இணையாக அனுப்பப்படும் கோரிக்கைகள் இணையாக இருப்பதால் மறுக்கப்படுவதில்லை. அவை வரிசையில் காத்திருந்து முறைப்படி பதிலளிக்கப்படும்.
GET /v1/models மற்றும் டோக்கன் எண்ணிக்கை endpoint-கள் கணக்கில் சேராது.
வரம்புகள் மற்றும் இருப்பு பற்றி மேலும், உங்கள் சொந்த இருப்பையும் பயன்பாட்டையும் எங்கே பார்க்கலாம்: வரம்புகளும் இருப்பும் Keys & usage
எதை மீண்டும் முயற்சிப்பது
அதே கோரிக்கை வெற்றி பெறக்கூடிய போதுதான் மீண்டும் அனுப்புங்கள். OpenAI மற்றும் Anthropic SDK-கள் 429 மற்றும் 5xx பதில்களை ஏற்கனவே தாமாகவே இரண்டு முறை மீண்டும் முயல்கின்றன; அதை மாற்ற max_retries-ஐ (JavaScript-ல் maxRetries) அமையுங்கள்.
| பிழை | மீண்டும் அனுப்பலாமா? | எப்படி |
|---|---|---|
400, 404, 405, 413, 415, 422 | இல்லை. முதலில் கோரிக்கையைத் திருத்துங்கள். | எந்தப் புலம், மாடல் அல்லது உள்ளீடு தவறு என்பதை செய்தி குறிப்பிடும். |
401 | இல்லை. செல்லுபடியாகும் key-ஐப் பயன்படுத்துங்கள். | Keys & usage பக்கத்தில் key-ஐ உருவாக்குங்கள் அல்லது மாற்றுங்கள். |
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 ஆக அமைத்து அனுப்புங்கள்: நேர வரம்பு stream செய்யாத பதில்களுக்கே பொருந்தும். |
இந்த அட்டவணையைப் பின்பற்றும் retry loop:
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); stream-க்குள் பிழைகள்
stream அதன் முதல் பைட்டிலிருந்தே நிலை 200 கொண்டது. அதன் பிறகு ஏற்படும் தோல்வி stream-க்குள் ஒரு நிகழ்வாக வரும்: /v1/chat/completions-ல் error உறுப்பு கொண்ட chunk, /v1/messages-ல் error நிகழ்வு, /v1/responses-ல் response.failed அல்லது error நிகழ்வு. stream-ன் முடிவு நிகழ்வுகள் அதன் பின்னும் வரும். அத்தகைய பதிலைத் தோல்வியாகக் கருதி, 5xx நிலைக்குச் செய்வதுபோல் கோரிக்கையை மீண்டும் அனுப்புங்கள்.
மாடலின் context window-வை விட நீளமான உரையாடல் இவ்வாறு தெரிவிக்கப்படும், வகை invalid_request_error மற்றும் குறியீடு context_length_exceeded உடன். மீண்டும் அனுப்பும் முன் உரையாடலைச் சுருக்குங்கள்.
சரியான frames streaming பகுதியில் விவரிக்கப்பட்டுள்ளன. ஸ்ட்ரீமிங்
கோரிக்கை id-கள்
பிழைகள் உட்பட ஒவ்வொரு பதிலிலும் x-request-id header உண்டு. அது உங்கள் சொந்த x-request-id header-ல் நீங்கள் அனுப்பிய மதிப்பு, எதுவும் அனுப்பாவிட்டால் 12 ஹெக்சாடெசிமல் எழுத்துகள். அதைப் பதிவு செய்து, ஒரு கோரிக்கைக்கு உதவி கேட்கும்போது குறிப்பிடுங்கள்.