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