تشغيل وكيل OpenAI Agents SDK على WhatsApp
اضبط وجهة خطاف الويب (webhook) للرقم على مسار في تطبيق Python لديك. لكل رسالة واردة، شغّل الوكيل بـ Runner.run مع جلسة مفتاحها رقم المرسل، ثم أرسل result.final_output عبر Cloud API باستخدام رمز الوصول (token) الخاص بالرقم ومعرّف الرقم (phone number id). يظل تطبيق WhatsApp Business يعمل على الرقم نفسه.
الجلسة المدمجة في SDK، على ملف أو في الذاكرة، تتذكر الأدوار السابقة تحت معرّف جلسة.
يقبل MCPServerStreamableHttp هنا httpx.Auth أو ترويسة Authorization لمصادقة الخادم.
إصدار Graph API المستخدم في أمثلة إرسال الرسائل الحالية لدى Meta.
كيف تتحول رسالة WhatsApp إلى تشغيل للوكيل؟
عبر مسار في تطبيقك أنت تستدعيه Meta. اضبط وجهة webhook للرقم عليه، مع سر عشوائي طويل في المسار. يرد المسار على طلب GET للتحقق من Meta بإرجاع hub.challenge نصًا عاديًا، ويقبل كل طلب POST، ويرد بـ 200 فورًا ويضع العمل في قائمة انتظار، لأن Meta تعيد المحاولة عند بطء الاستجابة فتشغّل الوكيل مرتين.
بعد ذلك يقرأ عامل المعالجة المرسل والنص من الحمولة ويستدعي Runner.run. مرّر جلسة معرّفها رقم المرسل: يخزّن SDK المحادثة تحت ذلك المعرّف، فتكمل الرسالة التالية من العميل نفسه من حيث توقفت السابقة، ولا يتشارك عميلان السجل نفسه. يكفي SQLiteSession للبدء، ويوفر SDK أيضًا جلسات Redis وSQLAlchemy عند تعدد العمال.
السر في عنوان URL هو المصادقة هنا. توقّع Meta الرسائل بالسر الخاص بتطبيق Tech Provider، لذلك لا يستطيع العميل التحقق من ترويسة التوقيع.
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 في عامل المعالجة. وهذا يُبقي token بعيدًا عن أي شيء يستطيع النموذج استدعاءه بوسائط عشوائية.
هل يستطيع الوكيل استخدام خادم MCP الخاص بـ EasyCoexistence؟
نعم، عبر MCPServerStreamableHttp، لكن الإعداد أطول من ترويسة. يقبل SDK إما ترويسة Authorization وإما httpx.Auth في params["auth"] لمصادقة الخادم. يصدر خادم MCP الخاص بـ EasyCoexistence رموز OAuth الخاصة به بعد تسجيل دخول في المتصفح، مع تسجيل ديناميكي للعميل وPKCE، لذلك لا يوجد مفتاح ثابت. يوفر MCP Python SDK الفئة OAuthClientProvider، وهي معالج مصادقة HTTP ينفذ هذا المسار مع PKCE وتجديد token، وهذا ما يوضع في params["auth"] ضمن الإعداد.
يستحق ذلك حين يُراد أن يقرر الوكيل بنفسه: يفحص صحة رقم، أو يقرأ حالة قالب، أو يختار بين send_message وsend_template وفق القواعد الواردة في أوصاف الأدوات. أما مكتب استقبال يكتفي بالرد، فعامل المعالجة أعلاه أقصر وأقل عرضة للأعطال.
وفي الحالتين يبقى webhook. MCP نمطه طلب واستجابة، ولا تصل رسالة العميل إلى الوكيل إلا عبر المسار الذي تستدعيه Meta.
الأخطاء الشائعة
- تشغيل الوكيل قبل إعادة 200 إلى Meta. تُعاد المحاولة عند بطء الاستجابة، فيصل إلى العميل جوابان.
- استخدام جلسة واحدة لكل العملاء. اجعل المفتاح رقم المرسل، وإلا اختلطت السجلات.
- ترك متابعة متأخرة ترسل نصًا حرًا. بعد 24 ساعة تفشل بالخطأ 131047، فأرسل قالبًا بدلًا منه.
اربط الرقم في easycoexistence.com، واضبط وجهة webhook على مسارك، واقرأ token ومعرّف الرقم (phone number id) من لوحة التحكم. من US$ 9 لكل رقم شهريًا، وتنخفض إلى US$ 1 مع إضافة أرقام جديدة، مع أول 3 أيام مجانًا.
الأسئلة الشائعة
هل يتطلب هذا أداة MCP المستضافة في OpenAI Responses API؟
لا. يشغّل عامل المعالجة الوكيل محليًا بـ Runner.run، وجانب WhatsApp مجرد استدعاء HTTPS عادي تجريه شيفرتك.
أي إصدار من Graph API أستخدم؟
تعتمد أمثلة Meta الحالية على v25.0 في الإرسال. ثبّت الإصدار في موضع واحد من شيفرتك لتصبح الترقية تعديلًا في سطر واحد.
هل يستطيع شخص أن يتولى الرد من الهاتف؟
نعم. تُبقي Coexistence تطبيق WhatsApp Business يعمل، ويصل رد الهاتف إلى مسارك على هيئة حدث echo يستطيع عامل المعالجة استخدامه لإيقاف الوكيل مؤقتًا.
هل يخزّن EasyCoexistence المحادثة؟
لا. تسلّم Meta الرسائل إلى مسارك مباشرة، وما تخزنه الجلسة يبقى في قاعدة بياناتك أنت.
تابع القراءة
هل أنت مستعد للبدء؟
أعد إعداد WhatsApp Coexistence خلال دقائق، وليس أشهر. يواصل التطبيق العمل على الهاتف.
ابدأ الفترة التجريبية المجانيةتم التحقق في