تخطَّ إلى المحتوى
دليل

بناء موظف استقبال بالذكاء الاصطناعي على Twilio في Node.js مع Wixzel Voice

في النهاية، يجيب على المكالمات إلى رقم Twilio الحالي لديك موظف استقبال بالذكاء الاصطناعي بنيته بنفسك: يرحّب بالمتصل، ويجيب انطلاقًا من تعليماتك، ويحجز مواعيد يمكنك قراءتها لاحقًا عبر الـ API. يستغرق ذلك نحو 30 دقيقة في Node.js، باستخدام حزمة wixzel-voice SDK للغتي TypeScript وJavaScript وElastic SIP trunk من Twilio. وقت المحرك على محرك classic هو $0.0867 لكل دقيقة اتصال، أي نحو $0.26 لمكالمة مدتها ثلاث دقائق، يُحتسب بالثانية من رصيد مسبق الدفع. تحاسبك Twilio على دقائق الـ trunk مباشرةً، دون أي هامش إضافي.

بقلم · نُشر في · حُدّث في

المدة
نحو 30 دقيقة
المحرك
classic
وقت المحرك
$0.0867 لكل دقيقة متصلة

ما الذي تحتاجه قبل أن تبدأ؟

  • حساب Twilio مع Elastic SIP Trunking، ورقم هاتف من Twilio.
  • مفتاح API من Wixzel Voice (wv_live_…) ورصيد في الحساب. الحد الأدنى لشحن الرصيد هو $5.
  • Node.js 20 أو أحدث.

