Mimu Aṣiṣe
Ìbéèrè tó bá kùnà ń dá HTTP status code àti body JSON padà pẹ̀lú irú àṣìṣe àti ìfiránṣẹ́. Ojú-ìwé yìí ń ṣàkójọ gbogbo status, ó ń fi body àṣìṣe ti ọ̀nà API kọ̀ọ̀kan hàn, ó sì ń sọ àwọn àṣìṣe tó yẹ kí a tún fi ránṣẹ́.
Àwọn SDK ń gbé object àṣìṣe jáde tó ní status code àti àwọn field body. Ìbéèrè yìí dárúkọ model tí kò sí:
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"}]
}' Ó ń dá status 400 àti body yìí padà:
{
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} Body àṣìṣe
Body méjì ló wà. /v1/messages ń dáhùn ní ọ̀nà Anthropic; gbogbo endpoint mìíràn ń dáhùn ní ọ̀nà OpenAI. Nínú méjèèjì, àwọn ẹ̀kúnrẹ́rẹ́ wà nínú error.type àti error.message, nítorí náà olùkà kan ń sin gbogbo 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 | Irú | Àpèjúwe |
|---|---|---|
error.type | string | Irú àṣìṣe. Wo Àwọn irú àṣìṣe ní ìsàlẹ̀. |
error.message | string | Ọ̀rọ̀ fún ènìyàn. Àwọn ọ̀rọ̀ inú àwọn tábìlì ìsàlẹ̀ dúró ṣinṣin àfi àwọn apá tó ń yípadà, tí a fi hàn bí <id>, <n> tàbí …. |
error.code | string | null | Ó wà lórí àwọn àṣìṣe kan ti ọ̀nà OpenAI: invalid_api_key pẹ̀lú 401, request_too_large pẹ̀lú 413, context_length_exceeded nígbà tí ìjíròrò bá gùn jù, bí bẹ́ẹ̀ kọ́ null tàbí kò sí. Pinnu lórí status àti error.type ná, kí o sì ka code sí àfikún. |
error.param | null | Ó wà lórí àwọn àṣìṣe kan náà bí code. Nígbà gbogbo null. |
type | string | Ọ̀nà Anthropic nìkan. Nígbà gbogbo error. |
Àwọn irú àṣìṣe
| Irú | Àwọn status | Àpèjúwe |
|---|---|---|
invalid_request_error | 400, 413, 415, 422 | Ìbéèrè fúnra rẹ̀ kò tọ̀: field, body, id model tàbí input tí model kò gbà. Yí ìbéèrè náà padà kí o tó tún fi ránṣẹ́. |
authentication_error | 401 | API key kò sí, a kò mọ̀ ọ́n, tàbí a ti wọ́gi lé e. |
not_found_error | 404 | Path náà kò sí. |
rate_limit_error | 429 | Balance kò tó fún ìbéèrè náà, ààbò flood dá a dúró, tàbí model kún lọ́wọ́. Ìfiránṣẹ́ náà sọ èwo. |
api_error | 500, 502, 503, 504 | Ìbéèrè náà dára, ìkùnà sì wà ní ẹ̀gbẹ́ wa. Tún fi ránṣẹ́. |
server_error | 500 | Ìbéèrè náà dára, ìkùnà sì wà ní ẹ̀gbẹ́ wa. Tún fi ránṣẹ́. |
Àwọn status code
| Ipò | Irú | Ìfiránṣẹ́ | Nígbà wo |
|---|---|---|---|
400 | invalid_request_error | Failed to parse the request body as JSON: … | Body kì í ṣe JSON tó tọ̀. |
400 | invalid_request_error | unknown model: <id> | model kì í ṣe id tí a tẹ̀ jáde. Lórí /v1/responses náà nígbà tí model kò bá sí. |
400 | invalid_request_error | No user message provided | Àwọn ipele Shannon: ìbéèrè náà kò ní ọ̀rọ̀ user. |
400 | invalid_request_error | <id> does not accept image input | A fi àwòrán ránṣẹ́ sí model open-weight tí a gbàlejò tí kò gba input àwòrán. |
400 | invalid_request_error | audio and video input are not supported by any hosted model | A fi apá audio tàbí fídíò ránṣẹ́ sí model open-weight tí a gbàlejò. |
400 | invalid_request_error | <id> does not accept response_format | A béèrè structured output lọ́wọ́ model open-weight tí a gbàlejò tí kò ní i. |
400 | invalid_request_error | <id> does not accept response_format json_schema; use json_object | A fi JSON schema ránṣẹ́ sí model open-weight tí a gbàlejò tó ń gba json_object nìkan. |
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | Ipa ìrònú kì í ṣe ọ̀kan nínú àwọn iye tí a ṣàkójọ. Àwọn model open-weight tí a gbàlejò. |
400 | invalid_request_error | count_tokens is available for the hosted open models; unknown model: <id> | A béèrè ìkà token fún model tó wà lẹ́yìn àwọn model open-weight tí a gbàlejò. |
401 | authentication_error | Missing authentication | A kò fi API key ránṣẹ́. |
401 | authentication_error | Invalid API key | A kò mọ key náà, key tuntun ti rọ́pò rẹ̀, tàbí a ti wọ́gi lé e. |
404 | not_found_error | Not Found | Path náà kò sí, fún àpẹẹrẹ /v1/embeddings. |
405 | api_error | Method Not Allowed | Path náà wà ṣùgbọ́n kì í ṣe pẹ̀lú HTTP method yìí. |
413 | invalid_request_error | Failed to buffer the request body: … | Body ìbéèrè tóbi ju 32 MiB. |
415 | invalid_request_error | Expected request with `Content-Type: application/json` | Header Content-Type kò sí tàbí kì í ṣe application/json. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | Field tí a nílò kò sí, bíi messages, tàbí field kan ní irú JSON tí kò tọ̀. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | Ààlà output ìbéèrè náà tóbi ju ohun tó kù nínú balance rẹ. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Ààbò flood: ju ìbéèrè 120 lọ ní ìṣẹ́jú kan lórí account rẹ. <n> ni iye ìṣẹ́jú-àáyá títí ìṣẹ́jú náà yóò fi parí. |
429 | rate_limit_error | Shannon Coder call quota reached. Upgrade your plan at shannon-ai.com/plan | shannon-coder-1 lórí /v1/chat/completions àti /v1/messages: àwọn ìpè Shannon Coder ti plan rẹ fún window wákàtí 4 lọ́wọ́lọ́wọ́ ti tán. |
429 | rate_limit_error | Shannon routes are temporarily busy. Please retry. | Model kún lọ́wọ́ ní àkókò yìí. |
500 | server_error | The model backend failed to answer. Please retry. | Model kò mú èsì jáde. |
500 | server_error | An internal error occurred. Please retry. | Ìkùnà inú nígbà tí a ń pèsè ìbéèrè náà. |
502 | api_error | The model backend failed to answer. Please retry. | Model kò mú èsì jáde. Ìdílé Shannon 3 àti àwọn model open-weight tí a gbàlejò. |
503 | api_error | Could not verify your quota right now. Please retry. | A kò lè ka balance rẹ ní àkókò yìí. |
503 | api_error | token counting is temporarily unavailable for this model | Ìkà token kò sí fún model yìí ní àkókò yìí. |
504 | api_error | upstream timed out | Model open-weight tí a gbàlejò pẹ́ ju ààlà àkókò ìbéèrè tí kì í ṣe streaming. |
Àwọn ìṣàyẹ̀wò ń ṣiṣẹ́ ní ìlànà yìí: API key, body ìbéèrè, id model, ààbò flood, balance. Nítorí náà ìbéèrè tó ní key tí kò tọ̀ àti body tí kò tọ̀ ń dá 401 padà. A kì í gba owó ìbéèrè tí a kọ̀ pẹ̀lú status 4xx.
Balance àti ààbò flood
A ń sin gbogbo ìbéèrè bákan náà: kò sí àwọn ipele rate àti kò sí quota API tó yàtọ̀. Nǹkan méjì ṣì lè dáhùn 429, méjèèjì pẹ̀lú irú rate_limit_error. Ìfiránṣẹ́ náà ni ó ń sọ wọ́n yàtọ̀.
Balance
Balance rẹ ni allowance plan òní, tó ń tún bẹ̀rẹ̀ ní 00:00 UTC, àti lẹ́yìn rẹ̀ credit tí o rà. Chat àti API ń yọ láti balance kan náà.
Ìbéèrè kọ̀ọ̀kan ń kọ́kọ́ fi ààlà output rẹ̀ pamọ́: max_tokens, tàbí max_output_tokens lórí /v1/responses, 4,096 nígbà tí o kò fi èyíkéyìí ránṣẹ́. Nígbà tí èsì bá parí, iye tí a fi pamọ́ ni a ó fi ohun tí ìbéèrè náà lò rọ́pò. Tí iye náà kò bá wọ inú balance tó kù, ìbéèrè náà ń dá Quota exceeded padà kí model tó bẹ̀rẹ̀.
Àwọn ìbéèrè tó ń ṣiṣẹ́ ní àkókò kan náà ń fi iye tirẹ̀ pamọ́ ọ̀kọ̀ọ̀kan. Nítorí náà ọ̀pọ̀ ìbéèrè ní ìṣọ̀kan pẹ̀lú max_tokens gíga lè lo balance tán fún ìgbà díẹ̀, kódà bí èsì kọ̀ọ̀kan bá kúkúrú. max_tokens tó kéré jù ń fi díẹ̀ pamọ́.
Ààbò flood
Ààbò flood gba ìbéèrè 120 fún ìṣẹ́jú kan fún account kọ̀ọ̀kan. Ó ń ka account, kì í ṣe key, lórí /v1/chat/completions, /v1/responses àti /v1/messages papọ̀. Ìṣẹ́jú náà bẹ̀rẹ̀ pẹ̀lú ìbéèrè àkọ́kọ́ rẹ.
Ìbéèrè nọ́ńbà 121 láàrín ìṣẹ́jú yẹn ń dá Too many requests. Retry in <n>s. padà, kò sì ná nǹkankan. Àwọn ìbéèrè tí a kọ̀ náà ni a ń kà, nítorí náà client tó bá tún fi ránṣẹ́ láìdúró yóò wà ní ìkọ̀ títí ìṣẹ́jú náà yóò fi parí. Dúró fún ìṣẹ́jú-àáyá <n> láti inú ìfiránṣẹ́ náà.
A kì í kọ àwọn ìbéèrè tí a fi ránṣẹ́ ní ìṣọ̀kan nítorí pé wọ́n jẹ́ ìṣọ̀kan. Wọ́n ń dúró ní ìlà, a sì ń dá wọn lóhùn lẹ́sẹẹsẹ.
A kì í ka GET /v1/models àti àwọn endpoint ìkà token.
Àlàyé síwájú sí i lórí àwọn ààlà àti balance, àti ibi tí o ti lè rí balance àti ìlò tìrẹ: Àwọn ààlà àti balance Àwọn key àti ìlò
Ohun tí a ó tún gbìyànjú
Tún fi ìbéèrè ránṣẹ́ nígbà tí ìbéèrè kan náà lè yọrí sí rere nìkan. Àwọn SDK OpenAI àti Anthropic ti ń tún gbìyànjú àwọn èsì 429 àti 5xx lẹ́ẹ̀mejì fúnra wọn; ṣètò max_retries (maxRetries ní JavaScript) láti yí i padà.
| Àṣìṣe | Tún fi ránṣẹ́? | Bí a ṣe ń ṣe é |
|---|---|---|
400, 404, 405, 413, 415, 422 | Rárá. Ṣe àtúnṣe ìbéèrè náà ná. | Ìfiránṣẹ́ náà dárúkọ field, model tàbí input tí kò tọ̀. |
401 | Rárá. Lo key tó tọ̀. | Ṣẹ̀dá tàbí pààrọ̀ key náà ní ojú-ìwé Àwọn key àti ìlò. |
429 Too many requests | Bẹ́ẹ̀ ni, lẹ́yìn ìdúró. | Dúró fún iye ìṣẹ́jú-àáyá inú ìfiránṣẹ́ náà, lẹ́yìn náà fi ìbéèrè kan náà ránṣẹ́. |
429 Quota exceeded | Kì í ṣe bí ó ṣe wà. | Dín max_tokens kù, dúró de ìtúnṣe ojoojúmọ́ ní 00:00 UTC, tàbí fi credit kún un. |
429 Shannon Coder call quota reached | Bẹ́ẹ̀ ni, ní window tó kàn. | Àwọn window ń bẹ̀rẹ̀ ní wákàtí 4 kọ̀ọ̀kan láti 00:00 UTC. Model mìíràn ń dáhùn lẹ́sẹ̀kẹsẹ̀. |
429 … temporarily busy | Bẹ́ẹ̀ ni. | Dúró fún ìṣẹ́jú-àáyá díẹ̀, lẹ́yìn náà pẹ́ sí i lórí ìgbìyànjú kọ̀ọ̀kan tó tẹ̀lé. |
500, 502, 503 | Bẹ́ẹ̀ ni. | Dúró ìṣẹ́jú-àáyá 1, lẹ́yìn náà 2, 4 àti 8. Dáwọ́ dúró lẹ́yìn ìgbìyànjú díẹ̀, kí o sì ròyìn id ìbéèrè náà. |
504 | Bẹ́ẹ̀ ni. | Fi ránṣẹ́ pẹ̀lú stream tí a ṣètò sí true: ààlà àkókò ń kan àwọn èsì tí kì í ṣe streaming. |
Retry loop tó tẹ̀lé tábìlì yìí:
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); Àwọn àṣìṣe inú stream
Stream ní status 200 láti byte àkọ́kọ́ rẹ̀. Ìkùnà lẹ́yìn náà ń dé bí event inú stream: chunk pẹ̀lú ẹ̀yà error lórí /v1/chat/completions, event error lórí /v1/messages, event response.failed tàbí error lórí /v1/responses. Àwọn event ìparí stream ṣì ń tẹ̀lé e. Ka èsì bẹ́ẹ̀ sí èyí tó kùnà, kí o sì tún fi ìbéèrè náà ránṣẹ́, bí fún status 5xx.
Ìjíròrò tó gùn ju context window ti model ni a ń ròyìn ní ọ̀nà yìí, pẹ̀lú irú invalid_request_error àti code context_length_exceeded. Dín ìjíròrò náà kù kí o tó tún fi ránṣẹ́.
A ṣàpèjúwe àwọn frame gan-an pẹ̀lú streaming. Sisanwọle
Àwọn id ìbéèrè
Gbogbo èsì, pẹ̀lú àwọn àṣìṣe, ní header x-request-id. Ó jẹ́ iye tí o fi ránṣẹ́ nínú header x-request-id tìrẹ, tàbí àwọn ọ̀rọ̀ hexadecimal 12 nígbà tí o kò fi nǹkan ránṣẹ́. Kọ ọ́ sílẹ̀ nínú log, kí o sì dárúkọ rẹ̀ nígbà tí o bá ń béèrè ìrànlọ́wọ́ lórí ìbéèrè kan.