AR ▾
احصل على مفتاح API

واجهة Codex API في Python: استدعاء نموذج لغوي للبرمجة

أبسط إعداد لواجهة Codex API في Python هو استخدام الحزمة الرسمية openai مع توجيهها إلى Base URL مختلف. تغطي الأمثلة أدناه توليد الكود، وضع JSON، استدعاء الأدوات والبث المتدفق مقابل نقطة النهاية هذه المتوافقة مع OpenAI.

تم التحديث

كابل مضيء يلتف عبر كتل الكود نحو مكعب خادم، يوضح استدعاءات Python لواجهة برمجة تطبيقات نموذج لغوي للبرمجة
كابل مضيء يربط بين جهاز كمبيوتر محمول ومكعب خادم، يوضح توجيه عميل إلى عنوان URL أساسي لواجهة برمجة التطبيقات

نقاط رئيسية

  • ثبّت الحزمة openai، اضبط base_url على https://api.getcodexapi.com/v1 والنموذج إلى uncensored.
  • استخدم درجة حرارة منخفضة (0 إلى 0.3) للكود وJSON، ودرجة أعلى للعصف الذهني.
  • استدعاء الأدوات، وضع JSON والبث المتدفق مدعومان؛ التضمينات (embeddings) غير مدعومة.
  • حدد الطلبات المتزامنة عند 8 باستخدام المفتاح الكامل، وأعد المحاولة لاستجابات 429 بعد انتظار قصير.

الإعداد وأول استدعاء

هذه خدمة مستقلة متوافقة مع OpenAI، وليست واجهة برمجة التطبيقات Codex الخاصة بـ OpenAI. يتكون نموذجها الوحيد من أوزان مفتوحة، وهو للنصوص فقط، ويتعامل مع الكود بشكل جيد بما يكفي لمهام التوليد والشرح وإعادة الهيكلة التي يجب عليك مراجعتها. إذا كنت تريد الاطلاع على الخلفية أولاً، فإن صفحة واجهة برمجة تطبيقات OpenAI Codex توضح كيفية ارتباط الاثنين ببعضهما.

ثبّت الحزمة باستخدام pip install openai، أنشئ مفتاحًا على صفحة مفتاح API، ثم شغّل:

# pip install openai
from openai import OpenAI

client = OpenAI(base_url="https://api.getcodexapi.com/v1", api_key="YOUR_KEY")

resp = client.chat.completions.create(
    model="uncensored",
    messages=[
        {"role": "system", "content": "You are a senior Python developer. Reply with code only, no commentary."},
        {"role": "user", "content": "Write a function that parses an ISO 8601 date string and returns a datetime."},
    ],
    temperature=0.2,
)
print(resp.choices[0].message.content)

يغطي رصيد التجربة للمستخدمين الجدد بقيمة $0.50 آلاف المكالمات الصغيرة مثل هذه. درجة الحرارة 0.2 لأن الكود يستفيد من تقليل العشوائية. إذا رأيت سور ماركداون حول الإجابة، قم بإزالتها في الكود أو اطلب النص الخام في رسالة النظام. صفحة عنوان الرابط الأساسي، عنوان رابط واجهة برمجة تطبيقات Codex، تذكر العنوان الدقيق مرة أخرى.

الموجّه للكود الذي يعمل

بعض العادات تحسن المخرجات أكثر من أي معلمة.

  • اذكر اللغة والإصدار. "Python 3.11، المكتبة القياسية فقط" يزيل الكثير من التخمين.
  • قدم التوقيع. الصق رأس الدالة ووصف الدالة، واطلب من النموذج ملء الجسم.
  • أظهر مثالاً واحداً للإدخال والمخرجات. إنه يحدد حالات الحافة بشكل أفضل من النص.
  • اطلب شيئاً واحداً. أنشئ الدالة، ثم اطلب الاختبارات في مكالمة ثانية.
  • اطلب الاختلاف للتعديلات. إعادة كتابة الملف بالكامل تستهلك رموز المخرجات، والتي تكلف أكثر من الإدخال.

تتسع نافذة السياق لـ 100,000 رمز، وmax_tokens اختياري. في مهمة برمجية، يمكنك لصق عدة وحدات نمطية ولا يزال هناك مجال للرد. يُعد تعيين max_tokens مفيدًا فقط كشبكة أمان ضد المخرجات غير المقيدة.

