مشاركة عبر


تكامل برامج الاتصال من جهات خارجية مع ذكاء المحادثة في Dynamics 365 (معاينة)

[هذا المقال عبارة عن وثائق نسخة مسبقة وهو عرضة للتغيير.]

من خلال هذا الدمج، بإمكان مستخدمي Dynamics 365 استخدام برامج الطلب التي توفرها شركات هاتفية خارجية مثل Twilio Flex، لإجراء وتلقي مكالمات هاتفية في Dynamics 365، والحصول على الرؤى التي يتم إنشاؤها بواسطة الذكاء الاصطناعي في الوقت الحقيقي بالإضافة إلى تحليل غني للمكالمات بعد المكالمة. اعرف المزيد حول ذكاء المحادثة في Dynamics 365

مهم

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

كيفية عمل التكامل

على مستوى عالٍ، تتكون عملية التكامل من ثلاثة أجزاء:

  1. تسجيل الموفر: تسجيل تفاصيل الموفر والحصول على قائمة المستخدمين الذين يجب تسجيلهم باستخدام واجهة API لذكاء المحادثة.

  2. تقسيم الوسائط: تقسيم دفق الصوت إلى مسجلات ذكاء المحادثة باستخدام بروتوكول SIPREC.

  3. إرسال أحداث في الوقت الحقيقي: لتمكين تجربة الكتابة في الوقت الحقيقي ورؤى المكالمات، أرسل أحداث واجهة المستخدم من واجهة مستخدم عميل الموفر إلى ذكاء المحادثة في Dynamics 365.

للحصول على مثال عن الدمج بين ذكاء المحادثة في Dynamics 365 وموفر هتفية خارجي، Twilio Flex، راجع دمج Twilio Flex مع ذكاء المحادثة في Dynamics 365.

يوضح الرسم التخطيطي التالي كيفية عمل الدمج:

رسم تخطيطي يصف تدفق الدمج

الخطوة 1: تسجيل الموفر

  1. إنشاء تطبيق Microsoft Entra ID.

  2. أضف إذن API لتسجيل الوسائط:

    1. في تطبيق Microsoft Entra ID الذي أنشأته، انتقل إلى أذونات API.

    2. حدد إضافة إذن.

    3. ضمن واجهات API التي تستخدمها مؤسستي، ابحث عن تسجيل الوسائط لتطبيق Dynamics 365 Sales وحدده: لقطة شاشة لخيار تسجيل الوسائط.

    4. أضف إذن Users.Read.All وحدد إضافة إذن

    ‏‫ملاحظة‬

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

  3. احصل على الرمز المميز لتشغيل واجهات API لذكاء المحادثة باستخدام التطبيق الذي تم إنشاؤه في القسم السابق:

    curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/token -d 'client_id=<your app id>' -d 'grant_type=client_credentials' -d 'scope=00001111-aaaa-2222-bbbb-3333cccc4444/.default' -d 'client_secret=<your app secret>'

    تحدد المعلمة scope معرف التطبيق الخاص بتطبيق ذكاء المحادثة. لا تغير هذه القيمة.

    لمزيد من المعلومات حول أمر curl، راجع الحصول على الرموز المميزة لـ Microsoft Entra ID لكيانات الخدمة.

  4. قم باستدعاء واجهة API لذكاء المحادثة التالية لتسجيل الموفر الخارجي:
    POST /api/v1.0/providers/tenants

    حدد المعلمات التالية في نص الطلب:

    • orgID: حدد معرف مؤسسة Dynamics 365.

    • النوع: حدد "مخصص" لبرامج الطلب التابعة لجهات خارجية.

    • استضافة: حدد نوع الاستضافة الخاص بموفر الهتفية. على سبيل المثال، "سحابة" أو "محلي".

    • AccountId: حدد معرف الحساب الخاص بموفر الهتفية.

    • CerfificateSubjectName وCertificateIssuer: حدد تفاصيل الشهادة الخاصة بموفر الهتفية.

    • SourceIPNetwork: حدد عنوان IP لعميل SIPREC. حدد "0.0.0.0" إذا كنت لا تريد تقييد عنوان IP.
      القصاصة البرمجية التالية هي مثال عن نص الطلب:

      
      {
         "orgId": "ad3dca46-962a-4895-9f85-d25f3828781f",
         "Type": "custom",
         "hosting": "cloud",
         "displayName": "Test Custom Provider",
         "AuthenticationDetails": 
         {
             "AccountId":"adxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",
             "CertificateSubjectName": "certSubject",
             "CertificateIssuer": "issuer",
             "SourceIPNetwork": "0.0.0.0"
         }
      }
      

    لمزيد من المعلومات حول واجهة API، راجع ‏‫وثائق Swagger ‬.

  5. اتصل بواجهة API التالية لذكاء المحادثة للحصول على قائمة المستخدمين المراد تسجيلهم:
    GET /api/v1.0/providers/users

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

