Condividi tramite


Integra i dialer di terze parti con Conversazione intelligente di Dynamics 365 (anteprima)

[Questo articolo fa parte della documentazione non definitiva, pertanto è soggetto a modifiche.]

Con questa integrazione, gli utenti di Dynamics 365 possono utilizzare dialer forniti da società di telefonia di terze parti come Twilio Flex, per effettuare e ricevere chiamate telefoniche in Dynamics 365 e ottenere approfondimenti generati dall'intelligenza artificiale in tempo reale e un'analisi post-chiamata completa delle loro chiamate. Altre informazioni su Conversazione intelligente in Dynamics 365

Importante

  • Questa è una funzionalità di anteprima.
  • Le funzionalità di anteprima non sono destinate ad essere utilizzate per la produzione e sono soggette a restrizioni. Queste funzionalità sono soggette a condizioni per l'utilizzo supplementari e sono disponibili prima di una versione ufficiale in modo che i clienti possano ottenere l'accesso iniziale e fornire feedback.

Funzionamento dell'integrazione

Ad alto livello, l’integrazione è composta da tre parti:

  1. Registrazione del provider: Registra i dettagli del provider e ottieni l'elenco degli utenti da registrare utilizzando l'API di Conversazione intelligente.

  2. Fork dei file multimediali: il fork del flusso audio ai registratori di Conversazione intelligente utilizzando un protocollo SIPREC.

  3. Invia eventi in tempo reale: per abilitare la trascrizione in tempo reale e l'esperienza delle informazioni dettagliate sulle chiamate, invia eventi dell'interfaccia utente dall'interfaccia utente del client del provider a Conversazione intelligente di Dynamics 365.

Per un esempio di integrazione tra Conversazione intelligente di Dynamics 365 e un provider di telefonia di terze parti, Twilio Flex, vedi Integrazione di Twilio Flex con Conversazione intelligente di Dynamics 365.

Il diagramma seguente illustra come funziona l'integrazione:

Diagramma che illustra il flusso di integrazione

Passaggio 1: registrazione del provider

  1. Creare un'applicazione Microsoft Entra ID.

  2. Aggiungi autorizzazione API per la registrazione multimediale:

    1. Nell'applicazione Microsoft Entra ID creata, vai a Autorizzazioni API.

    2. Seleziona Aggiungi autorizzazione.

    3. In API utilizzate dalla mia organizzazione cerca Registrazione multimediale per Dynamics 365 Sales e selezionalo: Screenshot dell'opzione registrazione multimediale

    4. Aggiungi autorizzazioni Users.Read.All e seleziona Aggiungi autorizzazione

    Nota

    Assicurati di ottenere il consenso amministratore per l'autorizzazione a chiamare l'API di Conversazione intelligente nel contesto dell'app. Altre informazioni sulle autorizzazioni e sul consenso.

  3. Ottieni il token per eseguire le API di Conversazione intelligente utilizzando l'app creata nella sezione precedente:

    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>'

    Il parametro scope specifica l'ID applicazione dell'app Conversazione intelligente. Non modificare questo valore.

    Per ulteriori informazioni sul comando Curl, vedi Ottieni token Microsoft Entra ID per le entità di servizio.

  4. Chiama la seguente API di Conversazione intelligente per registrare il provider di servizi di terze parti:
    POST /api/v1.0/providers/tenants

    Specifica i seguenti parametri nel corpo della richiesta:

    • orgID: specifica l'ID organizzazione Dynamics 365.

    • Tipo: specifica "personalizzato" per dialer di terze parti.

    • hosting: specifica il tipo di hosting del provider di telefonia. Ad esempio, "cloud" o "locale".

    • AccountId: specifica l'ID account del provider di telefonia.

    • CerfificateSubjectName e CertificateIssuer: specifica i dettagli del certificato del provider di telefonia.

    • SourceIPNetwork: specifica l'indirizzo IP del client SIPREC. Specifica "0.0.0.0" se non si desidera limitare l'indirizzo IP.
      Il seguente frammento è un esempio di corpo della richiesta:

      
      {
         "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"
         }
      }
      

    Per ulteriori informazioni sull'API, vedi Documentazione swagger.

  5. Chiama la seguente API di Conversazione intelligente per ottenere l'elenco di utenti da registrare:
    GET /api/v1.0/providers/users

Dopo che l'amministratore di Dynamics 365 Sales ha creato il criterio di registrazione, il provider può utilizzare questo endpoint per filtrare i contenuti multimediali che verranno trasferiti ai registratori di Conversazione intelligente.

Passaggio 2: fork dei file multimediali (integrazione SIPREC)

I registratori di Conversazione intelligente implementano il protocollo SIPREC standard.

La comunicazione è protetta utilizzando i protocolli SIPS (porta 5061) e SRTP. L'autenticazione viene eseguita utilizzando mTLS nella connessione dei messaggi SIPS e si basa sul certificato fornito all'API, il che significa che il provider deve essere registrato affinché un tenant possa stabilire una connessione SIPS.

