ການຈັດການຂໍ້ຜິດພາດ
ຄຳຮ້ອງຂໍທີ່ລົ້ມເຫຼວຈະສົ່ງ HTTP status code ແລະ body JSON ທີ່ມີປະເພດຂໍ້ຜິດພາດ ແລະ ຂໍ້ຄວາມກັບຄືນ. ໜ້ານີ້ລາຍຊື່ທຸກ status, ສະແດງ body ຂໍ້ຜິດພາດຂອງແຕ່ລະຮູບແບບ API ແລະ ບອກວ່າຂໍ້ຜິດພາດໃດຄຸ້ມຄ່າທີ່ຈະສົ່ງອີກ.
SDK ຍົກ object ຂໍ້ຜິດພາດທີ່ມີ status code ແລະ ຟີລດ໌ຂອງ body. ຄຳຮ້ອງຂໍນີ້ລະບຸ 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"}]
}' ມັນສົ່ງ status 400 ແລະ body ນີ້ກັບຄືນ:
{
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} Error 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: invalid_api_key ກັບ 401, request_too_large ກັບ 413, context_length_exceeded ເມື່ອການສົນທະນາຍາວເກີນໄປ, ນອກນັ້ນເປັນ null ຫຼື ບໍ່ມີ. ໃຫ້ຕັດສິນຈາກ status ແລະ error.type ກ່ອນ ແລ້ວຖື code ເປັນຂໍ້ມູນເພີ່ມເຕີມ. |
error.param | null | ມີໃນຂໍ້ຜິດພາດດຽວກັນກັບ code. ເປັນ null ສະເໝີ. |
type | string | ສະເພາະຮູບແບບ Anthropic. ເປັນ error ສະເໝີ. |
ປະເພດຂໍ້ຜິດພາດ
| ປະເພດ | Status | ຄຳອະທິບາຍ |
|---|---|---|
invalid_request_error | 400, 413, 415, 422 | ຄຳຮ້ອງຂໍເອງຜິດ: ຟີລດ໌, body, id ຂອງ model ຫຼື input ທີ່ model ບໍ່ຮັບ. ແກ້ໄຂຄຳຮ້ອງຂໍກ່ອນສົ່ງອີກ. |
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 code
| ສະຖານະ | ປະເພດ | ຂໍ້ຄວາມ | ເມື່ອໃດ |
|---|---|---|---|
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: ຄຳຮ້ອງຂໍບໍ່ມີຂໍ້ຄວາມຂອງ user. |
400 | invalid_request_error | <id> does not accept image input | ສົ່ງຮູບພາບໄປຫາ hosted open-weight model ທີ່ບໍ່ຮັບ input ຮູບພາບ. |
400 | invalid_request_error | audio and video input are not supported by any hosted model | ສົ່ງສ່ວນສຽງ ຫຼື ວິດີໂອໄປຫາ hosted open-weight model. |
400 | invalid_request_error | <id> does not accept response_format | ຂໍ structured output ຈາກ hosted open-weight model ທີ່ບໍ່ຮອງຮັບຄຸນສົມບັດນີ້. |
400 | invalid_request_error | <id> does not accept response_format json_schema; use json_object | ສົ່ງ JSON schema ໄປຫາ hosted open-weight model ທີ່ຮັບສະເພາະ json_object. |
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | ລະດັບການຄິດຫາເຫດຜົນ (reasoning effort) ບໍ່ແມ່ນໜຶ່ງໃນຄ່າທີ່ລະບຸໄວ້. ໃຊ້ກັບ hosted open-weight models. |
400 | invalid_request_error | count_tokens is available for the hosted open models; unknown model: <id> | ຂໍການນັບ tokens ສຳລັບ model ທີ່ຢູ່ນອກ hosted open-weight models. |
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` | header 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 | ຂີດຈຳກັດ 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 | shannon-coder-1 ໃນ /v1/chat/completions ແລະ /v1/messages: ການເອີ້ນ Shannon Coder ຂອງແຜນທ່ານສຳລັບ window 4 ຊົ່ວໂມງປັດຈຸບັນຖືກໃຊ້ໝົດ. |
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 ແລະ hosted 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 | ການນັບ tokens ບໍ່ສາມາດໃຊ້ໄດ້ກັບ model ນີ້ໃນເວລານີ້. |
504 | api_error | upstream timed out | hosted open-weight model ໃຊ້ເວລາດົນກວ່າຂີດຈຳກັດເວລາຂອງຄຳຮ້ອງຂໍທີ່ບໍ່ແມ່ນ stream. |
ການກວດສອບເຮັດຕາມລຳດັບນີ້: API key, body ຂອງຄຳຮ້ອງຂໍ, id ຂອງ model, flood protection, ຍອດເງິນ. ດັ່ງນັ້ນຄຳຮ້ອງຂໍທີ່ມີ key ຜິດ ແລະ body ຜິດຈະສົ່ງ 401. ຄຳຮ້ອງຂໍທີ່ຖືກປະຕິເສດດ້ວຍ status 4xx ບໍ່ຖືກຄິດເງິນ.
ຍອດເງິນ ແລະ ການປ້ອງກັນຄຳຮ້ອງຂໍຖ້ວມ (flood protection)
ທຸກຄຳຮ້ອງຂໍໄດ້ຮັບການບໍລິການເທົ່າທຽມກັນ: ບໍ່ມີລະດັບ rate ແລະ ບໍ່ມີໂຄວຕາ API ແຍກຕ່າງຫາກ. ແຕ່ມີສອງຢ່າງທີ່ຍັງຕອບ 429 ໄດ້, ທັງສອງມີປະເພດ rate_limit_error. ຂໍ້ຄວາມບອກໃຫ້ແຍກຄວາມແຕກຕ່າງ.
ຍອດເງິນ
ຍອດເງິນ ຂອງທ່ານແມ່ນໂຄວຕາປະຈຳວັນຂອງແຜນໃນມື້ນີ້ ເຊິ່ງຣີເຊັດເວລາ 00:00 UTC, ແລະ ຫຼັງຈາກນັ້ນແມ່ນ ເຄຣດິດ ທີ່ທ່ານຊື້. Chat ແລະ API ຫັກຈາກ ຍອດເງິນ ດຽວກັນ.
ແຕ່ລະຄຳຮ້ອງຂໍຈະກັນຂີດຈຳກັດ output ຂອງມັນກ່ອນ: max_tokens, ຫຼື max_output_tokens ໃນ /v1/responses, ແລະ 4,096 ເມື່ອທ່ານບໍ່ສົ່ງທັງສອງ. ເມື່ອຄຳຕອບສົມບູນ, ຈຳນວນທີ່ກັນໄວ້ຈະຖືກແທນທີ່ດ້ວຍຈຳນວນທີ່ຄຳຮ້ອງຂໍໃຊ້ຈິງ. ຖ້າຈຳນວນນັ້ນບໍ່ພໍດີກັບ ຍອດເງິນ ທີ່ເຫຼືອ, ຄຳຮ້ອງຂໍຈະສົ່ງ Quota exceeded ກັບຄືນກ່ອນທີ່ model ຈະເລີ່ມ.
ຄຳຮ້ອງຂໍທີ່ເຮັດວຽກພ້ອມກັນແຕ່ລະອັນກັນຈຳນວນຂອງຕົນເອງ. ດັ່ງນັ້ນຄຳຮ້ອງຂໍຂະໜານຫຼາຍອັນທີ່ມີ max_tokens ສູງອາດໃຊ້ ຍອດເງິນ ໝົດຊົ່ວຄາວ, ເຖິງແມ່ນຄຳຕອບແຕ່ລະອັນຈະສັ້ນ. max_tokens ທີ່ຕ່ຳກວ່າຈະກັນໄວ້ໜ້ອຍກວ່າ.
Flood protection
Flood protection ອະນຸຍາດ 120 ຄຳຮ້ອງຂໍຕໍ່ນາທີຕໍ່ບັນຊີ. ມັນນັບຕາມບັນຊີ, ບໍ່ແມ່ນຕາມ key, ລວມ /v1/chat/completions, /v1/responses ແລະ /v1/messages. ນາທີເລີ່ມຕັ້ງແຕ່ຄຳຮ້ອງຂໍທຳອິດຂອງທ່ານ.
ຄຳຮ້ອງຂໍທີ 121 ພາຍໃນນາທີນັ້ນຈະສົ່ງ Too many requests. Retry in <n>s. ກັບຄືນ ແລະ ບໍ່ເສຍຫຍັງ. ຄຳຮ້ອງຂໍທີ່ຖືກປະຕິເສດກໍຖືກນັບເຊັ່ນກັນ, ດັ່ງນັ້ນ client ທີ່ສົ່ງອີກໂດຍບໍ່ລໍຖ້າຈະຖືກປະຕິເສດຕໍ່ໄປຈົນກວ່ານາທີຈະຈົບ. ໃຫ້ລໍຖ້າ <n> ວິນາທີຕາມຂໍ້ຄວາມ.
ຄຳຮ້ອງຂໍທີ່ສົ່ງພ້ອມກັນບໍ່ຖືກປະຕິເສດຍ້ອນສົ່ງພ້ອມກັນ. ພວກມັນລໍຖ້າໃນຄິວ ແລະ ຖືກຕອບຕາມລຳດັບ.
GET /v1/models ແລະ endpoint ນັບ tokens ບໍ່ຖືກນັບ.
ຂໍ້ມູນເພີ່ມເຕີມກ່ຽວກັບຂີດຈຳກັດ ແລະ ຍອດເງິນ, ແລະ ບ່ອນເບິ່ງ ຍອດເງິນ ແລະ ການນຳໃຊ້ຂອງທ່ານເອງ: ຂີດຈຳກັດ ແລະ ຍອດເງິນ Keys & usage
ສິ່ງທີ່ຄວນລອງໃໝ່
ສົ່ງຄຳຮ້ອງຂໍອີກສະເພາະເມື່ອຄຳຮ້ອງຂໍດຽວກັນສາມາດສຳເລັດໄດ້. SDK ຂອງ OpenAI ແລະ Anthropic ລອງໃໝ່ຄຳຕອບ 429 ແລະ 5xx ສອງເທື່ອດ້ວຍຕົວເອງຢູ່ແລ້ວ; ຕັ້ງ max_retries (maxRetries ໃນ JavaScript) ເພື່ອປ່ຽນ.
| ຂໍ້ຜິດພາດ | ສົ່ງອີກບໍ? | ວິທີ |
|---|---|---|
400, 404, 405, 413, 415, 422 | ບໍ່. ແກ້ໄຂຄຳຮ້ອງຂໍກ່ອນ. | ຂໍ້ຄວາມບອກຊື່ຟີລດ໌, model ຫຼື input ທີ່ຜິດ. |
401 | ບໍ່. ໃຊ້ key ທີ່ຖືກຕ້ອງ. | ສ້າງ ຫຼື ປ່ຽນ key ໃນໜ້າ Keys & usage. |
429 Too many requests | ໄດ້, ຫຼັງຈາກລໍຖ້າ. | ລໍຖ້າຕາມຈຳນວນວິນາທີໃນຂໍ້ຄວາມ, ແລ້ວສົ່ງຄຳຮ້ອງຂໍດຽວກັນ. |
429 Quota exceeded | ບໍ່ແມ່ນຕາມທີ່ເປັນຢູ່. | ຫຼຸດ max_tokens, ລໍຖ້າການຣີເຊັດປະຈຳວັນເວລາ 00:00 UTC, ຫຼື ເຕີມ ເຄຣດິດ. |
429 Shannon Coder call quota reached | ໄດ້, ໃນ window ຖັດໄປ. | window ເລີ່ມທຸກ 4 ຊົ່ວໂມງຈາກ 00:00 UTC. model ອື່ນຕອບໄດ້ທັນທີ. |
429 … temporarily busy | ໄດ້. | ລໍຖ້າສອງສາມວິນາທີ, ແລ້ວດົນຂຶ້ນໃນແຕ່ລະຄັ້ງຖັດໄປ. |
500, 502, 503 | ໄດ້. | ລໍຖ້າ 1 ວິນາທີ, ແລ້ວ 2, 4 ແລະ 8. ຢຸດຫຼັງສອງສາມຄັ້ງ ແລະ ລາຍງານ request id. |
504 | ໄດ້. | ສົ່ງມັນດ້ວຍ stream ທີ່ຕັ້ງເປັນ true: ຂີດຈຳກັດເວລາໃຊ້ກັບຄຳຕອບທີ່ບໍ່ແມ່ນ stream. |
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 ມີ status 200 ຕັ້ງແຕ່ byte ທຳອິດ. ຄວາມລົ້ມເຫຼວຫຼັງຈາກນັ້ນຈະມາເປັນ event ພາຍໃນ stream: chunk ທີ່ມີສະມາຊິກ error ໃນ /v1/chat/completions, event error ໃນ /v1/messages, event response.failed ຫຼື error ໃນ /v1/responses. event ປິດຂອງ stream ຍັງຕາມມາ. ໃຫ້ຖືວ່າຄຳຕອບແບບນັ້ນລົ້ມເຫຼວ ແລະ ສົ່ງຄຳຮ້ອງຂໍອີກ, ຄືກັບ status 5xx.
ການສົນທະນາທີ່ຍາວກວ່າ context window ຂອງ model ຖືກລາຍງານແບບນີ້, ດ້ວຍປະເພດ invalid_request_error ແລະ code context_length_exceeded. ເຮັດໃຫ້ການສົນທະນາສັ້ນລົງກ່ອນສົ່ງອີກ.
frame ທີ່ແນ່ນອນຖືກອະທິບາຍໄວ້ກັບ streaming. ສະຕຣີມມິ້ງ
Request id
ທຸກຄຳຕອບ, ລວມທັງຂໍ້ຜິດພາດ, ມີ header x-request-id. ມັນແມ່ນຄ່າທີ່ທ່ານສົ່ງໃນ header x-request-id ຂອງທ່ານເອງ, ຫຼື ຕົວອັກສອນເລກຖານສິບຫົກ 12 ຕົວເມື່ອທ່ານບໍ່ໄດ້ສົ່ງ. ບັນທຶກມັນໄວ້ ແລະ ອ້າງອີງເມື່ອທ່ານຂໍຄວາມຊ່ວຍເຫຼືອກ່ຽວກັບຄຳຮ້ອງຂໍ.