AI untuk pemulaPanduan
Error "Not enough tokens": artinya dan cara memperbaikinya
Saldo kosong, rate limit, key buruk, prompt terlalu panjang atau jawaban terpotong: cocokkan error API Anda ke salah satu dari lima penyebab, jalankan pengecekan singkat, terapkan perbaikannya.

Di halaman ini
"Not enough tokens" bukan satu error. Orang memakai frasa itu untuk lima masalah berbeda: saldo kosong, permintaan datang terlalu cepat, key salah, prompt tidak muat di jendela konteks model, atau jawaban mencapai batas output dan berhenti di tengah kalimat. Masing-masing punya perbaikan sendiri, dan cara tercepat membedakannya adalah status HTTP dan body error, bukan kalimat pesannya.
Temukan gejala Anda di tabel, jalankan pengecekan, terapkan perbaikannya.
Gulir tabel ke kanan →
| Yang Anda lihat | Kemungkinan penyebab | Pengecekan | Perbaikan |
|---|---|---|---|
| Permintaan ditolak; pesan menyebut saldo, billing atau kredit | Saldo kosong | Buka akun Anda dan lihat saldonya | Isi ulang saldo, coba lagi |
| Berhasil, lalu gagal beruntun, pulih setelah jeda | Rate limit: terlalu banyak permintaan sekaligus atau per menit | Apakah permintaan yang sama berhasil setelah Anda menunggu satu menit? Apakah Anda mengirim permintaan secara paralel? | Perlambat, coba lagi dengan jeda yang makin panjang |
| Semua permintaan gagal sekaligus, bahkan prompt satu baris | Key salah, kedaluwarsa atau salah ketik, atau base URL salah | Bandingkan key di kode Anda dengan yang ada di akun; periksa URL-nya | Tempel key baru, jangan simpan di dalam kode sumber |
| Prompt pendek berhasil, yang panjang gagal | Prompt plus riwayat lebih besar dari jendela konteks | Perkirakan ukuran semua yang Anda kirim | Pangkas atau ringkas riwayat, pecah dokumen, atau pilih model dengan jendela lebih besar |
| Tidak ada error, tetapi jawaban berakhir di tengah kalimat | Jawaban mencapai batas output | finish_reason adalah "length" |
Naikkan max_tokens hingga batas model, minta format lebih pendek, atau minta model melanjutkan |
Tiga arti "token"#
Kata dalam pesan error menunjuk ke tiga kuantitas berbeda.
- Saldo. Token adalah yang Anda bayar, jadi "kehabisan token" sering berarti "kehabisan uang". Pada layanan prabayar ini adalah saldo.
- Batas per menit. Batas bisa dihitung dalam permintaan atau token per menit. Jika kena salah satunya, perbaikannya adalah menunggu dan mengirim lebih sedikit sekaligus.
- Ukuran jendela. Jendela konteks adalah berapa banyak token yang bisa dibaca model dalam satu permintaan, prompt Anda dan jawabannya bersama-sama.
Dan satu hal yang tidak pernah berarti: API key bukanlah stok token. Key mengidentifikasi akun Anda. Yang habis adalah saldo di belakangnya, atau batas yang melekat padanya. Jika Anda baru mengenal satuan ini, mulailah dengan What is a token in AI?.
1. Saldo kosong#
Dokumentasi API DeepSeek menyebut HTTP 402 Insufficient Balance sebagai "You have run out of balance". API Claude memakai 402 billing_error untuk masalah billing dan pembayaran. Nama berbeda, situasi sama: uangnya habis.
CheapTokens pada prinsipnya bekerja sama: saldo prabayar, bayar sesuai pemakaian, satu saldo untuk semua model. Jadi saat ada yang rusak, lihat saldo dulu. Pengecekannya sepuluh detik dan menyingkirkan penyebab paling umum.
2. Anda kena rate limit#
DeepSeek mendokumentasikan HTTP 429 Rate Limit Reached sebagai permintaan yang datang terlalu cepat, atau batas konkurensi atau QPS terlampaui. Perbaikannya adalah mengatur lajunya: lebih sedikit permintaan paralel, dan jeda retry yang makin panjang (1 s, 2 s, 4 s) alih-alih menghantam endpoint terus-menerus.
Satu jebakan. API Claude juga mengembalikan 429 rate_limit_error saat Anda mencapai batas belanja bulanan tier Anda, dan respons itu tidak memiliki header retry-after. Jadi 429 yang tidak pernah pulih setelah menunggu mungkin soal uang, bukan kecepatan. Jika menunggu tidak membantu, kembali ke penyebab 1.
3. Key salah#
HTTP 401 adalah masalah key di kedua dokumentasi: DeepSeek mencantumkannya sebagai API key salah, Claude sebagai authentication_. Penyebab umumnya adalah spasi atau newline nyasar yang ikut tersalin bersama key, key yang dihapus atau dibuat ulang, dan key yang dikirim ke alamat yang salah. Key dari satu layanan tidak berfungsi di URL layanan lain. Untuk CheapTokens base URL-nya adalah https:/.
Untuk error lain yang bisa Anda temui saat menghubungkan, lihat Common connection errors and how to fix them.
4. Prompt tidak muat di jendela konteks#
Jendela konteks menghitung semua yang dibaca model dalam satu permintaan: system prompt, seluruh riwayat percakapan, pesan baru Anda, dan ruang untuk jawaban. Di CheapTokens, jendela model di katalog kami adalah:
Gulir tabel ke kanan →
| Model | Jendela konteks | Output maksimum per jawaban |
|---|---|---|
| DeepSeek-V4-Flash | 380K | 32,768 token |
| GLM-5.3-Flash | 390K | 8,192 token |
| MiniMax-M2.7 | 200K | 8,192 token |
Sebuah chat tidak punya memori sendiri. Klien mengirim ulang seluruh riwayat di setiap permintaan, jadi setiap permintaan lebih besar dari sebelumnya. Berikut contoh chat fiktif untuk menunjukkan pertumbuhannya (angka bulat, untuk ilustrasi): system prompt 1.000 token, dan setiap giliran menambah sekitar 500 token pertanyaan dan 1.500 token jawaban, total 2.000.
1.000 + 30 × 2.000 = 61.000 token
Itu ukuran riwayat setelah 30 giliran. Setiap token tersebut dihitung lagi sebagai input pada permintaan berikutnya. Permintaan ke-31 membawa riwayat 61.000 token itu plus pertanyaan baru 500 token, jadi input-nya 61.500 token. Dengan jawaban 1.500 token pada MiniMax-M2.7 biayanya $0.0033. Berikut ketiga model untuk permintaan yang sama, dengan harga OpenRouter sebagai pembanding:
| Model | Input $/1Jt | Output $/1Jt | Biaya | 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 |
Total 61.500 token input dan 1.500 token output. Harga per 1 juta token adalah harga saat ini dan berubah seiring tarif kami; kolom OpenRouter menunjukkan harga referensi untuk beban kerja yang sama.
Chat yang sama memenuhi jendela terkecil dalam sekitar seratus giliran:
(200.000 − 1.000) / 2.000 = 99,5
Saat meluap, provider menolak permintaan. Kode statusnya berbeda-beda per provider, jadi baca body error-nya. 413 request_ milik Claude, misalnya, soal ukuran permintaan dalam byte (32 MB untuk Messages), batas yang berbeda dari jendela token.
Yang harus dilakukan:
- Buang giliran paling lama, atau ganti dengan ringkasan singkat.
- Jangan tempel seluruh dokumen saat tugasnya hanya butuh satu bab.
- Pindah ke model dengan jendela lebih besar jika Anda benar-benar butuh teks lengkapnya.
5. Jawaban terpotong#
Tidak ada error di sini, dan itulah yang membuat kasus ini membingungkan. Model berhenti begitu saja karena mencapai max_tokens atau batas output model itu sendiri. Dalam format Chat Completions tandanya adalah finish_ pada choice.
Di CheapTokens, DeepSeek-V4-Flash dapat mengembalikan hingga 32.768 token per jawaban; GLM-5.3-Flash dan MiniMax-M2.7 hingga 8.192. Jika max_tokens Anda lebih rendah dari itu, naikkan. Jika sudah di batas, pecah pekerjaannya ("tulis bagian 1 dari 3") atau minta model melanjutkan dari kalimat terakhir.
Output MiniMax-M2.7 dihargai $0.15 per 1M token, dan itu lebih murah daripada OpenRouter untuk output.
Masalah yang sama dengan nama berbeda#
Provider memberi label berbeda untuk penyebab yang sama. Inilah yang tertulis di dokumentasi mereka per 20 Oktober 2026:
Gulir tabel ke kanan →
| Masalah | DeepSeek API | Claude API |
|---|---|---|
| Saldo kosong | 402 Insufficient Balance |
402 billing_error |
| Rate limit | 429 Rate Limit Reached |
429 rate_limit_error (juga batas belanja bulanan tier) |
| Key buruk | 401 | 401 authentication_ |
| Permintaan terlalu besar | tidak dicantumkan sebagai kode terpisah | 413 request_ (byte, bukan token) |
| Batas belanja yang Anda tetapkan sendiri | tidak dicantumkan | 400 invalid_ |
Sumber: DeepSeek error codes, Claude API errors. Kedua halaman tidak mencantumkan tanggal publikasi, jadi tanggal pengecekan adalah milik kami.
Intinya: jangan menebak dari kalimatnya. Error kembali sebagai JSON dengan objek error yang berisi type dan message. Cocokkan berdasarkan status dan type, karena teks pesannya berubah.
Lihat apa yang sebenarnya dikembalikan#
Cuplikan ini mencetak status dan body dari permintaan yang gagal serta finish_reason dari yang berhasil. Ini sketsa diagnostik, bukan log pengujian: jalankan dengan key Anda sendiri dan baca hasilnya.
# 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_tokensJika pengecekan mengarah ke saldo#
Isi ulang saldo dan kirim ulang permintaannya. Harga di CheapTokens tetap per model, tidak ada jam sibuk, dan satu saldo mencakup semua model, jadi Anda tidak perlu isi ulang terpisah untuk masing-masing. Tarif saat ini ada di sini:
| Model | Konteks | Input $/1Jt | Output $/1Jt | OpenRouter in | OpenRouter out |
|---|---|---|---|---|---|
| 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 |
Harga dalam USD per 1 juta token. Angka OpenRouter ditampilkan sebagai perbandingan dan dapat berubah sewaktu-waktu.
Masukkan volume Anda sendiri ke tabel biaya sebelum mengisi ulang. Top up your balance saat angkanya sudah masuk akal, dan jika Anda ingin memperkirakan beban kerja yang lebih besar dulu, lihat How to estimate the cost of an AI agent.