الخطوة 2: تقسيم الوسائط (دمج SIPREC)

تنفذ سجلات ذكاء المحادثة بروتوكول SIPREC القياسي.

تتم حماية الاتصال باستخدام البروتوكولين SIPS (المنفذ 5061) وSRTP. تتم المصادقة باستخدام mTLS في اتصال رسائل SIPS، وتستند إلى الشهادة المقدمة إلى واجهة برمجة التطبيقات - مما يعني أنه يجب تسجيل الموفر للمستأجر لإنشاء اتصال SIPS.

توضح لقطة الشاشة التالية الاتصال بين عميل SIPREC وخادم SIPREC:

لقطة شاشة لعينة اتصال بين عميل SIPREC وخادم SIPREC.

بيانات التعريف التالية مطلوبة لذكاء المحادثة:

الرؤوس:

اسم الرأس الوصف مثال قيمة
Call-ID المعرّف الفريد للمكالمة. يتم استخدام هذا المعرف لربط إشارات SIP وإجراءات المستخدم مثل بدء/إيقاف التسجيل. efxxxxxxxxxxxxx
X-AccountId المعرّف الفريد للحساب الذي تنتمي إليه المكالمة. يستخدم هذا المعرف للمصادقة والتفويض. إنه معرف الحساب نفسه المسجل في واجهة API للمستأجر. ACxxxxxxxxxxxxxxxxxxxxxxx

بيانات التعريف

اسم مفتاح بيانات التعريف الوصف مثال قيمة
الدور الإشارة إلى ما إذا كانت مكالمة واردة أو صادرة للبائع. ["واردة", "صادرة"]
CallerDisplayName الاسم المعروض للمتصل. يظهر رقم الهاتف إذا لم يكن متاحًا. كيني سميث
CalleeDisplayName الاسم المعروض للمستلم. يظهر رقم الهاتف إذا لم يكن متاحًا. أليكس بيكر

فيما يلي أمثلة عن رسائل الدعوة والوداع التي تحتوي على الرؤوس وبينات التعريف المطلوبة:

رسالة دعوة:

INVITE sip:SRS@media.recording.dynamics.com:5061;transport=tls SIP/2.0 
Via: SIP/2.0/TLS 84.172.x.x:5061;branch=z9hG4bK4fa2.cdabfe83d76d3c41987802096d3b342a.0;received=172.16.x.x;rport=40334 
Via: SIP/2.0/UDP 172.25.x.x:5060;rport=5060;branch=z9hG4bK917ce574-0345-4c3d-9b63-d98c2c57dbe6_c3356d0b_599-10236398515455707148 
To: <sip:SRS@media.recording.dynamics.com:5061;transport=tls> 
From: <sip:SRC@sip.provider.com>;tag=66790678_c3356d0b_917ce574-0345-4c3d-9b63-d98c2c57dbe6 
Call-ID: efab0870bc597cb3fb56010921e2f57f 
CSeq: 1 INVITE 
Contact: <sip:SRC@172.25.x.x:5060;transport=udp>;+sip.src 
Max-Forwards: 67 
Record-Route: <sip:84.172.x.x:5061;transport=tls;r2=on;lr>,<sip:84.172.x.x;r2=on;lr> 
User-Agent: provider Gateway 
Allow: INVITE,ACK,CANCEL,OPTIONS,BYE,REFER,NOTIFY 
Require: siprec 
Content-Length: 3194 
Content-Type: multipart/mixed;boundary=\"----=_Part_1253_283419664.1674116473425\" 
Min-SE: 35 
X-AccountId: ACxxxxxxxxxxxxxxxxxxxx 
------=_Part_1253_283419664.1674116473425 

Content-Type: application/sdp 
v=0 
o=root 1176539620 1176539620 IN IP4 172.18.x.x 
s=provider Media Gateway 
c=IN IP4 84.172.x.x 
t=0 0 
m=audio 15352 RTP/SAVP 0 8 101 
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:<Encryption_key>
a=rtpmap:0 PCMU/8000 
a=rtpmap:8 PCMA/8000 
a=rtpmap:101 telephone-event/8000 
a=fmtp:101 0-16 
a=ptime:20 
a=maxptime:20 
a=sendonly 
a=label:inbound 
m=audio 16022 RTP/SAVP 0 8 101 
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:<Encryption_key> 
a=rtpmap:0 PCMU/8000 
a=rtpmap:8 PCMA/8000 
a=rtpmap:101 telephone-event/8000 
a=fmtp:101 0-16 
a=ptime:20 
a=maxptime:20 
a=sendonly 
a=label:outbound 
------=_Part_1253_283419664.1674116473425 

