وثائق واجهة API: إنشاء استدعاء دوال للدردشة
وصف الواجهة
عند تزويد النموذج بموجّه، سيُرجع نتيجة إكمال متوقعة واحدة أو أكثر، ويمكنه أيضًا إرجاع احتمالات الرموز البديلة لكل موضع. تدعم هذه الواجهة بشكل خاص ميزة استدعاء الدوال (Function Calling)، مما يسمح للنموذج بالاختيار الذكي بين إنشاء الرسائل واستدعاء دوال محددة.
- المرجع الرسمي: Function Calling Guide
المعلومات الأساسية
- طريقة الطلب:
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}} | بيانات اعتماد المصادقة |
جسم الطلب (Body)
| اسم المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
model | string | نعم | معرّف النموذج المراد استخدامه (مثل gpt-4o). راجع جدول توافق نقاط نهاية النماذج لمعرفة تفاصيل النماذج المتاحة. |
messages | array | نعم | قائمة الرسائل التي تتضمن المحادثة حتى الآن. يجب أن يحتوي كل كائن على الحقلين role وcontent. |
tools | array | نعم | قائمة بالأدوات التي يمكن للنموذج استدعاؤها. حاليًا لا يتم دعم سوى الدوال كأدوات. تُستخدم لتوفير قائمة الدوال التي يمكن للنموذج إنشاء مدخلات JSON لها. |
tool_choice | object/string | نعم | يتحكم في الدالة التي سيستدعيها النموذج، إن وجدت. تعني none عدم الاستدعاء؛ وتعني auto أن يختار النموذج بنفسه. ويمكن أيضًا فرض استدعاء دالة معيّنة عبر {"type": "function", "function": {"name": "my_function"}}. |
temperature | number | لا | درجة حرارة أخذ العينات، بين 0 و2. القيم الأعلى (مثل 0.8) تجعل المخرجات أكثر عشوائية، والقيم الأقل (مثل 0.2) تجعلها أكثر حسمًا. يُنصح بعدم تعديل هذا الحقل وtop_p في الوقت نفسه. |
top_p | number | لا | أسلوب أخذ العينات النووي. تعني القيمة 0.1 أنه سيتم النظر فقط في الرموز التي تشكل أعلى 10% من الكتلة الاحتمالية. يُنصح بعدم تعديل هذا الحقل وtemperature في الوقت نفسه. |
n | integer | لا | عدد اختيارات إكمال الدردشة التي سيتم إنشاؤها لكل رسالة إدخال. القيمة الافتراضية هي 1. |
stream | boolean | لا | القيمة الافتراضية false. إذا تم ضبطها على true، فسيتم إرسال زيادات الرسائل الجزئية بصيغة Server-Sent Events (SSE)، وسينتهي البث عند data: [DONE]. |
stop | string/array | لا | حتى 4 تسلسلات، وستتوقف واجهة API عن توليد المزيد من الرموز عند مواجهتها. القيمة الافتراضية null. |
max_tokens | integer | لا | الحد الأقصى لعدد الرموز التي سيتم توليدها في إكمال الدردشة. يخضع إجمالي طول الإدخال والمخرجات لحد طول السياق الخاص بالنموذج. |
presence_penalty | number | لا | رقم بين -2.0 و2.0. القيم الموجبة تعاقب الرموز الجديدة بناءً على ما إذا كانت قد ظهرت سابقًا في النص، مما يزيد احتمال انتقال النموذج إلى مواضيع جديدة. |
frequency_penalty | number | لا | رقم بين -2.0 و2.0. القيم الموجبة تعاقب الرموز الجديدة بناءً على تكرار ظهورها في النص الحالي، مما يقلل من احتمال تكرار النموذج لنفس المحتوى. |
logit_bias | object | لا | يعدّل احتمال ظهور رموز محددة في الإكمال. يقبل كائن JSON يربط معرّفات الرموز بقيم انحياز تتراوح بين -100 و100. |
user | string | لا | معرّف فريد يمثّل المستخدم النهائي لديك، ويمكن أن يساعد في مراقبة إساءة الاستخدام واكتشافها. |
response_format | object | لا | كائن يحدد التنسيق الذي يجب أن يخرجه النموذج. على سبيل المثال، يمكن استخدام { "type": "json_object" } لتفعيل وضع JSON. |
seen | integer | لا | ميزة في المرحلة التجريبية. إذا تم تحديدها، فسيحاول النظام تنفيذ أخذ عينات حتمي بحيث تعيد الطلبات ذات البذرة والمعاملات نفسها النتيجة نفسها. |
مثال على جسم الطلب
{
"model": "gpt-4o",
"messages": [
{
"role": "system",
"content": "أنت مساعد دعم عملاء مفيد. استخدم الأدوات المتاحة لمساعدة المستخدم."
},
{
"role": "user",
"content": "مرحبًا، هل يمكنك إخباري بتاريخ تسليم طلبي؟"
},
{"role": "assistant", "content": "مرحبًا! يمكنني مساعدتك في ذلك. هل يمكنك تزويدي بمعرّف الطلب من فضلك؟"},
{"role": "user", "content": "أعتقد أنه order_12345"}
],
"tools": [
{
"type": "function",
"function": {
"name": "get_delivery_date",
"description": "احصل على تاريخ تسليم طلب العميل. استدعِ هذه الدالة كلما احتجت إلى معرفة تاريخ التسليم، على سبيل المثال عندما يسأل العميل: أين طردي؟",
"parameters": {
"type": "object",
"properties": {
"order_id": {
"type": "string",
"description": "معرّف طلب العميل."
}
},
"required": [
"order_id"
],
"additionalProperties": false
}
}
}
]
}
معاملات الاستجابة (Response)
| اسم المعامل | النوع | الوصف |
|---|---|---|
id | string | المعرّف الفريد لإكمال الدردشة. |
object | string | نوع الكائن، وعادةً يكون chat.completion. |
created | integer | الطابع الزمني Unix عند إنشاء إكمال الدردشة. |
choices | array | قائمة اختيارات إكمال الدردشة. |
? index | integer | فهرس هذا الاختيار داخل قائمة الاختيارات. |
? message | object | كائن الرسالة الناتج عن النموذج، ويحتوي على role وcontent. |
? finish_reason | string | سبب توقف النموذج عن توليد الرموز (مثل stop أو length أو عند تفعيل استدعاء دالة). |
usage | object | إحصائيات استهلاك الرموز لهذا الطلب. |
? prompt_tokens | integer | عدد الرموز المستهلكة في الموجّه (الإدخال). |
? completion_tokens | integer | عدد الرموز المستهلكة في استجابة النموذج. |
? total_tokens | integer | إجمالي عدد الرموز المستهلكة في هذا الطلب. |
مثال على الاستجابة (200 OK)
{
"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: كيف يمكنني فرض استدعاء النموذج لدالة محددة بعينها؟
ج: يمكنك تحقيق ذلك عبر ضبط المعامل tool_choice. على سبيل المثال، إذا كان اسم دالتك هو get_weather، فيمكنك تعيين tool_choice إلى: {"type": "function", "function": {"name": "get_weather"}}۔ بهذه الطريقة سيتجاهل النموذج الرد العادي ويُخرج فقط معاملات تلك الدالة.
س2: لماذا تم اقتطاع محتوى الرد الخاص بي؟
ج: يُرجى التحقق من قيمة choices[0].finish_reason في الاستجابة. إذا كانت "length"، فهذا يعني أن النص الذي تم توليده تجاوز حد المعامل max_tokens الذي حددته، أو أنه بلغ الحد الأقصى لطول السياق الخاص بالنموذج. يمكنك محاولة زيادة قيمة max_tokens.
س3: يمكن لكل من temperature وtop_p التحكم في العشوائية، فكيف أستخدمهما؟
ج: بالفعل، كلا المعاملين يمكنه ضبط تنوع مخرجات النموذج. القيم الأعلى تجعل الإخراج أكثر إبداعًا، بينما القيم الأقل تجعله أكثر صرامة وحسمًا. توصي الوثائق الرسمية بتعديل أحد المعاملين فقط مع إبقاء الآخر على قيمته الافتراضية، وعدم تعديلهما معًا لتجنب نتائج غير متوقعة.
س4: ما هو تنسيق البيانات التي تُرجعها الواجهة عند تفعيل stream: true؟
ج: عند تفعيل البث، لن تُرجع الواجهة كائن JSON واحدًا، بل ستُرجع تدفق بيانات بصيغة Server-Sent Events (SSE). سيتم إرسال البيانات على شكل كتل مثل: data: {"id": "...", "choices": [{"delta": {"content": "..."}}]} ، وعند اكتمال الإرسال ستكون آخر رسالة هي data: [DONE].
س5: ما الذي يجب الانتباه إليه عند تفعيل response_format في وضع JSON؟
ج: عندما تضبط response_format على { "type": "json_object" }، يجب عليك في الوقت نفسه أن توضّح صراحةً داخل messages (في موجّه النظام أو موجّه المستخدم) أن على النموذج توليد بيانات بتنسيق JSON. إذا لم تفعل ذلك، فقد يدخل النموذج في حلقة توليد مستمرة للمسافات البيضاء، مما يؤدي إلى انتهاء مهلة الطلب أو بلوغ الحد الأعلى للرموز.