Pāriet uz saturu
Kļūdu apstrāde

Kļūdu apstrāde

Pieprasījums, kas neizdodas, atgriež HTTP statusa kodu un JSON pamattekstu ar kļūdas veidu un ziņojumu. Šī lapa uzskaita katru statusu, rāda katra API formāta kļūdas pamattekstu un norāda, kuras kļūdas ir vērts sūtīt vēlreiz.

SDK izmet kļūdas objektu, kas nes statusa kodu un pamatteksta laukus. Šis pieprasījums nosauc modeli, kura nav:

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

Tas atgriež statusu 400 un šādu pamattekstu:

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

Kļūdas pamatteksts

Ir divi pamattekstu veidi. /v1/messages atbild Anthropic formātā; katrs cits galapunkts atbild OpenAI formātā. Abos detaļas ir laukos error.type un error.message, tāpēc viens lasītājs apkalpo visus galapunktus.

401 OpenAI formāts
{
  "error": {
    "type": "authentication_error",
    "message": "Invalid API key",
    "code": "invalid_api_key",
    "param": null
  }
}
401 Anthropic formāts
{
  "type": "error",
  "error": {
    "type": "authentication_error",
    "message": "Invalid API key"
  }
}
Lauks Tips Apraksts
error.type string Kļūdas veids. Skatiet tālāk sadaļu Kļūdu veidi.
error.message string Teikums cilvēkam. Tālāk esošo tabulu teksti ir stabili līdz to mainīgajām daļām, kas parādītas kā <id>, <n> vai ….
error.code string | null Ir dažām OpenAI formāta kļūdām: invalid_api_key ar 401, request_too_large ar 413, context_length_exceeded, kad saruna ir pārāk gara, citādi null vai nav. Vispirms lemiet pēc statusa un error.type un uzskatiet code par papildinājumu.
error.param null Ir tām pašām kļūdām kā code. Vienmēr null.
type string Tikai Anthropic formātā. Vienmēr error.

Kļūdu veidi

Veids Statusi Apraksts
invalid_request_error 400, 413, 415, 422 Pats pieprasījums ir nepareizs: lauks, pamatteksts, modeļa id vai ievade, ko modelis nepieņem. Mainiet pieprasījumu, pirms sūtāt vēlreiz.
authentication_error 401 API atslēgas nav, tā nav zināma vai ir atsaukta.
not_found_error 404 Šāda ceļa nav.
rate_limit_error 429 Atlikums nesedz pieprasījumu, flood protection to apturēja vai modelis ir aizņemts. Ziņojums norāda, kas no tā.
api_error 500, 502, 503, 504 Pieprasījums bija kārtībā, un kļūme ir mūsu pusē. Sūtiet to vēlreiz.
server_error 500 Pieprasījums bija kārtībā, un kļūme ir mūsu pusē. Sūtiet to vēlreiz.

Statusa kodi

