تم إطلاق ERNIE 5.1 في 9 مايو 2026، وبعد أسبوع أصبح متاحًا عبر Qianfan API. إذا كنت تريد استدعاء النموذج من الكود، أو تشغيل tool calling، أو بناء agent loop واختبارها عبر Apidog، فهذا الدليل يركز على التنفيذ: إنشاء المفتاح، إرسال الطلبات، التدفّق، الأدوات، ومعالجة الأخطاء.
بنهاية المقال سيكون لديك أمثلة جاهزة لـ curl وPython وNode.js، بالإضافة إلى طريقة تنظيم الطلبات داخل Apidog لاختبار ERNIE 5.1 مقابل مزودين آخرين.
إذا لم تقرأ بعد شرح إطلاق ERNIE 5.1، فابدأ به سريعًا؛ فهو يغطي المعايير والمقارنات مع DeepSeek V4 وKimi K2.6. هذا المقال هو جزء التنفيذ العملي.
الخطوة 1: الحصول على مفتاح API لـ Qianfan
يتم تقديم ERNIE 5.1 عبر منصة Qianfan من Baidu Intelligent Cloud. لا يوجد API منفصل خاص بـ ERNIE؛ كل الاستدعاءات تمر عبر Qianfan.
نفّذ الخطوات التالية:
- انتقل إلى cloud.baidu.com وأنشئ حسابًا في Baidu Intelligent Cloud أو سجّل الدخول.
- يمكن للمطورين الدوليين التسجيل بالبريد الإلكتروني.
- بعض ميزات المؤسسات قد تتطلب رقم هاتف صيني.
- افتح لوحة Qianfan من console.bce.baidu.com/qianfan.
- من إدارة مفاتيح API (
API Key 管理) اختر إنشاء مفتاح API. - اختر مساحة العمل، وامنح المفتاح صلاحية الوصول إلى خدمة chat completions.
- انسخ المفتاح وخزّنه في متغير بيئة، وليس داخل الكود.
export QIANFAN_API_KEY="bce-v3/ALTAK-xxxx/xxxx"
نقطتان مهمتان قبل أول طلب:
- نقطة النهاية v2 تستخدم Bearer token واحدًا. لا تبنِ تطبيقًا جديدًا على تدفق OAuth القديم
access_tokenالخاص بـ v1. - ERNIE 5.1 نموذج مدفوع منذ البداية. أضف رصيدًا بسيطًا، مثل 10 ¥، قبل الاختبار.
الخطوة 2: استدعاء نقطة النهاية المتوافقة مع OpenAI باستخدام curl
يوفر Qianfan نقطة نهاية chat completions متوافقة مع تنسيق OpenAI. إذا كان تطبيقك يستخدم OpenAI SDK أو نفس شكل الطلبات، فغالبًا ستحتاج فقط إلى تغيير:
base_urlmodelapi_key
الإعدادات الأساسية:
Base URL: https://qianfan.baidubce.com/v2
Model: ernie-5.1
يمكنك أيضًا استخدام:
ernie-5.1-preview
للمزايا ذات الوصول المبكر.
مثال curl بسيط:
curl https://qianfan.baidubce.com/v2/chat/completions \
-H "Authorization: Bearer $QIANFAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "ernie-5.1",
"messages": [
{"role": "system", "content": "You are a senior API designer."},
{"role": "user", "content": "Sketch a REST schema for a GitHub-style PR review API. Be concise."}
],
"temperature": 0.3
}'
شكل الاستجابة سيكون قريبًا من OpenAI:
{
"id": "chatcmpl-...",
"object": "chat.completion",
"created": 1746780000,
"model": "ernie-5.1",
"choices": [
{
"index": 0,
"message": { "role": "assistant", "content": "..." },
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 42,
"completion_tokens": 318,
"total_tokens": 360
}
}
أخطاء شائعة في هذه المرحلة:
-
401 Unauthorized: المفتاح غير صحيح أو منتهي الصلاحية. -
403: المفتاح صحيح، لكن النموذج غير مفعّل في مساحة العمل. فعّل ERNIE 5.1 من لوحة Qianfan.
الخطوة 3: استدعاء ERNIE 5.1 من Python
بما أن نقطة النهاية متوافقة مع OpenAI، يمكنك استخدام حزمة openai الرسمية في Python مع تغيير base_url.
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["QIANFAN_API_KEY"],
base_url="https://qianfan.baidubce.com/v2",
)
response = client.chat.completions.create(
model="ernie-5.1",
messages=[
{"role": "system", "content": "You explain APIs in plain English."},
{"role": "user", "content": "Why would I use server-sent events over WebSockets for a chat UI?"},
],
temperature=0.4,
)
print(response.choices[0].message.content)
print(f"\nTokens used: {response.usage.total_tokens}")
إذا كان لديك wrapper داخلي حول OpenAI SDK، فاختبار ERNIE 5.1 غالبًا يكون تغييرًا في سطر الإعداد فقط. نفس النمط يعمل مع API الخاص بـ DeepSeek ومعظم مزودي النماذج الذين يدعمون تنسيق OpenAI.
الخطوة 4: تفعيل تدفق الرموز لواجهات الدردشة
لواجهات الدردشة، لا تنتظر الاستجابة كاملة. استخدم streaming حتى تعرض الرموز تدريجيًا للمستخدم.
في Python:
stream = client.chat.completions.create(
model="ernie-5.1",
messages=[{"role": "user", "content": "Write a haiku about API versioning."}],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta.content
if delta:
print(delta, end="", flush=True)
ولتصحيح الأخطاء باستخدام curl:
curl https://qianfan.baidubce.com/v2/chat/completions \
-H "Authorization: Bearer $QIANFAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "ernie-5.1",
"stream": true,
"messages": [{"role": "user", "content": "Stream a 3-sentence joke."}]
}' \
--no-buffer
شكل التدفق مطابق تقريبًا لتنسيق OpenAI:
data: {...}
data: {...}
data: [DONE]
الخطوة 5: استخدام ERNIE 5.1 مع الأدوات
يدعم ERNIE 5.1 نمط tool calling باستخدام نفس شكل function calling المتوافق مع OpenAI. الفكرة العملية:
- ترسل قائمة الأدوات المتاحة للنموذج.
- يقرر النموذج هل يحتاج إلى استدعاء أداة.
- ينفذ تطبيقك الأداة فعليًا.
- ترسل نتيجة الأداة مرة أخرى للنموذج.
- تكرر الحلقة حتى تنتهي الاستجابة بدون
tool_calls.
مثال تعريف أداة:
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get current weather for a city.",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "City name, e.g. Singapore"},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
},
"required": ["city"],
},
},
}
]
response = client.chat.completions.create(
model="ernie-5.1",
messages=[{"role": "user", "content": "What's the weather in Tokyo right now?"}],
tools=tools,
tool_choice="auto",
)
tool_calls = response.choices[0].message.tool_calls
if tool_calls:
call = tool_calls[0]
print(f"Model wants to call: {call.function.name}({call.function.arguments})")
بعد تنفيذ الأداة في تطبيقك، أضف النتيجة كرسالة بدور tool، ثم استدعِ النموذج مرة أخرى. تنتهي الحلقة عندما:
finish_reason == "stop"
ولا توجد:
tool_calls
ملاحظة تنفيذية: قد يعيد ERNIE 5.1 أحيانًا arguments الخاصة بالأداة كسلسلة JSON داخل code fence بدل JSON نظيف. تعامل معها دفاعيًا:
import json
import re
def parse_tool_args(raw):
try:
return json.loads(raw)
except json.JSONDecodeError:
cleaned = re.sub(r"^```
json|
```$", "", raw.strip(), flags=re.MULTILINE).strip()
return json.loads(cleaned)
الخطوة 6: استدعاء ERNIE 5.1 من Node.js
إذا كنت تستخدم حزمة openai في Node.js، غيّر baseURL فقط:
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.QIANFAN_API_KEY,
baseURL: "https://qianfan.baidubce.com/v2",
});
const completion = await client.chat.completions.create({
model: "ernie-5.1",
messages: [
{ role: "user", content: "Return a JSON object with 3 API design tips." },
],
response_format: { type: "json_object" },
});
console.log(completion.choices[0].message.content);
response_format: { type: "json_object" } يعمل للاستخدامات العملية. أما json_schema الصارم فما زال قيد الطرح في Qianfan؛ لذلك تحقّق من شكل الاستجابة في الكود بدل الاعتماد الكامل على القيود.
مثال تحقق بسيط:
const raw = completion.choices[0].message.content;
try {
const parsed = JSON.parse(raw);
if (!Array.isArray(parsed.tips)) {
throw new Error("Expected tips to be an array");
}
console.log(parsed);
} catch (error) {
console.error("Invalid JSON response:", error);
}
الخطوة 7: الاختبار والمقارنة باستخدام Apidog
إذا كنت تقارن ERNIE 5.1 مع DeepSeek V4 أو Kimi K2.6، لا تجعل المقارنة تعتمد على أوامر متفرقة في الطرفية. استخدم Apidog لإنشاء مشروع واحد، وبيئات منفصلة، وطلبات متطابقة لكل مزود.
إعداد سريع:
- افتح Apidog.
- أنشئ مشروعًا جديدًا باسم
LLM bake-off.
- أضف بيئة تحتوي على المتغيرات التالية:
QIANFAN_API_KEY
DEEPSEEK_API_KEY
MOONSHOT_API_KEY
- أنشئ طلبًا لكل مزود.
- استخدم نفس مصفوفة
messagesفي كل الطلبات. - غيّر فقط
base_urlوmodel.
مثال للنماذج:
{
"model": "ernie-5.1",
"messages": [
{
"role": "user",
"content": "Design a REST API for pull request reviews. Return endpoints and payload examples."
}
],
"temperature": 0.3
}
استخدم ميزة Run في Apidog لتشغيل الطلبات بالتوازي ومقارنة النتائج. يحتفظ Apidog بسجل الطلبات حسب البيئة، ما يجعل إعادة نفس التقييم لاحقًا أسهل من تشغيل عدة أوامر curl.
لمزيد من الاختبارات متعددة المزودين، راجع اختبار نماذج LLM المحلية كواجهات برمجة تطبيقات ودليل GLM 5.1 API.
التسعير، حدود المعدل، والحصص
لم يكن تسعير Qianfan العام لـ ERNIE 5.1 مذكورًا في منشور الإصدار. تحقق من بطاقة الأسعار داخل لوحة Qianfan قبل مشاركة أرقام داخلية مع فريقك.
نصائح عملية:
- حدود المعدل مرتبطة بمساحة العمل. الحسابات الجديدة تبدأ غالبًا بحد QPS منخفض. ارفع الحد من لوحة التحكم بعد الاختبار.
-
استخدم حقل
usage. كل استجابة تحتوي على:prompt_tokenscompletion_tokenstotal_tokens
- سجّل الاستخدام لكل طلب. لا تعتمد فقط على لوحة التحكم لتقدير التكلفة.
- لا يوجد prompt caching تلقائي. إذا كان لديك system prompt طويل، فسيتم احتسابه في كل استدعاء. اختصره أو خزّن النتائج في طبقة التطبيق عند الإمكان.
مثال تسجيل بسيط:
response = client.chat.completions.create(
model="ernie-5.1",
messages=messages,
)
usage = response.usage
print({
"prompt_tokens": usage.prompt_tokens,
"completion_tokens": usage.completion_tokens,
"total_tokens": usage.total_tokens,
})
معالجة الأخطاء التي ستواجهها غالبًا
الأخطاء العملية الأكثر شيوعًا:
| الحالة | المعنى | الإصلاح |
|---|---|---|
| 401 | رمز Bearer خاطئ أو منتهي الصلاحية | أعد توليد المفتاح من لوحة التحكم |
| 403 | النموذج غير مفعّل في مساحة العمل | فعّل ERNIE 5.1 من لوحة Qianfan |
| 429 | تم تجاوز حد المعدل | استخدم backoff مع jitter ثم أعد المحاولة |
400 (invalid messages) |
ترتيب أدوار الرسائل غير صحيح | راجع تسلسل user/assistant/tool |
| 500/502 | مشكلة من جهة Qianfan | أعد المحاولة مرة، ثم تحقق من حالة الخدمة |
للاستخدام الإنتاجي، غلّف كل استدعاء بإعادة محاولة مع exponential backoff، وسجّل request_id من رؤوس الاستجابة إذا كان متاحًا؛ ستحتاجه عند التواصل مع دعم Baidu.
غلاف Python بسيط مناسب كبداية إنتاجية
هذا wrapper يغطي السيناريوهات الأساسية: استدعاء chat completions مع إعادة محاولة عند حدود المعدل أو أخطاء الخادم.
import os
import time
import random
from openai import OpenAI, RateLimitError, APIError
client = OpenAI(
api_key=os.environ["QIANFAN_API_KEY"],
base_url="https://qianfan.baidubce.com/v2",
)
def chat(messages, *, model="ernie-5.1", temperature=0.3, max_retries=3):
for attempt in range(max_retries):
try:
return client.chat.completions.create(
model=model,
messages=messages,
temperature=temperature,
)
except RateLimitError:
sleep_for = (2 ** attempt) + random.random()
time.sleep(sleep_for)
except APIError as e:
if e.status_code and e.status_code >= 500 and attempt < max_retries - 1:
time.sleep(1 + attempt)
continue
raise
raise RuntimeError("ERNIE 5.1 retries exhausted")
استخدامه:
messages = [
{"role": "system", "content": "You are a concise API reviewer."},
{"role": "user", "content": "Review this endpoint design: POST /users/search"}
]
response = chat(messages)
print(response.choices[0].message.content)
للتدفق وtool calling، ابنِ فوق هذا الغلاف بدل تكرار منطق retry في كل مكان.
الأسئلة الشائعة
هل ERNIE 5.1 API مجاني؟
لا. Qianfan يعمل بنظام الدفع حسب الاستخدام. لا توجد طبقة مجانية دائمة، لكن الحسابات الجديدة قد تحصل أحيانًا على أرصدة تجريبية. للتجربة المجانية عبر واجهة دردشة، استخدم ernie.baidu.com أو راجع خيارات LLM المجانية.
هل يمكن تشغيل ERNIE 5.1 محليًا؟
لا. لا توجد أوزان عامة متاحة. إذا كان التشغيل المحلي أو on-prem مطلبًا أساسيًا، راجع كيفية تشغيل DeepSeek V4 محليًا أو أفضل نماذج LLM المحلية في عام 2026.
هل يعمل OpenAI SDK بدون تغييرات كبيرة؟
نعم. اضبط:
base_url="https://qianfan.baidubce.com/v2"
واستخدم مفتاح Qianfan في api_key. حقل model يجب أن يحتوي على معرف نموذج Qianfan مثل:
ernie-5.1
وليس معرفًا من OpenAI.
هل يدعم ERNIE 5.1 streaming وtool calling؟
نعم. يعمل streaming عبر stream: true، وتعمل الأدوات باستخدام مخطط function calling المتوافق مع OpenAI. أما response_format: json_object فهو مدعوم، بينما json_schema الصارم ما زال قيد الطرح.
كيف يتعامل ERNIE 5.1 مع العربية أو الإنجليزية أو الصينية؟
المقال الأصلي يركز على المقارنة بين الصينية والإنجليزية، ويشير إلى أن كلاهما من نقاط قوة النموذج. للمهام التقنية باللغة الإنجليزية مثل الكود وتصميم APIs، يمكن اختباره كنموذج منافس. للكتابة الإبداعية باللغة الصينية، يقدم أداءً قويًا بين النماذج الصينية.
ما الحد الأقصى لطول المخرجات؟
لم يُنشر رسميًا. عمليًا، قد تصل استجابات الدور الواحد إلى حوالي 8 آلاف رمز قبل أن ينهي النموذج. للتوليد الطويل، قسّم المهمة إلى أجزاء واستخدم رسائل متابعة.
إذا كنت تبني agent أو طبقة API فوق ERNIE 5.1، يمكنك تحميل Apidog واستخدام طلبات متوافقة مع OpenAI لاختبار وتوثيق نقطة نهاية Qianfan بجانب بقية خدماتك.



Top comments (0)