وضع JSON للمخرجات المهيكلة

عندما يستهلك الكود الإجابة، استخدم وضع JSON. إنه يجعل المخرجات JSON صالحًا؛ لا يفرض مخططك، لذا سمِّ المفاتيح في الموجّه وتحقق منها.

import json
from openai import OpenAI

client = OpenAI(base_url="https://api.getcodexapi.com/v1", api_key="YOUR_KEY")

resp = client.chat.completions.create(
    model="uncensored",
    response_format={"type": "json_object"},
    messages=[
        {"role": "system", "content": "Return JSON with keys: name, args (list of strings), returns."},
        {"role": "user", "content": "Describe the signature of: def clamp(x, lo, hi)."},
    ],
    temperature=0,
)
data = json.loads(resp.choices[0].message.content)
print(data["name"], data["args"])

أضف try/except حول json.loads مع محاولة إعادة واحدة فقط تُعيد خطأ التحليل. عملياً، هذا يتعامل مع الاستجابة المشوهة النادرة. استخدم درجة حرارة 0 لضمان تطابق التشغيلات المتكررة.

استدعاء الأدوات

مع الأدوات تصف الدوال ويقرر النموذج متى يستدعيها. تشغل الدالة، ثم ترسل المخرجات مرة أخرى مع دور tool. هذا أساس كل وكيل برمجة.

import json
from openai import OpenAI

client = OpenAI(base_url="https://api.getcodexapi.com/v1", api_key="YOUR_KEY")

tools = [{
    "type": "function",
    "function": {
        "name": "run_tests",
        "description": "Run the project's test suite and return the output.",
        "parameters": {
            "type": "object",
            "properties": {"path": {"type": "string"}},
            "required": ["path"],
        },
    },
}]

messages = [{"role": "user", "content": "Run the tests in tests/unit and tell me what failed."}]
first = client.chat.completions.create(model="uncensored", messages=messages, tools=tools, tool_choice="auto")
msg = first.choices[0].message

if msg.tool_calls:
    call = msg.tool_calls[0]
    args = json.loads(call.function.arguments)
    output = "2 passed, 1 failed: test_parse_empty"          # replace with a real runner
    messages.append(msg)
    messages.append({"role": "tool", "tool_call_id": call.id, "content": output})
    final = client.chat.completions.create(model="uncensored", messages=messages, tools=tools)
    print(final.choices[0].message.content)

اختبر الكود المُولَّد مثل أي مساهمة أخرى: شغّله، نفّذ عليه فحصًا (lint)، واحتفظ بمجموعة صغيرة من الموجّهات ذات المخرجات الجيدة المعروفة لتلاحظ تدهور النتائج عند تغيير الموجّه. ثبّت seed ودرجة الحرارة أثناء مقارنة الإصدارات.

ملاحظات: اجعل وصف الأدوات قصيرًا ودقيقًا، وقم بالتحقق من الحجج قبل تنفيذ أي شيء، ولا تمرر مخرجات النموذج مباشرة إلى قشرة النظام. بالنسبة للحلقة التكرارية، كرر المكالمة طالما أن tool_calls موجود، وتوقف بعد عدد أقصى من الخطوات. كل خطوة تعيد إرسال سجل المحادثة، لذا فإن تشغيل بـ 10 خطوات يكلف ما يعادل تقريبًا عشرة أضعاف سعة السياق.

البث المتدفق وإعادة المحاولة على 429

للأدوات التفاعلية، قم ببث الرموز عند وصولها. يأتي الاستخدام في نهاية البث، مما يجعل تسجيل التكلفة سهلاً.

import time
from openai import OpenAI, RateLimitError

client = OpenAI(base_url="https://api.getcodexapi.com/v1", api_key="YOUR_KEY", max_retries=0)

def ask(prompt, tries=4):
    for attempt in range(tries):
        try:
            stream = client.chat.completions.create(
                model="uncensored",
                messages=[{"role": "user", "content": prompt}],
                stream=True,
                stream_options={"include_usage": True},
            )
            text = []
            for chunk in stream:
                if chunk.choices and chunk.choices[0].delta.content:
                    piece = chunk.choices[0].delta.content
                    text.append(piece)
                    print(piece, end="", flush=True)
                if chunk.usage:
                    print("\ntokens:", chunk.usage.prompt_tokens, chunk.usage.completion_tokens)
            return "".join(text)
        except RateLimitError:
            time.sleep(5 * (attempt + 1))
    raise RuntimeError("still rate limited")