Statuss Veids Ziņojums Kad
400 invalid_request_error Failed to parse the request body as JSON: … Pamatteksts nav derīgs JSON.
400 invalid_request_error unknown model: <id> model nav publicēts id. Galapunktā /v1/responses arī tad, ja model trūkst.
400 invalid_request_error No user message provided Shannon līmeņi: pieprasījumā nav lietotāja teksta.
400 invalid_request_error <id> does not accept image input Attēls tika nosūtīts hostētam atvērto svaru modelim bez attēlu ievades.
400 invalid_request_error audio and video input are not supported by any hosted model Audio vai video daļa tika nosūtīta hostētam atvērto svaru modelim.
400 invalid_request_error <id> does not accept response_format Strukturēta izvade tika pieprasīta hostētam atvērto svaru modelim, kuram tās nav.
400 invalid_request_error <id> does not accept response_format json_schema; use json_object JSON shēma tika nosūtīta hostētam atvērto svaru modelim, kas pieņem tikai json_object.
400 invalid_request_error unknown reasoning effort '<value>'; expected off, low, medium or high Spriešanas apjoms nav viena no uzskaitītajām vērtībām. Hostētie atvērto svaru modeļi.
400 invalid_request_error count_tokens is available for the hosted open models; unknown model: <id> Tokenu skaitīšana tika pieprasīta modelim ārpus hostētajiem atvērto svaru modeļiem.
401 authentication_error Missing authentication API atslēga netika nosūtīta.
401 authentication_error Invalid API key Atslēga nav zināma, tika aizstāta ar jaunāku vai tika atsaukta.
404 not_found_error Not Found Ceļa nav, piemēram, /v1/embeddings.
405 api_error Method Not Allowed Ceļš pastāv, bet ne ar šo HTTP metodi.
413 invalid_request_error Failed to buffer the request body: … Pieprasījuma pamatteksts ir lielāks par 32 MiB.
415 invalid_request_error Expected request with `Content-Type: application/json` Galvene Content-Type trūkst vai nav application/json.
422 invalid_request_error Failed to deserialize the JSON body into the target type: … Trūkst obligāta lauka, piemēram, messages, vai laukam ir nepareizs JSON tips.
429 rate_limit_error Quota exceeded. Upgrade your plan at shannon-ai.com/plan Pieprasījuma izvades ierobežojums ir lielāks par jūsu atlikuma atlikušo daļu.
429 rate_limit_error Too many requests. Retry in <n>s. Flood protection: vairāk nekā 120 pieprasījumu minūtē jūsu kontā. <n> ir sekunžu skaits līdz minūtes beigām.
429 rate_limit_error Shannon Coder call quota reached. Upgrade your plan at shannon-ai.com/plan shannon-coder-1 galapunktos /v1/chat/completions un /v1/messages: jūsu plāna Shannon Coder izsaukumi pašreizējā 4 stundu logā ir izlietoti.
429 rate_limit_error Shannon routes are temporarily busy. Please retry. Modelis šobrīd ir aizņemts.
500 server_error The model backend failed to answer. Please retry. Modelis neizveidoja atbildi.
500 server_error An internal error occurred. Please retry. Iekšēja kļūme pieprasījuma sagatavošanas laikā.
502 api_error The model backend failed to answer. Please retry. Modelis neizveidoja atbildi. Shannon 3 saime un hostētie atvērto svaru modeļi.
503 api_error Could not verify your quota right now. Please retry. Jūsu atlikumu šobrīd nevarēja nolasīt.
503 api_error token counting is temporarily unavailable for this model Tokenu skaitīšana šim modelim šobrīd nav pieejama.
504 api_error upstream timed out Hostētais atvērto svaru modelis atbildēja ilgāk par laika ierobežojumu pieprasījumam, kas netiek straumēts.

Pārbaudes notiek šādā secībā: API atslēga, pieprasījuma pamatteksts, modeļa id, flood protection, atlikums. Pieprasījums ar nepareizu atslēgu un nepareizu pamattekstu tādēļ atgriež 401. Pieprasījums, kas noraidīts ar 4xx statusu, netiek rēķināts.

Atlikums un flood protection

Katrs pieprasījums tiek apkalpots vienādi: nav ātruma līmeņu un nav atsevišķas API kvotas. Ar 429 tomēr var atbildēt divas lietas, abas ar tipu rate_limit_error. Tās atšķir ziņojums.

Atlikums

Jūsu atlikums ir šīs dienas plāna kvota, kas atjaunojas plkst. 00:00 UTC, un pēc tās jūsu iegādātais kredīts. Čats un API velk no viena un tā paša atlikuma.

Katrs pieprasījums vispirms rezervē savu izvades ierobežojumu: max_tokens vai max_output_tokens galapunktā /v1/responses, 4,096, ja nesūtāt nevienu. Kad atbilde ir pabeigta, rezervētais apjoms tiek aizstāts ar pieprasījuma izmantoto. Ja apjoms neietilpst atlikušajā atlikumā, pieprasījums atgriež Quota exceeded, pirms modelis sāk darbu.

Pieprasījumi, kas darbojas vienlaikus, katrs rezervē savu apjomu. Daudzi paralēli pieprasījumi ar augstu max_tokens tādēļ uz brīdi var izsmelt atlikumu, pat ja katra atbilde ir īsa. Zemāks max_tokens rezervē mazāk.

