DeepSeek API SDK: استخدم OpenAI SDK وقم بتبديل نقاط النهاية
لا توجد عميل خاص يجب تثبيته لإعداد مكتبة DeepSeek API SDK: تتبع واجهات برمجة التطبيقات على نمط DeepSeek تنسيق OpenAI، لذا فإن مكتبة OpenAI SDK تعمل مع عنوان URL أساسي مختلف. يتيح لك هذا الأمر نفسه تغيير نقطة النهاية عن طريق تغيير ثلاث قيم.

نقاط رئيسية
- تعمل مكتبات Python و Node.js الخاصة بـ OpenAI مع أي نقطة نهاية متوافقة مع OpenAI؛ حيث تقوم بتغيير عنوان URL الأساسي ومفتاح API واسم النموذج.
- احتفظ بهذه القيم الثلاث في متغيرات البيئة بحيث لا يحتاج تغيير نقاط النهاية إلى تعديل في الكود.
- يعد التبديل آمنًا للدردشة العادية، والبث المتدفق، واستدعاء الدوال، ولكن اختبر ميزات محددة لكل نموذج قبل الاعتماد عليها.
- لنقطة النهاية هذه، استخدم https://api.deepseekapi.top/v1 ومعرف النموذج uncensored.
لماذا يُعد SDK الخاص بـ OpenAI هو SDK الخاص بـ DeepSeek API
عندما يبحث الأشخاص عن SDK الخاص بـ DeepSeek API، فإنهم يتوقعون حزمة برمجية تحمل اسم البائع. في الواقع، تصف وثائق DeepSeek الخاصة استدعاء الـ API الخاص بها عبر SDK الخاص بـ OpenAI مع عنوان URL أساسي مختلف، لأن الـ API يتبع طلبات OpenAI وتنسيق الاستجابة. تحقق من وثائقهم الحالية للحصول على عنوان URL الأساسي واسم النموذج الدقيقين؛ فهم المرجع المعتمد في خدمتهم.
النتيجة مفيدة. يمكن لأي كود مكتوب باستخدام مكتبة عميل OpenAI التحدث مع أي خادم يطبق نقاط النهاية نفسها، وهي هنا POST /v1/chat/completions، وPOST /v1/responses، وGET /v1/models. يصبح الانتقال بين المزودين مجرد تغيير في التكوين بدلاً من إعادة الكتابة. يوضح هذا المقال النمط في Python و Node و curl، ثم الهيكل الذي يجعل التبديل سهلاً.
إعداد Python
قم بتثبيت الحزمة الرسمية ووجهها إلى نقطة النهاية:
pip install openai
from openai import OpenAI
client = OpenAI(
base_url="https://api.deepseekapi.top/v1",
api_key="YOUR_KEY",
)
resp = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": "You are a concise technical assistant."},
{"role": "user", "content": "Explain idempotency in two sentences."},
],
)
print(resp.choices[0].message.content)
print(resp.usage)
احصل على مفتاح من صفحة مفتاح واجهة برمجة التطبيقات. يمكن للمستخدمين الجدد الحصول على رصيد تجريبي بقيمة $0.50 بنقرة واحدة وبدون بطاقة. يشرح المقال DeepSeek API Python هذه اللغة بشكل أعمق، بما في ذلك معالجة الأخطاء.
إعداد Node.js
npm install openai
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.deepseekapi.top/v1",
apiKey: process.env.API_KEY,
});
const stream = await client.chat.completions.create({
model: "uncensored",
stream: true,
messages: [{ role: "user", content: "List four uses of a message queue." }],
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
النمط متطابق: عنوان URL الأساسي، المفتاح، النموذج. يُرجع البث المتدفق SSE، وتحول المكتبة هذه الأحداث إلى مُكرّر غير متزامن. يتبع استدعاء الأدوات نفس المخطط الخاص بواجهات برمجة التطبيقات المتوافقة مع OpenAI: مرر tools، واقرأ الـ tool_calls المتدفقة، ثم أعد النتائج كرسائل role: "tool".
اجعل نقطة النهاية قابلة للتبديل
لا تقم بتثبيت القيم الثلاث بشكل ثابت. اقرأها من البيئة ولف إنشاء العميل في دالة واحدة. ثم يعني الانتقال من نقطة نهاية إلى أخرى تعديل ملف .env، وليس الكود.
import os
from openai import OpenAI
def make_client():
return OpenAI(
base_url=os.environ.get("LLM_BASE_URL", "https://api.deepseekapi.top/v1"),
api_key=os.environ["LLM_API_KEY"],
)
MODEL = os.environ.get("LLM_MODEL", "uncensored")
def ask(prompt: str) -> str:
r = make_client().chat.completions.create(
model=MODEL,
messages=[{"role": "user", "content": prompt}],
temperature=0.7,
)
return r.choices[0].message.content
الآن، يحتاج مزوّد مختلف فقط إلى ثلاث متغيرات بيئة. تقرأ المكتبات الرسمية أيضًا OPENAI_API_BASE و OPENAI_API_KEY في بعض الإصدارات، لكن المتغيرات الصريحة أكثر وضوحًا وتتجنب المفاجآت عند تشغيل عدة مزوّدين في وقت واحد.
إذا كنت تستخدم TypeScript أو لغة أخرى، فالفكرة نفسها: دالة مصنع واحدة، وثلاث متغيرات، بدون أسماء مزوّدات مشتتة في الكود. خطأ شائع هو السماح لاسم البائع بالتسرب إلى أسماء الدوال ورسائل السجل وأسماء المتغيرات، مما يجعل التبديل اللاحق أكثر صعوبة مما يجب. سمِّ الأشياء حسب الوظيفة (ask، summarise) بدلاً من المزوّد.
احتفظ باختبار صغير يرسل موجّهًا ثابتًا واحدًا عبر ask() ويتحقق من وجود إجابة غير فارغة. شغله بعد كل تغيير في نقطة النهاية؛ فإنه يلتقط عناوين URL والمفاتيح الخاطئة في ثوانٍ.
ما الذي يبقى كما هو وما الذي يتغير عند التبديل
| العنصر | يبقى كما هو | قد يتغير |
|---|---|---|
| شكل الطلب | الرسائل، الأدوار، درجة الحرارة، top_p، stop | المعاملات الاختيارية التي لا يدعمها المزود |
| البث المتدفق | SSE مع كتل البيانات | مكان ظهور الاستخدام في التدفق |
| استدعاء الدوال | الأدوات، tool_choice، tool_calls | مدى التزام النموذج بالمخطط |
| اسم النموذج | حقل مطلوب | القيمة نفسها: هنا هو uncensored |
| نافذة السياق | الموجّه بالإضافة إلى الإكمال | الحجم: 100,000 رمز هنا |
| السلوك | تنسيق الدردشة | الأسلوب، نقاط القوة، سلوك الرفض |
الصف الأخير هو الذي يلفت انتباه الناس. نقطة النهاية متوافقة على مستوى البروتوكول، وليس على مستوى السلوك. يمكن لمزوّدين قبول طلبات متطابقة وإعطاء إجابات مختلفة جدًا. النموذج هنا هو نموذج مفتوح الأوزان واحد من مزوّد مستقل، مُضبط للإجابة بدون رفض المحتوى للاستخدام القانوني للبالغين، وهو ليس واجهة برمجة التطبيقات الرسمية لـ DeepSeek أو أي مختبر آخر. أعد اختبار الموجّهات التي ضبطتها لنموذج آخر.
الميزات التي تمتلكها نقطة النهاية، وتفتقر إليها
- مدعوم: إكمال الدردشة، تنسيق Responses، سرد النماذج، البث المتدفق، استدعاء الأدوات، وضع JSON (
response_formatمعjson_object)، وتمرير temperature و top_p و stop و seed والعقوبات. - غير مُقدَّم: توليد الصور أو الصوت أو الفيديو، التضمينات، الضبط الدقيق.
- الحدود: نافذة 100,000 رمز، حد أقصى لحجم الجسم 8 ميجابايت، 8 طلبات متزامنة و 300 في الدقيقة على مفتاح كامل (2 و 60 على مفتاح تجريبي).
- الأخطاء: HTTP 429 مع الرمز
rate_limitedأوconcurrency، ورأسRetry-After: 5عند الحمل الزائد المؤقت.
إذا كان كودك يستدعي نقطة نهاية للتضمينات، فستحتاج إلى مزود آخر لذلك الجزء ويمكنك الاستمرار في الدردشة هنا. تقسيم المهام هو سبب شائع لنمط متغيرات البيئة المذكور أعلاه.
قائمة مراجعة للانتقال
عند استبدال نقطة نهاية بأخرى في مشروع قائم، اعمل خلال قائمة قصيرة بدلاً من تغيير كل شيء مرة واحدة.
- أثبت نقطة النهاية. أرسل طلباً واحداً مع curl وتأكد من استلام نص كاستجابة. اتصل بـ
GET /v1/modelsوتأكد من أن المعرفuncensoredمدرج. - غيّر القيم الثلاث. نقطة النهاية الأساسية، والمفتاح، واسم النموذج، ولا شيء آخر. لا تلمس الموجّهات بعد.
- شغّل اختباراتك الحالية. إذا كانت لديك اختبارات انحدار الموجّه، شغّلها ولاحظ الفشل. الفشل عادة يكون سلوكياً، مثل تنسيق إخراج مختلف، وليس أخطاء بروتوكول.
- تحقق من المعاملات. أزل الخيارات التي لا تحتاجها نقطة النهاية. احتفظ بـ temperature و top_p و stop و seed إذا كنت تستخدمها.
- اختبر البث المتدفق والأدوات بشكل منفصل. غالباً ما تختبئ أخطاء البث في كود العميل الذي يفترض تخطيط شريحة محدد. تحتاج استدعاءات الدوال إلى مخطط يلتزم به النموذج جيداً، لذا اختبره مع دوالك الحقيقية.
- قِس التكلفة وزمن الوصول على حركة المرور الحقيقية. قارن يوماً من الطلبات، وليس موجهاً واحداً.
افعل ذلك في فرع أو مع علم ميزة يحول حصة صغيرة من حركة المرور إلى نقطة النهاية الجديدة. لأن كود العميل مشترك، فإن التراجع هو تغيير متغير بيئة.
معالجة إعادة المحاولة وقراءة الاستخدام
تعيد المكتبات محاولة بعض الأخطاء افتراضيًا، لكن لا يزال يتعيّن عليك التعامل مع الخطأ 429 بنفسك، لأن حدود التزامن حقيقية في بيئة الإنتاج. التقط استثناء حدّ المعدل، وانتظر عدد الثواني المحدد في Retry-After (5 في حالة الحمل الزائد)، ثم أعد المحاولة عدة مرات. الطلبات الفاشلة لا تُحسب تكلفتها، لذا تعد إعادة المحاولة آمنة لرصيدك.
سجّل usage.prompt_tokens وusage.completion_tokens في كل استدعاء. التسعير هو $0.15 لكل مليون رمز إدخال و$0.50 لكل مليون رمز إخراج، لذا فإن استدعاءً يحتوي على 2,000 رمز إدخال و600 رمز إخراج يكلف 2,000 × $0.15 / 1M + 600 × $0.50 / 1M = $0.0003 + $0.0003 = $0.0006. تتضمن رؤوس الاستجابة أيضًا X-Balance-USD للرصيد المتبقي. انظر صفحة التسعير لشحن الرصيد والمكافآت، والوثائق للحصول على قائمة المعاملات الكاملة.
المحررات والأدوات الأخرى
القيم الثلاث تنتقل إلى أي أداة تحتوي على إعداد مزود متوافق مع OpenAI. تشرح المقالة حول استخدام واجهة برمجة تطبيقات على نمط DeepSeek في Cursor كيفية استخدام محرر واحد بهذه الطريقة. في كل أداة، تُسمى الحقول بشكل مختلف قليلاً، لكنك دائمًا تدخل عنوان URL الأساسي الذي ينتهي بـ /v1، والمفتاح، واسم النموذج.
المزيد من الأدلة
أسئلة وأجوبة
هل توجد مكتبة SDK رسمية لـ DeepSeek يجب تثبيتها؟
لا تحتاج إلى حزمة خاصة بالبائع. توثّق DeepSeek استخدام OpenAI SDK مع عنوان URL أساسي مختلف؛ تحقق من وثائقهم للحصول على التفاصيل الحالية.
ما هي القيم الثلاث التي أغيرها لاستخدام نقطة النهاية هذه؟
عنوان URL الأساسي (https://api.deepseekapi.top/v1)، ومفتاح API الخاص بك، ومعرف النموذج uncensored.
هل سيعمل كودي الموجود لـ OpenAI دون تغيير؟
يتبع الدردشة، والبث المتدفق، ووضع JSON، واستدعاء الدوال نفس التنسيق، لذا فإن الإجابة هي نعم في الغالب. لا يتم تقديم التضمينات (Embeddings)، والصور، والصوت، وتختلف الإجابات لأن النموذج مختلف.
هل ترسل المكتبة (SDK) المفتاح بشكل صحيح؟
نعم، ترسل تلقائيًا Authorization: Bearer مع مفتاحك.
مفتاحك على بُعد نموذج واحد
أنشئ حساباً، وانسخ المفتاح، ثم غيّر URL الأساسي. هذه هي الإعدادات الكاملة.