ask("Explain Python generators in four sentences.")

الحدود وراء حلقة إعادة المحاولة هذه: المفتاح الكامل يسمح بـ 8 طلبات متزامنة و300 في الدقيقة، والمفتاح التجريبي 2 و60. تجاوز الحد يعطيك HTTP 429 مع الرمز rate_limited أو concurrency. الحمل الزائد المؤقت يعطي أيضًا 429 مع رأس Retry-After: 5. يحدد المثال max_retries=0 في العميل بحيث تتحكم حلقتك الخاصة في فترات الانتظار. يحمل الطلب المتدفق مكان التزامن الخاص به حتى انتهاء البث، لذا استهلك أو أغلق البث دائمًا.

تشغيل العديد من الطلبات في وقت واحد

تحتاج مهام الدفع مثل توليد الاختبارات لمئة وظيفة إلى حد توافق. استخدم مجموعة خيوط مع 8 عمال كحد أقصى على المفتاح الكامل.

نمط بسيط هو ThreadPoolExecutor(max_workers=6) حول دالة تستدعي ask، تاركاً فتحتين حرتين لعمل آخر. مع مفتاح التجربة استخدم 2 عامل. إذا مررت رقماً أكبر، ستجيب API الطلبات الإضافية بأخطاء concurrency، وستقضي حلقة إعادة المحاولة وقتاً في الانتظار بدلاً من العمل. للكود غير المتزامن، استخدم AsyncOpenAI مع asyncio.Semaphore(6) حول كل مكالمة؛ إنه يعطي نفس الحد بدون خيوط. رؤوس الاستجابة X-RateLimit-Limit-Requests و X-RateLimit-Limit-Concurrency تظهر الحدود لمفتاحك.

تكلفة أحمال عمل البرمجة

السعر هو $0.15 لكل مليون رمز إدخال و$0.50 لكل مليون رمز مخرجات. قل أنك تولد اختبارات وحدة لـ 200 دالة. كل مكالمة ترسل 1,500 رمز إدخال وتعيد 700 رمز. الإدخال: 200 x 1,500 = 300,000 رمز، أو $0.045. المخرجات: 200 x 700 = 140,000 رمز، أو $0.07. المجموع: $0.115.

إعادة هيكلة ملف كبير ترسل 30,000 رمز وتخرج 8,000: $0.0045 + $0.004 = $0.0085 لكل تشغيل. الطلبات الفاشلة أو المرفوضة لا تُحتسب رسومها، ولا تنتهي صلاحية الرصيد أبدًا. تبدأ الشحنات من $20 ويمكن دفعها بالبطاقة أو العملات المشفرة، مع مكافأة 5% من $50، و10% من $100 و15% من $200. انظر الأسعار، واقرأ الوثائق للحصول على قائمة المعلمات الكاملة.

أسئلة وأجوبة

هل يمكنني استخدام حزمة openai القياسية؟

نعم. اضبط base_url على https://api.getcodexapi.com/v1، مرّر مفتاحك واستخدم معرف النموذج uncensored.

هل يدعم استدعاء الأدوات من Python؟

نعم. مرّر الأدوات و tool_choice، ثم أعد النتائج باستخدام دور الأداة. تعمل tool_calls المتدفقة أيضًا.

كيف أحصل على مخرجات مهيكلة؟

استخدم response_format مع type json_object، وسمِّ المفاتيح في الموجّه الخاص بك، ثم تحقق من النتيجة في الكود.

هل يوجد عميل غير متزامن؟

توفر الحزمة openai فئة AsyncOpenAI، التي تعمل بنفس الطريقة مع هذا base_url. حافظ على التزامن عند أو أقل من 8 باستخدام المفتاح الكامل.

مفتاحك على بُعد استمارة واحدة

أنشئ حسابًا، وانسخ المفتاح، ثم غيّر الرابط الأساسي. هذه هي الإعدادات الكاملة.

احصل على مفتاح API