كيف تبني هذا على Wixzel Voice، خطوة بخطوة؟

  1. 01أنشئ Elastic SIP trunk في Twilio

    في لوحة تحكم Twilio، افتح Elastic SIP Trunking وأنشئ trunk. ضمن Termination، اختر Termination SIP URI، مثل your-clinic.pstn.twilio.com. اسم المضيف هذا هو قيمة host للـ trunk الذي تربطه في الخطوة التالية.

    أبقِ لوحة تحكم Twilio مفتوحة. ستعود إليها بعد أن تعطيك الـ API العنوانين اللذين يجب إدخالهما.

  2. 02ثبّت الـ SDK واربط الـ trunk

    ثبّت الـ SDK وضع مفتاح API في متغيرات البيئة:

    shell
    npm install wixzel-voice
    export WIXZEL_API_KEY="wv_live_..."
    trunk.mjs
    import { WixzelVoice } from 'wixzel-voice';
    
    const client = new WixzelVoice({ apiKey: process.env.WIXZEL_API_KEY });
    
    const trunk = await client.sipTrunks.create({
      name: 'Twilio',
      host: 'your-clinic.pstn.twilio.com', // your Termination SIP URI
      port: 5060,
      transport: 'udp',
    });
    
    console.log('TRUNK_ID', trunk.id);
    console.log('Allowlist at Twilio:', trunk.platform_ip);
    console.log('Origination URI:', trunk.origination_uri);

    لا يوجد اسم مستخدم أو كلمة مرور هنا لأن Twilio تصادق حسب عنوان IP المصدر، وهذه هي الخطوة التالية. لاستخدام Credential List من Twilio بدلًا من ذلك، مرّر username وpassword الخاصين بها. تُخزَّن كلمة المرور مشفّرة ولا تعيدها الـ API مرة أخرى أبدًا.

  3. 03وجّه Twilio إلى Wixzel Voice، في الاتجاهين

    تضبط Twilio المكالمات الصادرة والواردة كلًّا على حدة، وكل منهما يفشل بصمت إذا كان مفقودًا.

    ضمن Termination ثم Authentication، أضف platform_ip المطبوع أعلاه إلى IP Access Control List. بدونه ترفض Twilio المكالمات خلال نحو ثانية بسبب الإنهاء (hangup cause) رقم 21.

    ضمن Origination، أضف Origination SIP URI مضبوطًا على origination_uri المطبوع أعلاه. بدونه لا يصل رقمك إلى الوكيل أبدًا ولا يظهر شيء في أي من السجلين، لأن المكالمة لا تغادر Twilio أصلًا.

    أخيرًا، اربط رقم Twilio بهذا الـ trunk ضمن Numbers.

  4. 04أنشئ موظف الاستقبال

    الوكيل هو تعليمات وجملة افتتاحية ومحرك صوت. يتيح appointment_booking_enabled له عرض المواعيد وحجزها وإلغاءها أثناء المكالمة؛ وتخبره التعليمات بالأيام والساعات ومدد المواعيد التي يمكنه عرضها.

    agent.mjs
    import { WixzelVoice } from 'wixzel-voice';
    
    const client = new WixzelVoice({ apiKey: process.env.WIXZEL_API_KEY });
    
    const agent = await client.agents.create({
      name: 'Reception',
      system_prompt: [
        'You are the receptionist for Riverside Dental, answering the phone.',
        'Keep every reply to one or two short sentences, and never read out lists.',
        'You can book, move and cancel check-ups and cleanings.',
        'Offer appointments Monday to Friday, 09:00 to 17:00, 30 minutes each.',
        'Before booking, ask for the full name of the caller and repeat the day and time back.',
        'For a dental emergency, tell the caller to hang up and ring the emergency number.',
        'If you cannot help, take a message and promise a callback.',
      ].join('\n'),
      opening_message: 'Riverside Dental, this is the automated assistant. How can I help?',
      appointment_booking_enabled: true,
      voice: {
        stt: { model: 'deepgram/nova-3', language: 'en-US' },
        llm: { model: 'openrouter/gpt-4o-mini' },
        tts: { model: 'elevenlabs/eleven_flash_v2_5' },
      },
    });
    
    console.log('AGENT_ID', agent.id);

    هذا هو محرك classic: Deepgram Nova-3 وGPT-4o-mini وElevenLabs Flash v2.5، أرخص تركيبة موثوقة للغة الإنجليزية بسعر $0.0867 في الدقيقة. أضف voice إلى كتلة tts لاختيار المتحدث؛ ويعرض client.engines.voices('classic') الأصوات التي يمكنه استخدامها.

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

  5. 05وجّه رقمك إلى موظف الاستقبال

    سجّل الرقم على الـ trunk، مع تحديد الوكيل الذي يجيب عليه:

    number.mjs
    import { WixzelVoice } from 'wixzel-voice';
    
    const client = new WixzelVoice({ apiKey: process.env.WIXZEL_API_KEY });
    
    const number = await client.phoneNumbers.create({
      phone_number: '+14155550100', // your Twilio number, in E.164
      sip_trunk_id: process.env.TRUNK_ID,
      inbound_agent_id: process.env.AGENT_ID,
    });
    
    console.log('NUMBER_ID', number.id);

    بدون inbound_agent_id تُرفض المكالمات الواردة إلى الرقم. لكي يُجري الوكيل نفسه مكالمات أيضًا، للتذكيرات أو لمكالمة اختبار، اجعل الرقم رقم المتصل الخاص به عبر client.agents.update(agentId, { outbound_phone_number_id: number.id }).

  6. 06اتصل به، ثم اقرأ المكالمة والحجز

    اتصل برقم Twilio من هاتف محمول واحجز موعدًا. عندما تُنهي المكالمة، تكون المكالمة والموعد كلاهما في الـ API:

    results.mjs
    import { WixzelVoice } from 'wixzel-voice';
    
    const client = new WixzelVoice({ apiKey: process.env.WIXZEL_API_KEY });
    
    // Lists are newest first.
    const calls = await client.calls.list({ direction: 'inbound', limit: 1 });
    const latest = calls.data[0];
    if (latest) {
      const call = await client.calls.retrieve(latest.id);
      console.log(call.status, call.duration_seconds + 's', (call.cost_micros ?? 0) / 1e6, 'USD');
      for (const line of call.transcript) console.log(line.role + ': ' + line.content);
    }
    
    const appointments = await client.appointments.list({ limit: 5 });
    for (const a of appointments.data) {
      console.log(a.date_time, a.client_name, a.phone_number, a.status);
    }

    قيمة date_time دائمًا بتوقيت UTC. كل حجز يُطلق أيضًا الـ webhook appointmentBooked، وبه يمكنك نسخه إلى تقويمك الخاص لحظة حدوثه.

