Batas permintaan API LLM: Tangani 429, Percobaan ulang, dan Konkurensi dengan Aman
Oleh Nicho
Aplikasi LLM produksi butuh lebih dari sekadar loop percobaan ulang. Aplikasi itu perlu tahu kenapa sebuah permintaan ditolak, berapa banyak beban yang bisa diterima, dan kapan harus berhenti mencoba.
Titik awal yang praktis itu sederhana: klasifikasikan error, kendalikan penerimaan permintaan, dan coba ulang hanya kegagalan yang masuk akal bisa pulih dalam tenggat waktu operasi. Menambah percobaan ulang tanpa kontrol ini bisa mengubah lonjakan trafik kecil jadi gangguan yang lebih lama.
Panduan ini membahas desain aplikasi yang netral penyedia. Kuota, kode error, header, dan aturan penghitungan yang tepat bergantung pada penyedia, model, akun, dan gateway kamu.
Pahami batas mana yang kamu capai
Kontrol-kontrol ini menjawab pertanyaan yang berbeda:
| Kontrol | Apa yang diukur | Respons aplikasi |
|---|---|---|
| Batas permintaan | Permintaan yang diterima dalam jendela waktu | Atur laju awal dan haluskan lonjakan |
| Batas token | Pemakaian token atau perkiraan kebutuhan token | Cadangkan kapasitas token dan batasi ukuran permintaan |
| Konkurensi | Permintaan yang sedang berjalan | Batasi worker atau pakai semaphore |
| Pengeluaran atau saldo | Ketersediaan finansial | Cek kontrol pembayaran atau anggaran |
OpenAI, misalnya, mendokumentasikan batas permintaan dan token secara terpisah, dengan cakupan yang bisa mencakup proyek dan keluarga model bersama. Jadi API key baru belum tentu berarti kapasitas baru. Dokumentasinya juga membedakan error batas permintaan sementara dari batas pengeluaran keras, meskipun keduanya memakai 429. Baca isi error-nya, jangan mengambil keputusan hanya dari status. Dokumentasi batas permintaan OpenAI
Standar HTTP mendefinisikan 429 tapi tidak mengatur bagaimana sebuah layanan mengidentifikasi pemanggil atau menghitung permintaan. Standar itu juga membuat Retry-After opsional. Jangan berasumsi setiap endpoint yang kompatibel dengan OpenAI punya perilaku pembatasan yang sama. Spesifikasi HTTP 429
Ukur trafik di sekitar batasan yang lebih ketat
Bayangkan contoh sederhana dan hipotetis: jatah 60 permintaan per menit dan 120,000 token per menit. Kalau setiap permintaan memakai 4,000 token yang dihitung, kapasitas token hanya mendukung 30 permintaan seperti itu per menit:
120,000 tokens/minute ÷ 4,000 tokens/request = 30 requests/minute
Ini contoh perencanaan, bukan kuota penyedia atau penjadwal yang pasti. Sebuah layanan bisa mencadangkan perkiraan output, memakai jendela penegakan yang lebih pendek, atau menghitung kategori token yang berbeda secara berbeda.
Ukur distribusi ukuran permintaanmu sendiri. Rata-rata saja menyembunyikan unggahan dokumen besar dan generasi panjang. Sisakan ruang untuk outlier ini, jangan menargetkan angka maksimum matematis.
Pakai kontrol terpisah untuk awal permintaan dan pekerjaan yang sedang berjalan. Batas konkurensi saja tidak menegakkan permintaan per menit: respons cepat bisa membebaskan slot cukup cepat untuk menciptakan awal permintaan yang berlebihan. Sebaliknya, pembatas laju permintaan tidak menghentikan streaming lambat menumpuk dan menghabiskan koneksi.
Taruh kontrol penerimaan sebelum percobaan ulang
Jalur permintaan yang berguna adalah:
Authenticated request → bounded queue → rate/token admission → worker → provider
Rancang antreannya dengan sengaja:
- Tetapkan panjang antrean maksimum dan waktu tunggu maksimum.
- Beri permintaan interaktif tenggat waktu yang lebih pendek daripada tugas latar belakang.
- Tolak atau tunda pekerjaan berlebih dengan respons tingkat aplikasi yang jelas.
- Hapus tugas yang dibatalkan dan kedaluwarsa sebelum dikirim.
- Bagikan status penerimaan di seluruh replika yang memakai kuota upstream yang sama.
Kalau tidak, menambah server aplikasi bisa melipatgandakan traffic sementara kapasitas upstream tetap sama. Untuk beban kerja campuran, sisihkan sebagian kapasitas untuk permintaan yang menghadap pengguna supaya tugas impor dokumen tidak mengambil semua slot.
Ini adalah rekomendasi arsitektur, bukan janji bahwa gateway tertentu menyediakan antrean atau kontrol konkurensi yang bisa diatur.
Gunakan satu kebijakan retry yang terbatas
Retry harus punya pemilik. Periksa perilaku SDK sebelum menambah loop lain. Dalam konfigurasi hipotetis, tiga percobaan aplikasi yang membungkus tiga percobaan SDK bisa menghasilkan sembilan percobaan upstream untuk satu operasi logis.
Kebijakan yang praktis adalah:
- Klasifikasikan kegagalan menggunakan informasi error yang didokumentasikan penyedia.
- Berhenti segera untuk error yang memerlukan perubahan kredensial, izin, pembayaran, atau konten permintaan.
- Retry hanya kegagalan sementara yang memenuhi syarat selama anggaran percobaan dan waktu masih tersisa.
- Patuhi panduan retry server yang valid; kalau tidak, gunakan exponential backoff dengan batas atas dan jitter.
- Kembalikan kegagalan akhir dengan konteks yang cukup untuk menyelidikinya dengan aman.
Retry-After bisa menentukan delay atau tanggal. Perlakukan delay server yang berlaku sebagai minimum, bukan saran untuk memperpendek. Kalau melebihi tenggat waktu operasi yang tersisa, tunda pekerjaan atau gagal dengan jelas daripada retry lebih awal. Semantik HTTP Retry-After
Waktu tunggu acak mengurangi gelombang retry yang tersinkronisasi. Batas waktu dan percobaan terbatas mencegah retry menahan resource tanpa batas. Panduan engineering AWS menjelaskan kenapa retry bisa memperkuat overload dan kenapa batas waktu tidak membuktikan suatu operasi tidak berdampak. Panduan AWS tentang batas waktu dan retry
Jangan replay stream atau aksi agen secara membabi buta
Stream yang berhenti setelah menampilkan teks tidak sama dengan permintaan yang ditolak sebelum pekerjaan dimulai. Antarmuka kamu perlu status belum selesai yang eksplisit. Memulai ulang secara otomatis bisa menduplikasi teks, memakai token tambahan, atau menghasilkan jawaban berbeda.
Alur kerja agen perlu batas tambahan: retry generasi model tidak boleh otomatis replay aksi tool yang sudah selesai. Catat hasil aksi dan gunakan mekanisme idempotensi di mana layanan aksi mendukungnya. Respons yang gagal bukan alasan untuk mengirim email yang sama atau membuat pesanan yang sama dua kali.
Pantau pekerjaan logis, bukan hanya keberhasilan HTTP
Lacak ini secara terpisah:
- Operasi logis dan percobaan upstream.
- Waktu tunggu antrean dan permintaan yang sedang berjalan.
- Penolakan berdasarkan alasan error yang didokumentasikan.
- Pemakaian input/output dan biaya per operasi yang selesai.
- Batas waktu, pekerjaan yang dibatalkan, dan stream yang belum selesai.
Gunakan pengenal permintaan dan metadata yang sudah dibersihkan. Hindari mencatat header otorisasi atau prompt lengkap secara default. Tingkat error yang menurun bukan berarti menang kalau percobaan ulang menggandakan biaya setiap tugas yang selesai.
Periksa kontrol gateway secara terpisah dari kapasitas
Informasi harga dan akun yang dipublikasikan cheapaimodel menjelaskan anggaran per key, kedaluwarsa, daftar yang diizinkan untuk model/IP, dan respons 403 saat saldo akun habis. Kondisi saldo itu bukan sesuatu yang bisa diselesaikan dengan backoff singkat. Kontrol tersebut juga tidak menjamin throughput permintaan atau token tanpa batas.
Sebelum melakukan scaling pada integrasi, cek dokumentasi cheapaimodel yang terbaru dan pastikan batas yang berlaku untuk route yang ingin kamu gunakan. Buat kontrol penerimaan dan kebijakan percobaan ulang tetap bisa dikonfigurasi supaya perubahan tidak perlu menulis ulang logika aplikasi.
Tujuannya adalah pekerjaan selesai yang bisa diprediksi: waktu tunggu yang terbatas, kegagalan yang bisa dijelaskan, pengeluaran yang terkendali, dan percobaan ulang yang membantu pemulihan, bukan melawannya.