Алдаа боловсруулах
Амжилтгүй хүсэлт HTTP статус код, мөн алдааны төрөл ба мессежтэй JSON body буцаана. Энэ хуудас бүх статусыг жагсааж, API формат бүрийн алдааны body-г үзүүлж, ямар алдааг дахин илгээх нь утгатайг хэлнэ.
SDK-ууд статус код ба body-ийн талбаруудыг агуулсан алдааны объект үүсгэнэ. Энэ хүсэлт байхгүй загварыг нэрлэсэн:
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 дотор байдаг тул нэг уншигч бүх 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 түлхүүр байхгүй, үл мэдэгдэх эсвэл хүчингүй болгосон. |
not_found_error | 404 | Зам байхгүй. |
rate_limit_error | 429 | Үлдэгдэл хүсэлтийг хангахгүй, flood protection зогсоосон, эсвэл загвар завгүй байна. Мессеж аль нь болохыг хэлнэ. |
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 | Зураг оролт авдаггүй hosted open-weight загварт зураг илгээсэн. |
400 | invalid_request_error | audio and video input are not supported by any hosted model | Hosted open-weight загварт аудио эсвэл видео хэсэг илгээсэн. |
400 | invalid_request_error | <id> does not accept response_format | Бүтэцтэй гаралтыг дэмждэггүй hosted open-weight загвараас хүссэн. |
400 | invalid_request_error | <id> does not accept response_format json_schema; use json_object | Зөвхөн json_object авдаг hosted open-weight загварт JSON schema илгээсэн. |
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | Reasoning effort нь жагсаасан утгуудын нэг биш. Hosted open-weight загварууд. |
400 | invalid_request_error | count_tokens is available for the hosted open models; unknown model: <id> | Hosted 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 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 зэрэг шаардлагатай талбар байхгүй, эсвэл талбар 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. | 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 дуудлага дууссан. |
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 гэр бүл ба hosted 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 | Hosted open-weight загвар stream хийгээгүй хүсэлтийн хугацааны хязгаараас удсан. |
Шалгалт дараах дарааллаар явна: API түлхүүр, хүсэлтийн body, загварын id, flood protection, үлдэгдэл. Иймд буруу түлхүүр ба буруу body-тэй хүсэлт 401 буцаана. 4xx статусаар татгалзсан хүсэлтэд үнэ гарахгүй.
Үлдэгдэл ба flood protection
Хүсэлт бүрт тэгш үйлчилнэ: түвшний хязгаар байхгүй, тусдаа API квот байхгүй. Гэхдээ хоёр зүйл 429 хариулж болно, хоёулаа rate_limit_error төрөлтэй. Мессеж нь аль нь болохыг ялгана.
Үлдэгдэл
Таны үлдэгдэл нь 00:00 UTC-д шинэчлэгддэг өнөөдрийн төлөвлөгөөний эрх, түүний дараа худалдаж авсан зээл юм. Чат ба API нэг үлдэгдлээс авна.
Хүсэлт бүр эхлээд гаралтын хязгаараа нөөцөлнө: max_tokens, /v1/responses дээр max_output_tokens, аль нь ч байхгүй бол 4,096. Хариу дуусахад нөөцөлсөн хэмжээг хүсэлтийн бодитоор ашигласнаар сольно. Хэрэв нөөцлөх хэмжээ үлдсэн үлдэгдэлд багтахгүй бол загвар эхлэхээс өмнө хүсэлт Quota exceeded буцаана.
Зэрэг ажиллаж буй хүсэлт бүр өөрийн хэмжээг нөөцөлнө. Иймд өндөр max_tokens-тэй олон зэрэгцээ хүсэлт хариу бүр богино байсан ч үлдэгдлийг түр дуусгаж болно. Бага max_tokens бага нөөцөлнө.
Flood protection
Flood protection нь бүртгэл тутамд минутад 120 хүсэлт зөвшөөрнө. Түлхүүрээр бус бүртгэлээр тоолж, /v1/chat/completions, /v1/responses, /v1/messages-ийг хамтад нь авна. Минут таны эхний хүсэлтээс эхэлнэ.
Тэр минутын 121 дэх хүсэлт Too many requests. Retry in <n>s. буцааж, үнэ гарахгүй. Татгалзсан хүсэлтүүд мөн тоологддог тул хүлээхгүйгээр дахин илгээдэг клиент минут дуустал татгалзагдсаар байна. Мессеж дэх <n> секундийг хүлээнэ үү.
Зэрэг илгээсэн хүсэлтүүдийг зэрэгцээ гэсэн шалтгаанаар татгалзахгүй. Тэд дараалалд хүлээж, ээлж ээлжээрээ хариулагдана.
GET /v1/models болон токен тоолох endpoint-ууд тоологдохгүй.
Хязгаар ба үлдэгдлийн тухай нэмэлт, мөн өөрийн үлдэгдэл ба хэрэглээг хаанаас харах: Хязгаар ба үлдэгдэл Түлхүүр ба хэрэглээ
Юуг дахин оролдох
Ижил хүсэлт амжилттай болох боломжтой үед л дахин илгээнэ үү. 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 болгож илгээнэ үү: хугацааны хязгаар stream хийгээгүй хариунд үйлчилнэ. |
Энэ хүснэгтийг дагасан дахин оролдох давталт:
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 доторх event хэлбэрээр ирнэ: /v1/chat/completions дээр error гишүүнтэй chunk, /v1/messages дээр error event, /v1/responses дээр response.failed эсвэл error event. Stream-ийн хаалтын event-үүд мөн л дагана. Ийм хариуг амжилтгүй гэж үзэж, 5xx статусын нэгэн адил хүсэлтийг дахин илгээнэ үү.
Загварын контекст цонхоос урт харилцан яриаг ийм байдлаар мэдээлдэг, invalid_request_error төрөл ба context_length_exceeded кодтой. Дахин илгээхээсээ өмнө харилцан яриаг богиносгоно уу.
Яг frame-үүдийг streaming хэсэгт тайлбарласан. Дамжуулалт
Хүсэлтийн id
Хариу бүр, алдаа ч гэсэн x-request-id header-тэй. Энэ нь таны өөрийн x-request-id header-ээр илгээсэн утга, эсвэл илгээгээгүй бол 12 арван зургаатын тэмдэгт. Үүнийг бүртгэж, хүсэлтийн талаар тусламж асуухдаа дурдаарай.