Compartir a través de


Integre marcadores de terceros con inteligencia de conversación de Dynamics 365 (versión preliminar)

[Este artículo es documentación preliminar y está sujeto a modificaciones].

Con esta integración, los usuarios de Dynamics 365 pueden usar marcadores proporcionados por compañías de telefonía de terceros, como Twilio Flex, para realizar y recibir llamadas telefónicas en Dynamics 365, y obtener información en tiempo real generada por IA y un rico análisis posterior a la llamada de sus llamadas. . Más información sobre la inteligencia de conversaciones en Dynamics 365

Importante

  • Esta es una característica en versión preliminar.
  • Las características en vista previa no se han diseñado para un uso de producción y pueden tener una funcionalidad restringida. Estas características están sujetas a condiciones de uso adicionales y están disponibles antes del lanzamiento oficial para que los clientes puedan tener un acceso anticipado y proporcionar comentarios.

Cómo funciona la integración

En un nivel alto, la integración consta de tres partes:

  1. Registrar el proveedor: Registre los detalles del proveedor y obtenga la lista de usuarios que se registrarán mediante la API de inteligencia de conversación.

  2. Bifurcar los medios: Bifurque el flujo de audio a las grabadoras de inteligencia de conversación mediante un protocolo SIPREC.

  3. Enviar eventos en tiempo real: Para habilitar la transcripción en tiempo real y la experiencia de información de llamadas, envíe eventos de interfaz de usuario desde la interfaz de usuario del cliente del proveedor a la inteligencia de conversaciones de Dynamics 365.

Para ver un ejemplo de integración entre la inteligencia de conversación de Dynamics 365 y un proveedor de telefonía de terceros, Twilio Flex, consulte Integrar Twilio Flex con la inteligencia de conversación de Dynamics 365.

En el siguiente diagrama se muestra cómo funciona la integración:

Diagrama que representa el flujo de integración

Paso 1: Registrar el proveedor

  1. Crear una aplicación de Microsoft Entra ID.

  2. Agregar permiso de API para grabación de medios:

    1. En la aplicación Microsoft Entra ID que creó, vaya a Permisos API.

    2. Seleccione Agregar permiso.

    3. En API que usa mi organización, busque Grabación de medios para Dynamics 365 Sales y selecciónelo: Captura de pantalla de la opción de grabación de medios

    4. Agregue el permiso Users.Read.All y seleccione Agregar permiso

    Nota

    Asegúrese de obtener el consentimiento del administrador para poder llamar a la API de inteligencia de conversación en el contexto de la aplicación. Obtenga más información sobre los permisos y el consentimiento.

  3. Obtenga el token para ejecutar las API de Conversation Intelligence utilizando la aplicación creada en la sección anterior:

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

    El parámetro scope especifica el ID de aplicación de la aplicación de inteligencia de conversación. No cambie este valor.

    Para obtener más información sobre el comando curl, consulte Conseguir tokens de Microsoft Entra ID para entidades de servicio.

  4. Llame a la siguiente API de inteligencia de conversación para registrar el proveedor de servicios de terceros:
    POST /api/v1.0/providers/tenants

    Especifique los parámetros siguientes en el cuerpo de la solicitud:

    • orgID: Especifique el Id. de organización de Dynamics 365.

    • Tipo: Especifique "personalizado" para los marcadores de terceros.

    • Hosting: Especifique el tipo de alojamiento del proveedor de telefonía. Por ejemplo, "nube" o "local".

    • ID de la cuenta: Especifique el ID de cuenta del proveedor de telefonía.

    • CerfificateSubjectName y CertificateIssuer: Especifique los detalles del certificado del proveedor de telefonía.

    • Red IP de origen: Especifique la dirección IP del cliente SIPREC. Especifique "0.0.0.0" si no desea restringir la dirección IP.
      El siguiente fragmento de código es un ejemplo de cuerpo de solicitud:

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

    Para obtener más información sobre la API, vea la documentación de Swagger.

  5. Llame a la siguiente API de inteligencia de conversación para obtener la lista de usuarios para registrar:
    GET /api/v1.0/providers/users

Una vez que el administrador de Dynamics 365 Sales crea la política de grabación, el proveedor puede usar este punto de conexión para filtrar los medios que se bifurcarán a las grabadoras de inteligencia de conversación.

Paso 2: bifurcar los medios (integración SIPREC)

Las grabadoras de Conversation Intelligence implementan el Protocolo SIPREC estándar.

La comunicación está protegida mediante los protocolos SIPS (puerto 5061) y SRTP. La autenticación se realiza mediante mTLS en la conexión de mensajes SIPS y se basa en el certificado proporcionado a la API, lo que significa que el proveedor debe estar registrado para que un inquilino establezca una conexión SIPS.