Content-Type: application/rs-metadata+xml 
Content-Disposition: recording-session 
<?xml version=\"1.0\" encoding=\"UTF-8\"?> 
<recording xmlns='urn:ietf:params:xml:ns:recording:1'> 
    <datamode>complete</datamode> 
    <session session_id=\"Wd/putWgTWCW2z1lI5Db9w==\"> 
            <ExtensionParameters  xmlns=\"http://provider.com/siprec\"> 
                    <Parameter name=\"Role\" value=\"inbound\"/> 
                    <Parameter name=\"CallerDisplayName\" value=\"Kiana Anderson\"/> 
                    <Parameter name=\"CalleeDisplayName\" value=\"Tomas Richardson\"/> 
            </ExtensionParameters> 
    </session> 
        <participant participant_id=\"bXCloPcETS6P/kfeeJtiow==\"> 
            <nameID aor=\"EE5C7EF0\"/> 
        </participant> 
        <participant participant_id=\"3nPi8XzBSzWrtSLlkU8Gjw==\"> 
            <nameID aor=\"230908\"/> 
        </participant> 
        <stream stream_id=\"9xff8FcdRUaJCSTxWFbV9g==\" session_id=\"Wd/putWgTWCW2z1lI5Db9w==\"><label>inbound</label></stream> 
        <stream stream_id=\"f/Qezx4jTMqiWSB1vW7oJA==\" session_id=\"Wd/putWgTWCW2z1lI5Db9w==\"><label>outbound</label></stream> 
    <sessionrecordingassoc session_id=\"Wd/putWgTWCW2z1lI5Db9w==\"> 
        <associate-time>2023-01-19T08:21:13.382512Z</associate-time> 
    </sessionrecordingassoc> 
        <participantsessionassoc participant_id=\"bXCloPcETS6P/kfeeJtiow==\" session_id=\"Wd/putWgTWCW2z1lI5Db9w==\"> 
            <associate-time>2023-01-19T08:21:13.382512Z</associate-time> 
        </participantsessionassoc> 
        <participantsessionassoc participant_id=\"3nPi8XzBSzWrtSLlkU8Gjw==\" session_id=\"Wd/putWgTWCW2z1lI5Db9w==\"> 
            <associate-time>2023-01-19T08:21:13.382512Z</associate-time> 
        </participantsessionassoc> 
        <participantstreamassoc participant_id=\"bXCloPcETS6P/kfeeJtiow==\"> 
                <send>9xff8FcdRUaJCSTxWFbV9g==</send> 
                <recv>f/Qezx4jTMqiWSB1vW7oJA==</recv> 
        </participantstreamassoc> 
        <participantstreamassoc participant_id=\"3nPi8XzBSzWrtSLlkU8Gjw==\"> 
                <send>f/Qezx4jTMqiWSB1vW7oJA==</send> 
                <recv>9xff8FcdRUaJCSTxWFbV9g==</recv> 
        </participantstreamassoc> 
</recording> 
------=_Part_1253_283419664.1674116473425--

رسالة وداع

BYE sip:SRS@media.recording.dynamics.com:5061;transport=tls SIP/2.0 
Via: SIP/2.0/TLS 84.172.x.x:5061;branch=z9hG4bK1fa2.d03c36b567136fcfae84281e926cda62.0;received=172.16.x.x;rport=40334 
Via: SIP/2.0/UDP 172.25.x.x:5060;rport=5060;received=84.144.x.x;branch=z9hG4bK917ce574-0345-4c3d-9b63-d98c2c57dbe6_c3356d0b_600-2513288074170844985 
To: <sip:SRS@media.recording.dynamics.com:5061;transport=tls>;tag=OXFWHPJQTL 
From: <sip:SRC@sip.provider.com>;tag=66790678_c3356d0b_917ce574-0345-4c3d-9b63-d98c2c57dbe6 
Call-ID: efab0870bc597cb3fb56010921e2f57f 
CSeq: 2 BYE 
Max-Forwards: 68 
User-Agent: provider Gateway 
Require: siprec 
Content-Length: 901 
Content-Type: multipart/mixed;boundary=\"----=_Part_29418_1017575873.1674116842924\" 
X-AccountId: ACxxxxxxxxxxxxx 

نقاط نهاية المسجل والمناطق المدعومة

