यूज़र गाइड API संदर्भ

गलतियाँ

API एरर रिस्पॉन्स, WebSocket क्लोज़ कोड और उन्हें कैसे हैंडल करें, यह समझना

REST API एरर फ़ॉर्मैट (HTTP)

जब किसी स्टैंडर्ड HTTP एंडपॉइंट पर कोई एरर आता है, तो API नीचे दिए गए स्ट्रक्चर वाला JSON रिस्पॉन्स देता है:

{
    "success": false,
    "error": {
        "code": "ERROR_CODE",
        "message": "इंसानों के पढ़ने लायक़ एरर का विवरण",
        "details": {
          // अतिरिक्त संदर्भ (त्रुटि के प्रकार के अनुसार अलग-अलग)
        }
    }
}

WebSocket एरर फ़ॉर्मैट (WSS)

WebSockets में एरर को अलग तरह से हैंडल किया जाता है। शुरुआती कनेक्शन हैंडशेक के दौरान या ऑडियो जनरेट होने के दौरान बीच में एरर आ सकते हैं।

  • गंभीर त्रुटियाँ: कनेक्शन को एक खास क्लोज़ कोड (जैसे, 4290) के साथ बंद कर दिया जाता है।
  • प्रक्रिया के बीच में आने वाली त्रुटियाँ: सर्वर बंद होने से पहले एक फ़्लैट JSON एरर फ़्रेम भेजता है: {"error": "स्ट्रीम के दौरान अपर्याप्त क्रेडिट"}

स्टेटस कोड और क्लोज़ कोड

HTTP स्टेटस कोड (REST)

स्थिति अर्थ विवरण
200 ठीक है अनुरोध सफल रहा
400 गलत अनुरोध अमान्य अनुरोध पैरामीटर या गलत तरीके से बना अनुरोध
401 अनधिकृत API की गायब है या अमान्य है
402 भुगतान आवश्यक है अनुरोध पूरा करने के लिए पर्याप्त क्रेडिट नहीं हैं।
403 वर्जित API की (key) के पास इस काम के लिए परमिशन नहीं है।
404 नहीं मिला मांगा गया रिसोर्स मौजूद नहीं है
409 संघर्ष रिक्वेस्ट मौजूदा स्थिति से मेल नहीं खाती (जैसे, एक साथ कई HTTP रिक्वेस्ट)
429 बहुत ज़्यादा अनुरोध रेट लिमिट पार हो गई है
500 इंटरनल सर्वर एरर हमारी तरफ़ से कुछ गड़बड़ हो गई।

WebSocket क्लोज़ कोड (WSS)

कोड टाइप विवरण
1000 सामान्य समापन स्ट्रीम सफलतापूर्वक पूरी हो गई।
3011 जनरेशन एरर अपस्ट्रीम API पर ऑडियो जनरेशन फ़ेल हो गया। अनुरोध को फिर से करें।
4001 ऑथेंटिकेशन मौजूद नहीं है हैंडशेक के दौरान ऑथराइज़ेशन हेडर में कोई API की (API key) नहीं दी गई।
4002 ऑथेंटिकेशन फ़ेल हो गया अमान्य की (key), निष्क्रिय खाता, अपर्याप्त शुरुआती क्रेडिट, या IP प्रतिबंध।
4290 समवर्ती सीमा आपके पास पहले से ही एक एक्टिव TTS WebSocket कनेक्शन है। प्रति यूज़र लिमिट 1 है।

गलती होने की आम स्थितियाँ

1. अनऑथराइज़्ड / ऑथेंटिकेशन फ़ेल

HTTP: 401 WSS: 4001 / 4002

API की (key) न होने या गलत होने, या IP व्हाइटलिस्ट पाबंदियों की वजह से ऑथेंटिकेशन फेल हो गया।

आम कारण:

  • Authorization: Bearer हेडर मौजूद नहीं है
  • API की का फ़ॉर्मैट गलत है या की को रद्द कर दिया गया है।
  • ऐसे IP एड्रेस से कनेक्ट करना जो आपकी की (key) की व्हाइटलिस्ट में नहीं है

2. अपर्याप्त क्रेडिट

HTTP: 402 WSS: मिड-स्ट्रीम JSON

इस अनुरोध को पूरा करने के लिए आपके खाते में पर्याप्त क्रेडिट नहीं हैं।

  • HTTP: ऑडियो जनरेट होने से ठीक पहले फ़ेल हो जाता है।
  • वेब-सॉकेट: अगर स्ट्रीमिंग के बीच में आपके क्रेडिट खत्म हो जाते हैं, तो सर्वर भेजता है {"error": "स्ट्रीम के दौरान अपर्याप्त क्रेडिट"} और कनेक्शन को सही तरीके से बंद कर देता है। क्रेडिट खत्म होने से पहले जो ऑडियो बना था, वह भी डिलीवर किया जाएगा।

3. कॉन्करेंसी और रेट लिमिट्स

