ការគ្រប់គ្រងកំហុស
request ដែលបរាជ័យត្រឡប់កូដស្ថានភាព HTTP និងខ្លឹមសារ JSON ដែលមានប្រភេទកំហុស និងសារ។ ទំព័រនេះរាយគ្រប់ស្ថានភាព បង្ហាញខ្លឹមសារកំហុសនៃទ្រង់ទ្រាយ API នីមួយៗ ហើយប្រាប់ថាកំហុសណាខ្លះគួរផ្ញើម្តងទៀត។
SDK លើកវត្ថុកំហុសដែលមានកូដស្ថានភាព និង field នៃខ្លឹមសារ។ request នេះដាក់ឈ្មោះម៉ូដែលដែលមិនមាន៖
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 និងខ្លឹមសារនេះ៖
{
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} ខ្លឹមសារកំហុស
មានខ្លឹមសារពីរប្រភេទ។ /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"
}
} | Field | ប្រភេទ | ការពិពណ៌នា |
|---|---|---|
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 ឬគ្មាន។ សូមសម្រេចចិត្តតាមស្ថានភាព និង error.type មុន ហើយចាត់ទុក code ជាព័ត៌មានបន្ថែម។ |
error.param | null | មាននៅលើកំហុសដូចគ្នានឹង code។ ជានិច្ចជា null។ |
type | string | ទ្រង់ទ្រាយ Anthropic តែប៉ុណ្ណោះ។ ជានិច្ចជា error។ |
ប្រភេទកំហុស
| ប្រភេទ | ស្ថានភាព | ការពិពណ៌នា |
|---|---|---|
invalid_request_error | 400, 413, 415, 422 | request ខ្លួនឯងខុស៖ field ខ្លឹមសារ model id ឬ input ដែលម៉ូដែលមិនទទួល។ សូមកែ request មុនផ្ញើម្តងទៀត។ |
authentication_error | 401 | API key បាត់ មិនស្គាល់ ឬត្រូវបានដកហូត។ |
not_found_error | 404 | path មិនមានទេ។ |
rate_limit_error | 429 | សមតុល្យមិនគ្រប់គ្រាន់សម្រាប់ request, flood protection បានបញ្ឈប់វា ឬម៉ូដែលរវល់។ សារប្រាប់ថាមួយណា។ |
api_error | 500, 502, 503, 504 | request ត្រឹមត្រូវ ហើយការបរាជ័យនៅខាងយើង។ សូមផ្ញើម្តងទៀត។ |
server_error | 500 | request ត្រឹមត្រូវ ហើយការបរាជ័យនៅខាងយើង។ សូមផ្ញើម្តងទៀត។ |
កូដស្ថានភាព
| ស្ថានភាព | ប្រភេទ | សារ | ពេលណា |
|---|---|---|---|
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៖ request មិនមានអត្ថបទ user ទេ។ |
400 | invalid_request_error | <id> does not accept image input | រូបភាពត្រូវបានផ្ញើទៅម៉ូដែល open-weight ដែលបង្ហោះ ដែលគ្មាន image input។ |
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 | Structured output ត្រូវបានស្នើពីម៉ូដែល open-weight ដែលបង្ហោះ ដែលគ្មានមុខងារនេះ។ |
400 | invalid_request_error | <id> does not accept response_format json_schema; use json_object | JSON schema ត្រូវបានផ្ញើទៅម៉ូដែល open-weight ដែលបង្ហោះ ដែលទទួលតែ json_object។ |
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | កម្រិត reasoning មិនមែនជាតម្លៃមួយក្នុងបញ្ជីទេ។ ម៉ូដែល open-weight ដែលបង្ហោះ។ |
400 | invalid_request_error | count_tokens is available for the hosted open models; unknown model: <id> | ការរាប់ token ត្រូវបានស្នើសម្រាប់ម៉ូដែលក្រៅពីម៉ូដែល open-weight ដែលបង្ហោះ។ |
401 | authentication_error | Missing authentication | មិនបានផ្ញើ API key ទេ។ |
401 | authentication_error | Invalid API key | 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: … | ខ្លឹមសារ request ធំជាង 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: … | field ដែលត្រូវការបាត់ ដូចជា messages ឬ field មួយមានប្រភេទ JSON មិនត្រឹមត្រូវ។ |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | ដែនកំណត់ output របស់ request ធំជាងអ្វីដែលនៅសល់ក្នុងសមតុល្យរបស់អ្នក។ |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Flood protection៖ លើសពី 120 request ក្នុងមួយនាទីលើគណនីរបស់អ្នក។ <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 របស់គម្រោងអ្នកសម្រាប់ចន្លោះពេល 4 ម៉ោងបច្ចុប្បន្នត្រូវបានប្រើអស់។ |
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. | ការបរាជ័យខាងក្នុង ខណៈ request កំពុងត្រូវបានរៀបចំ។ |
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 | ការរាប់ token មិនមានសម្រាប់ម៉ូដែលនេះនៅពេលនេះទេ។ |
504 | api_error | upstream timed out | ម៉ូដែល open-weight ដែលបង្ហោះប្រើពេលយូរជាងដែនកំណត់ពេលវេលានៃ request ដែលមិនមែន stream។ |
ការត្រួតពិនិត្យដំណើរការតាមលំដាប់នេះ៖ API key, ខ្លឹមសារ request, model id, flood protection, សមតុល្យ។ ដូច្នេះ request ដែលមាន key ខុស និងខ្លឹមសារខុសត្រឡប់ 401។ request ដែលត្រូវបានបដិសេធដោយស្ថានភាព 4xx មិនត្រូវបានគិតថ្លៃទេ។
សមតុល្យ និង flood protection
រាល់ request ត្រូវបានបម្រើស្មើគ្នា៖ គ្មានកម្រិតអត្រា និងគ្មានកូតា API ដាច់ដោយឡែកទេ។ ប៉ុន្តែមានពីរយ៉ាងអាចឆ្លើយ 429 ទាំងពីរមានប្រភេទ rate_limit_error។ សារប្រាប់ពីភាពខុសគ្នា។
សមតុល្យ
សមតុល្យរបស់អ្នកគឺកូតាគម្រោងប្រចាំថ្ងៃ ដែលកំណត់ឡើងវិញនៅម៉ោង 00:00 UTC ហើយបន្ទាប់ពីនោះគឺឥណទានដែលបានទិញ។ Chat និង API ដកពីសមតុល្យតែមួយ។
រាល់ request បម្រុងទុកដែនកំណត់ output របស់វាមុនគេ៖ max_tokens ឬ max_output_tokens លើ /v1/responses គឺ 4,096 នៅពេលអ្នកមិនផ្ញើទាំងពីរ។ នៅពេលចម្លើយពេញលេញ ចំនួនដែលបានបម្រុងទុកត្រូវបានជំនួសដោយអ្វីដែល request បានប្រើ។ ប្រសិនបើចំនួនមិនសមនឹងសមតុល្យដែលនៅសល់ request ត្រឡប់ Quota exceeded មុនម៉ូដែលចាប់ផ្តើម។
request ដែលដំណើរការក្នុងពេលតែមួយ បម្រុងទុកចំនួនរៀងៗខ្លួន។ ដូច្នេះ request ស្របគ្នាច្រើនដែលមាន max_tokens ខ្ពស់អាចប្រើសមតុល្យអស់មួយភ្លែត ទោះបីចម្លើយនីមួយៗខ្លីក៏ដោយ។ max_tokens ទាបជាងបម្រុងទុកតិចជាង។
Flood protection
Flood protection អនុញ្ញាត 120 request ក្នុងមួយនាទីក្នុងមួយគណនី។ វារាប់គណនី មិនមែន key ទេ លើ /v1/chat/completions, /v1/responses និង /v1/messages រួមគ្នា។ នាទីចាប់ផ្តើមជាមួយ request ដំបូងរបស់អ្នក។
Request លេខ 121 ក្នុងនាទីនោះត្រឡប់ Too many requests. Retry in <n>s. ហើយមិនគិតថ្លៃទេ។ request ដែលត្រូវបានបដិសេធក៏ត្រូវបានរាប់ដែរ ដូច្នេះ client ដែលផ្ញើម្តងទៀតដោយមិនរង់ចាំនឹងត្រូវបានបដិសេធរហូតដល់នាទីចប់។ សូមរង់ចាំ <n> វិនាទីពីសារ។
request ដែលផ្ញើស្របគ្នាមិនត្រូវបានបដិសេធដោយសារតែស្របគ្នាទេ។ ពួកវារង់ចាំជាជួរ ហើយត្រូវបានឆ្លើយតាមវេន។
GET /v1/models និង endpoint រាប់ token មិនត្រូវបានរាប់ទេ។
បន្ថែមអំពីដែនកំណត់ និងសមតុល្យ និងកន្លែងមើលសមតុល្យ និងការប្រើប្រាស់របស់អ្នក៖ ដែនកំណត់ និងសមតុល្យ Keys & usage
អ្វីដែលត្រូវព្យាយាមម្តងទៀត
ផ្ញើ request ម្តងទៀតតែនៅពេល request ដូចគ្នាអាចជោគជ័យប៉ុណ្ណោះ។ SDK របស់ OpenAI និង Anthropic ព្យាយាមម្តងទៀតចម្លើយ 429 និង 5xx ពីរដងដោយខ្លួនឯងរួចហើយ; កំណត់ max_retries (maxRetries ក្នុង JavaScript) ដើម្បីផ្លាស់ប្តូរវា។
| កំហុស | ផ្ញើម្តងទៀត? | របៀប |
|---|---|---|
400, 404, 405, 413, 415, 422 | ទេ។ សូមកែ request ជាមុនសិន។ | សារប្រាប់ឈ្មោះ field ម៉ូដែល ឬ input ដែលខុស។ |
401 | ទេ។ សូមប្រើ key ដែលត្រឹមត្រូវ។ | បង្កើត ឬជំនួស key នៅទំព័រ Keys & usage។ |
429 Too many requests | បាទ/ចាស បន្ទាប់ពីរង់ចាំ។ | រង់ចាំចំនួនវិនាទីក្នុងសារ បន្ទាប់មកផ្ញើ request ដូចគ្នា។ |
429 Quota exceeded | មិនមែនតាមដែលវាជា។ | បន្ថយ max_tokens រង់ចាំការកំណត់ឡើងវិញប្រចាំថ្ងៃនៅម៉ោង 00:00 UTC ឬបន្ថែមឥណទាន។ |
429 Shannon Coder call quota reached | បាទ/ចាស នៅចន្លោះពេលបន្ទាប់។ | ចន្លោះពេលចាប់ផ្តើមរៀងរាល់ 4 ម៉ោងចាប់ពី 00:00 UTC។ ម៉ូដែលផ្សេងឆ្លើយភ្លាមៗ។ |
429 … temporarily busy | បាទ/ចាស។ | រង់ចាំពីរបីវិនាទី បន្ទាប់មករង់ចាំយូរជាងមុនរាល់ការព្យាយាមបន្ត។ |
500, 502, 503 | បាទ/ចាស។ | រង់ចាំ 1 វិនាទី បន្ទាប់មក 2, 4 និង 8។ ឈប់បន្ទាប់ពីការព្យាយាមពីរបីដង ហើយរាយការណ៍ request 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 ចាប់ពីបៃដំបូង។ ការបរាជ័យបន្ទាប់ពីនោះមកដល់ជា event ក្នុង stream៖ chunk ដែលមានសមាជិក error លើ /v1/chat/completions, event error លើ /v1/messages, event response.failed ឬ error លើ /v1/responses។ event បិទនៃ stream នៅតែតាមក្រោយ។ សូមចាត់ទុកចម្លើយបែបនេះថាបរាជ័យ ហើយផ្ញើ request ម្តងទៀត ដូចស្ថានភាព 5xx។
ការសន្ទនាដែលវែងជាង context window របស់ម៉ូដែលត្រូវបានរាយការណ៍តាមរបៀបនេះ ដោយមានប្រភេទ invalid_request_error និងកូដ context_length_exceeded។ សូមកាត់បន្ថយការសន្ទនាមុនផ្ញើម្តងទៀត។
frame ពិតប្រាកដត្រូវបានពិពណ៌នាជាមួយ streaming។ ស្ទ្រីម
Request id
រាល់ចម្លើយ រួមទាំងកំហុស មាន header x-request-id។ វាគឺជាតម្លៃដែលអ្នកបានផ្ញើក្នុង header x-request-id ផ្ទាល់ខ្លួនរបស់អ្នក ឬតួអក្សរ hexadecimal 12 នៅពេលអ្នកមិនបានផ្ញើ។ សូមកត់ត្រាវា ហើយដកស្រង់វានៅពេលសុំជំនួយអំពី request។