المستوى المطلوب: متوسط — يفترض إن عندك خبرة بـ Python، استدعاء HTTP APIs، وفهم أساسي للـ async I/O. لو لسه ما جربتش anthropic SDK قبل كده، ابدأ بمقال "Tool Use في Claude للمبتدئ" قبل ما تكمّل هنا.
لو شات بوت بيردّ على المستخدم بعد 4.2 ثانية صمت، 38% من المستخدمين بيقفلوا الصفحة قبل ما الرد يخلص. Streaming بيحوّل نفس الرد لتجربة بتبدأ بعد 281 مللي ثانية، والمستخدم بيشوف الكلام بيتكتب أمامه token ورا token. التغيير في الكود؟ 12 سطر. التكلفة الإضافية على فاتورة الـ API؟ صفر بالظبط.
المشكلة باختصار
Claude Sonnet 4.6 بيولّد حوالي 65 token/ثانية في المتوسط. لو الرد المتوقع 800 token، الموديل محتاج تقريبًا 12 ثانية يخلص الرد كامل. لو إنت بتستنى الرد كله الأول وبعدين بتعرضه، المستخدم بيشوف شاشة بيضا 12 ثانية. ده حد فوق الحد النفسي المعروف للصبر في الواجهات (10 ثواني، حسب Nielsen Norman Group)، فبيقفل الصفحة.
Streaming مش بيخلّي الموديل يولّد أسرع. هو بيخلّيك تعرض كل token تقريبًا فور توليده، فالمستخدم بيشوف حركة بدل صمت، وبيتأكد إن النظام شغّال.
المثال البسيط: مطعمين بنفس الطباخ
تخيل مطعمين بنفس المطبخ ونفس السرعة. الأول بيستنّى لحد ما الـ 5 أصناف يخلصوا، يحطهم على ترولي، ييجي يحطهم قدامك مرة واحدة بعد 25 دقيقة صمت كامل. التاني بيجيبلك الشوربة بعد 4 دقايق، السلطة بعد 7، الطبق الرئيسي بعد 15، التحلية بعد 22. الزمن الكلي واحد، بس في الحالة التانية إنت بتاكل من بعد 4 دقايق وبتحس إن المطبخ شغّال. ده بالظبط الفرق بين response عادي و Streaming response.
Streaming في Claude API: التعريف العلمي ومتى يستحق
Streaming هو نمط بث البيانات اللي بيخلّي السيرفر يبعت أجزاء من الرد للعميل وقت ما تتولّد، بدل ما يستنى الرد كله يجهز ثم يبعته دفعة واحدة. في حالة LLMs، النموذج بيولّد token ورا token من خلال autoregressive decoding، فبدل ما تستنى الـ 800 token كلهم يخلصوا، Anthropic API بيستخدم بروتوكول Server-Sent Events (SSE) يبعت كل token تقريبًا فور توليده داخل event بصيغة text/event-stream.
SSE نفسه ليس اختراع Anthropic. هو جزء من معيار HTML Living Standard من WHATWG، وموجود في المتصفحات من 2009. الفكرة الأساسية: connection HTTP واحدة بتفضل مفتوحة، السيرفر بيكتب فيها سطور بصيغة data: ...\n\n، والعميل بيقرا كل سطر فور وصوله بدون ما يقفل الـ connection.
الافتراض في الشرح ده: إنت بتستخدم anthropic SDK 0.45+ على Python 3.11+، وبتعرض الرد لمستخدم نهائي (chat، assistant، أو copilot). لو بتستخدم الرد داخليًا في batch processing مفيش مستخدم بيستنى، Streaming مش هيفيدك (راجع قسم "متى لا تستخدم").
الكود التنفيذي: 12 سطر يفرقوا
بدل ما تستدعي client.messages.create() اللي بيرجّع الرد كامل، بتستخدم client.messages.stream() داخل context manager، وبتقرا الـ tokens كـ iterator. الـ SDK بيتولى parsing الـ SSE وراك بالكامل.