Błędy
Każdy kod błędu, którym to API może odpowiedzieć, status HTTP, który go przenosi, i co z tym zrobić. Koperta ma kształt OpenAI z jednym dodatkiem w przestrzeni nazw.
Koperta
error.message jest napisane dla osoby czytającej dziennik, error.type nazywa klasę błędu, a error.code to stabilny identyfikator, według którego można się rozgałęziać — tekst komunikatu nie jest kontraktem. Gdzie API ma ustrukturyzowany szczegół (która polityka, który punkt końcowy, który model), trafia on do error.llmeu i nigdy nie zastępuje trzech standardowych pól.
{
"error": {
"message": "No endpoint satisfies residency eu-owned. Residency is never relaxed silently.",
"type": "conflict_error",
"code": "no_endpoint_for_policy",
"llmeu": { "requested": "llmeu-auto" }
}
}
type zależy od statusu
Poniższe mapowanie jest tym, które stosuje API, renderowane z tej samej tabeli, która buduje jego odpowiedzi.
| HTTP | type |
|---|---|
| 400 | invalid_request_error |
| 401 | authentication_error |
| 402 | insufficient_quota |
| 403 | permission_error |
| 404 | not_found_error |
| 409 | conflict_error |
| 413 | invalid_request_error |
| 422 | invalid_request_error |
| 429 | rate_limit_error |
| 500 | api_error |
| 501 | api_error |
| 502 | api_error |
| 503 | api_error |
Kody
Każdy kod, który może dotrzeć do klienta. Test przechodzi przez źródło API i kończy się niepowodzeniem, gdy ta tabela i kod są niezgodne w którąkolwiek stronę, więc kod nie może zostać wymyślony tutaj ani dodany tam bez udokumentowania.
| HTTP | code | Co oznacza i co zrobić |
|---|---|---|
| 400 | invalid_request | Treść żądania nie przeszła walidacji. |
| 400 | invalid_json | Treść nie była prawidłowym JSON-em. |
| 400 | invalid_llmeu | Obiekt llmeu nie był obiektem lub zawierał nieznane pole. |
| 400 | invalid_residency | Żądana rezydencja nie jest jedną z czterech klas hostingu. |
| 400 | invalid_data_class | Żądana data_class nie jest jedną z czterech klas. |
| 400 | invalid_retention | Żądany okres przechowywania nie jest równy zero, 24h, 7d ani 30d. |
| 400 | invalid_max_tokens | max_tokens nie było dodatnią liczbą całkowitą. |
| 400 | invalid_stream | stream nie było wartością logiczną. |
| 400 | invalid_stop | stop nie było ani ciągiem, ani tablicą ciągów. |
| 400 | invalid_role | Wiadomość zawierała rolę spoza system, user, assistant i tool. |
| 400 | invalid_tools | tools lub tool_choice miały nieprawidłowy format. |
| 400 | missing_model | Pole model jest wymagane. |
| 400 | missing_messages | Pole messages jest wymagane i nie może być puste. |
| 400 | missing_input | Pole input jest wymagane dla embeddingów. |
| 400 | missing_name | Pole name jest wymagane. |
| 401 | invalid_api_key | Klucz jest nieobecny, nieznany, unieważniony lub wygasł. |
| 402 | budget_exceeded | Dzienny budżet organizacji został wykorzystany. Zwiększ max_usd_per_day lub poczekaj na odnowienie okna. |
| 403 | api_key_required | Żądanie korzystało z sesji konsoli. Utwórz klucz API i wyślij go zamiast tego. |
| 403 | insufficient_scope | Klucz jest ważny, ale nie ma zakresu wymaganego przez ten punkt końcowy. |
| 403 | no_organization | Poświadczenie nie jest przypisane do organizacji. |
| 403 | model_denied | Polityka organizacji nie zezwala na ten model ani jego dostawcę. |
| 403 | policy_violation | Żądanie narusza regułę polityki organizacji. |
| 403 | retention_exceeds_policy | Żądana retencja jest dłuższa niż pozwala polityka. Jest to sprawdzane przed czymkolwiek innym w żądaniu. |
| 403 | data_class_not_allowed | data_class żądania nie należy do dozwolonych przez politykę. |
| 404 | model_not_found | Nie ma takiego modelu dla tej organizacji. |
| 404 | hosted_unavailable | Model jest w katalogu, ale nie jest hostowany w LLM EU, więc nie można go wywołać. |
| 404 | not_found | Trasa istnieje, ale obiektu nie ma. |
| 404 | unknown_route | Pod tą ścieżką nie ma zamontowanej trasy. Każdy punkt końcowy OpenAI, którego nie ma na liście w sekcji Punkty końcowe, zwraca tę odpowiedź. |
| 404 | policy_not_found | policy_id w llmeu nie należy do tej organizacji. |
| 409 | no_endpoint_for_policy | Nic nie spełnia jednocześnie polityki i rezydencji, a żadne z nich nie jest po cichu łagodzone. |
| 409 | not_a_text_model | Nazwany model nie może generować tekstu: jest modelem rozpoznawania mowy, embeddingów lub rerankingu. |
| 409 | conflict | Żądanie jest sprzeczne z bieżącym stanem obiektu. |
| 413 | request_too_large | Treść żądania przekroczyła limit rozmiaru punktu końcowego. |
| 429 | rate_limit_exceeded | Osiągnięto limit z tabeli limitów szybkości. Komunikat podaje czas resetowania okna. |
| 500 | internal_error | Nieoczekiwany błąd po naszej stronie. |
| 501 | not_implemented | Punkt końcowy celowo nie jest oferowany lub żądana funkcja nie istnieje w tym wdrożeniu. |
| 501 | retention_not_implemented | Polityka dopuszcza retencję inną niż zero, a zaimplementowano tylko zero, więc żądanie jest odrzucane zamiast być przechowywane. |
| 501 | unsupported_n | n większe niż 1 nie jest obsługiwane. |
| 502 | upstream_error | Żaden punkt końcowy nie mógł obsłużyć żądania po przełączeniu awaryjnym. Ślad rejestruje każdą próbę. |
| 502 | stream_failed | Strumień zakończył się niepowodzeniem po tym, jak już się rozpoczął. |
no_endpoint_for_policy oznacza, że produkt działa
409 z tym kodem oznacza, że polityka i żądanie razem nie dopuszczają żadnego punktu końcowego, a router odmówił cichego złagodzenia któregokolwiek z nich. To nie jest przejściowe: ponowna próba bez zmiany żądania, polityki lub rezydencji kończy się tak samo. Błąd przenosi żądaną rezydencję, a ślad rejestruje, dlaczego każdy punkt końcowy został odrzucony.
Błędy w strumieniu
Żądanie strumieniowe, które nie powiedzie się po wysłaniu nagłówków, zapisuje błąd jako końcową ramkę SSE, a następnie terminator, więc klient przestrzegający formatu widzi niepowodzenie zamiast obciętego sukcesu.
data: {"error":{"message":"No endpoint could start the stream.","type":"api_error","code":"upstream_error"}}
data: [DONE]