Intégrer des numéroteurs tiers à l’intelligence conversationnelle de Dynamics 365 (version préliminaire)
[Cet article fait partie de la documentation en version préliminaire et peut faire l’objet de modifications.]
Grâce à cette intégration, les utilisateurs de Dynamics 365 peuvent utiliser des numéroteurs fournis par des sociétés de téléphonie tierces telles que Twilio Flex, pour passer et recevoir des appels téléphoniques dans Dynamics 365, et obtenir des informations en temps réel générées par l’IA et une analyse post-appel enrichie de leurs appels. En savoir plus sur l’intelligence conversationnelle de Dynamics 365
Important
- Cette fonctionnalité est en version préliminaire.
- Les fonctionnalités en version préliminaire ne sont pas destinées à une utilisation en production et peuvent être restreintes. Ces fonctionnalités sont soumises à des conditions d’utilisation supplémentaires, et sont disponibles avant une version officielle de telle sorte que les clients puissent tirer parti d’un accès anticipé et fournir leurs commentaires.
Fonctionnement de l’intégration
À un niveau supérieur, l’intégration se compose de trois parties :
Enregistrer le fournisseur : enregistrez les détails du fournisseur et obtenez la liste des utilisateurs à enregistrer à l’aide de l’API de l’intelligence conversationnelle.
Dupliquer les médias : dupliquez le flux audio vers les enregistreurs de l’intelligence conversationnelle à l’aide d’un protocole SIPREC.
Envoyez des événements en temps réel : Pour activer la transcription en temps réel et l’expérience d’informations sur les appels, envoyez les événements de l’interface utilisateur de l’interface utilisateur client du fournisseur vers l’intelligence conversationnelle Dynamics 365.
Pour un exemple d’intégration entre l’intelligence conversationnelle Dynamics 365 et un fournisseur de téléphonie tiers, Twilio Flex, voir Intégrer Twilio Flex avec l’intelligence conversationnelle Dynamics 365.
Le diagramme suivant illustre le fonctionnement de l’intégration :
Étape 1 : Enregistrer le fournisseur
Ajouter une autorisation API pour l’enregistrement média :
Dans l’application Microsoft Entra ID que vous avez créée, accédez à Autorisations API.
Sélectionnez Ajouter une autorisation.
Sous API utilisées par mon organisation, recherchez Enregistrement média pour Dynamics 365 Sales et sélectionnez-le :
Ajouter l’autorisation Users.Read.All et sélectionner Ajouter une autorisation
Remarque
Veillez à bien obtenir le consentement de l’administrateur pour pouvoir appeler l’API de l’intelligence conversationnelle dans le contexte de l’application. En savoir plus sur les autorisations et le consentement.
Obtenez le jeton pour exécuter les API de l’intelligence conversationnelle à l’aide de l’application créée dans la section précédente :
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=f448d7e5-e313-4f90-a3eb-5dbb3277e4b3/.default' -d 'client_secret=<your app secret>'
Le paramètre
scope
spécifie l’ID d’application de l’application d’intelligence conversationnelle. Ne changez pas cette valeur.Pour plus d’informations sur la commande Curl, voir Obtenir des ID de jetons Microsoft Entra pour les principaux de service.
Appelez l’API de l’intelligence conversationnelle pour enregistrer le fournisseur de services tiers :
POST /api/v1.0/providers/tenants
Spécifiez les paramètres suivants dans le corps de la demande :
orgID : spécifiez l’ID d’organisation Dynamics 365.
Type : spécifiez « personnalisé » pour les numéroteurs tiers.
hébergement : spécifiez le type d’hébergement du fournisseur de téléphonie. Par exemple, « cloud » ou « local ».
AccountId : spécifiez l’ID de compte du fournisseur de téléphonie.
CerfificateSubjectName et CertificateIssuer : spécifiez les détails du certificat du fournisseur de téléphonie.
SourceIPNetwork : indiquez l’adresse IP du client SIPREC. Spécifiez « 0.0.0.0 » si vous ne souhaitez pas limiter l’adresse IP.
L’extrait suivant est un exemple du corps de la demande :{ "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" } }
Pour plus d’informations sur l’API, consultez la Documentation Swagger.
Appelez l’API de l’intelligence conversationnelle suivante pour obtenir la liste des utilisateurs à enregistrer :
GET /api/v1.0/providers/users
Une fois que l’administrateur Dynamics 365 Sales a créé la stratégie d’enregistrement, le fournisseur peut utiliser ce point de terminaison pour filtrer les médias qui seront transmis aux enregistreurs de l’intelligence conversationnelle.
Etape 2 : Dupliquer le média (intégration SIPREC)
Les enregistreurs de l’intelligence conversationnelle implémentent la norme Protocole SIPREC.
La communication est sécurisée à l’aide des protocoles SIPS (port 5061) et SRTP. L’authentification se fait à l’aide de mTLS dans la connexion du message SIPS et est basée sur le certificat fourni à l’API, ce qui signifie que le fournisseur doit être enregistré auprès d’un client pour établir une connexion SIPS.
La capture d’écran suivante illustre la communication entre le client SIPREC et le serveur SIPREC :
Les métadonnées suivantes sont requises pour l’intelligence conversationnelle :
En-têtes :
Nom de l’en-tête | Description | Exemple de valeur |
---|---|---|
Identification d’appel | Identificateur unique de l’appel. Cet identifiant est utilisé pour corréler les signaux SIP et les actions de l’utilisateur telles que démarrer/arrêter l’enregistrement. | efxxxxxxxxxxxx |
X-AccountId | Identificateur unique du compte auquel l’appel appartient. Cet identifiant est utilisé pour l’authentification et l’autorisation. Il s’agit du même ID de compte enregistré dans l’API pour le client. | ACxxxxxxxxxxxxxxxxxxxxxxx |
Metadata
Nom de la clé des métadonnées | Description | Exemple de valeur |
---|---|---|
Rôle | Indique s’il s’agit d’un appel entrant ou sortant pour le vendeur. | ["inbound", "outbound"] |
CallerDisplayName | Nom d’affichage de l’appelant. S’il n’est pas disponible, le numéro de téléphone s’affiche. | Antoine Dupont |
CalleeDisplayName | Nom complet du destinataire. S’il n’est pas disponible, le numéro de téléphone s’affiche. | Alex Boulanger |
Voici des exemples de messages d’invitation et d’au revoir avec les en-têtes et métadonnées requis :
Message INVITATION :
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--
Message AU REVOIR :
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
Points de terminaison et régions d’enregistrement pris en charge
Le tableau suivant répertorie les terminaux d’enregistrement pris en charge et leurs régions. Vous pouvez configurer les enregistreurs que vous souhaitez utiliser dans les paramètres de votre fournisseur de téléphonie. Pour en savoir plus sur la procédure à suivre pour Twilio Flex, consultez Étape 2 : Installer le connecteur SIPREC et acheminer les appels vers Dynamics 365.
Point de terminaison | Région |
---|---|
media.recording.dynamics.com | Global (région la plus proche) |
southeastasia.media.recording.dynamics.com | Asie du Sud-Est |
australiaeast.media.recording.dynamics.com | Australie |
sam.media.recording.dynamics.com | Amérique du Sud |
canadacentral.media.recording.dynamics.com | Canada |
switzerlandnorth.media.recording.dynamics.com | Suisse |
eastus.media.recording.dynamics.com | États-Unis |
francecentral.media.recording.dynamics.com | France |
centralindia.media.recording.dynamics.com | Inde |
japaneast.media.recording.dynamics.com | Japon |
uae.media.recording.dynamics.com | Émirats arabes unis |
uksouth.media.recording.dynamics.com | Royaume-Uni |
westeurope.media.recording.dynamics.com | Europe Ouest |
zaf.media.recording.dynamics.com | Afrique du Sud |
Étape 3 : Envoyer des événements en temps réel (intégration du client du numéroteur)
Pour permettre à l’intelligence conversationnelle de fournir une transcription et des informations en temps réel, le numéroteur tiers peut utiliser deux événements pour notifier le début ou la fin d’un appel.
Événement d’appel démarré : lorsque l’intelligence conversationnelle reçoit l’événement « appel démarré », elle affiche le bouton d’enregistrement, ainsi que la transcription et les informations en temps réel.
Événement de fin d’appel : lorsque l’intelligence conversationnelle reçoit l’événement « Appel terminé », elle conclut l’appel et affiche le bouton Résumé complet pour obtenir le résumé de l’appel généré par l’IA et des informations.
Pour envoyer les événements, utilisez l’API raiseEvent dans l’environnement d’intégration du canal de Dynamics 365.
Voici un exemple d’extrait de code pour envoyer les événements :
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);
});
Tester l’intégration
Après avoir enregistré le nouveau fournisseur auprès du locataire et configuré la duplication SIPREC et les événements du numéroteur client, vous pouvez tester l’intégration en créant une stratégie d’enregistrement avec le nouveau fournisseur.
Connectez-vous en tant qu’administrateur système dans l’application Centre des ventes.
Dans la zone de modification, sélectionnez Paramètres de Sales Insights.
Accédez à Paramètres globaux>Intelligence conversationnelle. Dans la section Fournisseurs d’appels, vous voyez le fournisseur tiers que vous avez enregistré.
Créez une stratégie d’enregistrement pour le nouveau fournisseur. Pour plus d’informations, voir Configurer Microsoft Teams pour l’intelligence conversationnelle
La capture d’écran suivante est un exemple de stratégie d’enregistrement pour Twilio.
Maintenant, appelez un utilisateur qui fait partie du rôle de sécurité sélectionné (dans notre exemple, la stratégie est activée pour tous les rôles de sécurité).
Lorsque Dynamics 365 reçoit l’événement callStarted du numéroteur, vous avez la possibilité de démarrer l’enregistrement :
Après avoir sélectionné Enregistrer, vous pouvez voir la transcription en temps réel pendant l’appel et un résumé complet et des informations sur l’appel à la fin de l’appel.