Fò lọ sí àkóónú
Mimu Aṣiṣe

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

Ó ń dá status 400 àti body yìí padà:

400 JSON
{
  "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.

401 Ọ̀nà OpenAI
{
  "error": {
    "type": "authentication_error",
    "message": "Invalid API key",
    "code": "invalid_api_key",
    "param": null
  }
}
401 Ọ̀nà Anthropic
{
  "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)

À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.