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 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"}]
}' Tas atgriež statusu 400 un šādu pamattekstu:
{
"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.
{
"error": {
"type": "authentication_error",
"message": "Invalid API key",
"code": "invalid_api_key",
"param": null
}
} {
"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) 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); 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.