يتطلب الانتقال من API الرسمي لـ OpenAI إلى LemonData تغيير سطرين فقط. تعمل الأكواد الحالية، والـ prompts، وأسماء الـ models كما هي تماماً. كما يمكنك الوصول إلى أكثر من 300 model عبر OpenAI و Anthropic و Google و DeepSeek وغيرها، من خلال مفتاح API واحد.
إذا كنت تقارن بين خيارات الـ gateway قبل الانتقال، فاقرأ مقارنة الأسعار و مقارنة OpenRouter مقابل LemonData. وإذا كان فريقك يحتاج إلى دليل خاص بمنطقة معينة، فإن دليل المطورين في الصين يغطي الجوانب المالية والتشغيلية.
النسخة المختصرة
- سجل في lemondata.cc واحصل على API key (ستحصل على رصيد مجاني بقيمة 1 دولار).
- استبدل `base_url` و `api_key` الخاصين بك.
- تم. كل شيء آخر سيبقى كما هو.
Python (OpenAI SDK)
# Before: OpenAI official
from openai import OpenAI
client = OpenAI(api_key="sk-openai-xxx")
# After: LemonData (change 2 lines)
from openai import OpenAI
client = OpenAI(
api_key="sk-lemon-xxx",
base_url="https://api.lemondata.cc/v1"
)
# Everything else stays the same
response = client.chat.completions.create(
model="gpt-4.1",
messages=[{"role": "user", "content": "Hello!"}]
)
print(response.choices[0].message.content)
الـ Streaming، والـ function calling، والـ vision: جميعها تعمل بشكل متطابق. يرسل OpenAI Python SDK الطلبات إلى أي base_url توجهه إليه.
Node.js (OpenAI SDK)
// Before: OpenAI official
import OpenAI from 'openai';
const openai = new OpenAI({ apiKey: 'sk-openai-xxx' });
// After: LemonData (change 2 lines)
import OpenAI from 'openai';
const openai = new OpenAI({
apiKey: 'sk-lemon-xxx',
baseURL: 'https://api.lemondata.cc/v1',
});
// Everything else stays the same
const completion = await openai.chat.completions.create({
model: 'gpt-4.1',
messages: [{ role: 'user', content: 'Hello!' }],
});
console.log(completion.choices[0].message.content);
ملاحظة: في Node.js SDK نستخدم baseURL (بصيغة camelCase)، وليس base_url.
curl
# Before: OpenAI official
curl https://api.openai.com/v1/chat/completions \
-H "Authorization: Bearer sk-openai-xxx" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-4.1","messages":[{"role":"user","content":"Hello"}]}'
# After: LemonData (change URL and key)
curl https://api.lemondata.cc/v1/chat/completions \
-H "Authorization: Bearer sk-lemon-xxx" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-4.1","messages":[{"role":"user","content":"Hello"}]}'
نفس مسار الـ endpoint، ونفس الـ request body، ونفس تنسيق الـ response.
نهج متغيرات البيئة (Environment Variable)
إذا كان الكود الخاص بك يقرأ من متغيرات البيئة (وهو ما ينبغي فعله)، فلن تحتاج حتى إلى لمس الكود:
# Before
export OPENAI_API_KEY="sk-openai-xxx"
export OPENAI_BASE_URL="https://api.openai.com/v1"
# After
export OPENAI_API_KEY="sk-lemon-xxx"
export OPENAI_BASE_URL="https://api.lemondata.cc/v1"
يقرأ OpenAI SDK تلقائياً OPENAI_API_KEY و OPENAI_BASE_URL من البيئة. لا توجد تغييرات في الكود.
ما الذي ستحصل عليه بعد الانتقال
بمجرد انتقالك إلى LemonData، ستحافظ على التوافق الكامل مع OpenAI وستحصل على إمكانيات إضافية:
أكثر من 300 Model، بمفتاح API واحد
كود OpenAI الحالي سيعمل الآن مع Claude و Gemini و DeepSeek و Mistral ومئات النماذج الأخرى. في كثير من الحالات، الشيء الوحيد الذي تحتاج لتغييره هو بارامتر الـ model:
# GPT-4.1 (OpenAI): $2.00/$8.00 per 1M tokens
response = client.chat.completions.create(model="gpt-4.1", messages=messages)
# Claude Sonnet 4.6 (Anthropic): $3.00/$15.00 per 1M tokens
response = client.chat.completions.create(model="claude-sonnet-4-6", messages=messages)
# Gemini 2.5 Pro (Google)
response = client.chat.completions.create(model="gemini-2.5-pro", messages=messages)
# DeepSeek V3: $0.28/$0.42 per 1M tokens (use "deepseek-chat" or alias "deepseek-v3")
response = client.chat.completions.create(model="deepseek-chat", messages=messages)
تعني ميزة الـ Multi-channel redundancy أنه في حال واجه أحد مزودي الخدمة (upstream provider) مشكلة، سيقوم الـ gateway تلقائياً بتوجيه الطلب إلى قناة بديلة. لا حاجة لتغييرات في الكود.
الوصول عبر البروتوكول الأصلي (اختياري)
إذا كنت ترغب في استخدام نماذج Anthropic أو Google بكامل إمكانياتها الأصلية (مثل extended thinking، و prompt caching مع cache_control، و Google search grounding)، فإن LemonData يدعم بروتوكولاتها الأصلية (native protocols) عبر نفس الـ base URL:
# Anthropic native: use the Anthropic SDK
# Extended thinking, cache_control, Citations all work natively
from anthropic import Anthropic
client = Anthropic(
api_key="sk-lemon-xxx",
base_url="https://api.lemondata.cc" # No /v1. Anthropic SDK adds /v1/messages itself.
)
# Google Gemini native: use the Google SDK
# Search grounding, grounding_metadata all work natively
from google import genai
client = genai.Client(
api_key="sk-lemon-xxx",
http_options={"base_url": "https://api.lemondata.cc"} # No path suffix. SDK adds /v1beta/models/... itself.
)
هذا الأمر اختياري تماماً. الـ endpoint المتوافق مع OpenAI يعمل مع جميع الـ models. ولكن إذا كنت بحاجة إلى ميزة extended thinking من Anthropic أو grounding من Google، فإن الوصول عبر البروتوكول الأصلي يمنحك هذه الميزات دون أي فقدان في تحويل التنسيق.
ما الذي يتغير عادةً أثناء الانتقال
معظم عمليات الانتقال بسيطة تقنياً ولكنها قد تكون غير منظمة تشغيلياً. غالباً ما تغير الفرق الـ base URL والمفتاح، ثم تفترض أن كل شيء آخر متطابق. هذا صحيح عادةً بالنسبة لمخطط الطلب (request schema)، لكنه ليس صحيحاً دائماً لكل ما يحيط به.
المجالات التي تستحق المراجعة قبل تحويل الـ traffic هي:
- إعدادات الـ timeout في الـ SDK أو الـ HTTP client الخاص بك
- قوائم الـ models المسموح بها (allowlists) في إعدادات التطبيق
- لوحات معلومات التكلفة (cost dashboards) التي تفترض وجود مزود خدمة واحد
- منطق إعادة المحاولة (retry logic) الذي تم ضبطه لمزود خدمة واحد
- أي افتراضات برمجية ثابتة حول الـ response headers أو الـ rate limits
إذا قمت بمراجعة هذه المجالات الخمسة قبل تحويل الـ traffic في بيئة الإنتاج (production)، فعادةً ما يمر الانتقال بسلاسة.
قائمة التحقق للانتقال
استخدم قائمة التحقق هذه إذا كنت تريد أن يمر الانتقال بهدوء:
- أنشئ API key في LemonData.
- استبدل
base_urlأوbaseURL. - قم بإجراء اختبار سريع (smoke test) لـ
/v1/models. - اختبر chat completion واحداً، و streamed response واحداً، ومسار فشل (failure path) واحداً.
- تأكد من أن سجلاتك (logs) لا تزال تلتقط الـ request IDs وأسماء الـ models.
- تحقق من الفواتير بعد المكالمات القليلة الأولى للتأكد من صحة افتراضات التكلفة لديك.
- عندها فقط، قم بنقل مهام الخلفية (background jobs) والـ production traffic.
أخطاء شائعة
الخطأ 1: تثبيت قائمة الـ models القديمة برمجياً
تقوم بعض الفرق بالتحقق من صحة الـ model IDs مقابل قائمة ثابتة في إعدادات التطبيق. إذا احتفظت بتلك القائمة، سيعمل الـ gateway ولكن تطبيقك سيرفض أسماء الـ models الصالحة قبل إرسال الطلب.
الخطأ 2: التعامل مع الانتقال كمجرد تبديل لمزود الخدمة
الفائدة الحقيقية ليست مجرد ترك OpenAI. الفائدة الحقيقية هي الانتقال من بنية تعتمد على مزود واحد إلى نموذج الـ gateway حيث يمكنك إضافة Claude و Gemini و DeepSeek وغيرها دون تغيير بقية تطبيقك مرة أخرى.
الخطأ 3: تخطي اختبارات مسارات الفشل (failure-path)
نجاح عملية completion يثبت أن الـ API key يعمل، لكنه لا يثبت أن منطق إعادة المحاولة، أو تحليل الأخطاء، أو إمكانية المراقبة (observability) لا تزال تعمل بشكل صحيح بعد الانتقال.
إذا كنت تطلق تطبيقاً موجهاً للمستخدمين وليس مجرد سكريبت بسيط، فإن دليلي التنفيذ التاليين اللذين يجب قراءتهما هما برنامج تعليمي لبناء chatbot بمفتاح واحد و دليل الـ rate limiting.
انتقال التكاملات الشائعة
Cursor
Settings ← Models ← OpenAI API Key:
- API Key:
sk-lemon-xxx - Base URL:
https://api.lemondata.cc/v1
LangChain
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="gpt-4.1",
api_key="sk-lemon-xxx",
base_url="https://api.lemondata.cc/v1"
)
Vercel AI SDK
import { createOpenAI } from '@ai-sdk/openai';
const lemondata = createOpenAI({
apiKey: 'sk-lemon-xxx',
baseURL: 'https://api.lemondata.cc/v1',
});
const result = await generateText({
model: lemondata('gpt-4.1'),
prompt: 'Hello!',
});
LiteLLM
import litellm
response = litellm.completion(
model="openai/gpt-4.1",
messages=[{"role": "user", "content": "Hello!"}],
api_key="sk-lemon-xxx",
api_base="https://api.lemondata.cc/v1"
)
التحقق من انتقالك
اختبار سريع للتأكد من السلامة بعد التبديل:
curl https://api.lemondata.cc/v1/models \
-H "Authorization: Bearer sk-lemon-xxx" | head -c 200
إذا رأيت استجابة JSON تحتوي على كائنات الـ model، فأنت جاهز.
الأسئلة الشائعة
هل ستعمل الـ prompts الحالية الخاصة بي؟ نعم. LemonData متوافق تماماً مع OpenAI، لذا تظل تنسيقات الطلب والاستجابة كما هي.
هل أحتاج إلى تغيير أسماء الـ models؟ لا. gpt-4.1 و gpt-4o و gpt-4.1-mini كلها تعمل كما هو متوقع. يحتوي LemonData أيضاً على نظام حل أسماء النماذج من ثلاث طبقات: المطابقة التامة، والبحث عن الاسم المستعار (alias)، والتصحيح التقريبي (fuzzy correction). وهذا يعني أن الأسماء المهجورة مثل gpt-4-turbo أو الأخطاء الإملائية مثل gpt4o عادةً ما يتم حلها بشكل صحيح.
ماذا عن الـ streaming؟ يعمل بشكل متطابق. تنسيق SSE، ونفس هيكل الـ chunks. بالنسبة لبروتوكولات Anthropic/Gemini الأصلية، ستحصل على تنسيق SSE الأصلي لكل مزود (بما في ذلك thinking deltas لميزة extended thinking).
ماذا عن الـ function calling / tools؟ مدعومة بالكامل. نفس الـ schema، ونفس السلوك.
ماذا عن معالجة الأخطاء (error handling)؟ يعيد LemonData أخطاء متوافقة مع OpenAI مع حقول إضافية صديقة للبرمجة مثل retryable، و did_you_mean، و suggestions، و retry_after. لا تزال معالجة الأخطاء القياسية في OpenAI SDK تعمل لأن هذه الحقول مضافة وليست مستبدلة.
هل يمكنني العودة؟ نعم. قم بتغيير السطرين مرة أخرى. لا يوجد تنسيق ملكية خاص ولا توجد بيانات تحتاج إلى ترحيل عكسي.
ابدأ من هنا: lemondata.cc/r/devto-migration
وثائق الـ API الكاملة: docs.lemondata.cc
دليل البدء السريع: docs.lemondata.cc/quickstart
