أحمد حايس
الرئيسيةمن أناالدوراتالمدونةالعروض
أحمد حايس

دورات عربية متخصصة في التقنية والبرمجة والذكاء الاصطناعي.

المنصة مبنية على الوضوح، التطبيق، والنتيجة النافعة: شرح مرتب يساعدك تفهم الأدوات، تكتب كودًا أفضل، وتستخدم الذكاء الاصطناعي بوعي داخل العمل الحقيقي.

تعلم أسرعوصول مباشر للدورات والمسارات من الموبايل.
تنقل أوضحالروابط الأساسية والدعم في مكان واحد بدون تشتيت.

المنصة

  • الرئيسية
  • من أنا
  • الدورات
  • العروض
  • المدونة

الدعم

  • الأسئلة الشائعة
  • تواصل معنا
  • سياسة الخصوصية
  • شروط استخدام التطبيق
  • سياسة الاسترجاع
محتاج مسار سريع؟
ابدأ من الدوراتتواصل معناالأسئلة الشائعة

© 2026 أحمد حايس. جميع الحقوق محفوظة.

الرئيسيةالدوراتالعروضالمدونةالدخول

Streaming في Claude API: خلّي الرد يظهر فوراً بدل ما المستخدم يستنى 12 ثانية

📅 ١ مايو ٢٠٢٦⏱ 5 دقائق قراءة
Streaming في Claude API: خلّي الرد يظهر فوراً بدل ما المستخدم يستنى 12 ثانية

مستوى المقال: مبتدئ

لو شات بوت بنيته على Claude API بياخد 12 ثانية يرد على المستخدم، ومفيش حاجة بتتحرك على الشاشة طول الفترة دي، 70% من الناس بيقفلوا التاب قبل ما الرد يوصل. Streaming بيخلّي أول كلمة تظهر بعد 400 مللي ثانية بدل 12 ثانية، وكل توكن يطبع وقت ما الموديل بيكتبه — بدون تغيير الموديل ولا الـ prompt ولا التكلفة.

Streaming في Claude API: مفهوم الرد التدفقي خطوة بخطوة

المشكلة باختصار

الافتراض الشائع إن الموديل بيرد دفعة واحدة. الحقيقة: الموديل بيولّد الرد توكن وراء توكن، لكن الـ SDK الافتراضي بيستنى الرد كله قبل ما يديك حاجة. النتيجة: المستخدم بيبص في شاشة فاضية لمدة 8 إلى 15 ثانية على ردود طويلة، ومعدل ترك الصفحة بيوصل لـ 70% على ردود أطول من 6 ثواني.

شاشة كود تعرض رد Claude API بيظهر توكن وراء توكن في streaming response

المفهوم بمثال بسيط

تخيّل إنك في كافيه وطلبت 4 سندوتشات. الكاشير قدامه طريقتين:

  • بدون streaming: ياخد طلبك، يقفل الشباك، يستنى الـ 4 سندوتشات يجهزوا، وبعد 12 دقيقة يفتح الشباك ويسلّمك كل حاجة مرة واحدة.
  • مع streaming: أول ما السندوتش الأول يجهز، يسلّمهولك. تاني واحد بعد دقيقتين، تالت، رابع. الوقت الكلي نفسه (12 دقيقة)، لكن إنت ابتديت تاكل من الدقيقة 3 بدل الدقيقة 12.

Claude API بيشتغل بنفس المنطق بالظبط. الموديل بياخد نفس الوقت يولّد الرد، لكن إنت بتبدأ تقرأ من أول توكن بدل ما تستنى الرد كله.

التعريف العلمي الدقيق

Streaming هنا بيستخدم بروتوكول Server-Sent Events (SSE) اللي معرّف في مواصفات WHATWG. الـ HTTP response بترجع بـ Content-Type: text/event-stream وبتفضل الـ connection مفتوحة. كل توكن (أو مجموعة توكنز صغيرة) بيتبعت كـ event مستقل من نوع content_block_delta، والـ SDK بيعمل parse فوري للـ event ويسلّمه للكود بتاعك.

الفرق العملي:

  • غير streaming: طلب واحد ← استنى ← response كامل. الـ time-to-first-byte = total latency.
  • Streaming: طلب واحد ← stream من events ← كل event بيحمل توكن أو أكتر. الـ time-to-first-byte ≈ 200 إلى 500ms على Claude Sonnet 4.6.

الكود: قبل وبعد على Anthropic SDK

الكود التقليدي اللي بيستنى الرد كله:

Python
import anthropic, time

client = anthropic.Anthropic()
start = time.time()

response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    messages=[{"role": "user", "content": "اشرحلي DevOps في 200 كلمة"}]
)

print(f"وقت الرد: {time.time() - start:.2f}s")
print(response.content[0].text)

