انتقل إلى المحتوى
العودة إلى المقالات

~/writing / من واقع التجربة

  • ai-agents
  • hermes
  • livekit
  • twilio
  • mcp
  • open-source
  • voice-ai
  • python

بنيت وكيلاً هاتفياً مفتوح المصدر بالذكاء الاصطناعي باستخدام LiveKit وTwilio وHermes

Mustafa Ramx pixel avatarبقلم Mustafa Ramx5 سبتمبر 20267 دقائق للقراءة
صورة المقال بنيت وكيلاً هاتفياً مفتوح المصدر بالذكاء الاصطناعي باستخدام LiveKit وTwilio وHermes
محتويات المقال10 أقسام
  1. لم تكن المشكلة مجرد إجراء مكالمة هاتفية
  2. لماذا بنيته حول Hermes؟
  3. ما بنيته: Clauver
  4. ما الذي يكلف المال فعلياً؟
  5. ماذا يحدث عندما أطلب من Hermes إجراء مكالمة؟
  6. بعض الأمور كانت أصعب مما توقعت
  7. كانت السلامة مهمة منذ البداية
  8. ما الذي يستطيع Clauver فعله اليوم؟
  9. لماذا جعلته مفتوح المصدر؟
  10. أصبح هذا نمطاً في الطريقة التي أبني بها أدوات الذكاء الاصطناعي

لم أبدأ ببناء وكيل هاتفي بالذكاء الاصطناعي لأن تقنيات الصوت بدت مثيرة للاهتمام.

بدأت لأنني لم أستطع الكلام لما يقارب شهرين.

حدث ذلك بشكل مفاجئ. ذهبت إلى النوم بشكل طبيعي، ثم استيقظت بالكاد أستطيع استخدام صوتي.

وفجأة أصبح الاتصال بالعمل أو العائلة، وحتى حجز موعد مع الطبيب، أمراً صعباً. كنت أستطيع الكتابة واستخدام الذكاء الاصطناعي وكتابة الكود، لكن عندما تطلب منك شركة أن ترفع الهاتف وتتحدث فعلياً، لا يساعدك أي من ذلك.

قادني هذا إلى التفكير:

إذا كان وكيل الذكاء الاصطناعي يستطيع إرسال البريد الإلكتروني وتصفح الويب وتشغيل الأوامر واستخدام واجهات API، فلماذا لا يستطيع إجراء مكالمة هاتفية نيابةً عني؟

لذلك بدأت ببناء واحد.

كانت النتيجة Clauver، وهو وكيل هاتف مفتوح المصدر يربط Hermes Agent بشبكة الهاتف الحقيقية باستخدام LiveKit وSIP/Twilio.

وكان هدف التصميم بسيطاً: إعادة استخدام أكبر قدر ممكن من منظومة الذكاء الاصطناعي التي أملكها بالفعل.


لم تكن المشكلة مجرد إجراء مكالمة هاتفية

ليس من الصعب بشكل خاص أن تجعل برنامجاً يتصل برقم هاتف. فـTwilio يستطيع فعل ذلك منذ سنوات.

المشكلة الأصعب هي ما يحدث بعد أن يجيب شخص ما. أردت أن يعرّف Clauver بنفسه، ويوضح أنه يتصل نيابةً عني، وينقل رسالتي، ويستمع إلى الرد، ويواصل محادثة قصيرة، ويتعامل مع المواعيد غير المتاحة، ويكتشف البريد الصوتي، ثم يعيد النتيجة إليّ.

على سبيل المثال:

«اتصل بطبيب الأسنان واحجز لي موعداً غداً الساعة الثانية ظهراً. إذا لم يكن الموعد متاحاً، فاسأل عن أقرب موعد متاح.»

هذا مختلف تماماً عن تشغيل ملف صوتي مسجل مسبقاً. إنه يتطلب وكيلاً صوتياً حقيقياً.


لماذا بنيته حول Hermes؟

