Powrót do bloga

AI dla początkującychPrzewodnik

Błąd „Not enough tokens”: co oznacza i jak go naprawić

Puste saldo, limit szybkości, zły klucz, zbyt długi prompt lub ucięta odpowiedź: dopasuj błąd API do jednej z pięciu przyczyn, wykonaj szybkie sprawdzenie, zastosuj poprawkę.

Autor: CheapTokens TeamOpublikowano Zaktualizowano 6 min czytania

Okładka ze słowami „Not enough tokens?” nad pięcioma etykietami: saldo, szybkość, klucz, kontekst, wyjście
Na tej stronie
  1. Trzy znaczenia słowa „tokeny”
  2. 1. Saldo jest puste
  3. 2. Trafiłeś w limit szybkości
  4. 3. Klucz jest nieprawidłowy
  5. 4. Prompt nie mieści się w oknie kontekstu
  6. 5. Odpowiedź została ucięta
  7. Ten sam problem pod różnymi nazwami
  8. Zobacz, co faktycznie wraca
  9. Jeśli sprawdzenie wskazuje na saldo

„Za mało tokenów” to nie jeden błąd. Ludzie używają tego sformułowania na określenie pięciu różnych problemów: saldo jest puste, żądania przychodzą zbyt szybko, klucz jest nieprawidłowy, prompt nie mieści się w oknie kontekstu modelu albo odpowiedź trafiła w limit wyjścia i urwała się w połowie zdania. Każdy z nich ma własne rozwiązanie, a najszybszym sposobem na ich rozróżnienie jest status HTTP i treść błędu, a nie brzmienie komunikatu.

Znajdź swój objaw w tabeli, wykonaj sprawdzenie, zastosuj poprawkę.

Co widzisz Prawdopodobna przyczyna Sprawdzenie Poprawka
Żądanie odrzucone; komunikat wspomina o saldzie, rozliczeniach lub środkach Saldo jest puste Otwórz swoje konto i sprawdź saldo Doładuj saldo, ponów próbę
Działa, potem zawodzi seriami, ustępuje po przerwie Limit szybkości: zbyt wiele żądań naraz lub na minutę Czy to samo żądanie przechodzi po odczekaniu minuty? Czy wysyłasz żądania równolegle? Zwolnij tempo, ponawiaj z rosnącym opóźnieniem
Każde żądanie zawodzi od razu, nawet jednolinijkowy prompt Nieprawidłowy, wygasły lub błędnie wpisany klucz albo zły bazowy URL Porównaj klucz w kodzie z tym na koncie; sprawdź URL Wklej świeży klucz, trzymaj go poza kodem źródłowym
Krótkie prompty działają, długie zawodzą Prompt wraz z historią jest większy niż okno kontekstu Oszacuj rozmiar wszystkiego, co wysyłasz Przytnij lub podsumuj historię, podziel dokument albo wybierz model z większym oknem
Brak błędu, ale odpowiedź kończy się w połowie zdania Odpowiedź trafiła w limit wyjścia finish_reason wynosi "length" Zwiększ max_tokens do limitu modelu, poproś o krótszy format albo poproś o kontynuację

Trzy znaczenia słowa „tokeny”#

Słowo w komunikacie błędu wskazuje na trzy różne wielkości.

  • Saldo. Tokeny to to, za co płacisz, więc „skończyły się tokeny” często oznacza „skończyły się pieniądze”. W usłudze przedpłaconej to właśnie saldo.
  • Limit na minutę. Limity mogą być liczone w żądaniach lub w tokenach na minutę. Gdy w jeden trafisz, rozwiązaniem jest odczekanie i wysyłanie mniejszej liczby naraz.
  • Rozmiar okna. Okno kontekstu to liczba tokenów, które model może odczytać w jednym żądaniu — Twój prompt i jego odpowiedź razem.

A jedno znaczenie nigdy nie obowiązuje: klucz API nie jest zapasem tokenów. Klucz identyfikuje Twoje konto. Wyczerpuje się saldo stojące za nim albo limit do niego przypisany. Jeśli dopiero zaczynasz z samą jednostką, zacznij od What is a token in AI?.

1. Saldo jest puste#