كم يكلّف هذا البناء على Wixzel Voice؟

وقت المحرك لمكالمات مدة كل منها 3 دقيقة على محرك classic بسعر $0.0867 لكل دقيقة متصلة: نحو $0.26 للمكالمة. الاتصالات الهاتفية عبر trunk الخاص بك بسعر مزوّد الاتصالات، وهي غير مشمولة.

تكلفة المحرك الشهرية لما يبنيه هذا الدليل
المكالمات شهريًاالدقائق المتصلةتكلفة المحرك شهريًا
200600$52.02
1,0003,000$260
3,0009,000$780

يحاسب Wixzel Voice على وقت المحرك فقط، بالثانية من المكالمة، من رصيد مسبق الدفع. تحاسب Twilio حسابك لديها على دقائق Elastic SIP Trunking بأسعارك لديها؛ ولا يرى Wixzel Voice هذه الرسوم ولا يضيف عليها أي هامش.

مسبق الدفع، دون اشتراك ودون خطة مجانية: أضِف رصيدًا بدءًا من $5 ويُستهلك مع الاستخدام. قدّر تكلفة استخدامك.

ما حدود Wixzel Voice التي تنطبق على هذا البناء؟

  • يعرف موظف الاستقبال ساعات عملك من تعليماته. لا تحتوي الإصدارة v1 من الـ API على نقطة نهاية للتوفّر، فلا يرى تقويمك الحقيقي: يُرفض أي وقت محجوز مسبقًا عبر الـ API، لكن المواعيد التي تحتفظ بها في مكان آخر غير مرئية له.
  • تُقرأ الحجوزات بالمنطقة الزمنية للحساب، وهي UTC ما لم تُغيَّر، ولا تستطيع الإصدارة v1 من الـ API تغييرها بعد. تحقق من date_time في حجوزاتك الأولى قبل الاعتماد عليها، وراسل aqeel@wixzel.com إذا كان نشاطك التجاري لا يعمل بتوقيت UTC.
  • يمكن أن تكون خمس مكالمات نشطة في وقت واحد لكل حساب افتراضيًا. تُرفض المكالمات الإضافية حتى تنتهي إحداها، ويُرفع الحد عند الطلب.
  • يبقى رقمك لدى Twilio. لا يبيع Wixzel Voice الأرقام ولا ينقلها ولا يحتفظ بها.
  • تُطرح التغييرات في سلوك Wixzel Voice خلف ترويسة Wixzel-Version مؤرّخة.

الأسئلة الشائعة

هل يمكنني بناء موظف استقبال بالذكاء الاصطناعي على Twilio؟

نعم. اربط Elastic SIP trunk من Twilio بـ Wixzel Voice، وأضف عنوان IP المنصة إلى قائمة السماح ضمن Termination، واضبط Origination SIP URI، وسجّل رقم Twilio مع inbound_agent_id. بعدها يجيب وكيلك على المكالمات إلى الرقم، وتواصل Twilio محاسبتك على الـ trunk مباشرةً.

هل عليّ نقل رقمي من Twilio؟

لا. يبقى الرقم في حساب Twilio لديك، مرتبطًا بـ Elastic SIP trunk. لا يبيع Wixzel Voice الأرقام ولا ينقلها ولا يحتفظ بها.

لماذا لا يصل رقم Twilio إلى الوكيل؟

عادةً يكون Origination SIP URI مفقودًا، أو لا يكون الرقم مرتبطًا بالـ trunk. يُضبط توصيل المكالمات الواردة بمعزل عن الصادرة، وبدونه لا تجد Twilio وجهة ترسل إليها المكالمة، فلا يظهر شيء في أي من السجلين. يجب أن يطابق الـ URI قيمة origination_uri للـ trunk، ويحتاج الرقم إلى inbound_agent_id.