La siguiente captura de pantalla ilustra la comunicación entre el cliente SIPREC y el servidor SIPREC:

Captura de pantalla de ejemplo de comunicación entre el cliente SIPREC y el servidor SIPREC.

Los siguientes metadatos son necesarios para la inteligencia de conversación:

Encabezados:

Nombre de encabezado Descripción Ejemplo de valor
Call-ID Identificador único de la llamada. Este identificador se utiliza para correlacionar señales SIP y acciones del usuario, como iniciar/detener la grabación. efxxxxxxxxxxxxx
X-AccountId Identificador único de la cuenta a la que pertenece la llamada. Esta identificación se utiliza para autenticación y autorización. Este es el mismo Id. de cuenta registrado en la API para el inquilino. ACxxxxxxxxxxxxxxxxxxxxxxx

Metadata

Nombre de clave de metadatos Descripción Ejemplo de valor
Role Indica si se trata de una llamada entrante o saliente para el vendedor. ["inbound", "outbound"]
CallerDisplayName Nombre para mostrar del autor de la llamada. Si no está disponible, se muestra el número de teléfono. Kenny Smith
CalleeDisplayName Nombre para mostrar del destinatario. Si no está disponible, se muestra el número de teléfono. Alex Baker

Aquí hay ejemplos de mensajes de invitación y despedida con los encabezados y metadatos requeridos:

Mensaje INVITE:

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

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 

Regiones y puntos finales de grabadora admitidos

En la siguiente tabla, se enumeran los puntos finales de grabadora admitidos y sus regiones. Puede configurar las grabadoras que desea utilizar en la configuración de su proveedor de telefonía. Para obtener información sobre cómo se hace esto para Twilio Flex, consulte Paso 2: Instalar el conector SIPREC y enrutar las llamadas a Dynamics 365.

Punto de conexión Región
media.recording.dynamics.com Global (región más cercana)
southeastasia.media.recording.dynamics.com Sudeste Asiático
australiaeast.media.recording.dynamics.com Australia
sam.media.recording.dynamics.com Sudamérica
canadacentral.media.recording.dynamics.com Canadá
switzerlandnorth.media.recording.dynamics.com Suiza
eastus.media.recording.dynamics.com EE. UU.
francecentral.media.recording.dynamics.com Francia
centralindia.media.recording.dynamics.com India
japaneast.media.recording.dynamics.com Japón
uae.media.recording.dynamics.com EAU
uksouth.media.recording.dynamics.com Reino Unido
westeurope.media.recording.dynamics.com Oeste de Europa
zaf.media.recording.dynamics.com Sudáfrica

Paso 3: Enviar eventos en tiempo real (Integración de cliente de Dialer)

Para permitir que la inteligencia de conversación proporcione transcripciones e información en tiempo real, el marcador externo puede usar dos eventos para notificar cuándo comienza o finaliza una llamada.

  • Evento de llamada iniciada: Cuando la inteligencia de conversación recibe el evento de "llamada iniciada", mostrará el botón de grabación y la transcripción e información en tiempo real.

  • Evento de llamada finalizada: cuando la inteligencia de conversación recibe el evento "llamada finalizada", finalizará la llamada y mostrará el botón Resumen completo para obtener el resumen de llamada generado por IA y perspectivas.

Para enviar los eventos, use la API raiseEvent en Dynamics 365 Channel Integration Framework (CIF).

Aquí hay un fragmento de código de muestra para enviar los eventos:

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

Probar la integración

Después de registrar el nuevo proveedor con el inquilino y configurar la bifurcación SIPREC y los eventos del marcador del cliente, puede probar la integración creando una nueva política de grabación con el nuevo proveedor.

  1. Inicie sesión como administrador del sistema en la aplicación Centro de ventas.

  2. En el área Cambiar, seleccione Configuración de Sales Insights.

  3. Vaya a Configuración global>Inteligencia de conversaciones. En la sección Proveedores de llamadas, verá el proveedor externo que ha registrado.

  4. Cree una política de grabación para el nuevo proveedor. Para más información, vea Configurar Microsoft Teams para la inteligencia de conversaciones

La siguiente captura de pantalla es un ejemplo de política de grabación para Twilio.

captura de pantalla de una política de grabación para Twilio

Ahora, llame a un usuario que sea parte del rol de seguridad seleccionado (en nuestro ejemplo, la política está habilitada para todos los roles de seguridad).

Cuando Dynamics 365 recibe el evento callStarted del marcador, tendrá la opción de iniciar la grabación:

Captura de pantalla de la notificación para grabar llamadas

Después de seleccionar Grabar, podrá ver la transcripción en tiempo real durante la llamada y un resumen completo e información de la llamada al final de la llamada.

Ver y comprender una página de resumen de llamada