Kullanım Kılavuzu API Başvuru Kılavuzu

İşlem Sınırları

API hız sınırlarını, eşzamanlılığı ve bunlar dahilinde nasıl çalışılacağını anlama

Genel Bakış

Hız sınırları, API’yi kötüye kullanıma karşı korur ve tüm kullanıcılar için adil kullanım sağlar. Moknah; hem HTTP hem de WebSocket uç noktalarımızda istek sıklığı, kredi tüketimi ve eşzamanlı bağlantılar konusunda sınırlar uygular.

Katı Eşzamanlı Kullanım Yasağı Politikası

Moknah tam olarak işler Kullanıcı başına aynı anda tek bir işlem.
• HTTP: Başka bir istek göndermeden önce mevcut isteğin tamamlanmasını bekleyin. Eşzamanlı istekler 409 Conflict veya 429 Too Many Requests yanıtı alır.
• WebSocket: Aynı anda yalnızca 1 aktif WebSocket bağlantısı açık tutabilirsiniz. İkinci bir bağlantı açılması durumunda, bu bağlantı 4290 koduyla anında kapatılacaktır.

Varsayılan Limitler

Limit Türü Değer Şunlar için geçerlidir Açıklama
Dakika Başına İstek (RPM) 60 Sadece HTTP Dakika başına maksimum standart API POST isteği sayısı.
Dakika Başına Kredi (CPM) 10,000 HTTP ve WebSocket Dakika başına tüketilen maksimum kredi.
Etkin Bağlantılar 1 Yalnızca WebSocket Kullanıcı başına eşzamanlı WSS akışlarının maksimum sayısı.

WebSocket Sınırları ve Kapatma Kodları

WebSocket’ler kalıcı bir bağlantı sürdürdükleri için, hız sınırlaması amacıyla HTTP başlıklarını kullanmazlar. Bunun yerine, sınırlamalar bağlantının sonlandırılması ve JSON kontrol mesajları aracılığıyla uygulanır:

Sınıra Ulaşıldı Davranış / Çıktı
Eşzamanlılık Sınırı Bağlantı, 4290 koduyla anında kapanıyor.
Krediler Tükendi JSON hatası alır ve kapanır.
Parça Boyutu Sınırı Tek bir metin parçası 2.000 karakteri aşarsa JSON hatası alınır.
Mesaj Hızı Sınırı Metin parçalarını kuyruğun işleyebileceğinden daha hızlı gönderirseniz JSON hatası alırsınız.

Not: WebSocket bağlantınız beklenmedik bir şekilde kesilirse, sunucu tarafındaki kilidin tamamen kalktığından emin olmak için yeniden bağlanmadan önce en az 15 saniye bekleyin.

HTTP İstek Sınırı Başlıkları

Standart REST uç noktaları için, her API yanıtı durumunuzu takip etmenize yardımcı olacak başlıklar içerir:

Üst Bilgi Açıklama Örnek
RateLimit-Limit Devir sınırınız 60
RateLimit-Remaining Bu dakika içinde kalan istekler 45
RateLimit-Reset Limitlerin sıfırlandığı Unix zaman damgası 1699574460
Moknah-Credits-Remaining Bu dakikada kalan krediler 10000
Moknah-Credits-Used Bu dakika kullanılan krediler 5000

HTTP Hız Sınırına Takılındığında

HTTP hız sınırını aşarsanız, şu ek başlıkları içeren bir ”429 Too Many Requests” yanıtı alırsınız:

Üst Bilgi Açıklama Örnek
Retry-After Yeniden denemeden önce beklenecek saniye sayısı 45
RateLimit-Reset Yeniden deneyebileceğiniz Unix zaman damgası 1699574460

Kredi Hesaplaması

Krediler, metin uzunluğu ve işleme seçenekleri temel alınarak hesaplanır. WebSocket’lerde ise krediler, veriler akış halindeyken her bir parça (chunk) için dinamik olarak düşülür.

Faktör Çarpan Açıklama
Temel maliyet 1x Karakter başına 1 kredi
Yapay Zeka Destekli Normalizasyon 2x Harekeli Arapça için gelişmiş işleme
Premium Ses +% Premium sesler için ek yüzde

Örnek: Yapay zeka destekli normalleştirme içeren 500 karakterlik bir metin:

500 characters × 2 (AI-Enhanced) = 1,000 credits

En İyi Uygulamalar

1. Yüksek Hacimli Ardışık Metinler için WebSocket Kullanın

Sohbet tabanlı yapay zeka yanıtları oluşturuyorsanız veya uzun belgeleri ayrıştırıyorsanız, art arda 50 adet HTTP POST isteği göndermeyin. Bunun yerine tek bir WebSocket bağlantısı açın ve veri parçalarını bu kalıcı bağlantı üzerinden akış (stream) şeklinde iletin. Bu yöntem, (kredi limitleri geçerliliğini korusa da) dakikada 60 istek (RPM) şeklindeki HTTP sınırını tamamen aşmanızı sağlar.

