الانتقال إلى المحتوى الرئيسي

تنسيق استجابة الخطأ

كل الأخطاء تعيد تنسيق JSON ثابت مع تلميحات Agent-First اختيارية:
{
  "error": {
    "message": "Human-readable error description",
    "type": "error_type",
    "code": "error_code",
    "param": "parameter_name",
    "did_you_mean": "suggested_model",
    "suggestions": [{"id": "model-id"}],
    "hint": "Next step guidance",
    "retryable": true,
    "retry_after": 30
  }
}
الحقول الأساسية (message, type, code, param) موجودة دائمًا. حقول التلميح (did_you_mean, suggestions, hint, retryable, retry_after, balance_usd, estimated_cost_usd) هي امتدادات اختيارية لتصحيح ذاتي لوكلاء الذكاء الاصطناعي. راجع دليل Agent-First API للتفاصيل. تستخدم نقاط النهاية المتوافقة مع OpenAI أنواع أخطاء بوابة LemonData المستقرة. تستخدم نقاط النهاية المتوافقة مع Anthropic وGemini عائلات أخطائها وشكل الاستجابات الخاصة بها.

رموز حالة HTTP

CodeDescription
400طلب خاطئ - معلمات غير صالحة
401غير مصرح - مفتاح API مفقود أو غير صالح
402يتطلب دفع - رصيد غير كافٍ
403ممنوع - الوصول مرفوض أو النموذج غير مسموح به
404غير موجود - النموذج أو المورد غير موجود
413الحِمل أكبر من المسموح - تجاوز حجم الإدخال أو الملف
429عدد الطلبات أكبر من المسموح - تجاوز حد المعدل
500خطأ داخلي في الخادم
502بوابة خاطئة - خطأ من المزود الأعلى
503الخدمة غير متاحة - الخدمة غير متاحة مؤقتًا
504نفاذ مهلة البوابة - انقضت مهلة الطلب

أنواع الأخطاء

أخطاء المصادقة (401)

TypeCodeDescription
invalid_api_keyinvalid_api_keyمفتاح API مفقود أو غير صالح
expired_api_keyexpired_api_keyتم إبطال مفتاح API
from openai import OpenAI, AuthenticationError

try:
    response = client.chat.completions.create(...)
except AuthenticationError as e:
    print(f"Authentication failed: {e.message}")

أخطاء الدفع (402)

TypeCodeDescription
insufficient_balanceinsufficient_balanceرصيد الحساب منخفض جدًا (نقاط النهاية المتوافقة مع OpenAI)
insufficient_balance_errorinsufficient_balanceرصيد الحساب منخفض جدًا (نقاط النهاية المتوافقة مع Anthropic)
quota_exceededquota_exceededتم الوصول إلى حد استخدام مفتاح API
from openai import OpenAI, APIStatusError

try:
    response = client.chat.completions.create(...)
except APIStatusError as e:
    if e.status_code == 402:
        print("Please top up your account balance")

أخطاء الوصول (403)

TypeCodeDescription
access_deniedaccess_deniedتم رفض الوصول إلى المورد
access_deniedmodel_not_allowedالنموذج غير مسموح به لمفتاح API هذا
{
  "error": {
    "message": "You don't have permission to access this model",
    "type": "access_denied",
    "code": "model_not_allowed"
  }
}

أخطاء التحقق (400)

TypeDescription
invalid_request_errorمعلمات الطلب غير صالحة
context_length_exceededالإدخال طويل جدًا بالنسبة لطول سياق النموذج
model_not_foundالنموذج المطلوب غير متوفر في العقدة العامة الحالية
{
  "error": {
    "message": "Model not found: please check the model name",
    "type": "invalid_request_error",
    "param": "model",
    "code": "model_not_found",
    "did_you_mean": "gpt-5.4",
    "suggestions": [{"id": "gpt-5.4"}, {"id": "gpt-5-mini"}],
    "hint": "Did you mean 'gpt-5.4'? Use GET https://api.lemondata.cc/v1/models to list all available models."
  }
}
لا تميز المسارات العامة بين حالات الخطأ الإملائي أو المخفي أو المؤجل أو غير العام في جسم الاستجابة. إذا لم يكن النموذج متوفرًا حاليًا عبر العقدة العامة، تعيد LemonData model_not_found.