كم تكلف مكالمة موظف استقبال بالذكاء الاصطناعي؟

على محرك classic، $0.0867 لكل دقيقة اتصال، أي نحو $0.26 لمكالمة مدتها ثلاث دقائق، تُحتسب بالثانية من رصيد مسبق الدفع. تحاسبك Twilio على دقائق الـ trunk بأسعارك لديها.

هل توجد SDK للغات غير JavaScript؟

توجد حزمتا SDK رسميتان: wixzel-voice على npm للغتي TypeScript وJavaScript، وwixzel_voice على pub.dev للغة Dart وFlutter. اللغات الأخرى تستدعي واجهة HTTP API نفسها مباشرةً، الموصوفة في مستند OpenAPI على https://docs.voice.wixzel.com/api-reference.

للمزيد من القراءة

  • SIP trunksالتوثيق

    قسم Twilio: IP ACL وTermination URI ورقم المتصل وOrigination URI.

  • الوكلاءالتوثيق

    التعليمات والجمل الافتتاحية ومصدر قيمة كل حقل ومكالمات الاختبار.

  • Webhooksالتوثيق

    appointmentBooked وcallCompleted والتواقيع وإعادة المحاولة.

  • حزم SDKالتوثيق

    حزمتا TypeScript وDart SDK.

واجهات API للاتصالات الهاتفية القائمة على الوكلاء

عن Wixzel Voice

Wixzel Voice هو API للذكاء الاصطناعي الصوتي لبناء وكلاء ذكاء اصطناعي يجرون مكالمات هاتفية حقيقية ويردّون عليها عبر SIP trunk الخاص بك، أو يتحدثون إلى الناس في تطبيقات الويب والجوال الخاصة بك. مفتاح API واحد ورصيد مدفوع مسبقًا واحد يغطيان كل محركات الصوت، مع فوترة بالثانية حسب الاستخدام الفعلي.

أعطِ Claude خط هاتف حقيقيًا عبر خادم MCP من Wixzel Voice

Claude، في Claude Code أو claude.ai، يجري مكالمة حقيقية عبر SIP trunk الخاص بك ويقرأ لك النص المكتوب، مع طلب تأكيد قبل أي اتصال.

وكيل هاتفي بالهندية والمالايالامية على محرك sarvam من Wixzel Voice

وكيلان هاتفيان، أحدهما يتحدث الهندية والآخر المالايالامية، على نماذج Sarvam المخصصة للغات الهند، يجيبان على المكالمات أو يجريانها عبر SIP trunk الخاص بك.

أضف وكيلًا صوتيًا إلى Flutter عبر WebSocket مع Wixzel Voice

تطبيق Flutter يتحدث فيه المستخدمون إلى وكيلك الصوتي عبر WebSocket، مع بقاء مفتاح API على خادمك ودون أي رقم هاتف.

Gemini Live في مكالمة هاتفية حقيقية عبر Wixzel Voice API

وكيل Gemini Live يتصل بهاتف حقيقي عبر SIP trunk الخاص بك من أربعة طلبات cURL، وسجل المكالمة مع النص المكتوب والتكلفة.

تشغيل حملة لتأهيل العملاء المحتملين بالذكاء الاصطناعي مع Wixzel Voice

قائمة عملاء محتملين اتصل بهم وكيلك عبر SIP trunk الخاص بك، على دفعات بحجم حد التزامن لديك، مع قراءة حالة كل مكالمة ونصها المكتوب.

أضف شخصية تعريفية ناطقة بالذكاء الاصطناعي إلى موقعك مع Wixzel Voice

شخصية تعريفية ناطقة في زاوية موقعك يتصل بها الزوار من المتصفح، مقيّدة بنطاقاتك وحدودك اليومية، مع قائمة بكل متصل.

اعرض الشخصية التعريفية لوكيلك في تطبيق Flutter مع Wixzel Voice

شاشة Flutter فيها الشخصية التعريفية لوكيلك تحرّك فمها مع صوت الوكيل أثناء مكالمة آنية، مع بقاء مفتاح API على خادمك.