Flood protection

Flood protection atļauj 120 pieprasījumus minūtē uz kontu. Tā skaita kontu, nevis atslēgu, kopā pa /v1/chat/completions, /v1/responses un /v1/messages. Minūte sākas ar jūsu pirmo pieprasījumu.

Pieprasījums numur 121 šajā minūtē atgriež Too many requests. Retry in <n>s. un neko nemaksā. Noraidītie pieprasījumi tiek skaitīti arī, tāpēc klients, kas sūta vēlreiz negaidot, paliek noraidīts, līdz minūte beidzas. Pagaidiet <n> sekundes no ziņojuma.

Paralēli nosūtīti pieprasījumi netiek noraidīti paralēlisma dēļ. Tie gaida rindā un tiek atbildēti pēc kārtas.

GET /v1/models un tokenu skaitīšanas galapunkti netiek skaitīti.

Vairāk par ierobežojumiem un atlikumu un kur redzēt savu atlikumu un izmantošanu: Ierobežojumi un atlikums Atslēgas un izmantošana

Ko mēģināt atkārtot

Sūtiet pieprasījumu vēlreiz tikai tad, ja tas pats pieprasījums var izdoties. OpenAI un Anthropic SDK jau paši divreiz atkārto 429 un 5xx atbildes; iestatiet max_retries (maxRetries JavaScript), lai to mainītu.

Kļūda Sūtīt vēlreiz? Kā
400, 404, 405, 413, 415, 422 Nē. Vispirms izlabojiet pieprasījumu. Ziņojums nosauc nepareizo lauku, modeli vai ievadi.
401 Nē. Izmantojiet derīgu atslēgu. Izveidojiet vai nomainiet atslēgu lapā Atslēgas un izmantošana.
429 Too many requests Jā, pēc gaidīšanas. Pagaidiet ziņojumā norādīto sekunžu skaitu, tad nosūtiet to pašu pieprasījumu.
429 Quota exceeded Ne tāds, kāds tas ir. Samaziniet max_tokens, pagaidiet dienas atjaunošanos plkst. 00:00 UTC vai papildiniet kredītu.
429 Shannon Coder call quota reached Jā, nākamajā logā. Logi sākas ik pēc 4 stundām no 00:00 UTC. Cits modelis atbild uzreiz.
429 … temporarily busy Jā. Pagaidiet dažas sekundes, tad katrā nākamajā mēģinājumā ilgāk.
500, 502, 503 Jā. Pagaidiet 1 sekundi, tad 2, 4 un 8. Pēc dažiem mēģinājumiem apstājieties un ziņojiet pieprasījuma id.
504 Jā. Sūtiet ar stream, iestatītu uz true: laika ierobežojums attiecas uz atbildēm, kas netiek straumētas.

Atkārtošanas cikls, kas seko šai tabulai:

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)

Kļūdas straumes iekšienē

Straumei no pirmā baita ir statuss 200. Kļūme pēc tam ierodas kā notikums straumes iekšienē: daļa ar error locekli galapunktā /v1/chat/completions, error notikums galapunktā /v1/messages, response.failed vai error notikums galapunktā /v1/responses. Straumes noslēguma notikumi tāpat seko. Uzskatiet šādu atbildi par neizdevušos un sūtiet pieprasījumu vēlreiz, tāpat kā 5xx statusam.

Saruna, kas ir garāka par modeļa konteksta logu, tiek norādīta šādi, ar tipu invalid_request_error un kodu context_length_exceeded. Saīsiniet sarunu, pirms sūtāt vēlreiz.

Precīzie kadri ir aprakstīti pie straumēšanas. Straumēšana

Pieprasījumu id

Katrai atbildei, ieskaitot kļūdas, ir galvene x-request-id. Tā ir vērtība, ko nosūtījāt savā x-request-id galvenē, vai 12 heksadecimālas rakstzīmes, ja neko nesūtījāt. Žurnālējiet to un norādiet, kad lūdzat palīdzību ar pieprasījumu.