Vigade käsitlus
Ebaõnnestunud päring tagastab HTTP olekukoodi ja JSON-sisu, milles on vea tüüp ja teade. See leht loetleb iga oleku, näitab iga API formaadi vea sisu ja ütleb, milliseid vigu tasub uuesti saata.
SDK-d tõstatavad veaobjekti, mis kannab olekukoodi ja sisu välju. See päring nimetab mudeli, mida ei ole olemas:
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"}]
}' See tagastab oleku 400 ja selle sisu:
{
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} Vea sisu
Sisu on kahte liiki. /v1/messages vastab Anthropic formaadis; iga teine lõpp-punkt vastab OpenAI formaadis. Mõlemas on üksikasjad väljades error.type ja error.message, seega teenindab üks lugeja kõiki lõpp-punkte.
{
"error": {
"type": "authentication_error",
"message": "Invalid API key",
"code": "invalid_api_key",
"param": null
}
} {
"type": "error",
"error": {
"type": "authentication_error",
"message": "Invalid API key"
}
} | Väli | Tüüp | Kirjeldus |
|---|---|---|
error.type | string | Vea liik. Vaata allpool Vea tüübid. |
error.message | string | Lause inimesele. Allolevate tabelite tekstid on stabiilsed, välja arvatud muutuvad osad, mida näidatakse kui <id>, <n> või …. |
error.code | string | null | Olemas mõnel OpenAI formaadi veal: invalid_api_key koos 401, request_too_large koos 413, context_length_exceeded, kui vestlus on liiga pikk, muidu null või puudub. Otsusta kõigepealt oleku ja error.type põhjal ning käsitle code lisana. |
error.param | null | Olemas samadel vigadel nagu code. Alati null. |
type | string | Ainult Anthropic formaat. Alati error. |
Vea tüübid
| Tüüp | Olekud | Kirjeldus |
|---|---|---|
invalid_request_error | 400, 413, 415, 422 | Päring ise on vale: väli, sisu, mudeli id või sisend, mida mudel ei võta. Muuda päringut enne uuesti saatmist. |
authentication_error | 401 | API võti puudub, on tundmatu või tühistatud. |
not_found_error | 404 | Teed ei ole olemas. |
rate_limit_error | 429 | Saldo ei kata päringut, kiirusepiirang peatas selle või mudel on hõivatud. Teade ütleb, kumb. |
api_error | 500, 502, 503, 504 | Päring oli korras ja tõrge on meie poolel. Saada see uuesti. |
server_error | 500 | Päring oli korras ja tõrge on meie poolel. Saada see uuesti. |
Olekukoodid
| Olek | Tüüp | Teade | Millal |
|---|---|---|---|
400 | invalid_request_error | Failed to parse the request body as JSON: … | Sisu ei ole kehtiv JSON. |
400 | invalid_request_error | unknown model: <id> | model ei ole avaldatud id. Lõpp-punktis /v1/responses ka siis, kui model puudub. |
400 | invalid_request_error | No user message provided | Shannoni tasemed: päringul ei ole kasutaja teksti. |
400 | invalid_request_error | <id> does not accept image input | Pilt saadeti hostitud avatud kaaludega mudelile, millel pole pildisisendit. |
400 | invalid_request_error | audio and video input are not supported by any hosted model | Hostitud avatud kaaludega mudelile saadeti heli- või videoosa. |
400 | invalid_request_error | <id> does not accept response_format | Struktureeritud väljundit küsiti hostitud avatud kaaludega mudelilt, millel seda ei ole. |
400 | invalid_request_error | <id> does not accept response_format json_schema; use json_object | JSON schema saadeti hostitud avatud kaaludega mudelile, mis võtab ainult json_object. |
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | Arutluse pingutus ei ole üks loetletud väärtustest. Hostitud avatud kaaludega mudelid. |
400 | invalid_request_error | count_tokens is available for the hosted open models; unknown model: <id> | Tokenite lugemist küsiti mudelile, mis ei kuulu hostitud avatud kaaludega mudelite hulka. |
401 | authentication_error | Missing authentication | API võtit ei saadetud. |
401 | authentication_error | Invalid API key | Võti on tundmatu, asendati uuemaga või tühistati. |
404 | not_found_error | Not Found | Teed ei ole olemas, näiteks /v1/embeddings. |
405 | api_error | Method Not Allowed | Tee on olemas, kuid mitte selle HTTP meetodiga. |
413 | invalid_request_error | Failed to buffer the request body: … | Päringu sisu on suurem kui 32 MiB. |
415 | invalid_request_error | Expected request with `Content-Type: application/json` | Päis Content-Type puudub või ei ole application/json. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | Kohustuslik väli puudub, näiteks messages, või väljal on vale JSON-tüüp. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | Päringu väljundi piir on suurem kui sinu saldo jääk. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Kiirusepiirang: üle 120 päringu minutis sinu kontol. <n> on sekundite arv minuti lõpuni. |
429 | rate_limit_error | Shannon Coder call quota reached. Upgrade your plan at shannon-ai.com/plan | shannon-coder-1 lõpp-punktides /v1/chat/completions ja /v1/messages: sinu paketi Shannon Coderi kõned praeguseks 4-tunniseks aknaks on kasutatud. |
429 | rate_limit_error | Shannon routes are temporarily busy. Please retry. | Mudel on praegu hõivatud. |
500 | server_error | The model backend failed to answer. Please retry. | Mudel ei andnud vastust. |
500 | server_error | An internal error occurred. Please retry. | Sisemine tõrge päringu ettevalmistamisel. |
502 | api_error | The model backend failed to answer. Please retry. | Mudel ei andnud vastust. Shannon 3 perekond ja hostitud avatud kaaludega mudelid. |
503 | api_error | Could not verify your quota right now. Please retry. | Sinu saldot ei saanud praegu lugeda. |
503 | api_error | token counting is temporarily unavailable for this model | Tokenite lugemine ei ole selle mudeli jaoks praegu saadaval. |
504 | api_error | upstream timed out | Hostitud avatud kaaludega mudel kulutas rohkem aega kui voogedastamata päringu ajapiirang. |
Kontrollid käivad selles järjekorras: API võti, päringu sisu, mudeli id, kiirusepiirang, saldo. Vale võtme ja vale sisuga päring tagastab seetõttu 401. Päringu eest, mis lükatakse tagasi 4xx olekuga, ei arveldata.
Saldo ja kiirusepiirang
Iga päringut teenindatakse võrdselt: kiirusetasemeid ja eraldi API kvooti ei ole. 429 võib siiski vastata kaks asja, mõlemad tüübiga rate_limit_error. Teade ütleb, kumb on.
Saldo
Sinu saldo on tänane paketi päevalimiit, mis lähtestub kell 00:00 UTC, ja pärast seda sinu ostetud krediit. Vestlus ja API kasutavad sama saldot.
Iga päring paneb kõigepealt kõrvale oma väljundi piiri: max_tokens või max_output_tokens lõpp-punktis /v1/responses, 4,096, kui sa ei saada kumbagi. Kui vastus on valmis, asendatakse kõrvale pandud summa sellega, mida päring kasutas. Kui summa ei mahu allesolevasse saldosse, tagastab päring Quota exceeded enne mudeli käivitumist.
Samal ajal töötavad päringud panevad igaüks kõrvale oma summa. Paljud paralleelsed päringud kõrge max_tokens väärtusega võivad seetõttu hetkeks saldo ära kasutada, isegi kui iga vastus on lühike. Madalam max_tokens paneb vähem kõrvale.
Kiirusepiirang
Kiirusepiirang lubab 120 päringut minutis konto kohta. See loeb kontot, mitte võtit, lõpp-punktid /v1/chat/completions, /v1/responses ja /v1/messages kokku. Minut algab sinu esimese päringuga.
Päring number 121 selle minuti sees tagastab Too many requests. Retry in <n>s. ja ei maksa midagi. Tagasi lükatud päringuid loetakse samuti, seega klient, mis saadab uuesti ootamata, jääb tagasi lükatuks, kuni minut on läbi. Oota teates antud <n> sekundit.
Paralleelselt saadetud päringuid ei lükata tagasi paralleelsuse pärast. Nad ootavad järjekorras ja neile vastatakse kordamööda.
GET /v1/models ja tokenite lugemise lõpp-punkte ei loeta.
Rohkem piirangute ja saldo kohta ning kust näha oma saldot ja kasutust: Piirangud ja saldo Võtmed ja kasutus
Mida korrata
Saada päring uuesti ainult siis, kui sama päring võib õnnestuda. OpenAI ja Anthropic SDK-d kordavad 429 ja 5xx vastuseid juba ise kaks korda; seda muudad väärtusega max_retries (maxRetries JavaScriptis).
| Viga | Kas saata uuesti? | Kuidas |
|---|---|---|
400, 404, 405, 413, 415, 422 | Ei. Paranda kõigepealt päringut. | Teade nimetab välja, mudeli või sisendi, mis on vale. |
401 | Ei. Kasuta kehtivat võtit. | Loo või asenda võti lehel Võtmed ja kasutus. |
429 Too many requests | Jah, pärast ootamist. | Oota teates antud arv sekundeid ja saada sama päring. |
429 Quota exceeded | Mitte selliselt. | Vähenda max_tokens, oota päevast lähtestust kell 00:00 UTC või lisa krediiti. |
429 Shannon Coder call quota reached | Jah, järgmises aknas. | Aknad algavad iga 4 tunni järel alates 00:00 UTC. Teine mudel vastab kohe. |
429 … temporarily busy | Jah. | Oota mõni sekund, seejärel igal järgmisel katsel kauem. |
500, 502, 503 | Jah. | Oota 1 sekund, seejärel 2, 4 ja 8. Peatu mõne katse järel ja teata päringu id. |
504 | Jah. | Saada see väärtusega stream true: ajapiirang kehtib voogedastamata vastustele. |
Kordustsükkel, mis järgib seda tabelit:
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); Vead voo sees
Voo olek on 200 esimesest baidist alates. Hilisem tõrge saabub sündmusena voo sees: chunk, millel on liige error, lõpp-punktis /v1/chat/completions, error-sündmus lõpp-punktis /v1/messages, response.failed- või error-sündmus lõpp-punktis /v1/responses. Voo lõpusündmused järgnevad siiski. Käsitle sellist vastust ebaõnnestununa ja saada päring uuesti, nagu 5xx oleku puhul.
Mudeli kontekstiakent ületavast vestlusest teatatakse nii, tüübiga invalid_request_error ja koodiga context_length_exceeded. Lühenda vestlust enne uuesti saatmist.
Täpseid kaadreid kirjeldatakse voogedastuse juures. Voogedastus
Päringu id-d
Igal vastusel, ka vigadel, on päis x-request-id. See on väärtus, mille saatsid oma päises x-request-id, või 12 kuueteistkümnendsüsteemi märki, kui sa midagi ei saatnud. Logi see ja tsiteeri seda, kui palud päringuga abi.