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:
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.
Bifurcar los medios: Bifurque el flujo de audio a las grabadoras de inteligencia de conversación mediante un protocolo SIPREC.
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:
Paso 1: Registrar el proveedor
Agregar permiso de API para grabación de medios:
En la aplicación Microsoft Entra ID que creó, vaya a Permisos API.
Seleccione Agregar permiso.
En API que usa mi organización, busque Grabación de medios para Dynamics 365 Sales y selecciónelo:
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.
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.
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.
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:
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.
Inicie sesión como administrador del sistema en la aplicación Centro de ventas.
En el área Cambiar, seleccione Configuración de Sales Insights.
Vaya a Configuración global>Inteligencia de conversaciones. En la sección Proveedores de llamadas, verá el proveedor externo que ha registrado.
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.
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:
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.