توجد بالفعل منصات جيدة لبناء وكلاء هاتف بالذكاء الاصطناعي، ويحتوي Hermes نفسه على مهارة اختيارية للاتصالات الهاتفية. وحتى وقت كتابة هذا المقال، يستطيع Hermes استخدام Twilio مباشرةً للاتصالات الأساسية، أو خدمات مثل Bland.ai وVapi للمكالمات الحوارية بالذكاء الاصطناعي.

هذا مريح، لكنني كنت أشغّل Hermes بالفعل مع مزود LLM وبيانات اعتماد وإعدادات TTS وSTT ومنطق للوكيل وأدوات ومهارات خاصة به. إضافة منصة صوتية أخرى كانت ستعني دفع تكلفة طبقة ثانية تكرر جزءاً كبيراً من المنظومة الموجودة لدي.

لذلك طرحت سؤال مهندس عنيد قليلاً:

لماذا أدفع لمنصة ذكاء اصطناعي أخرى بينما يمتلك Hermes معظم الذكاء الذي أحتاج إليه؟

من هذا السؤال جاءت معمارية Clauver.


ما بنيته: Clauver

Clauver هو جسر مفتوح المصدر بين Hermes Agent والمكالمات الهاتفية الحقيقية.

تبدو المعمارية الأساسية هكذا:

معمارية Clauver من Hermes Agent إلى LiveKit وSIP/Twilio ثم مكالمة هاتفية حقيقية

يقرأ Clauver داخل عامل الصوت إعدادات Hermes الحالية ويحوّلها إلى مكونات يستطيع LiveKit استخدامها. وهكذا يمكن للنموذج نفسه وبيانات الاعتماد وتفضيلات الصوت أن تستمر في تشغيل وكيل الهاتف من دون إعدادها مرة أخرى في منصة منفصلة.

تحويل النص إلى كلام

إذا كان لدى Hermes مزود TTS مدعوم، يستطيع Clauver استخدامه. كما بنيت محولاً حول Microsoft Edge TTS ليكون خياراً افتراضياً بلا تكلفة إضافية، لذلك لا تصبح واجهة صوت مدفوعة أخرى أمراً ضرورياً.

تحويل الكلام إلى نص

يستخدم المسار الافتراضي للتعرف على الكلام Whisper محلياً من خلال faster-whisper. تُعالج الأصوات على الجهاز الذي يشغّل Clauver، فلا تحتاج إلى واجهة API منفصلة لتحويل الكلام إلى نص. التكلفة أقل، لكنه يعتمد على CPU أكثر من خدمة بث سريعة مثل Deepgram.

وهذا نمط يتكرر في المشروع كله: ابدأ بالخيار المحلي أو الافتراضي الأرخص والعملي، لكن لا تجعل المعمارية مقيدة به.


ما الذي يكلف المال فعلياً؟

لا يجعل Clauver الاتصالات الهاتفية مجانية بطريقة سحرية. في إعدادي، تمثل Twilio عبر SIP التكلفة الخارجية الأساسية لربط الإنترنت بشبكة الهاتف.

يتولى LiveKit طبقة الاتصال في الوقت الفعلي. وبالنسبة إلى التطوير والاستخدام الشخصي الخفيف، قد يغطي رصيد البناة فيه قدراً مفيداً من الاستخدام، بينما تُحسب تكلفة الاتصال والدقائق لدى Twilio.

والفرق المهم أنني لا أحتاج إلى إضافة منصة أخرى للذكاء الاصطناعي الحواري لمجرد تنسيق LLM والتعرف على الكلام وتوليد الصوت. أنا أعيد استخدام البنية التحتية التي أملكها في الغالب.


ماذا يحدث عندما أطلب من Hermes إجراء مكالمة؟

أردت أن يبدو استخدام Clauver طبيعياً. ليس بهذه الطريقة:

python call.py --number ...

ولا عشرين خانة إعداد، ولا لوحة تحكم أخرى. فقط تحدث مع الوكيل.

على سبيل المثال:

«اتصل بشريكي وأخبره أنني سأتأخر عشرين دقيقة.»

يرى Hermes مهارة Clauver ويستدعي أداة MCP:

