AI API Oran Sınırlaması: Nasıl Çalışır ve Nasıl Yönetilir
Her AI API'nin oran sınırları vardır. Geliştirme aşamasında bunlara takılmak can sıkıcıdır. Üretimde takılmak ise kullanıcılarınızın hata görmesine neden olur. Sağlayıcılar arasındaki oran sınırlarının nasıl çalıştığını anlamak ve uygun yeniden deneme mantığını kurmak, bir demo ile üretim uygulaması arasındaki farktır.
Her Sağlayıcının Sınırlaması Nasıl Çalışır
OpenAI
OpenAI, hesabınızın kullanım geçmişi ve ödeme seviyesine göre katmanlı oran sınırları uygular.
| Katman | RPM (İstek/Dakika) | TPM (Token/Dakika) | Nasıl Ulaşılır |
|---|---|---|---|
| Ücretsiz | 3 | 40.000 | Yeni hesap |
| Katman 1 | 500 | 200.000 | 5$ ödeme yapıldı |
| Katman 2 | 5.000 | 2.000.000 | 50$ ödeme yapıldı |
| Katman 3 | 5.000 | 10.000.000 | 100$ ödeme yapıldı |
| Katman 4 | 10.000 | 50.000.000 | 250$ ödeme yapıldı |
| Katman 5 | 10.000 | 300.000.000 | 1.000$ ödeme yapıldı |
Sınırlar model başına geçerlidir. GPT-4.1 kullanmak, GPT-4.1-mini kotanızı tüketmez.
Anthropic
Anthropic, RPM ve TPM sınırları olan benzer bir katman sistemi kullanır. Ayrıca alt katmanlarda günlük token sınırı uygular.
Google (Gemini)
Google AI Studio, model başına sınırlar uygular. Ücretsiz katman günlük isteklerde cömerttir ancak dakikalık oranlarda sıkıdır (Gemini 2.5 Flash ücretsiz katman için 15 RPM).
Aggregratör Platformlar
LemonData ve OpenRouter gibi aggregratörler, yukarı akış sınırlarının üzerine kendi oran sınırlama katmanlarını ekler. LemonData rol tabanlı sınırlar kullanır:
| Rol | RPM |
|---|---|
| Kullanıcı | 1.000 |
| Ortak | 3.000 |
| VIP | 10.000 |
Avantajı: Aggregratör sınırları genellikle bireysel sağlayıcıların ücretsiz katmanlarından yüksektir ve çok kanallı yönlendirme sayesinde bir yukarı akış kanalı oran sınırlamasına takılırsa istek başka bir kanala yönlendirilir.
Oran Sınırı Başlıklarını Okuma
Tüm büyük sağlayıcılar, yanıt başlıklarında oran sınırı bilgisi döner:
x-ratelimit-limit-requests: 500
x-ratelimit-remaining-requests: 499
x-ratelimit-reset-requests: 60s
x-ratelimit-limit-tokens: 200000
x-ratelimit-remaining-tokens: 199500
Bu başlıkları proaktif olarak kullanın. Yavaşlamak için 429 hatasını beklemeyin.
Yeniden Deneme Mantığı Kurma
Yanlış Yol
# Bunu yapmayın
import time
def call_api(messages):
while True:
try:
return client.chat.completions.create(
model="gpt-4.1",
messages=messages
)
except Exception:
time.sleep(1) # Sabit gecikme, geri çekilme yok, her hatayı yakalar
Sorunlar: üssel geri çekilme yok, yeniden denemeye uygun olmayan hataları yakalar, maksimum yeniden deneme sınırı yok, rastgele gecikme (jitter) yok.
Doğru Yol
import time
import random
from openai import RateLimitError, APIError, APIConnectionError
def call_with_retry(messages, model="gpt-4.1", max_retries=3):
"""Üssel geri çekilme ve jitter ile yeniden deneme."""
for attempt in range(max_retries + 1):
try:
return client.chat.completions.create(
model=model,
messages=messages
)
except RateLimitError as e:
if attempt == max_retries:
raise
# Yanıttan retry_after varsa kullan
wait = getattr(e, 'retry_after', None)
if wait is None:
wait = (2 ** attempt) + random.uniform(0, 1)
print(f"Oran sınırına takıldı. {wait:.1f}s bekleniyor (deneme {attempt + 1})")
time.sleep(wait)
except APIConnectionError:
if attempt == max_retries:
raise
wait = (2 ** attempt) + random.uniform(0, 1)
time.sleep(wait)
except APIError as e:
# İstemci hatalarını (400, 401, 403) yeniden deneme
if e.status_code and 400 <= e.status_code < 500:
raise
if attempt == max_retries:
raise
time.sleep((2 ** attempt) + random.uniform(0, 1))
Ana prensipler:
- Üssel geri çekilme: 1s, 2s, 4s, 8s
- Jitter: 0-1s rastgele eklenerek "thundering herd" önlenir
- Sağlanırsa
retry_afterbaşlığına saygı gösterilir - İstemci hataları (kötü istek, yetkilendirme hatası) yeniden denenmez
- Maksimum yeniden deneme sayısı belirlenir
Async Versiyon
import asyncio
import random
from openai import AsyncOpenAI, RateLimitError
async_client = AsyncOpenAI(
api_key="sk-lemon-xxx",
base_url="https://api.lemondata.cc/v1"
)
async def call_with_retry_async(messages, model="gpt-4.1", max_retries=3):
for attempt in range(max_retries + 1):
try:
return await async_client.chat.completions.create(
model=model,
messages=messages
)
except RateLimitError:
if attempt == max_retries:
raise
wait = (2 ** attempt) + random.uniform(0, 1)
await asyncio.sleep(wait)
Gelişmiş: Token Bucket Oran Sınırlayıcı
Yüksek verimli uygulamalar için, sunucu sınırlarına takılmamak adına istemci tarafı oran sınırlaması uygulayın:
import time
import asyncio
class TokenBucket:
def __init__(self, rate: float, capacity: int):
self.rate = rate # saniye başına token
self.capacity = capacity # maksimum patlama boyutu
self.tokens = capacity
self.last_refill = time.monotonic()
async def acquire(self, tokens: int = 1):
while True:
now = time.monotonic()
elapsed = now - self.last_refill
self.tokens = min(
self.capacity,
self.tokens + elapsed * self.rate
)
self.last_refill = now
if self.tokens >= tokens:
self.tokens -= tokens
return
# Yeterli token için bekle
wait = (tokens - self.tokens) / self.rate
await asyncio.sleep(wait)
# Dakikada 500 istek = saniyede ~8.3
limiter = TokenBucket(rate=8.0, capacity=20)
async def rate_limited_call(messages, model="gpt-4.1"):
await limiter.acquire()
return await async_client.chat.completions.create(
model=model,
messages=messages
)
Oran Sınırlarında Model Yedekleme
Birincil modeliniz oran sınırına takıldığında, alternatif modele geçin:
FALLBACK_CHAIN = [
"claude-sonnet-4-6",
"gpt-4.1",
"gpt-4.1-mini",
]
async def call_with_fallback(messages):
for model in FALLBACK_CHAIN:
try:
return await async_client.chat.completions.create(
model=model,
messages=messages
)
except RateLimitError:
continue
raise Exception("Tüm modeller oran sınırına takıldı")
API aggregratörleri burada parlıyor. Tek bir uç noktada 300+ model ile her zaman bir yedek bulunur.
Oran Sınırı Kullanımını İzleme
Kullanıcılar etkilenmeden önce sorunları yakalamak için oran sınırı tüketiminizi takip edin:
import logging
def log_rate_limits(response):
headers = response.headers
remaining = headers.get("x-ratelimit-remaining-requests")
limit = headers.get("x-ratelimit-limit-requests")
if remaining and int(remaining) < int(limit) * 0.1:
logging.warning(
f"Oran sınırı uyarısı: {remaining}/{limit} istek kaldı"
)
Kalan kapasite %10'un altına düştüğünde uyarılar kurun. Bu, kullanıcılar 429 hatası görmeden önce kısıtlama uygulamanız için zaman kazandırır.
Özet
| Strateji | Ne Zaman Kullanılır |
|---|---|
| Üssel geri çekilme | Her zaman (temel) |
| İstemci tarafı oran sınırlayıcı | Yüksek verimli uygulamalar (>100 RPM) |
| Model yedekleme | SLA gereksinimli üretim uygulamaları |
| Proaktif izleme | Herhangi bir üretim dağıtımı |
| Toplu API | Gerçek zamanlı olmayan iş yükleri |
Amaç oran sınırlarından tamamen kaçınmak değil. Onları kullanıcılarınızın fark etmeyeceği şekilde yönetmektir.
Dayanıklı AI uygulamaları geliştirin: lemondata.cc, yukarı akış oran sınırlarını otomatik yöneten çok kanallı yönlendirme sağlar. Tek API anahtarı, 300+ model.
