Strona główna → Pomoc

Unexpected token '<' przy wywołaniu API zgodnego z OpenAI

Twój base URL jest błędny, a serwer zwraca stronę WWW zamiast API. Klient próbuje wtedy sparsować HTML jako JSON i wykłada się już na pierwszym znaku.

Co widzisz

Dlaczego tak się dzieje

Większość bramek zgodnych z OpenAI serwuje stronę i API z tej samej domeny. Gdy zapytasz o ścieżkę, której API nie zna, nie dostaniesz czystego 404 – dostaniesz frontend strony, z HTTP 200 i Content-Type: text/html.

Z punktu widzenia klienta wszystko się udało, więc parsuje treść odpowiedzi. Błąd, który widzisz, to parser JSON narzekający na pierwszy znak dokumentu HTML – a to nie wskazuje nawet w pobliżu prawdziwego problemu.

Oznacza to też, że nieudane wywołanie zwykle nie zostawia śladu w logach błędów dostawcy – 200 to nie błąd. Wsparcie powie ci, że nie widzi niczego złego, i będzie mówić prawdę.

Sprawdź, czy to ta przyczyna

Potwierdź to jednym poleceniem. Wyślij zapytanie i spójrz na typ treści zamiast na samą treść:

curl -s -o /dev/null -w '%{http_code} %{content_type}\n' \
  -X POST 'YOUR_BASE_URL/chat/completions' \
  -H 'Authorization: Bearer YOUR_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"model":"MODEL","messages":[{"role":"user","content":"hi"}]}'

Działający endpoint zwraca application/json – nawet przy złym kluczu dostaniesz JSON-a, który o tym mówi. Jeśli widzisz text/html, problemem jest adres, nie klucz.

Jak to naprawić

  1. Sprawdź, czy twój klient sam dokleja /v1Na tym polega cała pułapka. SDK OpenAI nie dodają /v1 – musisz je wpisać w base URL. Anthropic SDK i Claude Code dodają je same, więc base URL kończący się już na /v1 daje /v1/v1/messages i kończy się dokładnie tak samo.
  2. Uważaj na ukośnik na końcuNiektóre klienty łączą ścieżki naiwnie. Base URL zakończony ukośnikiem może dać w końcowej ścieżce podwójny ukośnik, który część bramek kieruje do frontendu zamiast do API.
  3. Upewnij się, że trafiasz w host APIJeśli dostawca ma osobną subdomenę API, główna domena może pod tymi samymi ścieżkami serwować stronę marketingową. Ten sam kształt adresu, zupełnie inna obsługa.
KlientBase URL powinien
OpenAI SDK (Python, Node, Go)kończyć się na /v1
Codex, Cherry Studio, Chatbox, LobeChatkończyć się na /v1
Anthropic SDKbez /v1 – samo dokleja /v1/messages
Claude Codebez /v1 – z tego samego powodu
W APICLAN base URL to https://apiclan.us/v1 dla klientów w stylu OpenAI i https://apiclan.us dla Claude Code. Pełna konfiguracja każdego klienta jest w szybkim starcie.

Powiązane

401 invalid API key – gdy klucz wygląda dobrze, a i tak nie działa404 na /v1/chat/completions, choć endpoint na pewno istnieje

Ostatnio sprawdzono 2026-10-01. Napisane na podstawie problemów zdiagnozowanych na działającej bramce zgodnej z OpenAI, a nie zebrane z innych stron.