dispatch_clauver_call(
    phone_number,
    task,
    target_name?,
    boss?
)

بعد ذلك يتولى Clauver البنية التحتية. يبدأ العامل عند الحاجة، وينشئ LiveKit الجلسة، ويربط SIP المكالمة عبر Twilio، ثم يبدأ الوكيل المحادثة.

الشخص في الطرف الآخر لا يسمع رسالة مسجلة مسبقاً. يستطيع Clauver الاستماع والرد.

انتقلت جملة كتبتها إلى وكيل ذكاء اصطناعي عبر MCP وLLM وTTS وLiveKit وSIP وشبكة الهاتف العامة… ثم أجاب إنسان حقيقي.

أصبح البرنامج صوتي.

إليك نظرة سريعة على Clauver أثناء عمله:

هل تريد أن ترى ما يحدث خلف الكواليس؟

استكشف Clauver على GitHub

يحتوي المستودع على جسر MCP وعامل الصوت وملفات الإعداد. إذا كنت تبني باستخدام Hermes أو LiveKit أو MCP أو وكلاء الصوت، فجرّبه؛ وإذا وجدت مشكلة فافتح issue أو pull request. وستساعد النجمة أيضاً.


بعض الأمور كانت أصعب مما توقعت

تبدو المعمارية مرتبة في الرسم، لكن الواقع كان أقل لطفاً. 😅

1. مسارات الصوت حساسة جداً لزمن الاستجابة

تبدو ثانيتان من الصمت وقتاً طويلاً في المكالمة الهاتفية. يتراكم زمن استجابة LLM والتعرف على الكلام وتوليد TTS وزمن الشبكة. يقلل Whisper المحلي التكلفة الخارجية لكنه يزيد وقت CPU، بينما يتجنب Edge TTS مزوداً مدفوعاً آخر ويتطلب عناية أكبر في توليد الصوت وتحويله.

لا توجد إعدادات واحدة هي الأفضل للجميع؛ إنها مفاضلة بين زمن الاستجابة والتكلفة والجودة.

2. كل مزود LLM يتصرف بطريقة مختلفة قليلاً

يوفر بعض المزودين نقاط نهاية متوافقة مع OpenAI، بينما يحتاج AWS Bedrock وAnthropic إلى معالجة مختلفة. لذلك يحتاج الجسر إلى اكتشاف المزود وحل مفاتيح API ومنطق خاص بكل مزود وبدائل منطقية.

3. المكالمات الهاتفية ليست محادثات مرتبة

البشر يقاطعون، ويرد البريد الصوتي، ويضع موظفو الاستقبال المكالمة قيد الانتظار، وقد يُسأل الوكيل عن أمر لم يستعد له. وأحياناً يكون التصرف الصحيح هو التوقف بدلاً من اختراع إجابة.


كانت السلامة مهمة منذ البداية

يصبح الذكاء الاصطناعي الصوتي مزعجاً بسرعة إذا بدأ النظام يتظاهر بأنه إنسان. لم أرد أن يفعل Clauver ذلك.

تحتوي المهارة الحالية على قواعد مقصودة:

  • يعرّف Clauver نفسه على أنه مساعد ذكاء اصطناعي.
  • يتصل نيابةً عن المستخدم بدلاً من انتحال شخصيته.
  • يؤكد المستخدم قبل إجراء المكالمة.
  • لا يُسمح بالاتصال بأرقام الطوارئ.
  • يجب الحفاظ على المهمة الأصلية من دون تغيير معناها بطريقة إبداعية.

هذه القاعدة الأخيرة مهمة. إذا قلت:

«أخبرهم أنني لا أستطيع الحضور اليوم.»

فأنت لا تريد من الوكيل أن يقرر أن الصياغة الأكثر احترافية هي:

«لدى مصطفى حالة طبية طارئة وسيتواصل معكم غداً.»

في المكالمة الهاتفية المستقلة، سلامة الرسالة أهم من الإبداع.


ما الذي يستطيع Clauver فعله اليوم؟