La seguente schermata illustra la comunicazione tra il client SIPREC e il server SIPREC:

Screenshot di una comunicazione di esempio tra il client SIPREC e il server SIPREC.

I seguenti metadati sono richiesti per Conversazione intelligente:

Intestazioni:

Nome intestazione Descrizione Valore di esempio
ID chiamata Identificatore univoco della chiamata. Questo ID viene utilizzato per correlare i segnali SIP e le azioni dell'utente come l'avvio/arresto della registrazione. efxxxxxxxxxxxxx
X-AccountId Identificatore univoco dell'account a cui appartiene la chiamata. Questo ID viene utilizzato per l'autenticazione e l'autorizzazione. Questo è lo stesso ID account registrato nell'API per il tenant. ACxxxxxxxxxxxxxxxxxxxxxxx

Metadati UFX

Nome chiave metadati Descrizione Valore di esempio
Ruolo Indica se si tratta di una chiamata in entrata o in uscita per il venditore. ["in entrata", "in uscita"]
CallerDisplayName Nome visualizzato chiamante. Se non disponibile, viene visualizzato il numero di telefono. Kenny Smith
CalleeDisplayName Nome visualizzato destinatario. Se non disponibile, viene visualizzato il numero di telefono. Alex Baker

Ecco alcuni esempi di messaggi di invito e di saluto con le intestazioni e i metadati richiesti:

Messaggio INVITO:

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--

Messaggio di SALUTO:

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 

Endpoint e aree geografiche del registratore supportati

La tabella seguente elenca gli endpoint del registratore supportati e le relative aree geografiche. È possibile configurare i registratori che si desidera utilizzare nelle impostazioni del provider di telefonia. Per informazioni su come eseguire questa operazione per Twilio Flex, vedi Passaggio 2: installare il connettore SIPREC e instradare le chiamate a Dynamics 365.

Endpoint Area geografica
media.recording.dynamics.com Globale (area geografica più vicina)
southeastasia.media.recording.dynamics.com Asia sud-orientale
australiaeast.media.recording.dynamics.com Australia
sam.media.recording.dynamics.com America del Sud
canadacentral.media.recording.dynamics.com Canada
switzerlandnorth.media.recording.dynamics.com Svizzera
eastus.media.recording.dynamics.com Stati Uniti
francecentral.media.recording.dynamics.com Francia
centralindia.media.recording.dynamics.com India
japaneast.media.recording.dynamics.com Giappone
uae.media.recording.dynamics.com UAE
uksouth.media.recording.dynamics.com Regno Unito
westeurope.media.recording.dynamics.com Europa occidentale
zaf.media.recording.dynamics.com Sudafrica

Passaggio 3: inviare eventi in tempo reale (integrazione client del dialer)

Per consentire a Conversazione intelligente di fornire informazioni dettagliate e trascrizione in tempo reale, il dialer di terze parti può utilizzare due eventi per notificare l'inizio o la fine di una chiamata.

  • Evento di chiamata avviata: Quando Conversazione intelligente riceve l'evento "chiamata avviata", mostrerà il pulsante di registrazione e le informazioni dettagliate e le trascrizione in tempo reale.

  • Evento chiamata terminata: quando Conversazione intelligente riceve l'evento "chiamata terminata", concluderà la chiamata e mostrerà il pulsante Riepilogo completo per ottenere il riepilogo della chiamata generato dall'intelligenza artificiale e le informazioni dettagliate.

Per inviare gli eventi, utilizza l'API raiseEvent in Framework di integrazione del canale Dynamics 365 (CIF).

Ecco un frammento di codice di esempio per inviare gli eventi:

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); 
});

Test dell'integrazione

Dopo aver registrato il nuovo provider con il tenant e impostato il fork SIPREC e gli eventi del dialer client, è possibile testare l'integrazione creando un nuovo criterio di registrazione con il nuovo provider.

  1. Accedi come amministratore di sistema nell'app Hub delle vendite.

  2. Nell'area di modifica, seleziona Impostazioni di Sales Insights.

  3. Vai a Impostazioni globali>Conversazione intelligente. Nella sezione Provider di chiamate, vedrai il provider di terze parti che hai registrato.

  4. Creare criteri di registrazione per il nuovo provider. Per ulteriori informazioni, vedi Configurare Microsoft Teams per Conversazione intelligente

Lo screenshot seguente è un esempio di criteri di registrazione per Twilio.

screenshot di criteri di registrazione per Twilio

Ora chiama un utente che fa parte del ruolo di sicurezza selezionato (nel nostro esempio, i criteri sono abilitati per tutti i ruoli di sicurezza).

Quando Dynamics 365 riceve l'evento callStarted dal dialer, avrai la possibilità di avviare la registrazione:

Screenshot della notifica per registrare le chiamate

Dopo aver selezionato Registra, potrai vedere la trascrizione in tempo reale durante la chiamata e un riepilogo completo e informazioni dettagliate sulla chiamata al termine della chiamata.

Visualizzare e comprendere la pagina di riepilogo delle chiamate