البث المتدفق للردود عبر API في كل صيغة
كيف تستقبل الرد أثناء كتابته في كل صيغة، Chat Completions وResponses وMessages وGemini، مع أرقام الاستخدام والأخطاء أثناء البث ونصائح.
مع البث المتدفق يصلك الرد على أجزاء أثناء كتابة النموذج له، فيرى المستخدم النص فورًا بدلًا من انتظار الرد كاملًا. كل الصيغ تدعمه عبر Server-Sent Events، أي أسطر تبدأ بـ data:، وقد يسبقها سطر event:.
التفعيل#
- Chat Completions وResponses وMessages: أضف
"stream": trueإلى جسم الطلب. - Gemini: استدعِ
:streamGenerateContent?alt=sseبدلًا من:generateContent.
مع cURL أضف -N لتظهر الأجزاء فور وصولها. وفي Python مع requests مرّر stream=True واقرأ الأسطر عبر iter_lines. المكتبات الرسمية تتولى هذا كله عنك.
curl --request POST "https://api.5abeer.ai/v1/chat/completions" \
--header "Authorization: Bearer $KHABEER_API_KEY" \
--header "Content-Type: application/json" \
--data '{"model":"claude-sonnet-5.5","messages":[{"role":"user","content":"اكتب فكرة منتج في سطر واحد"}]}'{
"id": "chatcmpl-9f2",
"object": "chat.completion",
"model": "claude-sonnet-5.5",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "مرحبًا! كيف أساعدك اليوم؟"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 21,
"completion_tokens": 12,
"total_tokens": 33
}
}المفتاح يُقرأ من متغير البيئة KHABEER_API_KEY، فلا يظهر في الكود.
ما يصلك في كل صيغة#
- Chat Completions: أسطر
data:كل منهاchat.completion.chunkوالنص فيchoices[0].delta.content، وينتهي البث بالسطرdata: [DONE]. - Responses: أحداث مسمّاة،
response.createdثمresponse.output_text.deltaوأحداث استدعاء الدوال، وينتهي بالحدثresponse.completedالذي يحمل الرد الكامل. - Messages:
message_start، ثم لكل كتلةcontent_block_startوcontent_block_deltaوcontent_block_stop، ثمmessage_delta، وينتهي بالحدثmessage_stop. - Gemini: كل حدث رد جزئي بالشكل نفسه للرد الكامل، وآخر حدث يحمل
finishReasonوusageMetadata.
أمثلة كاملة لكل بث في المراجع: Chat Completions وResponses وMessages وGemini.
أرقام الاستخدام#
- Chat Completions: أضف
"stream_options": {"include_usage": true}فيحمل آخر جزء قبل[DONE]الحقلusageمعchoicesفارغة. نماذج GPT ترسله دائمًا حتى دون هذا الخيار. - Responses: الحقل
usageداخلresponse.completed. - Messages: أرقام الإدخال في
message_start، وأرقام الإخراج فيmessage_delta. - Gemini: الحقل
usageMetadataفي آخر حدث.
الأخطاء أثناء البث#
الخطأ الذي يقع قبل بدء البث يصلك ردًا عاديًا بصيغة JSON مع حالته في HTTP. أما بعد بدء البث فالحالة 200 قد أُرسلت، فيصلك الخطأ داخل البث:
- Chat Completions وGemini: سطر
data:فيه كائنerror. - Responses: حدث
response.failed. - Messages: حدث
error.
يحمل كل منها الرمز نفسه للخطأ العادي، والتفاصيل في الحدود ورموز الأخطاء. اعرض للمستخدم ما كُتب حتى الآن، واعرض عليه إعادة المحاولة.
نصائح#
- اقرأ البث سطرًا سطرًا، وتجاهل الأسطر الفارغة وأسطر
event:التي لا تحتاجها. - اجعل مهلة الانتظار طويلة، فالإجابة الطويلة قد يستمر بثها عدة دقائق.
- لا تحلّل JSON ناقصًا من استدعاء أداة قبل انتهاء كتلته؛ اجمع أجزاء
argumentsأوinput_json_deltaأولًا.
هل كانت هذه الصفحة مفيدة؟