تركز النسخة الحالية بشكل أساسي على المكالمات الصادرة. وتستطيع:

  • إجراء مكالمات حقيقية وإدارة محادثات قصيرة ثنائية الاتجاه.
  • نقل الرسائل وجمع الردود وحجز المواعيد مع البدائل.
  • اكتشاف البريد الصوتي وترك رسالة وتحويل المكالمة إلى إنسان عند الحاجة.
  • تسجيل نتائج المكالمات وتشغيل العامل تلقائياً عند الحاجة.
  • إعادة استخدام إعدادات Hermes الخاصة بـLLM وTTS وSTT.
  • العمل بمكونات صوتية مجانية أو محلية افتراضياً.

المكالمات الواردة، وإعادة نتائج أكثر تنظيماً إلى Hermes، والتسجيلات، والنصوص المفرغة، والملخصات، وأنماط الوكلاء المتخصصة كلها خطوات تالية طبيعية.

لكن الجزء المهم يعمل بالفعل:

أستطيع كتابة طلب إلى Hermes وجعل وكيل ذكاء اصطناعي يجري مكالمة هاتفية حقيقية نيابةً عني.

كانت تلك هي المشكلة الأصلية التي أردت حلها.


لماذا جعلته مفتوح المصدر؟

بدأ هذا المشروع لأنني لم أستطع استخدام صوتي مؤقتاً. كما جعلني أفكر في الأشخاص الذين يعانون من إعاقة صوتية دائمة أو قلق شديد من المكالمات أو يحتاجون إلى إجراء مكالمات عمل متكررة.

لا أعتقد أن كل مكالمة هاتفية يجب أن تكون آلية. وبالتأكيد لا أريد أن يكون المستقبل عبارة عن روبوتين يتصل أحدهما بالآخر بلا نهاية لمناقشة موعد طبيب الأسنان. 😂

لكن توجد حالات يكون فيها منح شخص طريقة أخرى للتواصل أمراً مفيداً فعلاً. لهذا جعلت Clauver مفتوح المصدر: يمكنك فحصه وتشغيله بنفسك وتعديله والبناء فوقه.

هل تريد تجربة Clauver؟

شاهد Clauver على GitHub

إذا وجدته مفيداً، فامنح المستودع نجمة. سيساعد ذلك المطورين الآخرين على اكتشاف المشروع.

وإذا كنت تعرف شخصاً يبني باستخدام Hermes أو LiveKit أو MCP أو وكلاء الصوت، فشارك المشروع معه.

نرحب أيضاً بتقارير الأخطاء والأفكار وطلبات الدمج.


أصبح هذا نمطاً في الطريقة التي أبني بها أدوات الذكاء الاصطناعي

لا يختلف Clauver كثيراً عن مشاريعي الأخرى. أميل إلى بناء الأشياء عندما أواجه بنفسي قيداً حقيقياً.

مع FinMCP، كان مساعدو الذكاء الاصطناعي يستطيعون تحليل الأسواق لكنهم لا يعرفون بيانات اليوم المالية بشكل موثوق. وفي تجربتي مع OpenClaw على VPS، أردت اختبار ما إذا كان وكلاء الذكاء الاصطناعي يحتاجون فعلاً إلى أجهزة باهظة، فشغلت النظام على VPS رخيصاً ووثقت نقاط الاختناق.

يتبع Clauver الفكرة نفسها. كنت بحاجة إلى وكيل يستطيع عبور الفجوة بين البرنامج والمكالمة الهاتفية العادية، لذلك بنيت الجسر المفقود.

هذا هو نوع البنية التحتية للذكاء الاصطناعي الذي أجده أكثر إثارة للاهتمام. ليس روبوت محادثة آخر.

بل ذكاء اصطناعي يستطيع التفاعل فعلياً مع الأنظمة التي نستخدمها بالفعل.

أدوات تجعل العمل أسهل

تطبيقات بسيطة للمهام الصغيرة التي تقوم بها كل يوم.

// شارك المقال

شارك على XLinkedIn