بناء موظف استقبال بالذكاء الاصطناعي على 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 مباشرةً، دون أي هامش إضافي.
بقلم Aqeel Shamsudheen · نُشر في · حُدّث في
- المدة
- نحو 30 دقيقة
- المحرك
- classic
- وقت المحرك
- $0.0867 لكل دقيقة متصلة
ما الذي تحتاجه قبل أن تبدأ؟
- حساب Twilio مع Elastic SIP Trunking، ورقم هاتف من Twilio.
- مفتاح API من Wixzel Voice (
wv_live_…) ورصيد في الحساب. الحد الأدنى لشحن الرصيد هو $5. - Node.js 20 أو أحدث.
كيف تبني هذا على Wixzel Voice، خطوة بخطوة؟
01أنشئ Elastic SIP trunk في Twilio
في لوحة تحكم Twilio، افتح Elastic SIP Trunking وأنشئ trunk. ضمن Termination، اختر Termination SIP URI، مثل
your-clinic.pstn.twilio.com. اسم المضيف هذا هو قيمةhostللـ trunk الذي تربطه في الخطوة التالية.أبقِ لوحة تحكم Twilio مفتوحة. ستعود إليها بعد أن تعطيك الـ API العنوانين اللذين يجب إدخالهما.
02ثبّت الـ SDK واربط الـ trunk
ثبّت الـ SDK وضع مفتاح API في متغيرات البيئة:
shellnpm install wixzel-voice export WIXZEL_API_KEY="wv_live_..."trunk.mjsimport { 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 مرة أخرى أبدًا.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.
04أنشئ موظف الاستقبال
الوكيل هو تعليمات وجملة افتتاحية ومحرك صوت. يتيح
appointment_booking_enabledله عرض المواعيد وحجزها وإلغاءها أثناء المكالمة؛ وتخبره التعليمات بالأيام والساعات ومدد المواعيد التي يمكنه عرضها.agent.mjsimport { 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')الأصوات التي يمكنه استخدامها.تقول الجملة الافتتاحية إن المتصل يتحدث إلى مساعد آلي. حيث يشترط القانون ذلك، أو يشترط الإخطار بتسجيل المكالمة، فالجملة الافتتاحية هي المكان المناسب له.
05وجّه رقمك إلى موظف الاستقبال
سجّل الرقم على الـ trunk، مع تحديد الوكيل الذي يجيب عليه:
number.mjsimport { 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 }).06اتصل به، ثم اقرأ المكالمة والحجز
اتصل برقم Twilio من هاتف محمول واحجز موعدًا. عندما تُنهي المكالمة، تكون المكالمة والموعد كلاهما في الـ API:
results.mjsimport { 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. كل حجز يُطلق أيضًا الـ webhookappointmentBooked، وبه يمكنك نسخه إلى تقويمك الخاص لحظة حدوثه.
كم يكلّف هذا البناء على Wixzel Voice؟
وقت المحرك لمكالمات مدة كل منها 3 دقيقة على محرك classic بسعر $0.0867 لكل دقيقة متصلة: نحو $0.26 للمكالمة. الاتصالات الهاتفية عبر trunk الخاص بك بسعر مزوّد الاتصالات، وهي غير مشمولة.
| المكالمات شهريًا | الدقائق المتصلة | تكلفة المحرك شهريًا |
|---|---|---|
| 200 | 600 | $52.02 |
| 1,000 | 3,000 | $260 |
| 3,000 | 9,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؟
inbound_agent_id. بعدها يجيب وكيلك على المكالمات إلى الرقم، وتواصل Twilio محاسبتك على الـ trunk مباشرةً.هل عليّ نقل رقمي من Twilio؟
لماذا لا يصل رقم Twilio إلى الوكيل؟
origination_uri للـ trunk، ويحتاج الرقم إلى inbound_agent_id.كم تكلف مكالمة موظف استقبال بالذكاء الاصطناعي؟
هل توجد SDK للغات غير JavaScript؟
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.
عن Wixzel Voice
Wixzel Voice هو API للذكاء الاصطناعي الصوتي لبناء وكلاء ذكاء اصطناعي يجرون مكالمات هاتفية حقيقية ويردّون عليها عبر SIP trunk الخاص بك، أو يتحدثون إلى الناس في تطبيقات الويب والجوال الخاصة بك. مفتاح API واحد ورصيد مدفوع مسبقًا واحد يغطيان كل محركات الصوت، مع فوترة بالثانية حسب الاستخدام الفعلي.
المزيد من الأدلة
Claude، في Claude Code أو claude.ai، يجري مكالمة حقيقية عبر SIP trunk الخاص بك ويقرأ لك النص المكتوب، مع طلب تأكيد قبل أي اتصال.
وكيلان هاتفيان، أحدهما يتحدث الهندية والآخر المالايالامية، على نماذج Sarvam المخصصة للغات الهند، يجيبان على المكالمات أو يجريانها عبر SIP trunk الخاص بك.
تطبيق Flutter يتحدث فيه المستخدمون إلى وكيلك الصوتي عبر WebSocket، مع بقاء مفتاح API على خادمك ودون أي رقم هاتف.
وكيل Gemini Live يتصل بهاتف حقيقي عبر SIP trunk الخاص بك من أربعة طلبات cURL، وسجل المكالمة مع النص المكتوب والتكلفة.
قائمة عملاء محتملين اتصل بهم وكيلك عبر SIP trunk الخاص بك، على دفعات بحجم حد التزامن لديك، مع قراءة حالة كل مكالمة ونصها المكتوب.
شخصية تعريفية ناطقة في زاوية موقعك يتصل بها الزوار من المتصفح، مقيّدة بنطاقاتك وحدودك اليومية، مع قائمة بكل متصل.
شاشة Flutter فيها الشخصية التعريفية لوكيلك تحرّك فمها مع صوت الوكيل أثناء مكالمة آنية، مع بقاء مفتاح API على خادمك.
ابنِ أول وكيل صوتي لك

