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

Na tej stronie
„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ę.
Przewiń tabelę w prawo →
| 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_. 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:/.
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ą:
Przewiń tabelę w prawo →
| 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 | Wejście $/1M | Wyjście $/1M | Koszt | OpenRouter |
|---|---|---|---|---|
| GLM-5.3-Flash | $0.02 | $0.04 | $0.0013 | $0.0027 |
| DeepSeek-V4-Flash | $0.015 | $0.10 | $0.0011 | $0.0032 |
| MiniMax-M2.7 | $0.05 | $0.15 | $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_ 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_ 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:
Przewiń tabelę w prawo →
| 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_ |
| Żądanie zbyt duże | niewymieniony jako osobny kod | 413 request_ (bajty, nie tokeny) |
| Limit wydatków ustawiony samodzielnie | niewymieniony | 400 invalid_ |
Ź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.
# 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_tokensJeś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.



