القيم الثلاث التي تحتاجها
كل عميل متوافق مع OpenAI يطلب نفس الأشياء الثلاثة. إليكها لهذه الخدمة.
| الإعداد | القيمة |
|---|---|
| عنوان URL الأساسي | https://api.getcodexapi.com/v1 |
| مفتاح API | مفتاحك من صفحة مفتاح API |
| النموذج | uncensored |
يُرسَل المفتاح بصيغة Authorization: Bearer YOUR_KEY. نقطتا النهاية اللتان يمكنك استدعاؤهما هما POST /v1/chat/completions و GET /v1/models. هذه خدمة مستقلة تشغّل نموذجًا واحدًا مفتوح الأوزان، وليست Codex الخاصة بـ OpenAI، لذا لا تلصق نقطة النهاية الخاصة بـ OpenAI أو مفتاح OpenAI في نفس الإعداد.
فحص الاتصال باستخدام curl
قبل تعديل أي إعداد للتطبيق، تأكد من صحة المفتاح وعنوان URL من خلال طرفية الأوامر. يعد سرد النماذج أبسط فحص، لأنه لا يحتاج إلى موجّه:
curl https://api.getcodexapi.com/v1/models \
-H "Authorization: Bearer YOUR_API_KEY"
يجب أن تحصل على قائمة JSON تتضمن النموذج uncensored. ثم أرسل إكمالًا حقيقيًا واحدًا:
curl https://api.getcodexapi.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "uncensored",
"messages": [{"role": "user", "content": "Say hello in five words."}]
}'
إذا نجحت كلا الطلبين، فإن المشكلة في أي فشل لاحق تكمن في إعداد العميل، وليس في الخدمة. تتضمن رؤوس الاستجابة X-Request-Id، وهو مفيد للاحتفاظ به إذا احتجت إلى تتبع طلب معين، و X-Balance-USD، الذي يعرض رصيدك المتبقي.
Python باستخدام SDK
تأخذ الحزمة الرسمية openai عنوان URL الأساسي في مُنشئ العميل. لا يتغير أي شيء آخر في رمزك.
from openai import OpenAI
client = OpenAI(
base_url="https://api.getcodexapi.com/v1",
api_key="YOUR_API_KEY",
)
resp = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": "You are a concise assistant."},
{"role": "user", "content": "Explain what a base URL is in two sentences."},
],
)
print(resp.choices[0].message.content)
إذا كنت تفضل إبقاء الإعدادات خارج الرمز، فإن SDK يقرأ أيضًا OPENAI_BASE_URL و OPENAI_API_KEY من البيئة:
export OPENAI_BASE_URL="https://api.getcodexapi.com/v1"
export OPENAI_API_KEY="YOUR_API_KEY"
بإعداد هذه القيم، يلتقط OpenAI() بدون وسائط. هذه ميزة مفيدة لأن العديد من الأدوات الطرفية المبنية على SDK ترث نفس المتغيرات دون أي تغيير في الرمز.
Node.js
يستخدم SDK JavaScript نفس اسم الخيار، مكتوبًا baseURL.
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.getcodexapi.com/v1",
apiKey: process.env.API_KEY,
});
const stream = await client.chat.completions.create({
model: "uncensored",
messages: [{ role: "user", content: "Write a haiku about version control." }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
يأتي البث المتدفق كحدث مرسل من الخادم مع stream: true، ويُدرج الاستخدام في النهاية. ضع في اعتبارك أن الطلب المتدفق يحتل أحد فتحات التزامن الخاصة بك حتى انتهاء البث، لذا فإن البث الذي تتخلى عنه دون إغلاق يستمر في احتسابه ضمن الحد.
التطبيقات التي تحتوي على شاشة إعدادات
عادةً ما تسمي أدوات سطح المكتب ومحررات الأكواد الحقل بأحد الأسماء الثلاثة: "Base URL" أو "API Base" أو "نقطة النهاية المتوافقة مع OpenAI". جميعها تريد نفس السلسلة. ملاحظات قليلة توفر الوقت:
- اختر نوع المزود "OpenAI" أو "custom OpenAI-compatible"، وليس نوعًا خاصًا بالبائع.
- اكتب اسم النموذج يدويًا إذا كان التطبيق يحتوي على مربع نص حر.
uncensoredهو المعرف الدقيق. - إذا كان التطبيق يحتوي على زر "اختبار الاتصال"، فإنه عادةً يستدعي قائمة النماذج، والتي تدعمها هذه الـ API.
- بعض التطبيقات تُخزّن قائمة النماذج من مزوّد سابق. احذف الإدخال القديم وأضف إدخالاً جديداً إذا كانت القائمة المنسدلة تبدو خاطئة.
لمثال عملي في محرر معين، انظر الدليل حول توصيل Cursor، أو صفحة برمجة API للحصول على الصورة الكاملة. المرجع الكامل للمعاملات موجود في وثائق API.
بمجرد عمل الاتصال، احفظ القيم الدقيقة في مكان يمكنك العثور عليها مرة أخرى: الرابط، واسم النموذج وتاريخ إنشاء المفتاح. غالباً ما تضيع الفرق ساعة لاحقاً بسبب نسخة من ملف الإعداد الذي لا يزال يحتوي على قيمة قديمة. ملف مثال مشترك واحد في المستودع، مع مكان بديل بدلاً من المفتاح الحقيقي، يمنع ذلك.
الأخطاء الشائعة وحلولها
ينتهي URL بـ /v1/v1
بعض العملاء يضيفون /v1 بأنفسهم. إذا فشلت طلباتك وسجل العميل يظهر مساراً يحتوي على /v1/v1/chat/completions، احذف /v1 من URL الأساسي الذي أدخلته. يحدث العكس أيضاً: عميل لا يضيفه يحتاجه في إعدادك. سجل مسار الطلب يحل السؤال بسرعة.
وضعت نقطة النهاية الكاملة في URL الأساسي
يتوقف URL الأساسي عند /v1. لا تدخل /chat/completions هناك. يضيف SDK المسار لكل استدعاء.
شرطة مائلة في النهاية أو خطأ مطبعي في المضيف
تتحمل معظم مكتبات SDK شرطة مائلة في النهاية، لكن بعض الأدوات الأقدم تبني المسارات بالدمج البسيط وتنتهي بشريط مائل مزدوج. احذفها إذا رأيت استجابات 404 غريبة.
مفتاح خاطئ، أو مفتاح خدمة أخرى
لن يعمل مفتاح OpenAI هنا، ولن يعمل مفتاحنا هناك. أخطاء مفتاح API تعني تقريباً دائماً مشكلة نسخ ولصق، مثل حرف مفقود أو مسافة في النهاية.
يعمل في curl لكن ليس في تطبيقك
إذا نجح curl وفشل التطبيق بنفس URL والمفتاح، فإن الاختلاف يكمن في البيئة. تحقق مما إذا كان التطبيق يعمل خلف وكيل أو داخل حاوية بدون وصول خارجي، وما إذا كان يقرأ متغير بيئة أقدم مثل OPENAI_BASE_URL المتبقي من مشروع آخر، وما إذا كان ملف تكوين يتجاوز القيمة التي حددتها في الكود. طباعة URL النهائي الذي سيتصل به العميل، مباشرة قبل الطلب، يحل معظم هذه الحالات في دقيقة واحدة.
HTTP 429
هذا يعني تجاوز حد. رمز الخطأ rate_limited هو الطلبات في الدقيقة، وconcurrency هو عدد كبير جداً من الطلبات في وقت واحد. مفتاح كامل يسمح بـ 8 طلبات متزامنة و300 في الدقيقة؛ مفتاح تجريبي يسمح بـ 2 و60. في حالات الحمل الزائد المؤقت، تحصل أيضاً على 429 مع رأس Retry-After: 5، لذا انتظر خمس ثوانٍ وحاول مرة أخرى.
LangChain وإبقاء URL في مكان واحد
الأطر المبنية على عميل OpenAI تأخذ نفس القيم. في تكامل LangChain مع OpenAI، تسمى الحجج هكذا:
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="uncensored",
base_url="https://api.getcodexapi.com/v1",
api_key="YOUR_API_KEY",
)
print(llm.invoke("Name three uses of a base URL.").content)
بغض النظر عن الإطار، لا تبعثر URL في كودك. ضعها في متغير بيئة واحد أو ملف إعداد واحد، واقرأها من هناك. بهذه الطريقة، الانتقال بين مفتاح اختبار ومفتاح إنتاج، أو بين آلات، يعني تغيير سطر واحد. كما يحافظ على المفاتيح خارج مستودعك: احفظ المفتاح في متغير بيئة أو مدير أسرار، وليس في ملف مُلتزم.
إذا كنت تبحث عن نقطة النهاية الخاصة بـ OpenAI لمنتجات Codex الخاصة بها، فهذا ليس هو. URL الأساسي ومفتاح API الخاصة بهم موثقة من قبل OpenAI، لذا اتبع وثائقهم الحالية لذلك. العنوان في هذه الصفحة ينتمي إلى خدمة مستقلة ويقبل فقط المفاتيح المصدرة هنا.
ما يمكنك إرساله بعد الاتصال
تدعم نقطة النهاية البث المتدفق، استدعاء الدوال (tools، tool_choice، مع إرجاع النتائج كرسائل role: "tool")، ووضع JSON عبر response_format: {"type": "json_object"}. تُمرَّر المعاملات temperature، top_p، stop، seed والعقوبات كما هي. نافذة السياق هي 100,000 رمز للموجّه بالإضافة إلى الإكمال، وحجم جسم الطلب الأقصى هو 8 MB.
النص فقط. لا يوجد توليد صور أو صوت، ولا تضمينات ولا ضبط دقيق، لذا لن تعمل ميزة عميل تعتمد على ذلك مع عنوان URL الأساسي هذا. يُحسب الاستخدام لكل رمز بمبلغ $0.15 لكل مليون رمز مدخل و$0.50 لكل مليون رمز مخرج؛ يحتوي صفحة التسعير على أمثلة عملية.
