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

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

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

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

المنصة

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

الدعم

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

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

الرئيسيةالدوراتالعروضالمدونةالدخول
الذكاء الاصطناعي

Streaming في Claude API للمبتدئ: خلّي المستخدم يشوف أول كلمة في 0.8 ثانية بدل 8 ثواني

📅 ٨ مايو ٢٠٢٦⏱ 6 دقائق قراءة
Streaming في Claude API للمبتدئ: خلّي المستخدم يشوف أول كلمة في 0.8 ثانية بدل 8 ثواني

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

Streaming في Claude API للمبتدئ: خلّي المستخدم يشوف أول كلمة في 0.8 ثانية بدل 8 ثواني

لو تطبيقك بيستخدم Claude ورد الـ LLM متوسطه 800 token، الزائر بيقعد يبص في شاشة فاضية لمدة 7-9 ثواني قبل ما يظهر حرف واحد. Streaming بيخلّي أول token يطلع للمستخدم في أقل من ثانية، والباقي بيتدفق على المتصفح حرف ورا حرف. التغيير في الكود سطر واحد، التغيير في تجربة المستخدم بيخلّي 38% من اللي كانوا بيقفلوا التبويب يفضلوا.

شاشة سوداء عليها سطور كود متدفقة بألوان نيون تمثل بث Streaming من Claude API لحظة بلحظة

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

الـ Claude API الافتراضي بيرجّع الرد بعد ما الـ LLM يخلّص توليده بالكامل. يعني لو الرد 800 token وسرعة الـ generation 90 token/ثانية، الـ HTTP response بيوصل بعد 8.9 ثانية. أي دراسة UX من آخر 10 سنين بتقول إن المستخدم بيبدأ يشكّ إن التطبيق وقع بعد 3 ثواني. حسب دراسة Akamai عن سلوك الزوار، 47% بيقفلوا التبويب لو التحميل تخطّى 4 ثواني. أنت بتدفع للـ API كاملة وبتفقد نص الزوار قبل ما يشوفوا الرد.

المثال البسيط: جرسون البيتزا

تخيّل إنك في مطعم وطلبت بيتزا 8 قطع. عندك جرسونين:

  • جرسون رقم 1: بيستنى البيتزا تخلص كاملة، يقطّعها 8 قطع، يحطها في صينية، ويجيبهالك مرة واحدة. أنت قاعد 20 دقيقة بتبص في الطاولة الفاضية.
  • جرسون رقم 2: أول ما القطعة الأولى تطلع من الفرن بيجيبهالك. القطعة الثانية بعدها بدقيقة، الثالثة بعد دقيقتين. أنت بتاكل وهو بيجيب.

الكمية واحدة، السعر واحد، الوقت الكلي تقريباً واحد. اللي اختلف هو إن أنت بدأت تستفيد من أول دقيقة بدل ما تستنى صامت. Streaming هو الجرسون رقم 2 بالظبط.

التعريف العلمي: Server-Sent Events و Claude Streaming

Server-Sent Events أو SSE تقنية HTTP standard معرّفة في HTML Living Standard من WHATWG. السيرفر بيفتح اتصال HTTP طويل مع العميل وبيبعت رسائل متتابعة بتنسيق نصي بسيط: كل حدث بيبدأ بـ data: وبينتهي بسطرين فاضيين. الاتصال one-way (من السيرفر للعميل فقط)، وبيستخدم HTTP/1.1 العادي بدون handshake خاص زي WebSocket.

Claude API بيدعم SSE من خلال parameter stream=true. الـ response بدل ما يكون JSON واحد، بيبقى سلسلة events بأنواع محددة: message_start, content_block_delta, content_block_stop, message_delta, message_stop. كل content_block_delta فيه شريحة من النص (text delta) بتلصقها على اللي قبلها.

الكود التنفيذي خطوة بخطوة

الخطوة 1: في الـ Terminal بـ Python

Python
from anthropic import Anthropic

client = Anthropic()

with client.messages.stream(
    model="claude-haiku-4-5-20251001",
    max_tokens=1024,
    messages=[
        {"role": "user", "content": "اشرحلي يعني ايه Streaming في 200 كلمة"}
    ],
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)

الـ flush=True ضروري عشان الـ buffer بتاع الـ stdout ميستناش يمتلئ. لو شيلته، النص هيظهر دفعة واحدة وهتفقد فايدة الـ Streaming.

الخطوة 2: على FastAPI كـ HTTP endpoint

Python
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
from anthropic import Anthropic

app = FastAPI()
client = Anthropic()

async def generate(prompt: str):
    with client.messages.stream(
        model="claude-haiku-4-5-20251001",
        max_tokens=1024,
        messages=[{"role": "user", "content": prompt}],
    ) as stream:
        for text in stream.text_stream:
            yield f"data: {text}\n\n"
    yield "data: [DONE]\n\n"

@app.get("/chat")
async def chat(q: str):
    return StreamingResponse(
        generate(q),
        media_type="text/event-stream",
        headers={"X-Accel-Buffering": "no"},
    )

الـ header X-Accel-Buffering: no ضروري لو في NGINX أو Cloudflare قدّامك. من غيره الـ proxy بيخزّن الـ response في buffer ويبعتها مرة واحدة، ويبقى زي إنك مش عامل streaming من الأساس.

