एजेंट रिस्पॉन्स स्ट्रीमिंग: मल्टी-स्टेप वर्कफ्लो के लिए रियल-टाइम आउटपुट
एजेंट रिस्पॉन्स स्ट्रीमिंग: मल्टी-स्टेप वर्कफ्लो के लिए रियल-टाइम आउटपुट
आपका एजेंट किसी सवाल को रिसर्च करने, तीन टूल्स कॉल करने और जवाब तैयार करने में 20 सेकंड लेता है। यूजर “Ask” पर क्लिक करता है और 20 सेकंड तक एक स्पिनर घूमते देखता है। उसे समझ नहीं आता कि काम हो रहा है या नहीं। वह पेज रिफ्रेश करने की सोचता है। मन में आता है कि शायद फिर से शुरू करना पड़े।
अब कल्पना करें: यूजर “Ask” दबाता है और 500 मिलीसेकंड के अंदर एजेंट के पहले शब्द स्क्रीन पर दिखने लगते हैं। वह देखता है कि एजेंट जानकारी खोज रहा है—”🔍 ऑर्डर डेटाबेस खोजा जा रहा है…”—और परिणाम रियल टाइम में आते हैं। जवाब लिखा जाता है, वाक्य दर वाक्य। वही 20 सेकंड। बिल्कुल अलग अनुभव।
यूजर-फेसिंग एजेंट्स के लिए स्ट्रीमिंग कोई अतिरिक्त सुविधा नहीं—यह एक UX अनिवार्यता है। एजेंट इंटरफेस में time-to-first-token सबसे अहम लेटेंसी मेट्रिक है। प्रगति देखने वाला यूजर धैर्य रखता है। कुछ न दिखे तो यूजर छोड़ देता है। वेब परफॉर्मेंस की तमाम स्टडीज बताती हैं कि महसूस की गई लेटेंसी असली लेटेंसी से ज़्यादा मायने रखती है, और स्ट्रीमिंग दोनों के बीच की खाई पाटने का सबसे शक्तिशाली ज़रिया है।
इस लेख में आप सीखेंगे कि मल्टी-स्टेप AI एजेंट्स के लिए रियल-टाइम स्ट्रीमिंग कैसे लागू करें—बेसिक टोकन-दर-टोकन डिलीवरी से लेकर टूल कॉल ट्रांसपेरेंसी, स्टेटस अपडेट, प्रोग्रेसिव डिस्क्लोज़र, एरर रिकवरी और ट्रांसपोर्ट लेयर चॉइस तक।
सेक्शन 1: Claude स्ट्रीमिंग API की मूल बातें
एजेंट स्ट्रीम करने से पहले आपको एक सिंगल Claude रिस्पॉन्स स्ट्रीम करना आना चाहिए। आइए बुनियादी बातों से शुरू करें।
स्ट्रीम बनाम नॉन-स्ट्रीम
नॉन-स्ट्रीमिंग API कॉल तब तक ब्लॉक रहती है जब तक पूरा रिस्पॉन्स तैयार न हो जाए, फिर सब एक साथ लौटाती है। स्ट्रीमिंग कॉल रिस्पॉन्स बनते समय इवेंट्स की एक सीक्वेंस लौटाती है, पहले टोकन से शुरू होकर।
कोड में फर्क मामूली है। यूजर एक्सपीरियंस में फर्क ज़बरदस्त है।
इवेंट टाइप्स
Claude स्ट्रीमिंग API server-sent events की एक व्यवस्थित सीक्वेंस भेजती है:
message_start— मेटाडेटा (मॉडल, रोल, यूसेज) के साथ शुरुआतीMessageऑब्जेक्ट।content_block_start— किसी कंटेंट ब्लॉक (text या tool_use) की शुरुआत का संकेत।content_block_delta— इंक्रीमेंटल कंटेंट: टेक्स्ट के टुकड़े या आंशिक टूल इनपुट JSON।content_block_stop— कंटेंट ब्लॉक के समाप्त होने का संकेत।message_delta— मैसेज पर अंतिम अपडेट (स्टॉप रीज़न, फाइनल यूसेज)।message_stop— स्ट्रीम पूरी हो गई।
टेक्स्ट रिस्पॉन्स के लिए आपको कई content_block_delta इवेंट्स मिलेंगे, जिनमें से हर एक में टेक्स्ट का एक छोटा हिस्सा होगा (अक्सर कुछ टोकन)।
बेसिक स्ट्रीमिंग इम्प्लीमेंटेशन
यहाँ Anthropic Python SDK का उपयोग करते हुए एक synchronous स्ट्रीमिंग उदाहरण है:
import anthropic
client = anthropic.Anthropic()
def stream_basic_response(user_message: str): """Stream a basic Claude response token by token.""" with client.messages.stream( model="claude-sonnet-4-20250514", max_tokens=1024, messages=[{"role": "user", "content": user_message}], ) as stream: for text in stream.text_stream: print(text, end="", flush=True) print() # Newline after stream completes
stream_basic_response("Explain quantum entanglement in simple terms.")और async वर्शन, जिसे आप प्रोडक्शन वेब सर्वर में इस्तेमाल करेंगे:
import anthropicimport asyncio
async_client = anthropic.AsyncAnthropic()
async def stream_basic_response_async(user_message: str): """Async streaming with the Anthropic SDK.""" async with async_client.messages.stream( model="claude-sonnet-4-20250514", max_tokens=1024, messages=[{"role": "user", "content": user_message}], ) as stream: async for text in stream.text_stream: print(text, end="", flush=True) print()
asyncio.run(stream_basic_response_async("Explain quantum entanglement in simple terms."))आंशिक टोकन और UTF-8 बाउंड्री को संभालना
SDK आपके लिए UTF-8 डिकोडिंग संभालता है, लेकिन अगर आप raw HTTP स्ट्रीम के साथ काम कर रहे हैं, तो ध्यान रखें कि मल्टी-बाइट कैरेक्टर चंक्स के बीच बट सकते हैं। हमेशा raw bytes को बफर करें और तभी डिकोड करें जब आपके पास पूरी UTF-8 सीक्वेंस हो। anthropic SDK का text_stream इटरेटर यह स्वचालित रूप से संभालता है—यह एक और कारण है कि इसे raw SSE स्ट्रीम को खुद पार्स करने की बजाय इस्तेमाल करें।
सेक्शन 2: स्ट्रीमिंग टूल कॉल्स
बेसिक टेक्स्ट स्ट्रीमिंग तो बस शुरुआत है। असली चुनौती—और असली मूल्य—तब आता है जब आपका एजेंट टूल्स इस्तेमाल करता है। एक मल्टी-स्टेप एजेंट जो क्रम से तीन टूल्स कॉल करता है, टूल एग्जीक्यूशन के दौरान निष्क्रिय लग सकता है—जब तक आप दिखाएं कि क्या हो रहा है।
स्ट्रीम में टूल कॉल्स कैसे दिखते हैं
जब Claude किसी टूल का उपयोग करने का फैसला करता है, तो स्ट्रीम type: "tool_use" के साथ एक content_block_start इवेंट भेजती है, उसके बाद content_block_delta इवेंट्स में टूल के इनपुट JSON के टुकड़े आते हैं। पूरा टूल कॉल असेंबल होने पर आप टूल एग्जीक्यूट करते हैं, परिणाम इंजेक्ट करते हैं, और बातचीत जारी रखते हैं।
मुख्य बात: content_block_start आते ही आपको टूल का नाम पता चल जाता है, इनपुट JSON पूरा होने से पहले ही। इसका मतलब है कि आप तुरंत यूजर को कुछ दिखा सकते
संबंधित लेख
- टूल उपयोग पैटर्न: विश्वसनीय एजेंट-टूल इंटरफेस बनाना
- मल्टी-एजेंट पैटर्न: ऑर्केस्ट्रेटर, Workers और पाइपलाइन
- एजेंट एरर रिकवरी: प्रोडक्शन विश्वसनीयता के लिए 5 पैटर्न
- वेब ऑटोमेशन एजेंट: Claude और Computer Use से ब्राउज़र नियंत्रण