Dokumentacja API Hop
Kody błędów i diagnozowanie
Sprawdź wszystkie kody błędów platformy, rozpoznawaj błędy protokołów, bezpiecznie ponawiaj i zbieraj dane diagnostyczne dla użytkowników oraz asystentów AI.
Ustal, co zawiodło
- Zapisz rzeczywisty status HTTP, metodę i ścieżkę żądania. Status HTTP i kod błędu aplikacji opisują różne warstwy; nie zastępuj jednego drugim.
- Odczytuj pola błędów zgodnie z wywołanym protokołem. Odpowiedzi natywne, OpenAI, Claude i Gemini nie mają wspólnej struktury we wszystkich przypadkach.
- Dla żądań strumieniowych sprawdź także zdarzenia błędów i stan ukończenia. Dla zadań asynchronicznych sprawdź
statuszadania. HTTP200nie gwarantuje udanego generowania. - Użyj poniższej tabeli, aby poprawić żądanie lub zdecydować o ponowieniu.
messagejest tekstem objaśniającym, a nie stabilnym wyliczeniem; nie uzależniaj logiki od jego brzmienia.
Wyliczenie kodów błędów platformy
To kompletne wyliczenie kodów błędów aplikacyjnych platformy. Nazwy są etykietami referencyjnymi; wartości code w odpowiedzi są liczbami. „Typowy HTTP” jest wskazówką diagnostyczną, a nie stałym mapowaniem każdego punktu końcowego. Używaj rzeczywistego statusu HTTP i treści odpowiedzi. code przekazany od dostawcy może nie należeć do tego wyliczenia.
Numeryczny code | Nazwa | Typowy HTTP | Znaczenie i działanie |
|---|---|---|---|
10000 | BAD_REQUEST | 400 | Nieprawidłowy format żądania, ścieżka lub podstawowe parametry. Sprawdź metodę, ścieżkę, składnię JSON i nazwy parametrów. |
10001 | VALIDATION_ERROR | 400 / 422 | Walidacja parametrów nie powiodła się. Sprawdź wymagane pola, typy, zakresy i kombinacje parametrów. |
20000 | AUTH_ERROR | 401 | Uwierzytelnienie nie powiodło się. Sprawdź ważność klucza API, wygaśnięcie i format nagłówka uwierzytelnienia. |
20001 | FORBIDDEN | 403 | Odmowa dostępu lub ograniczone konto. Sprawdź uprawnienia konta i własność zasobu. |
30000 | NOT_FOUND | 404 | Ścieżka, model lub zasób nie istnieje. Sprawdź ścieżkę punktu końcowego, model i ID zadania względem zasobów widocznych dla bieżącego klucza API. |
30001 | CONFLICT | 409 | Operacja koliduje z bieżącym stanem zasobu. Odczytaj stan przed dostosowaniem operacji; unikaj podwójnych zgłoszeń. |
40000 | INSUFFICIENT_CREDIT | 402 | Niewystarczające saldo. Sprawdź i uzupełnij je przed kolejnym wywołaniem. |
40001 | RATE_LIMIT | 429 | Żądania napływają zbyt często. Zmniejsz częstotliwość i opóźnij ponowienia. |
40002 | CONCURRENCY_LIMIT | 429 | Zbyt wiele żądań działa jednocześnie. Zmniejsz współbieżność i poczekaj na ukończenie istniejących żądań. |
50000 | PROVIDER_ERROR | 502 | Wywołanie dostawcy zawiodło lub nie zwróciło poprawnego wyniku. Przed rozważeniem ograniczonych ponowień sprawdź, czy wynik został utworzony. |
50001 | SERVICE_UNAVAILABLE | 503 | Usługa jest tymczasowo niedostępna. Spróbuj później z ograniczeniami; zbierz dane diagnostyczne, jeśli błąd się utrzymuje. |
50002 | GATEWAY_TIMEOUT | 504 | Przetwarzanie przekroczyło limit czasu. Wynik może być niepewny; przed ponowieniem sprawdź, czy nastąpiło wykonanie. |
50003 | INTERNAL_ERROR | 500 | Wystąpił niesklasyfikowany błąd serwera. Stosuj ograniczone ponowienia; zbierz dane diagnostyczne, jeśli błąd się utrzymuje. |
Sam HTTP 429 nie pozwala wiarygodnie odróżnić limitu częstotliwości od limitu współbieżności. Rozróżniaj je tylko przy dostępnym jawnym numerycznym kodzie błędu. Sprawdź identyfikatory modeli na liście modeli; nie przepisuj samodzielnie wartości model.
Odczytywanie błędów według protokołu
Poniższe przykłady pokazują typowe struktury generowane przez platformę, a nie jeden format gwarantowany dla każdego błędu. Błędy uwierzytelnienia mogą pochodzić z różnych warstw przetwarzania, a odpowiedzi przekazywane od dostawcy mogą zachować własne struktury, kody tekstowe lub typy. Przed parsowaniem rozpoznaj rzeczywistą strukturę odpowiedzi. Jeśli jest nieznana, zachowaj oryginalne pola i status HTTP zamiast wymuszać konwersję.
Natywne API platformy
Zwykle odczytuj error.code i error.message. requestId może nie występować.
{
"success": false,
"error": {
"code": 10000,
"message": "Bad request"
},
"requestId": "req_example"
}Niektóre błędy mogą używać code i message najwyższego poziomu. Klienci powinni tolerować tę różnicę i nie mogą traktować braku obiektu error jako dowodu sukcesu. Odpowiedzi walidacji parametrów mogą też nie zawierać numerycznego kodu błędu. Traktuj brakujący kod jako nieznany zamiast go wymyślać.
API zgodne z OpenAI
Typowe błędy generowane przez platformę używają code, message i type najwyższego poziomu; nie muszą być opakowane w error.
{
"code": 40000,
"message": "Insufficient credit",
"type": "api_error"
}type jest kategorią protokołu; code w tej strukturze to numeryczny kod błędu platformy. Samo api_error nie określa zasadności ponowienia. Błędy przekazywane od dostawcy i błędy strumieniowe mogą zawierać zagnieżdżone error; obsługuj rzeczywistą odpowiedź protokołu. Zobacz Chat Completions i Responses.
API zgodne z Claude
W typowej strukturze type najwyższego poziomu to error, konkretna kategoria to error.type, a opis to error.message. Ta struktura nie zawiera numerycznego code platformy. Nie wymyślaj go.
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "max_tokens must be a positive safe integer"
}
}Platforma lokalnie generuje poniższe typy błędów Claude. Nie jest to pełne wyliczenie typów błędów dostawcy.
error.type | Lokalne mapowanie HTTP | Co sprawdzić |
|---|---|---|
invalid_request_error | 400 | Sprawdź format i parametry żądania. |
authentication_error | 401 | Sprawdź dane uwierzytelniające. |
api_error | Inne statusy HTTP | Ogólny błąd API; sprawdź rzeczywisty status HTTP i opis. Nie musi nadawać się do ponowienia. |
Zobacz wiadomości Claude.
Błędy w stylu Gemini
Gdy otrzymasz odpowiedź w stylu Gemini, odczytaj error.code, error.message i error.status. Tutaj status jest kategorią tekstową, a nie statusem HTTP lub zadania asynchronicznego.
{
"error": {
"code": 10000,
"message": "Bad request",
"status": "INVALID_ARGUMENT"
}
}Błędy generowane przez platformę w tej strukturze używają numerycznych wartości code platformy. Poniżej znajduje się lokalne mapowanie tekstowego status; nie jest to wyliczenie wszystkich statusów dostawcy.
error.status | Lokalne mapowanie HTTP | Co sprawdzić |
|---|---|---|
UNAUTHENTICATED | 401 | Sprawdź dane uwierzytelniające. |
RESOURCE_EXHAUSTED | 402 / 429 | Sprawdź saldo lub limity zużycia; sam ciąg nie pozwala ich odróżnić. |
PERMISSION_DENIED | 403 | Sprawdź uprawnienia i własność zasobu. |
NOT_FOUND | 404 | Sprawdź ścieżkę, model lub zasób. |
UNAVAILABLE | 503 | Usługa jest tymczasowo niedostępna. |
INTERNAL | >= 500, z wyjątkiem 503 | Błąd serwera; 504 również używa tej wartości. |
INVALID_ARGUMENT | Inne statusy HTTP | Sprawdź rzeczywisty status HTTP i żądanie; 409 również używa tej wartości. |
503 ma pierwszeństwo i używa UNAVAILABLE, a nie INTERNAL. Odpowiedzi dostawcy mogą mieć inną semantykę code i status. Nie stosuj tabeli błędów platformy do każdego numerycznego kodu Gemini.
Bezpieczne ponawianie
| Sytuacja | Zalecane działanie |
|---|---|
400 / 401 / 402 / 403 / 404 / 409 / 422 | Najpierw popraw żądanie, dane uwierzytelniające, saldo, uprawnienia lub stan zasobu. Nie wysyłaj wielokrotnie niezmienionego żądania. Klucze API wysyłaj tylko w nagłówkach, nigdy w parametrach zapytania URL. |
429 | Zmniejsz częstotliwość i współbieżność, a następnie poczekaj przed ponowieniem. Samo zwiększanie liczby ponowień zwykle nasila ograniczanie. |
500 / 502 / 503 / 504 | Najpierw oceń ryzyko podwójnego wykonania, a następnie użyj ograniczonego wykładniczego wydłużania odstępów z losowym odchyleniem, na przykład najwyżej 3 ponowień z łącznym limitem oczekiwania. |
| Rozłączenie sieci lub limit czasu klienta | Brak otrzymanego wyniku nie oznacza, że serwer nie wykonał żądania. Oznacz wynik jako nieznany zamiast deklarować błąd lub natychmiast tworzyć kolejne żądanie. |
Respektuj poprawny nagłówek Retry-After, jeśli występuje. Nie zakładaj, że zawiera go każdy błąd. Automatyczne ponowienie nieidempotentnego żądania generowania może wykonać je ponownie i naliczyć dodatkowe opłaty. Ta strona nie obiecuje ogólnej obsługi kluczy idempotencji; samodzielne dodanie Idempotency-Key nie gwarantuje deduplikacji.
Jeśli masz już jobId, sprawdź to zadanie przed utworzeniem kolejnego. Jeśli nie masz jobId, a wynik jest niepewny, zachowaj identyfikator żądania i znacznik czasu do analizy.
Strumienie i zadania asynchroniczne
Żądania SSE
Po rozpoczęciu SSE status HTTP może pozostać 200, podczas gdy późniejszy błąd zostanie zgłoszony przez zdarzenie lub dane błędu w strumieniu. Parsuj zdarzenia i dane wybranego protokołu oraz sprawdzaj prawidłowe ukończenie. Przy błędzie lub nieoczekiwanym rozłączeniu nie traktuj częściowego tekstu lub obrazów jako pełnego udanego wyniku. Nazwy zdarzeń i ich dane różnią się między punktami końcowymi. Nie sprawdzaj tylko jednego stałego pola error ani nie używaj „otrzymano dowolny tekst” jako warunku sukcesu.
Zadania asynchroniczne
Odpowiedź utworzenia zawierająca data.jobId oznacza przyjęcie żądania, a nie ukończenie generowania. Udana odpowiedź HTTP przy odpytywaniu zadania oznacza powodzenie zapytania. Nadal musisz sprawdzić data.status zadania:
PENDING,CONNECT,PROCESSING: kontynuuj odpytywanie zgodnie z dokumentacją Jobs.COMPLETED: odczytajoutputResult.FAILED,CANCELLED: zatrzymaj odpytywanie i zachowaj ID zadania oraz informacje odpowiedzi bez danych wrażliwych do analizy.
Szczegóły błędu mogą pojawić się w data.outputResult.error. Pole jest opcjonalne i nie jest gwarantowane dla każdego nieudanego zadania. Używaj Jobs tylko wtedy, gdy odpowiedź utworzenia jawnie zwraca jobId. Nie stosuj odpytywania zadań do punktów końcowych zwracających wyniki bezpośrednio przez JSON lub SSE.
Diagnostyka dla użytkowników i asystentów AI
Przekaż wsparciu lub asystentowi AI poniższe informacje po usunięciu danych wrażliwych. Dla brakujących pól użyj unknown; dla statusu HTTP użyj unknown, jeśli nie otrzymano odpowiedzi HTTP. Zachowaj ścieżki pól i oryginalne typy wartości, na przykład error.code: 10000 (number) lub error.code: "invalid_api_key" (string). Nie konwertuj automatycznie tekstowego code na numeryczny kod platformy ani nie wymyślaj brakujących pól z message, statusu HTTP lub nazw modeli.
time_with_timezone: unknown
method: unknown
path_without_query: unknown
model: unknown
stream: unknown
http_status: unknown
error_code_path_value_and_type: unknown
error_type_path_and_value: unknown
protocol_status_path_and_value: unknown
sanitized_message: unknown
request_id_from_body_or_X-Request-ID: unknown
job_id: unknown
job_status: unknown
retry_after: unknown
retry_count_and_delays: unknown
received_partial_output: unknownOdczytaj requestId z treści odpowiedzi lub nagłówka odpowiedzi X-Request-ID, gdy są dostępne. Zachowaj jobId jako ciąg znaków, aby nie utracić precyzji długich liczb. Podaj tylko minimalne parametry żądania bez danych wrażliwych. Usuń klucze API, tokeny, pliki cookie, pełne nagłówki uwierzytelnienia, dane osobowe, prywatne prompty i treść plików wejściowych. Usuń parametry zapytań URL oraz adresy wejścia lub wyjścia zawierające podpisy lub dane dostępu. Nie wklejaj pełnych logów żądań bez ich przeglądu.
Asystenci AI powinni odróżniać zaobserwowane pola od możliwych przyczyn i wskazywać brakujące informacje. Niedostateczne dowody nie mogą być uznawane za potwierdzenie sukcesu żądania, braku wykonania lub braku opłaty.