# Hız Sınırları ve Eşzamanlılık

Tripo API, hizmet istikrarını ve adil kullanımı sağlamak için hız sınırları ve eşzamanlılık sınırları uygular.

## Oran Limitleri

Hız sınırları, bir zaman aralığı içinde yapabileceğiniz API isteklerinin sayısını kısıtlar.

### Sınırlama Kuralları

- Oran limitleri **API Key** seviyesinde hesaplanır
- Sınırlar uç noktaya göre değişir. `/v3/generation/*` gibi nesil uç noktalarının sınırları daha düşükken, `/v3/tasks/*` gibi sorgu uç noktalarının sınırları daha yüksektir
- Bir sınır aşıldığında API, `1007` hata koduyla HTTP `429 Too Many Requests` değerini döndürür

### Yanıt Başlıkları

Her API yanıtı, hız sınırıyla ilgili yanıt başlıklarını içerir:

| Yanıt Başlığı | Açıklama |
| :-: | :-: |
| `X-RateLimit-Limit` | Geçerli zaman penceresinde izin verilen maksimum istek sayısı |
| `X-RateLimit-Remaining` | Geçerli zaman penceresinde kalan isteklerin sayısı |
| `X-RateLimit-Reset` | Oran sınırı penceresi sıfırlandığında saniye cinsinden Unix zaman damgası |

### Hız Sınırlı Olduğunda Yanıt

```json
{
  "code": 1007,
  "message": "Rate limit exceeded, you've generated too many requests in a short amount of time",
  "suggestion": "Please wait for a while and try again"
}
```

---

## Eşzamanlılık Sınırları

Eşzamanlılık sınırları, hesabınız altında **aynı anda** çalıştırılabilecek görevlerin sayısını kısıtlar. Bu, hız sınırlarından farklıdır; hız sınırları istek sıklığını sınırlarken eşzamanlılık sınırları paralel çalışan görevleri sınırlar.

### Nasıl Çalışır?

- Eşzamanlılık **hesap** düzeyinde hesaplanır (API Key başına değil)
- Sınırlamalar **görev kategorisi başına** uygulanır; her kategorinin kendi bağımsız eşzamanlılık havuzu vardır
- Bir kategorinin eş zamanlılığı dolduğunda, bu kategori için yeni görev oluşturma, `2000` hata koduyla HTTP `429` değerini döndürür
- Diğer kategorilerdeki görevler **etkilenmez**; kullanılabilir slotlara sahip kategorilerde görevler oluşturmaya devam edebilirsiniz

### Varsayılan Limitler

Tüm kullanıcılar, kategori başına **10** varsayılan eşzamanlılıkla başlar; bazı kategorilerin farklı sınırları vardır (aşağıdaki tabloya bakın).

| Kategori | Dahil Edilen Görev Türleri | Varsayılan Eşzamanlılık |
| :-: | :-: | :-: |
| 3D Nesil — H Serisi | metinden modele (H), görüntüden modele (H), çoklu görünümden modele (H) | 10 |
| 3D Nesil — P Serisi | metinden modele (P), görüntüden modele (P), çoklu görünümden modele (P) | 5 |
| Görüntü Üretimi | metinden resme, resimden resme, resimden çoklu görünüme, düzenlemeden çoklu görünüme | 1 |
| Animasyon | otomatik rigging, rigging kontrolü, animasyon-yeniden hedefleme | 10 |
| Modeli İşleme | doku, format dönüştürme, iyileştirme | 5 |
| Mesh İşlemleri | segmentasyon, tamamlama, retopoloji | 10 |

> **Not:** Aynı kategorideki görevler eşzamanlılık havuzunu paylaşır. Örneğin, çalışan 10 H serisi metinden modele göreviniz varsa, biri tamamlanana kadar H serisi görüntüden modele görevini başlatamazsınız. Ancak yine de P serisi veya görüntü oluşturma görevlerini başlatabilirsiniz.

### Eşzamanlılık Aşıldığında Yanıt

```json
{
  "code": 2000,
  "message": "You have exceeded the limit of generation",
  "suggestion": "Try again later. You can also check `Retry-After` header."
}
```

Yanıt, yeniden denemeden önce kaç saniye bekleneceğini belirten bir `Retry-After` başlığını içerir.

### Eşzamanlılığı Artırma

Daha yüksek eşzamanlılık limitleri talep etmek için lütfen destek kanalı aracılığıyla ekibimizle iletişime geçin. Özel eşzamanlılık, kullanım ihtiyaçlarınıza göre kategori başına yapılandırılabilir.

---

## 429 Yanıtın İşlenmesi

### Python

```python
import time
import requests

def request_with_backoff(method, url, headers, json=None, max_retries=5):
    for attempt in range(max_retries):
        response = requests.request(method, url, headers=headers, json=json)

        if response.status_code != 429:
            return response

        retry_after = response.headers.get("Retry-After")
        reset_at = response.headers.get("X-RateLimit-Reset")

        if retry_after:
            wait = int(retry_after)
        elif reset_at:
            wait = max(int(reset_at) - int(time.time()), 1)
        else:
            wait = 2 ** attempt

        print(f"429 triggered. Waiting {wait} seconds (attempt {attempt + 1})...")
        time.sleep(wait)

    raise Exception("Maximum retry attempts exhausted")
```

### JavaScript

```javascript
async function requestWithBackoff(url, options, maxRetries = 5) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    const response = await fetch(url, options);

    if (response.status !== 429) {
      return response;
    }

    const retryAfter = response.headers.get("Retry-After");
    const resetAt = response.headers.get("X-RateLimit-Reset");
    const wait = retryAfter
      ? Number(retryAfter)
      : resetAt
        ? Math.max(Number(resetAt) - Math.floor(Date.now() / 1000), 1)
        : 2 ** attempt;

    console.log(`429 triggered. Waiting ${wait} seconds (attempt ${attempt + 1})...`);
    await new Promise(resolve => setTimeout(resolve, wait * 1000));
  }

  throw new Error("Maximum retry attempts exhausted");
}
```

## En İyi Uygulamalar

- **Üstel geri çekilme denemelerini uygulayın**: Başlangıçta 1 saniye bekleyin, her seferinde bekleme süresini iki katına çıkarın ve maksimum bekleme süresini 32 saniyeyle sınırlayın
- **`Retry-After` ve `X-RateLimit-Reset` başlıklarını tercih edin**: Sınır penceresi sıfırlanana kadar tam olarak bekleyin
- **Kategori düzeyinde eşzamanlılık için tasarım**: Mümkün olduğunda iş yüklerini kategorilere dağıtın; görüntü oluşturma ve 3D oluşturmanın ayrı havuzları vardır
- **Toplu API'leri kullanın**: Birden fazla `GET /v3/tasks/{task_id}` isteği yerine `POST /v3/tasks/list` kullanın
- **Akıllıca anket yapın**: Görevin tamamlanmasını beklerken, sorgu uç noktasını doldurmak yerine makul aralıklarla (1-2 saniyede bir) anket yapın
