រំលងទៅមាតិកា
ការគ្រប់គ្រងកំហុស

ការគ្រប់គ្រងកំហុស

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

វាត្រឡប់ស្ថានភាព 400 និងខ្លឹមសារនេះ៖

400 JSON
{
  "error": {
    "type": "invalid_request_error",
    "message": "unknown model: no-such-model"
  }
}

ខ្លឹមសារកំហុស

មានខ្លឹមសារពីរប្រភេទ។ /v1/messages ឆ្លើយក្នុងទ្រង់ទ្រាយ Anthropic; endpoint ផ្សេងទៀតទាំងអស់ឆ្លើយក្នុងទ្រង់ទ្រាយ OpenAI។ ក្នុងទាំងពីរ ព័ត៌មានលម្អិតស្ថិតក្នុង error.type និង error.message ដូច្នេះកូដអានតែមួយបម្រើគ្រប់ endpoint។

401 ទ្រង់ទ្រាយ OpenAI
{
  "error": {
    "type": "authentication_error",
    "message": "Invalid API key",
    "code": "invalid_api_key",
    "param": null
  }
}
401 ទ្រង់ទ្រាយ Anthropic
{
  "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)

កំហុសក្នុង 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។