දෝෂ
අසාර්ථක වන ඉල්ලීමක් HTTP status code එකක් සහ දෝෂ වර්ගයක් හා පණිවිඩයක් සහිත JSON body එකක් ආපසු දෙයි. මෙම පිටුවේ සෑම status එකක්ම ලැයිස්තුගත කර, සෑම API format එකකම දෝෂ body එක පෙන්වා, නැවත යැවීමට වටින දෝෂ මොනවාදැයි කියයි.
SDKs status code එක සහ body එකේ fields රැගෙන යන error object එකක් raise කරයි. මෙම ඉල්ලීම නොපවතින model එකක් නම් කරයි:
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 status එක සහ මෙම body එක ආපසු දෙයි:
{
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} දෝෂ body එක
Body දෙකක් ඇත. /v1/messages පිළිතුරු දෙන්නේ Anthropic format එකෙනි; අනෙක් සෑම endpoint එකක්ම පිළිතුරු දෙන්නේ OpenAI format එකෙනි. දෙකෙහිම විස්තර error.type සහ error.message හි ඇත, එබැවින් එක reader එකකින් සියලු endpoints සඳහා සේවය කළ හැක.
{
"error": {
"type": "authentication_error",
"message": "Invalid API key",
"code": "invalid_api_key",
"param": null
}
} {
"type": "error",
"error": {
"type": "authentication_error",
"message": "Invalid API key"
}
} | Field | වර්ගය | විස්තරය |
|---|---|---|
error.type | string | දෝෂයේ වර්ගය. පහත Error types බලන්න. |
error.message | string | පුද්ගලයෙකු සඳහා වාක්යයක්. පහත වගුවල ඇති පෙළ <id>, <n> හෝ … ලෙස පෙන්වන විචල්ය කොටස් හැර ස්ථාවරය. |
error.code | string | null | OpenAI format එකේ සමහර දෝෂවල ඇත: 401 සමඟ invalid_api_key, 413 සමඟ request_too_large, සංවාදයක් ඉතා දිගු වූ විට context_length_exceeded, අන් අවස්ථාවල null හෝ නොමැත. පළමුව status එක සහ error.type අනුව තීරණය කර, code අමතර දෙයක් ලෙස සලකන්න. |
error.param | null | code ඇති එම දෝෂවලම ඇත. සෑම විටම null. |
type | string | Anthropic format එකේ පමණි. සෑම විටම error. |
දෝෂ වර්ග
| වර්ගය | Statuses | විස්තරය |
|---|---|---|
invalid_request_error | 400, 413, 415, 422 | ඉල්ලීමම වැරදිය: field එකක්, body එක, model id එක හෝ model එක නොපිළිගන්නා input එකක්. නැවත යැවීමට පෙර ඉල්ලීම වෙනස් කරන්න. |
authentication_error | 401 | API key එක නැත, නොදන්නා හෝ අවලංගු කළ එකකි. |
not_found_error | 404 | Path එක නොපවතී. |
rate_limit_error | 429 | ශේෂය ඉල්ලීමට ප්රමාණවත් නොවේ, flood protection එය නැවැත්වීය, නැතහොත් model එක කාර්යබහුලයි. පණිවිඩය කුමක්දැයි කියයි. |
api_error | 500, 502, 503, 504 | ඉල්ලීම නිවැරදි වූ අතර අසාර්ථකත්වය අපගේ පැත්තේය. එය නැවත යවන්න. |
server_error | 500 | ඉල්ලීම නිවැරදි වූ අතර අසාර්ථකත්වය අපගේ පැත්තේය. එය නැවත යවන්න. |
Status codes
| තත්ත්වය | වර්ගය | පණිවිඩය | කවදාද |
|---|---|---|---|
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 tiers: ඉල්ලීමේ user පෙළක් නැත. |
400 | invalid_request_error | <id> does not accept image input | රූප ආදානය නැති, අපගේ සේවාදායකවල ධාවනය වන open-weight model එකකට රූපයක් යවා ඇත. |
400 | invalid_request_error | audio and video input are not supported by any hosted model | අපගේ සේවාදායකවල ධාවනය වන open-weight model එකකට audio හෝ video කොටසක් යවා ඇත. |
400 | invalid_request_error | <id> does not accept response_format | ව්යුහගත output නැති, අපගේ සේවාදායකවල ධාවනය වන open-weight model එකකින් එය ඉල්ලා ඇත. |
400 | invalid_request_error | <id> does not accept response_format json_schema; use json_object | json_object පමණක් පිළිගන්නා, අපගේ සේවාදායකවල ධාවනය වන open-weight model එකකට JSON schema එකක් යවා ඇත. |
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | Reasoning effort එක ලැයිස්තුගත අගයන්ගෙන් එකක් නොවේ. අපගේ සේවාදායකවල ධාවනය වන open-weight models. |
400 | invalid_request_error | count_tokens is available for the hosted open models; unknown model: <id> | අපගේ සේවාදායකවල ධාවනය වන open-weight models වලින් පිටත model එකක් සඳහා token ගණන් කිරීම ඉල්ලා ඇත. |
401 | authentication_error | Missing authentication | API key එකක් යවා නැත. |
401 | authentication_error | Invalid API key | Key එක නොදන්නා ය, අලුත් එකකින් ප්රතිස්ථාපනය වී ඇත, නැතහොත් අවලංගු කර ඇත. |
404 | not_found_error | Not Found | Path එක නොපවතී, උදාහරණයක් ලෙස /v1/embeddings. |
405 | api_error | Method Not Allowed | Path එක පවතී, නමුත් මෙම HTTP method එකෙන් නොවේ. |
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 වැනි අවශ්ය field එකක් නැත, නැතහොත් field එකක JSON type එක වැරදිය. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | ඉල්ලීමේ output සීමාව ඔබේ ශේෂයේ ඉතිරි ප්රමාණයට වඩා විශාලය. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Flood protection: ඔබේ ගිණුමෙන් විනාඩියකින් ඉල්ලීම් 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 calls භාවිතා කර අවසන්. |
429 | rate_limit_error | Shannon routes are temporarily busy. Please retry. | මෙම මොහොතේ model එක කාර්යබහුලයි. |
500 | server_error | The model backend failed to answer. Please retry. | Model එක පිළිතුරක් නිපදවූයේ නැත. |
500 | server_error | An internal error occurred. Please retry. | ඉල්ලීම සකස් කරන අතරතුර අභ්යන්තර අසාර්ථකත්වයක්. |
502 | api_error | The model backend failed to answer. Please retry. | Model එක පිළිතුරක් නිපදවූයේ නැත. Shannon 3 පවුල සහ අපගේ සේවාදායකවල ධාවනය වන open-weight models. |
503 | api_error | Could not verify your quota right now. Please retry. | මෙම මොහොතේ ඔබේ ශේෂය කියවිය නොහැකි විය. |
503 | api_error | token counting is temporarily unavailable for this model | මෙම මොහොතේ මෙම model එක සඳහා token ගණන් කිරීම ලබා ගත නොහැක. |
504 | api_error | upstream timed out | අපගේ සේවාදායකවල ධාවනය වන open-weight model එකක් stream නොකළ ඉල්ලීමක කාල සීමාවට වඩා වැඩි කාලයක් ගත කළේය. |
පරීක්ෂා ක්රියාත්මක වන්නේ මෙම පිළිවෙලටයි: API key, ඉල්ලීමේ body, model id, flood protection, ශේෂය. එබැවින් වැරදි key එකක් සහ වැරදි body එකක් ඇති ඉල්ලීමකට 401 ලැබේ. 4xx status එකකින් ප්රතික්ෂේප වන ඉල්ලීමකට අය නොකෙරේ.
ශේෂය සහ ඉල්ලීම් ගණන සීමා කිරීම (flood protection)
සෑම ඉල්ලීමකටම එක සමානව සේවය කෙරේ: rate tiers නැත සහ වෙනම API quota නැත. තවමත් 429 පිළිතුරු දිය හැකි දේ දෙකකි, දෙකම rate_limit_error type එක සමඟ. පණිවිඩය මගින් ඒවා වෙන්කර හඳුනාගත හැක.
ශේෂය
ඔබේ ශේෂය යනු 00:00 UTC ට යළි සකසන අද දිනයේ සැලසුම් ප්රමාණයත්, ඉන්පසු ඔබ මිලදී ගත් credit ත් ය. Chat සහ API එකම ශේෂයෙන් ගනී.
සෑම ඉල්ලීමක්ම මුලින්ම එහි output සීමාව වෙන් කර තබයි: max_tokens, නැතහොත් /v1/responses හි max_output_tokens, ඔබ කිසිවක් නොයවන විට 4,096. පිළිතුර සම්පූර්ණ වූ විට, වෙන් කළ ප්රමාණය ඉල්ලීම භාවිතා කළ ප්රමාණයෙන් ප්රතිස්ථාපනය වේ. එම ප්රමාණය ඉතිරි ශේෂයට නොගැළපේ නම්, model එක ආරම්භ වීමට පෙර ඉල්ලීමට Quota exceeded ලැබේ.
එකම වේලාවේ ධාවනය වන ඉල්ලීම් සෑම එකක්ම තමන්ගේම ප්රමාණය වෙන් කරයි. එබැවින් ඉහළ max_tokens සහිත සමාන්තර ඉල්ලීම් බොහොමයක්, සෑම පිළිතුරක්ම කෙටි වුවත්, ටික වේලාවකට ශේෂය සම්පූර්ණයෙන් භාවිතා කළ හැක. අඩු max_tokens අඩුවෙන් වෙන් කරයි.
Flood protection
Flood protection මගින් ගිණුමකට විනාඩියකට ඉල්ලීම් 120ක් ඉඩ දෙයි. එය /v1/chat/completions, /v1/responses සහ /v1/messages එකට ගෙන ගණන් කරන්නේ key එක නොව ගිණුමයි. විනාඩිය ආරම්භ වන්නේ ඔබේ පළමු ඉල්ලීමෙනි.
එම විනාඩිය තුළ ඉල්ලීම් අංක 121 Too many requests. Retry in <n>s. ආපසු දෙන අතර කිසිවක් අය නොකරයි. ප්රතික්ෂේප කළ ඉල්ලීම් ද ගණන් ගැනේ, එබැවින් රැඳී නොසිට නැවත යවන client එකක් විනාඩිය අවසන් වන තුරු ප්රතික්ෂේප වෙමින් පවතී. පණිවිඩයේ ඇති තත්පර <n> රැඳී සිටින්න.
සමාන්තරව යවන ඉල්ලීම් සමාන්තර වීම නිසා ප්රතික්ෂේප නොකෙරේ. ඒවා පෝලිමේ රැඳී සිට පිළිවෙලින් පිළිතුරු ලබයි.
GET /v1/models සහ token ගණන් කිරීමේ endpoints ගණන් නොගනී.
සීමා සහ ශේෂය ගැන තවත්, සහ ඔබේම ශේෂය හා භාවිතය බලන්නේ කොතැනද: සීමා සහ ශේෂය යතුරු සහ භාවිතය
නැවත උත්සාහ කළ යුතු දේ
එම ඉල්ලීමටම සාර්ථක විය හැකි විට පමණක් ඉල්ලීමක් නැවත යවන්න. OpenAI සහ Anthropic SDKs දැනටමත් 429 සහ 5xx පිළිතුරු තනිවම දෙවරක් නැවත උත්සාහ කරයි; එය වෙනස් කිරීමට max_retries (JavaScript හි maxRetries) සකසන්න.
| දෝෂය | නැවත යවන්නද? | කෙසේද |
|---|---|---|
400, 404, 405, 413, 415, 422 | නැත. මුලින් ඉල්ලීම නිවැරදි කරන්න. | පණිවිඩය වැරදි field එක, model එක හෝ input එක නම් කරයි. |
401 | නැත. වලංගු key එකක් භාවිතා කරන්න. | Keys & usage පිටුවේ key එක සාදන්න හෝ ප්රතිස්ථාපනය කරන්න. |
429 Too many requests | ඔව්, රැඳී සිටි පසු. | පණිවිඩයේ ඇති තත්පර ගණන රැඳී සිට, එම ඉල්ලීමම යවන්න. |
429 Quota exceeded | එලෙසම නොවේ. | max_tokens අඩු කරන්න, 00:00 UTC ට දෛනික යළි සැකසීම තෙක් රැඳී සිටින්න, නැතහොත් credit එකතු කරන්න. |
429 Shannon Coder call quota reached | ඔව්, ඊළඟ කවුළුවේදී. | කවුළු 00:00 UTC සිට පැය 4කට වරක් ආරම්භ වේ. වෙනත් model එකක් වහාම පිළිතුරු දෙයි. |
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 එකකට එහි පළමු byte එකේ සිටම 200 status එක ඇත. ඉන්පසු සිදුවන අසාර්ථකත්වයක් stream එක තුළ event එකක් ලෙස පැමිණේ: /v1/chat/completions හි error member එකක් සහිත chunk එකක්, /v1/messages හි error event එකක්, /v1/responses හි response.failed හෝ error event එකක්. Stream එකේ අවසන් events තවමත් ඊට පසුව පැමිණේ. එවැනි පිළිතුරක් අසාර්ථක ලෙස සලකා, 5xx status එකක් මෙන් ඉල්ලීම නැවත යවන්න.
Model එකේ context window එකට වඩා දිගු සංවාදයක් මෙලෙස invalid_request_error type එක සහ context_length_exceeded code එක සමඟ වාර්තා කෙරේ. නැවත යැවීමට පෙර සංවාදය කෙටි කරන්න.
නිවැරදි frames streaming සමඟ විස්තර කර ඇත. ස්ට්රීමිං
ඉල්ලීම් ids
දෝෂ ඇතුළුව සෑම පිළිතුරකම x-request-id header එකක් ඇත. එය ඔබ ඔබේම x-request-id header එකේ යැවූ අගය, නැතහොත් ඔබ කිසිවක් නොයැවූ විට hexadecimal අක්ෂර 12ක් වේ. එය log කර, ඉල්ලීමක් සම්බන්ධයෙන් උදව් ඉල්ලන විට සඳහන් කරන්න.