लॉग इनमुफ़्त ट्रायल शुरू करें
Meta Tech Provider

OpenAI Agents SDK एजेंट को WhatsApp पर चलाएँ

नंबर का वेबहुक डेस्टिनेशन अपने Python ऐप के किसी रूट पर सेट करें। हर आने वाले मैसेज पर Runner.run से एजेंट चलाएँ, सेशन की कुंजी भेजने वाले का नंबर रखें, फिर result.final_output को नंबर के टोकन और phone_number_id के साथ Cloud API से वापस भेजें। WhatsApp Business ऐप उसी नंबर पर चलता रहता है।

SQLiteSession

SDK का अपना सेशन, फ़ाइल या मेमोरी में, जो सेशन आईडी के तहत पिछली बातचीत याद रखता है।

params["auth"]

MCPServerStreamableHttp यहाँ सर्वर की पहचान के लिए httpx.Auth या Authorization हेडर लेता है।

v25.0

Meta के मौजूदा send message उदाहरणों में इस्तेमाल हुआ Graph API वर्शन।

WhatsApp का मैसेज एजेंट की एक रन कैसे बनता है?

आपके अपने ऐप के उस रूट से, जिसे Meta कॉल करता है। नंबर का वेबहुक डेस्टिनेशन उसी पर सेट करें और पाथ में एक लंबा, random सीक्रेट रखें। रूट Meta के पुष्टि वाले GET का जवाब hub.challenge को सादे टेक्स्ट में लौटाकर देता है, हर POST स्वीकार करता है, तुरंत 200 लौटाता है और काम को कतार में डाल देता है। वजह यह है कि Meta धीमे जवाब को दोबारा भेजता है और एजेंट दो बार चल जाएगा।

फिर एक वर्कर पेलोड से भेजने वाले का नंबर और टेक्स्ट पढ़ता है और Runner.run को कॉल करता है। ऐसा सेशन दें जिसकी आईडी भेजने वाले का नंबर हो: SDK बातचीत को उसी आईडी के तहत रखता है, इसलिए उसी ग्राहक का अगला मैसेज वहीं से आगे बढ़ता है जहाँ पिछला रुका था, और दो ग्राहकों का इतिहास कभी आपस में नहीं मिलता। शुरुआत के लिए SQLiteSession काफ़ी है; कई वर्कर हों तो SDK में Redis और SQLAlchemy सेशन भी मिलते हैं।

यहाँ URL में रखा सीक्रेट ही प्रमाणीकरण है। Meta डिलीवरी पर Tech Provider के ऐप सीक्रेट से हस्ताक्षर करता है, इसलिए सिग्नेचर हेडर की जाँच ग्राहक नहीं कर सकता।

Worker: run the agent for one message and send the answer
import os, httpx
from agents import Agent, Runner, SQLiteSession

agent = Agent(name="Front desk", instructions="Answer briefly and politely.")
URL = f"https://graph.facebook.com/v25.0/{os.environ['PHONE_NUMBER_ID']}/messages"

async def handle(sender: str, text: str) -> None:
    session = SQLiteSession(sender, "whatsapp.db")
    result = await Runner.run(agent, text, session=session)
    async with httpx.AsyncClient() as http:
        await http.post(
            URL,
            headers={"Authorization": f"Bearer {os.environ['WA_TOKEN']}"},
            json={"messaging_product": "whatsapp", "to": sender,
                  "type": "text", "text": {"body": result.final_output}},
        )

जवाब एजेंट के बजाय आपका कोड क्यों भेजे?

क्योंकि जो एक नियम कभी नहीं टूटना चाहिए वह समय का नियम है, और उसे प्रॉम्प्ट से बेहतर कोड लागू करता है। ग्राहक के लिखते ही Meta 24 घंटे की कस्टमर सर्विस विंडो खोल देता है। उसके अंदर फ़्री टेक्स्ट जाता है। उसके बाहर सिर्फ़ मंज़ूर किया हुआ टेम्पलेट जाता है, और फ़्री टेक्स्ट पर गड़बड़ी 131047 लौटती है।

जो वर्कर अभी आए मैसेज का जवाब देता है वह हमेशा विंडो के अंदर होता है, इसलिए result.final_output को टेक्स्ट में भेजना अपने आप सुरक्षित है। बाद में होने वाले काम, जैसे अगली सुबह का फ़ॉलो-अप या रिमाइंडर, अलग रास्ते से जाने चाहिए जो टेम्पलेट भेजे, फ़्री टेक्स्ट कभी नहीं।

