الإعداد وأول استدعاء
هذه خدمة مستقلة متوافقة مع 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. انظر الأسعار، واقرأ الوثائق للحصول على قائمة المعلمات الكاملة.