HTTP: 409 / 429 WSS: 4290

सही इस्तेमाल सुनिश्चित करने के लिए, Moknah एक बार में हर यूज़र की एक ही रिक्वेस्ट प्रोसेस करता है।

  • HTTP 409: आपके अकाउंट से एक और रिक्वेस्ट पर पहले से ही काम चल रहा है। उसके पूरा होने का इंतज़ार करें।
  • HTTP 429: आपने 60 रिक्वेस्ट प्रति मिनट (RPM) की सीमा पार कर ली है।
  • WSS 4290: आपने तब दूसरा WebSocket कनेक्शन खोलने की कोशिश की, जब आपका पहला कनेक्शन अभी भी चालू था।

4. अमान्य अनुरोध / खराब डेटा

HTTP: 400 WSS: मिड-स्ट्रीम JSON

रिक्वेस्ट पैरामीटर अमान्य हैं, या आपने टेक्स्ट चंक की सीमा पार कर ली है।

  • HTTP: ज़रूरी फ़ील्ड (text, voice_id) मौजूद नहीं हैं।
  • वेब-सॉकेट: 2,000 कैरेक्टर से ज़्यादा लंबा टेक्स्ट भेजने पर {"error": "हिस्सा बहुत बड़ा है। हर हिस्से में ज़्यादा से ज़्यादा 2000 कैरेक्टर हो सकते हैं।"}.

कोड में एरर को संभालना

import requests
import time

def generate_speech(text, voice_id, api_key):
    url = "https://moknah.io/api/v1/tts/generate"
    headers = {"Authorization": f"Bearer {api_key}"}

    response = requests.post(url, json={"text": text, "voice_id": voice_id}, headers=headers)

    if response.status_code == 200:
        return response.content  # ऑडियो बाइट्स
    elif response.status_code == 402:
        raise Exception("अपर्याप्त क्रेडिट")
    elif response.status_code == 429:
        retry_after = int(response.headers.get("Retry-After", 5))
        time.sleep(retry_after)
        return generate_speech(text, voice_id, api_key)  # फिर से कोशिश करें
    elif response.status_code == 409:
        time.sleep(5)
        return generate_speech(text, voice_id, api_key)  # फिर से कोशिश करें
    else:
        raise Exception(f"API error: {response.status_code}")
async function generateSpeech(text, voiceId, apiKey) {
  const response = await fetch("https://moknah.io/api/v1/tts/generate", {
    method: "POST",
    headers: {
      "Authorization": `Bearer ${apiKey}`,
      "Content-Type": "application/json"
    },
    body: JSON.stringify({ text: text, voice_id: voiceId })
  });

  if (response.ok) return await response.blob();

  if (response.status === 429) {
    const retryAfter = response.headers.get("Retry-After") || 5;
    await new Promise(r => setTimeout(r, retryAfter * 1000));
    return generateSpeech(text, voiceId, apiKey);
  }

  if (response.status === 409) {
    await new Promise(r => setTimeout(r, 5000));
    return generateSpeech(text, voiceId, apiKey);
  }

  const error = await response.json();
  throw new Error(error.error?.message || "API Error");
}
const ws = new WebSocket('wss://moknah.io/api/v1/api/v1/tts/ws/', {
    headers: { "Authorization": `Bearer ${apiKey}` }
});

// Handle Mid-Stream JSON Errors
ws.on('message', (data, isBinary) => {
    if (!isBinary) {
        const msg = JSON.parse(data.toString());
        if (msg.error) {
            console.error("Stream Error:", msg.error);
            // e.g., "Insufficient credits during stream"
        }
    }
});

// Handle Fatal Close Codes
ws.on('close', (code, reason) => {
    switch(code) {
        case 1000:
            console.log("Stream finished successfully.");
            break;
        case 4001:
        case 4002:
            console.error("Authentication failed. Check your API key.");
            break;
        case 4290:
            console.error("Concurrency limit reached. Close other active streams.");
            // Wait a few seconds before attempting to reconnect
            setTimeout(reconnect, 5000);
            break;
        case 3011:
            console.error("Upstream generation failed. Please try again.");
            break;
        default:
            console.error(`Disconnected with code ${code}`);
    }
});
बेस्ट प्रैक्टिस: एक्सपोनेंशियल बैकऑफ़

429 (HTTP), 409 (HTTP), और 4290 (WSS) एरर के लिए, ’एक्सपोनेंशियल बैकऑफ़’ (exponential backoff) का इस्तेमाल करें: पहले 1 सेकंड, फिर 2 सेकंड, फिर 4 सेकंड, वगैरह इंतज़ार करें। इससे API पर बहुत ज़्यादा लोड नहीं पड़ता और यह पक्का होता है कि लॉक हटने के बाद आपकी रिक्वेस्ट सफल हो जाएगी।

API सपोर्ट

API से जुड़े सवालों या समस्याओं के लिए, हमसे संपर्क करें api@moknah.io.