وثائق API: إنشاء مخرجات منظَّمة
وصف الواجهة
عند تزويد النموذج بموجّه (Prompt)، سيُرجع النموذج استجابة إكمال واحدة أو أكثر متوقعة، كما يدعم فرض إخراج منظَّم وفق JSON Schema محدد.
المرجع الرسمي: OpenAI Structured Outputs
المعلومات الأساسية للواجهة
- طريقة الطلب:
POST - مسار الطلب:
https://api.codingplanx.ai/v1/chat/completions - تنسيق البيانات:
application/json
ترويسات الطلب (Headers)
| اسم المعامل | مطلوب | النوع | القيمة المثال | الوصف |
|---|---|---|---|---|
Content-Type | نعم | string | application/json | يحدد نوع بيانات جسم الطلب |
Accept | نعم | string | application/json | يحدد نوع البيانات التي يقبلها العميل |
Authorization | لا | string | Bearer {{YOUR_API_KEY}} | بيانات اعتماد المصادقة |
جسم الطلب (Request Body)
| اسم المعامل | مطلوب | النوع | الوصف |
|---|---|---|---|
model | نعم | string | معرّف النموذج المطلوب استخدامه (مثل gpt-4.1-2025-04-14). |
messages | نعم | array | قائمة الرسائل التي تتضمن المحادثة حتى الآن. |
? messages[].role | نعم | string | دور مرسل الرسالة، مثل system أو user أو assistant. |
? messages[].content | نعم | string | المحتوى الفعلي للرسالة. |
tools | نعم | array | قائمة بالأدوات التي يمكن للنموذج استدعاؤها. حاليًا يتم دعم الدوال فقط. تُستخدم لتزويد النموذج بمجموعة من الدوال التي يمكنه توليد مدخلات JSON لها. |
tool_choice | نعم | object | يتحكم في الدالة التي يجب على النموذج استدعاؤها. القيمة none تعني عدم الاستدعاء، وauto تعني الاختيار التلقائي. كما يمكن فرض استدعاء دالة محددة عبر {"type": "function", "function": {"name": "my_function"}}. |
temperature | لا | integer | درجة حرارة أخذ العينات، وتتراوح بين 0 و2. كلما ارتفعت القيمة (مثل 0.8) أصبح الإخراج أكثر عشوائية، وكلما انخفضت (مثل 0.2) أصبح الإخراج أكثر تركيزًا وحتمية. يُنصح بتعديل هذا المعامل أو top_p، ولكن ليس كليهما معًا. |
top_p | لا | integer | معامل أخذ العينات النووية. تعني القيمة 0.1 أنه سيتم النظر فقط في الرموز التي تشكل أعلى 10% من كتلة الاحتمال. يُنصح بتعديل هذا المعامل أو temperature، ولكن ليس كليهما معًا. |
n | لا | integer | عدد خيارات الإكمال التي سيتم توليدها لكل رسالة إدخال. القيمة الافتراضية هي 1. |
stream | لا | boolean | ما إذا كان سيتم تفعيل الإخراج المتدفق. إذا كانت القيمة true، فسيتم إرسال زيادات الرسائل الجزئية بصيغة Server-Sent Events (SSE)، مع إنهاء التدفق بـ data: [DONE]. القيمة الافتراضية هي false. |
stop | لا | string | التسلسل الذي عنده تتوقف الواجهة عن توليد المزيد من الرموز (حتى 4 تسلسلات كحد أقصى). القيمة الافتراضية هي null. |
max_tokens | لا | integer | الحد الأقصى لعدد الـ Tokens التي سيتم توليدها في إكمال الدردشة. القيمة الافتراضية هي inf (غير محدود). |
presence_penalty | لا | number | عقوبة الوجود (-2.0 إلى 2.0). القيم الموجبة تعاقب الرموز الجديدة بناءً على ما إذا كانت قد ظهرت في النص حتى الآن، مما يزيد احتمال تحدث النموذج عن موضوعات جديدة. |
frequency_penalty | لا | number | عقوبة التكرار (-2.0 إلى 2.0). القيم الموجبة تعاقب الرموز الجديدة بناءً على تكرار ظهورها في النص الحالي، مما يقلل من احتمال تكرار النموذج لنفس المحتوى. |
logit_bias | لا | null/object | يقبل كائن JSON يربط معرفات الرموز بقيم انحياز مقابلة (-100 إلى 100)، وذلك لتعديل احتمال ظهور رموز محددة في الإكمال. |
user | لا | string | معرّف فريد يمثّل المستخدم النهائي، للمساعدة في المراقبة واكتشاف إساءة الاستخدام. |
response_format | لا | object | يحدد كائن التنسيق الذي يجب أن يلتزم به إخراج النموذج. من خلال تعيين {"type": "json_schema", "json_schema": {...}} يمكن تفعيل الإخراج المنظَّم، لضمان أن يولد النموذج JSON صالحًا. |
seen | لا | integer | (ميزة تجريبية Beta) تعيين البذرة العشوائية (Seed). سيحاول النظام قدر الإمكان جعل عملية أخذ العينات حتمية، بحيث تعيد الطلبات المتكررة بنفس البذرة ونفس المعاملات نفس النتيجة. |
مثال الطلب (Request Example)
{
"model": "gpt-4.1-2025-04-14",
"messages": [
{
"role": "system",
"content": "حدّد ما إذا كان إدخال المستخدم ينتهك إرشادات محددة واشرح السبب إذا كان كذلك."
},
{
"role": "user",
"content": "كيف أستعد لمقابلة عمل؟"
}
],
"response_format": {
"type": "json_schema",
"json_schema": {
"name": "content_compliance",
"description": "يحدد ما إذا كان المحتوى ينتهك قواعد الإشراف المحددة",
"schema": {
"type": "object",
"properties": {
"is_violating": {
"type": "boolean",
"description": "يشير إلى ما إذا كان المحتوى ينتهك الإرشادات"
},
"category": {
"type": ["string", "null"],
"description": "نوع الانتهاك إذا كان المحتوى ينتهك الإرشادات، وإلا فتكون القيمة Null.",
"enum": ["violence", "sexual", "self_harm"]
},
"explanation_if_violating": {
"type": ["string", "null"],
"description": "شرح سبب اعتبار المحتوى مخالفًا"
}
},
"required": ["is_violating", "category", "explanation_if_violating"],
"additionalProperties": false
},
"strict": true
}
}
}
جسم الاستجابة (Response Body)
| اسم المعامل | النوع | الوصف |
|---|---|---|
id | string | المعرّف الفريد لطلب الإكمال. |
object | string | نوع الكائن، وهو ثابت بقيمة chat.completion. |
created | integer | الطابع الزمني لوقت الإنشاء (Unix بالثواني). |
choices | array | قائمة خيارات الإكمال. |
? choices[].index | integer | فهرس الخيار داخل القائمة. |
? choices[].message | object | كائن الرسالة التي أنشأها النموذج. |
? choices[].message.role | string | اسم الدور (غالبًا assistant). |
? choices[].message.content | string | المحتوى الفعلي للرسالة. |
? choices[].finish_reason | string | سبب توقف النموذج عن التوليد (مثل stop أو length). |
usage | object | إحصاءات استخدام الـ Tokens. |
? usage.prompt_tokens | integer | عدد الـ Tokens المستهلكة في الموجّه (Prompt). |
? usage.completion_tokens | integer | عدد الـ Tokens المستهلكة في الإكمال (Completion). |
? usage.total_tokens | integer | إجمالي عدد الـ Tokens المستهلكة. |
مثال الاستجابة (Response Example)
{
"id": "chatcmpl-123",
"object": "chat.completion",
"created": 1677652288,
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "\r
\r
مرحبًا، كيف يمكنني مساعدتك اليوم؟"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 9,
"completion_tokens": 12,
"total_tokens": 21
}
}
الأسئلة الشائعة (FAQs)
1. ما هو response_format وكيف أضمن أن يُخرج النموذج JSON صارمًا؟
يتيح لك المعامل response_format مطالبة النموذج بإرجاع البيانات بتنسيق محدد. إذا كنت تريد استخدام "الإخراج المنظَّم"، فيجب ضبطه إلى {"type": "json_schema"} وتعريف JSON Schema بداخله، مع تفعيل strict: true. يضمن ذلك أن يُخرج النموذج البيانات بنسبة 100% وفق الحقول وأنواع البيانات التي حددتها، دون الحاجة إلى تنفيذ معالجة إضافية لتحمل أخطاء JSON في تطبيقك.
2. لماذا يتم اقتطاع إخراج JSON الخاص بي؟
إذا كانت قيمة choices[0].finish_reason في بيانات الاستجابة هي length، فهذا يعني أن النص المولَّد قد وصل إلى حد max_tokens، أو أنه تجاوز الحد الأقصى لطول السياق الذي يدعمه النموذج. يُنصح بزيادة قيمة max_tokens في الطلب.
3. ما الفرق بين temperature وtop_p؟ وأيّهما ينبغي أن أعدّل؟
كلاهما يُستخدم للتحكم في عشوائية إخراج النموذج:
temperatureيقوم بتحجيم توزيع احتمالات إخراج النموذج. كلما انخفضت القيمة، أصبح الإخراج أكثر دقة وحتمية؛ وكلما ارتفعت، أصبح الإخراج أكثر تفرعًا.top_p(أخذ العينات النووية) يقيّد النموذج بحيث يختار فقط من الكلمات الأعلى احتمالًا التي تصل كتلتها الاحتمالية التراكمية إلىp. التوصية الرسمية: عدّل أحدهما فقط، ولا تعدّلtemperatureوtop_pفي الوقت نفسه.
4. ماذا يحدث عند تفعيل stream: true؟
عند ضبط stream: true، لن تنتظر الواجهة حتى يكتمل الجواب بالكامل قبل الإرجاع، بل ستُعيد مقاطع من البيانات بشكل متدفق وفوري كما لو أنها تُكتب مباشرة. سيتحول تنسيق الإرجاع إلى Server-Sent Events (SSE). يحتاج العميل إلى الاستماع إلى تدفق البيانات وتجميع delta.content حتى يتم استلام العلامة [DONE] التي تشير إلى النهاية.
5. كيف أضمن الحصول على نفس الإجابة تمامًا عند استدعاء نفس الـ Prompt في كل مرة؟
على الرغم من أن النماذج اللغوية الكبيرة تتضمن قدرًا من العشوائية، يمكنك تمرير المعامل seen (Seed) المحدد، وضبط temperature إلى 0، لتحقيق أعلى درجة ممكنة من الحتمية في الإخراج. إذا لاحظت أن قيمة system_fingerprint في نتيجة الإرجاع قد تغيّرت، فهذا يعني أن إعدادات النموذج في الخلفية قد تم تعديلها بشكل طفيف، وعندها قد تظهر فروق بسيطة حتى مع استخدام نفس الـ Seed.