يسرد الجدول التالي نقاط نهاية المسجل المدعومة والمناطق الخاصة بها. يمكنك تكوين المسجلات التي ترغب في استخدامها في إعدادات موفر الهتفية. لمعرفة كيفية القيم بذلك في Twilio Flex، راجع الخطوة 2: تثبيت موصل SIPREC وتوجيه المكالمات إلى Dynamics 365.

نقطة النهاية منطقة
media.recording.dynamics.com عالمي (أقرب منطقة)
southeastasia.media.recording.dynamics.com جنوب شرق آسيا
australiaeast.media.recording.dynamics.com أستراليا
sam.media.recording.dynamics.com أمريكا الجنوبية
canadacentral.media.recording.dynamics.com كندا
switzerlandnorth.media.recording.dynamics.com سويسرا
eastus.media.recording.dynamics.com US
francecentral.media.recording.dynamics.com فرنسا
centralindia.media.recording.dynamics.com الهند
japaneast.media.recording.dynamics.com اليابان
uae.media.recording.dynamics.com الإمارات العربية المتحدة
uksouth.media.recording.dynamics.com المملكة المتحدة
westeurope.media.recording.dynamics.com أوروبا الغربية
zaf.media.recording.dynamics.com جنوب إفريقيا

الخطوة 3: إرسال أحداث الوقت الحقيقي (تكامل عميل برنامج الطلب الهاتفي)

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

  • حدث بدء المكالمة: عندما يحصل ذكاء المحادثة على حدث "بدء المكالمة"، سيعرض زر التسجيل والنسخ في الوقت الحقيقي والرؤى.

  • حدث انتهاء المكالمة: عندما يحصل ذكاء المحادثة على حدث "انتهاء المكالمة"، سيقوم بإتمام المكالمة ويعرض الزر ملخص كامل للحصول على الرؤى وملخص المكالمة الذي تم توليده.

لإرسال الأحداث، استخدم raiseEvent API في إطار عمل تكامل قنوات Dynamics 365.

فيما يلي عينة قصاصة برمجية لإرسال الأحداث:

export interface CallStartedEvent { 
  callId: string; 
  startTime: Date; 
  isIncomingCall: boolean; 
  contactNumber: string; 
  contactName: string; 
} 

export interface CallEndedEvent { 
  callId: string; 
  callDurationInSeconds: number; 
  callTerminationReason: string; // ['success', 'error'] 
  callEndTime: Date; 
  isCallStarted: boolean; 
} 

dialer.Actions.addListener('onCallStarted', (payload: any) => { 
  const callStartedEvent : CallStartedEvent = { 
    callId: payload.call_sid, 
    startTime: new Date(), 
    isIncomingCall: payload.attributes.is_incoming_call, 
    contactName: payload.attributes.caller_name, 
    contactNumber: payload.attributes.caller_phone_number 
  }; 

  // @ts-ignore 
  Microsoft.CIFramework.raiseEvent('WIDGET_CALL_STARTED', callStartedEvent); 
}); 

dialer.Actions.addListener('onCallEnded', (payload: any) => { 
  const callEndedEvent : CallEndedEvent = { 
    callId: payload.call_sid, 
    callEndTime: new Date(), 
    callTerminationReason: 'success', 
    isCallStarted: true, 
    callDurationInSeconds: payload.attributes.call_length 
  }; 

  // @ts-ignore 
  Microsoft.CIFramework.raiseEvent('WIDGET_CALL_ENDED', callEndedEvent); 
});

اختبار التكامل

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

  1. سجل دخولك باعتبارك مسؤول النظام في تطبيق مركز المبيعات.

  2. في منطقة التغيير، حدد إعدادات Sales Insights.

  3. انتقل إلى الإعدادات العمومية>ذكاء المحادثة. في قسم "موفرو المكالمات"، سترى الموفر الخارجي الذي قمت بتسجيله.

  4. قم بإنشاء سياسة تسجيل للموفر الجديد. لمزيد من المعلومات، راجع: إعداد Microsoft Teams لذكاء المحادثة

لقطة الشاشة التالية هي مثال عن سياسة التسجيل لتطبيق Twilio.

لقطة شاشة لسياسة التسجيل لتطبيق Twilio

الآن، اتصل بمستخدم هو جزء من دور الأمان المحدد (في المثال الذي قدمناه، تم تمكين السياسة لكل أدوار الأمان).

عندما يتلقى Dynamics 365 الحدث callStarted من برنامج الطلب، يمكنك بدء التسجيل:

لقطة شاشة للإعلام لتسجيل المكالمات

بعد تحديد تسجيل، سوف تتمكن من مشاهدة النسخ في الوقت الحقيقي أثناء المكالمة وملخص كامل ومعلومات المكالمات في نهاية المكالمة.

عرض وفهم صفحة ملخص المكالمات