Dokumentacja API DeepSeek opisuje HTTP 402 Insufficient Balance jako „You have run out of balance”. API Claude używa 402 billing_error dla problemów z rozliczeniami i płatnościami. Różne nazwy, ta sama sytuacja: pieniądze się skończyły.

CheapTokens działa w zasadzie tak samo: przedpłacone saldo, płatność za zużycie, jedno saldo dla wszystkich modeli. Więc gdy coś się psuje, najpierw sprawdź saldo. To dziesięciosekundowa czynność, która wyklucza najczęstszą przyczynę.

2. Trafiłeś w limit szybkości#

DeepSeek dokumentuje HTTP 429 Rate Limit Reached jako żądania przychodzące zbyt szybko albo przekroczenie limitu współbieżności lub QPS. Rozwiązaniem jest nadanie im tempa: mniej równoległych żądań i opóźnienie ponawiania, które rośnie (1 s, 2 s, 4 s), zamiast dobijania się do endpointu.

Jedna pułapka. API Claude również zwraca 429 rate_limit_error, gdy osiągniesz miesięczny limit wydatków swojego planu, a ta odpowiedź nie ma nagłówka retry-after. Więc 429, które nigdy nie ustępuje po odczekaniu, może dotyczyć pieniędzy, a nie szybkości. Jeśli czekanie nie pomaga, wróć do przyczyny 1.

3. Klucz jest nieprawidłowy#

HTTP 401 to problem z kluczem w obu dokumentacjach: DeepSeek wymienia go jako nieprawidłowy klucz API, Claude jako authentication_error. Typowe powody to zbłąkana spacja lub znak nowej linii skopiowany razem z kluczem, klucz usunięty lub wygenerowany ponownie oraz klucz wysłany pod zły adres. Klucz z jednej usługi nie działa pod URL innej usługi. Dla CheapTokens bazowy URL to https://api.cheaptokens.dev/v1.

Inne błędy, na które możesz trafić podczas łączenia, opisano w Common connection errors and how to fix them.

4. Prompt nie mieści się w oknie kontekstu#

Okno kontekstu liczy wszystko, co model odczytuje w jednym żądaniu: prompt systemowy, całą historię rozmowy, Twoją nową wiadomość i miejsce na odpowiedź. W CheapTokens okna modeli z naszego katalogu wynoszą:

Model Okno kontekstu Maksymalne wyjście na odpowiedź
DeepSeek-V4-Flash 380K 32 768 tokenów
GLM-5.3-Flash 390K 8 192 tokenów
MiniMax-M2.7 200K 8 192 tokenów

Czat nie ma własnej pamięci. Klient wysyła całą historię ponownie przy każdym żądaniu, więc każde żądanie jest większe od poprzedniego. Oto wymyślony czat pokazujący wzrost (okrągłe liczby, dla ilustracji): prompt systemowy 1000 tokenów, a każda tura dodaje około 500 tokenów pytania i 1500 tokenów odpowiedzi, w sumie 2000.

1 000 + 30 × 2 000 = 61 000 tokenów

Taki jest rozmiar historii po 30 turach. Każdy z tych tokenów liczy się ponownie jako wejście przy następnym żądaniu. 31. żądanie niesie tę 61 000-tokenową historię plus nowe 500-tokenowe pytanie, więc jego wejście to 61 500 tokenów. Przy 1500-tokenowej odpowiedzi na MiniMax-M2.7 kosztuje to $0.0033. Oto wszystkie trzy modele dla tego samego żądania, z ceną OpenRouter dla porównania:

Model Koszt OpenRouter
GLM-5.3-Flash $0.0013 $0.0027
DeepSeek-V4-Flash $0.0011 $0.0032
MiniMax-M2.7 $0.0033 $0.0203

61 500 tokenów wejściowych i 1500 tokenów wyjściowych łącznie. Ceny za 1 mln tokenów są aktualne i zmieniają się wraz z naszymi taryfami; kolumna OpenRouter pokazuje ceny referencyjne dla tego samego obciążenia.

Ten sam czat zapełnia najmniejsze okno w około sto tur:

(200 000 − 1 000) / 2 000 = 99,5

Gdy następuje przepełnienie, dostawca odrzuca żądanie. Kod statusu różni się w zależności od dostawcy, więc czytaj treść błędu. Na przykład 413 request_too_large u Claude dotyczy rozmiaru żądania w bajtach (32 MB dla Messages), co jest innym limitem niż okno tokenów.