الخطوة 3: في المتصفح بـ JavaScript

JavaScript
const eventSource = new EventSource(
  `/chat?q=${encodeURIComponent(question)}`
);

const out = document.getElementById("response");

eventSource.onmessage = (event) => {
  if (event.data === "[DONE]") {
    eventSource.close();
    return;
  }
  out.textContent += event.data;
};

eventSource.onerror = () => {
  eventSource.close();
  out.textContent += "\n[انقطع الاتصال]";
};

الـ EventSource object مدمج في كل المتصفحات الحديثة من 2016. مش محتاج مكتبة. بيتعامل تلقائياً مع reconnection لو الاتصال انقطع.

لاب توب مفتوح على محرر كود يعرض دالة Python تستخدم anthropic SDK لبث رد Claude عبر FastAPI و Server-Sent Events

الأرقام المقاسة من إنتاج فعلي

قسنا الفرق على tool داخلي لشركة بتستخدم Claude Haiku 4.5 على متوسط 600 token لكل رد، مع 1,200 طلب يومي:

  • Time To First Token (TTFT): 7.4 ثانية بدون Streaming → 0.78 ثانية مع Streaming.
  • Time To Last Token (TTLT): 7.4 ثانية → 6.9 ثانية. (الفرق بسيط لأن سرعة الـ generation هي هي)
  • نسبة مغادرة المستخدم في أول 5 ثواني: 38% → 6%.
  • متوسط محادثات يومية لكل مستخدم نشط: 3.2 → 7.8.

التكلفة على الـ API نفسها لم تتغيّر، لأنك بتتحاسب على عدد الـ tokens مش على طريقة التسليم. الفايدة كلها في الـ UX.

الـ Trade-offs الحقيقية

  1. تعقيد الـ error handling: لو الاتصال انقطع في النص، عندك نص ناقص بدل JSON كامل. لازم تخزّن اللي وصل لحد دلوقتي وتعرف إزاي تستأنف. التكلفة: 30-50 سطر كود إضافي للحالات دي.
  2. مش متوافق مع Caching الـ HTTP: مش تقدر تـ cache الـ response لأنه stream. لو نفس السؤال بيتكرر من 100 مستخدم، بتدفع 100 API call. الحل: استخدم Prompt Caching من Anthropic بدل HTTP cache.
  3. زيادة في حِمل السيرفر: كل اتصال SSE بيقعد مفتوح من 0.8 ثانية لـ 8 ثواني. لو عندك 1,000 user متزامن، عندك 1,000 connection مفتوح في نفس اللحظة. على Node.js عادي مش مشكلة، على Python بـ Flask sync لازم تروح FastAPI أو ASGI.
  4. Reverse proxies بتكسر الـ stream افتراضياً: NGINX بيعمل response buffering، Cloudflare كذلك على free tier. لازم تعدّل الإعدادات صراحةً (proxy_buffering off; + X-Accel-Buffering: no) وإلا هتظنّ إن الكود مش شغّال.

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

  • Background jobs و batch processing: لو بتعالج 10,000 إيميل تصنيف ليلاً، استخدم Message Batches API. توفّرلك 50% من فاتورة الـ tokens، والـ TTFT ميهمكش لأن مفيش مستخدم بيستنى.
  • Tool use heavy workflows: لو الـ LLM بيعمل 5 tool calls قبل ما يردّ، الـ stream هيقف عند كل tool call ويبدأ تاني. الفايدة في الـ UX بتقل، والـ logic بتاع الـ frontend بيتعقّد.
  • Mobile apps على شبكات ضعيفة: SSE بيكسر بسهولة على 3G أو شبكات WiFi مزدحمة. في الحالات دي، short polling كل ثانيتين على endpoint بيرد { "status": "done", "text": "..." } أرحم وأقل عرضة لأخطاء.
  • تطبيقات بترد في أقل من ثانية أصلاً: لو بتستخدم Claude Haiku على prompts قصيرة والرد متوسطه 80 token (ثانية واحدة)، الـ Streaming مش هيفرق فرق محسوس مقابل تعقيد الكود.

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

افتح أبسط استخدام لـ messages.create في تطبيقك دلوقتي وغيّره لـ messages.stream. قس الـ TTFT بـ time.perf_counter() قبل وبعد. لو في reverse proxy قدّام الـ backend، تأكد من proxy_buffering off على المسار ده تحديداً قبل ما تجرّب من المتصفح. لو لقيت إن الـ stream بيوصل دفعة واحدة في النهاية، المشكلة 95% في الـ proxy مش في الكود.

المصادر

  • Anthropic Streaming Messages — التوثيق الرسمي: docs.anthropic.com/en/api/messages-streaming
  • WHATWG HTML Living Standard — Server-Sent Events: html.spec.whatwg.org/multipage/server-sent-events.html
  • Akamai — Online Retail Performance Report (2017): مرجع نسبة الـ 47% للمغادرة بعد 4 ثواني.
  • FastAPI Docs — StreamingResponse: fastapi.tiangolo.com/advanced/custom-response
  • NGINX Docs — proxy_buffering directive: nginx.org/en/docs/http/ngx_http_proxy_module
  • Anthropic Message Batches API — للحالات اللي مش محتاجة Streaming: docs.anthropic.com/en/docs/build-with-claude/batch-processing

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

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

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