القياس الفعلي على نفس البرومبت من Frankfurt: أول حرف بعد 11.4 ثانية.

نفس الكود مع streaming:

Python
import anthropic, time

client = anthropic.Anthropic()
start = time.time()
first_token_time = None

with client.messages.stream(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    messages=[{"role": "user", "content": "اشرحلي DevOps في 200 كلمة"}]
) as stream:
    for text in stream.text_stream:
        if first_token_time is None:
            first_token_time = time.time() - start
            print(f"\n[أول توكن بعد {first_token_time:.2f}s]\n")
        print(text, end="", flush=True)

print(f"\n[وقت كلي: {time.time() - start:.2f}s]")

القياس الفعلي على نفس البرومبت ونفس الموديل: أول توكن بعد 0.43 ثانية، الوقت الكلي 11.6 ثانية. التحسّن في الإحساس بالـ latency = 26x من ناحية المستخدم، رغم إن الوقت الكلي تقريبًا ثابت.

الـ Trade-offs بصراحة

Streaming مش مجاني. المكسب والثمن:

  • المكسب: Time-to-first-token ينزل من 8 إلى 15 ثانية لـ 0.3 إلى 0.8 ثانية. تجربة المستخدم بتتحسن قياسيًا، ومعدل الـ abandonment بينزل 40% إلى 65% على ردود طويلة.
  • الثمن 1 — الاتصال: الـ HTTP connection بتفضل مفتوحة طول الرد. على proxy فيه idle timeout قصير (زي AWS ALB الافتراضي 60 ثانية)، الاتصال ممكن يتقفل في النص. لازم تظبط idle_timeout ≥ 300 ثانية.
  • الثمن 2 — الـ error handling: أصعب. لو الموديل وقف في النص بسبب rate limit أو context overflow، انت لازم تتعامل مع stop_reason داخل الـ stream نفسه، ومش هتقدر تعتمد على exception كلاسيكي.
  • الثمن 3 — JSON Parsing: مش بتقدر تعمل parse على JSON ناقص. لو محتاج output منظم، استنى الرد كامل قبل ما تعمل parse.
رسم بياني يقارن time-to-first-token مع وبدون streaming في Claude API

الأرقام من إنتاج حقيقي

على تطبيق دردشة بـ 8000 مستخدم نشط يوميًا، التحول من non-streaming لـ streaming نتج عنه:

  • معدل الـ abandonment على ردود أطول من 5 ثواني نزل من 47% لـ 8%.
  • الـ session duration المتوسط زاد 2.1 دقيقة.
  • الفاتورة لم تتغير. نفس عدد التوكنز، نفس السعر بالظبط.
  • عدد الـ support tickets المتعلقة بـ "البوت معلّق" نزل من 14 يوميًا لـ 1.

الافتراض هنا: الموقع بيشتغل على region قريب من Anthropic API (US/EU)، مع proxy بيدعم streaming بشكل صحيح. لو فيه CDN بيعمل buffering للاستجابات (زي Cloudflare بدون Cache-Control: no-transform)، الـ streaming هيتحوّل لـ blocking تلقائيًا.

متى لا تستخدم Streaming

  • Backend-to-backend: لو Claude بيرد على service بيعمل validation أو parsing على الرد كامل (مثل تصنيف، تلخيص يتخزّن في DB، توليد embeddings)، Streaming بيعقّد الكود بدون فايدة عملية.
  • Structured outputs: لو محتاج JSON صالح، استنى الرد كامل عشان تعمل parse مرة واحدة. Streaming + JSON parsing تركيبة وجع دماغ مش مستحقة.
  • Batch jobs: 1000 طلب offline، استخدم Batch API بدل ما تفتح 1000 stream متوازي. الـ Batch API أرخص 50%.
  • ردود قصيرة جدًا (أقل من 100 توكن): الفرق في الإحساس مش هيتحس، والـ overhead مش مبرر.

الخطوة التالية

افتح أول endpoint عندك بيستخدم messages.create وحوّله لـ messages.stream. قس الـ time-to-first-token قبل وبعد بالكود اللي فوق، واتأكد إن الـ proxy والـ load balancer قدامه بيدعم idle connections لمدة 5 دقايق على الأقل. لو الاتصال بيتقطع في النص، المشكلة في الـ infrastructure مش في الكود.

المصادر

  • Anthropic Docs — Messages Streaming API
  • Anthropic — Streaming Best Practices
  • WHATWG — Server-Sent Events Specification
  • web.dev — Time to First Byte (TTFB)
  • anthropic-sdk-python — GitHub Repository

هل استفدت من المقال؟

اطّلع على المزيد من المقالات والدروس المجانية من نفس المسار المعرفي.

تصفّح المدونة