Co zrobić:

  • Odrzuć najstarsze tury albo zastąp je krótkim podsumowaniem.
  • Nie wklejaj całego dokumentu, gdy zadanie wymaga jednego rozdziału.
  • Przejdź na model z większym oknem, jeśli naprawdę potrzebujesz pełnego tekstu.

5. Odpowiedź została ucięta#

Tu nie ma błędu i właśnie to czyni ten przypadek mylącym. Model po prostu się zatrzymał, bo osiągnął max_tokens lub własny limit wyjścia modelu. W formacie Chat Completions znakiem tego jest finish_reason: "length" przy wyborze.

W CheapTokens DeepSeek-V4-Flash może zwrócić do 32 768 tokenów na odpowiedź; GLM-5.3-Flash i MiniMax-M2.7 do 8 192. Jeśli Twoje max_tokens jest niższe, zwiększ je. Jeśli już jesteś na limicie, podziel zadanie („napisz część 1 z 3”) albo poproś model o kontynuację od ostatniego zdania.

Wyjście MiniMax-M2.7 jest wyceniane na $0.15 za 1 mln tokenów, co jest tańsze niż OpenRouter na wyjściu.

Ten sam problem pod różnymi nazwami#

Dostawcy różnie nazywają te same przyczyny. Oto co mówi ich dokumentacja na dzień 20 października 2026:

Problem API DeepSeek API Claude
Saldo jest puste 402 Insufficient Balance 402 billing_error
Limit szybkości 429 Rate Limit Reached 429 rate_limit_error (także miesięczny limit wydatków planu)
Zły klucz 401 401 authentication_error
Żądanie zbyt duże niewymieniony jako osobny kod 413 request_too_large (bajty, nie tokeny)
Limit wydatków ustawiony samodzielnie niewymieniony 400 invalid_request_error

Źródła: DeepSeek error codes, Claude API errors. Żadna ze stron nie podaje daty publikacji, więc data sprawdzenia jest nasza.

Wniosek: nie zgaduj po brzmieniu. Błędy wracają jako JSON z obiektem error zawierającym type i message. Dopasowuj po statusie i typie, bo tekst komunikatu się zmienia.

Zobacz, co faktycznie wraca#

Ten fragment wypisuje status i treść nieudanego żądania oraz finish_reason udanego. To szkic diagnostyczny, nie dziennik testów: uruchom go z własnym kluczem i przeczytaj, co dostaniesz.

python
# Placeholders: YOUR_API_KEY, MODEL_ID (a model id you have access to)
from openai import OpenAI, APIStatusError

client = OpenAI(api_key="YOUR_API_KEY", base_url="https://api.cheaptokens.dev/v1")

try:
    r = client.chat.completions.create(
        model="MODEL_ID",
        messages=[{"role": "user", "content": "Write a long checklist."}],
        max_tokens=1000,
    )
except APIStatusError as e:
    # Read the status and the body, not the wording of the message
    print("status:", e.status_code)
    print("body:", e.body)
else:
    print("finish_reason:", r.choices[0].finish_reason)  # "length" = cut off
    print("usage:", r.usage)  # prompt_tokens and completion_tokens

Jeśli sprawdzenie wskazuje na saldo#

Doładuj saldo i wyślij żądanie ponownie. Ceny w CheapTokens są stałe dla modelu, nie ma godzin szczytu, a jedno saldo obejmuje każdy model, więc nie potrzebujesz osobnego doładowania dla każdego. Aktualne stawki są tutaj:

Model Kontekst Wejście $/1M Wyjście $/1M OpenRouter wejście OpenRouter wyjście
GLM-5.3-Flash reasoning 390K $0.02 $0.04 $0.0413 $0.0758
DeepSeek-V4-Flash 380K $0.015 $0.10 $0.0475 $0.1568
MiniMax-M2.7 180K $0.05 $0.15 $0.30 $1.20

Ceny w USD za 1 mln tokenów. Dane OpenRouter służą do porównania i mogą ulec zmianie.

Wstaw swój własny wolumen do tabeli kosztów, zanim doładujesz. Top up your balance, gdy liczby wyglądają dobrze, a jeśli najpierw chcesz oszacować większe obciążenie, zobacz How to estimate the cost of an AI agent.