أخطاء حد المعدل (429)

عند تجاوز حدود المعدل:
{
  "error": {
    "message": "Rate limit: 60 rpm exceeded",
    "type": "rate_limit_exceeded",
    "code": "rate_limit_exceeded",
    "retryable": true,
    "retry_after": 8,
    "hint": "Rate limited. Retry after 8s. Current limit: 60/min for user role."
  }
}
الرؤوس المضمنة:
Retry-After: 8
يشير كل من ترويسة Retry-After وحقل retry_after إلى عدد الثواني الدقيق للانتظار قبل إعادة المحاولة.

الحِمل أكبر من المسموح (413)

عندما يتجاوز حجم الإدخال أو الملف الحدود:
{
  "error": {
    "message": "Input size exceeds maximum allowed",
    "type": "invalid_request_error",
    "code": "payload_too_large"
  }
}
الأسباب الشائعة:
  • ملف صورة كبير جدًا (الحد الأقصى 20MB)
  • ملف صوتي كبير جدًا (الحد الأقصى 25MB)
  • نص الإدخال يتجاوز طول سياق النموذج

أخطاء المزود الأعلى (502، 503)

TypeDescription
upstream_errorأعاد المزود خطأً
all_channels_failedلا توجد مزودات متاحة
timeout_errorانتهت مهلة الطلب
عندما تفشل كل القنوات، تتضمن الاستجابة نماذج بديلة:
{
  "error": {
    "message": "Model claude-opus-4-6 temporarily unavailable",
    "code": "all_channels_failed",
    "retryable": true,
    "retry_after": 30,
    "alternatives": [
      {"id": "claude-sonnet-4-6", "status": "available", "tags": []},
      {"id": "gpt-5-mini", "status": "available", "tags": []}
    ],
    "hint": "Retry in 30s or switch to an available model."
  }
}

معالجة الأخطاء في Python

from openai import OpenAI, APIError, RateLimitError, APIConnectionError

client = OpenAI(
    api_key="sk-your-api-key",
    base_url="https://api.lemondata.cc/v1"
)

def chat_with_retry(messages, max_retries=3):
    for attempt in range(max_retries):
        try:
            return client.chat.completions.create(
                model="gpt-4o",
                messages=messages
            )
        except RateLimitError as e:
            if attempt < max_retries - 1:
                import time
                time.sleep(2 ** attempt)  # Exponential backoff
                continue
            raise
        except APIConnectionError as e:
            print(f"Connection error: {e}")
            raise
        except APIError as e:
            print(f"API error: {e.status_code} - {e.message}")
            raise

معالجة الأخطاء في JavaScript

import OpenAI from 'openai';

const client = new OpenAI({
  apiKey: 'sk-your-api-key',
  baseURL: 'https://api.lemondata.cc/v1'
});

async function chatWithRetry(messages, maxRetries = 3) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    try {
      return await client.chat.completions.create({
        model: 'gpt-4o',
        messages
      });
    } catch (error) {
      if (error instanceof OpenAI.RateLimitError) {
        if (attempt < maxRetries - 1) {
          await new Promise(r => setTimeout(r, 2 ** attempt * 1000));
          continue;
        }
      }
      throw error;
    }
  }
}

أفضل الممارسات

عند تقييد المعدل، انتظر فترات أطول تدريجيًا بين محاولات إعادة المحاولة:
wait_time = 2 ** attempt  # 1s, 2s, 4s, 8s...
دائمًا قم بتعيين مهلات زمنية معقولة لتجنب الطلبات المعلقة:
client = OpenAI(timeout=60.0)  # 60 second timeout
سجّل استجابة الخطأ الكاملة بما في ذلك معرف الطلب للدعم:
except APIError as e:
    logger.error(f"API Error: {e.status_code} - {e.message}")
بعض النماذج لها متطلبات محددة (مثل max tokens، تنسيقات الصور). تحقق من صحة المدخلات قبل إرسال الطلبات.