2. İstek Kuyruklama (HTTP) Uygula

Moknah eşzamanlı istekleri desteklemediğinden, HTTP isteklerinizi sıraya alın ve bunları sırayla işleyin:

import queue
import threading
import time

class TTSQueue:
    def __init__(self, api_key):
        self.api_key = api_key
        self.queue = queue.Queue()
        self.worker = threading.Thread(target=self._process_queue, daemon=True)
        self.worker.start()

    def _process_queue(self):
        while True:
            text, voice_id, callback = self.queue.get()
            try:
                result = self._generate(text, voice_id)
                callback(result, None)
            except Exception as e:
                callback(None, e)
            finally:
                self.queue.task_done()

    def _generate(self, text, voice_id):
        # Your API call here
        pass

    def add(self, text, voice_id, callback):
        self.queue.put((text, voice_id, callback))

# Usage
tts = TTSQueue("your_api_key")
tts.add("Hello world", "voice_123", lambda r, e: print(r or e))
class TTSQueue {
  constructor(apiKey) {
    this.apiKey = apiKey;
    this.queue = [];
    this.processing = false;
  }

  async add(text, voiceId) {
    return new Promise((resolve, reject) => {
      this.queue.push({ text, voiceId, resolve, reject });
      this.processNext();
    });
  }

  async processNext() {
    if (this.processing || this.queue.length === 0) return;

    this.processing = true;
    const { text, voiceId, resolve, reject } = this.queue.shift();

    try {
      const result = await this.generate(text, voiceId);
      resolve(result);
    } catch (error) {
      reject(error);
    } finally {
      this.processing = false;
      this.processNext(); // Process next in queue
    }
  }

  async generate(text, voiceId) {
    // Your API call here
  }
}

// Usage
const tts = new TTSQueue("your_api_key");
const audio = await tts.add("Hello world", "voice_123");

2. İstek Kuyruklama (HTTP) Uygula

Moknah eşzamanlı istekleri desteklemediğinden, HTTP isteklerinizi sıraya alın ve bunları sırayla işleyin:

import time
import random

def request_with_backoff(func, max_retries=5):
    retries = 0

    while retries < max_retries:
        try:
            response = func()

            if response.status_code == 429:
                retry_after = int(response.headers.get("Retry-After", 60))
                # Add jitter to prevent thundering herd
                wait_time = retry_after + random.uniform(0, 1)
                print(f"Rate limited. Waiting {wait_time:.1f}s...")
                time.sleep(wait_time)
                retries += 1
                continue

            return response

        except Exception as e:
            # Exponential backoff for other errors
            wait_time = (2 ** retries) + random.uniform(0, 1)
            print(f"Error: {e}. Retrying in {wait_time:.1f}s...")
            time.sleep(wait_time)
            retries += 1

    raise Exception("Max retries exceeded")
async function requestWithBackoff(func, maxRetries = 5) {
  let retries = 0;

  while (retries < maxRetries) {
    try {
      const response = await func();

      if (response.status === 429) {
        const retryAfter = parseInt(response.headers.get("Retry-After") || 60);
        // Add jitter to prevent thundering herd
        const waitTime = retryAfter + Math.random();
        console.log(`Rate limited. Waiting ${waitTime.toFixed(1)}s...`);
        await new Promise(r => setTimeout(r, waitTime * 1000));
        retries++;
        continue;
      }

      return response;

    } catch (error) {
      // Exponential backoff for other errors
      const waitTime = Math.pow(2, retries) + Math.random();
      console.log(`Error: ${error.message}. Retrying in ${waitTime.toFixed(1)}s...`);
      await new Promise(r => setTimeout(r, waitTime * 1000));
      retries++;
    }
  }

  throw new Error("Max retries exceeded");
}

3. Üstel Geri Çekilme (Exponential Backoff) Uygulayın

İstek hızı (HTTP 429) veya bağlantı sayısı (WebSocket 4290) sınırına takıldığınızda, sunucuya spam yapmadan güvenli bir şekilde yeniden denemek için üstel geri çekilme (exponential backoff) yöntemini kullanın:


Özet

Hızlı Başvuru

HTTP sınırları: Dakikada 60 istek, 1 eşzamanlı istek.
WebSocket sınırları: 1 eşzamanlı bağlantı, parça başına 2.000 karakter.
Genel sınırlar: 10.000 CPM (Dakika Başına Kredi).
Daha fazla kapasiteye mi ihtiyacınız var? E-posta sales@moknah.io

API Desteği

API ile ilgili soru veya sorunlarınız için bizimle şu adresten iletişime geçin: api@moknah.io.