एजेंट के पास टूल फिर भी हो सकते हैं। चीज़ें खोजने के लिए उसे फ़ंक्शन टूल दें, जैसे ऑर्डर या बुकिंग देखना, और WhatsApp पर भेजना वर्कर में रखें। इससे एक्सेस टोकन भी उस हर चीज़ से दूर रहता है जिसे मॉडल मनमाने आर्ग्युमेंट के साथ कॉल कर सकता है।

क्या एजेंट EasyCoexistence MCP सर्वर इस्तेमाल कर सकता है?

कर सकता है, MCPServerStreamableHttp के ज़रिए, पर सेटअप एक हेडर से ज़्यादा है। SDK या तो Authorization हेडर लेता है या params["auth"] में httpx.Auth। EasyCoexistence MCP सर्वर ब्राउज़र में लॉग इन के बाद अपने OAuth टोकन जारी करता है, डायनैमिक क्लाइंट रजिस्ट्रेशन और PKCE के साथ, इसलिए कोई स्थिर कुंजी होती ही नहीं। MCP Python SDK में OAuthClientProvider आता है, जो PKCE और टोकन रिफ़्रेश के साथ वही प्रक्रिया चलाने वाला HTTP auth हैंडलर है, और params["auth"] में वही जाता है।

यह तब काम का है जब एजेंट खुद तय करे: किसी नंबर की हेल्थ जाँचना, टेम्पलेट का स्टेटस पढ़ना, या टूल के विवरण के नियमों से send_message और send_template में चुनना। जो एजेंट सिर्फ़ जवाब देता है, उसके लिए ऊपर वाला वर्कर छोटा है और उसमें बिगड़ने की जगह कम है।

दोनों हालात में वेबहुक रहता है। MCP में अनुरोध और जवाब का तरीका है, और ग्राहक का मैसेज एजेंट तक सिर्फ़ उसी रूट से पहुँच सकता है जिसे Meta कॉल करता है।

आम गड़बड़ियाँ

  • Meta को 200 लौटाने से पहले एजेंट चलाना। धीमे जवाब को दोबारा भेजा जाता है और ग्राहक को दो जवाब मिलते हैं।
  • सभी ग्राहकों के लिए एक ही सेशन रखना। कुंजी भेजने वाले का नंबर रखें, वरना इतिहास आपस में मिल जाते हैं।
  • देर से होने वाले फ़ॉलो-अप को फ़्री टेक्स्ट भेजने देना। 24 घंटे बाद वह गड़बड़ी 131047 के साथ विफल होता है; टेम्पलेट भेजें।
EasyCoexistence के साथ ऐसा करना

easycoexistence.com पर नंबर कनेक्ट करें, वेबहुक डेस्टिनेशन अपने रूट पर सेट करें, और टोकन व phone_number_id डैशबोर्ड से पढ़ें। US$ 9 प्रति नंबर प्रति माह से शुरू, नंबर बढ़ने पर US$ 1 तक, और पहले 3 दिन मुफ़्त।

अक्सर पूछे जाने वाले सवाल

क्या इसके लिए OpenAI Responses API का hosted MCP टूल चाहिए?

नहीं। वर्कर एजेंट को Runner.run से अपने यहाँ चलाता है, और WhatsApp वाला हिस्सा आपके कोड का किया हुआ सादा HTTPS कॉल है।

मुझे कौन सा Graph API वर्शन इस्तेमाल करना चाहिए?

Meta के मौजूदा उदाहरण v25.0 इस्तेमाल करते हैं। वर्शन को अपने कोड में एक ही जगह रखें, ताकि अपग्रेड एक लाइन का बदलाव रहे।

क्या कोई व्यक्ति फ़ोन से बातचीत संभाल सकता है?

हाँ। Coexistence में WhatsApp Business ऐप चलता रहता है, और फ़ोन से दिया गया जवाब आपके रूट पर ईको इवेंट बनकर आता है, जिससे वर्कर एजेंट को रोक सकता है।

क्या EasyCoexistence बातचीत को स्टोर करता है?

नहीं। Meta सीधे आपके रूट पर डिलीवर करता है। सेशन जो कुछ रखता है वह आपके अपने डेटाबेस में रहता है।

पढ़ना जारी रखें

शुरू करने के लिए तैयार हैं?

WhatsApp Coexistence को महीनों में नहीं, मिनटों में कॉन्फ़िगर करें। ऐप्लिकेशन मोबाइल पर काम करता रहता है।

मुफ़्त ट्रायल शुरू करें

इस तारीख को सत्यापित

WhatsApp पर OpenAI Agents SDK, Cloud API