Integrar discadores de terceiros à inteligência de conversação do Dynamics 365 (versão preliminar)
[Este artigo faz parte da documentação de pré-lançamento e está sujeito a alterações.]
Com essa integração, os usuários do Dynamics 365 podem usar discadores fornecidos por empresas de telefonia de terceiros, como Twilio Flex, para fazer e receber telefonemas no Dynamics 365 e obter insights gerados por IA em tempo real, além de uma análise avançada pós-chamadas. Saiba mais sobre a inteligência de conversa do Dynamics 365
Importante
- Este é um recurso em versão preliminar.
- Os recursos de versão preliminar não foram criados para uso em ambientes de produção e podem ter funcionalidade restrita. Esses recursos estão sujeitos a termos de uso suplementares e são disponibilizados antes de um lançamento oficial, de maneira que os clientes possam ter acesso antecipado e fazer comentários.
Como a integração funciona
Em alto nível, a integração consiste em três partes:
Registrar o provedor: registre os detalhes do provedor e obtenha a lista de usuários a serem registrados usando a API da inteligência de conversa.
Bifurcar a mídia: bifurque o fluxo de áudio para os gravadores da inteligência de conversa usando um protocolo SIPREC.
Enviar eventos em tempo real: para habilitar a transcrição em tempo real e a experiência dos insights de chamada, envie eventos da interface do usuário cliente do provedor para a inteligência de conversa do Dynamics 365.
Para obter um exemplo de integração entre a inteligência de conversa do Dynamics 365 e um provedor de telefonia de terceiros, Twilio Flex, consulte Integrar Twilio Flex à inteligência de conversa do Dynamics 365.
O diagrama a seguir ilustra como a integração funciona:
Etapa 1: Registrar o provedor
Adicione permissão de API para gravação de mídia:
No aplicativo ID do Microsoft Entra criado por você, vá até Permissões de API.
Selecione Adicionar permissão.
Em APIs usadas pela organização, procure Gravação de Mídia do Dynamics 365 Sales e selecione:
Adicione a permissão Users.Read.All e selecione Adicionar permissão
Observação
Não se esqueça de obter o consentimento do administrador para poder chamar a API de inteligência de conversa no contexto do aplicativo. Saiba mais sobre permissões e consentimento.
Obtenha o token para executar as APIs de Inteligência de Conversa usando o aplicativo criado na seção 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>'
O parâmetro
scope
especifica a ID do aplicativo de Inteligência de Conversa. Não altere esse valor.Para obter mais informações sobre o comando curl, consulte Obter tokens de ID do Microsoft Entra para entidades de serviço.
Chame a seguinte API de inteligência de conversa para registrar o provedor de serviços de terceiros:
POST /api/v1.0/providers/tenants
Especifique os seguintes parâmetros no corpo da solicitação:
orgID: especifique a ID da organização do Dynamics 365.
Tipo: especifique "custom" para discadores de terceiros.
hospedagem: especifique o tipo de hospedagem do provedor de telefonia. Por exemplo, "nuvem" ou "local".
AccountId: especifique a ID da conta do provedor de telefonia.
CerfificateSubjectName e CertificateIssuer: especifique os detalhes do certificado do provedor de telefonia.
SourceIPNetwork: especifique o endereço IP do cliente SIPREC. Especifique "0.0.0.0" se você não quiser restringir o endereço IP.
O seguinte trecho é um exemplo do corpo da solicitação:{ "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 obter mais informações sobre a API, consulte a documentação do Swagger.
Chame a seguinte API de inteligência de conversa para obter a lista de usuários a serem registrados:
GET /api/v1.0/providers/users
Depois que o administrador do Dynamics 365 Sales cria a política de gravação, o provedor pode usar esse ponto de extremidade para filtrar a mídia que será bifurcada para gravadores da inteligência de conversa.
Etapa 2: bifurcar a mídia (integração SIPREC)
Os gravadores de Inteligência de Conversa implementam o protocolo SIPREC padrão.
A comunicação é protegida usando os protocolos SIPS (porta 5061) e SRTP. A autenticação é feita usando-se mTLS na conexão de mensagem SIPS e se baseia no certificado fornecido à API – o que significa que o provedor deve ser registrado para um locatário estabelecer conexão SIPS.
A captura de tela a seguir ilustra a comunicação entre o cliente SIPREC e o servidor SIPREC:
Os seguintes metadados são necessários para inteligência de conversa:
Cabeçalhos:
Nome do cabeçalho | Descrição | Exemplo de valor |
---|---|---|
Call-ID | Identificador exclusivo da chamada. Essa ID é usada para correlacionar sinais SIP e ações de usuário, como iniciar/parar gravação. | efxxxxxxxxxxxxx |
X-AccountId | Identificador exclusivo da conta à qual a chamada pertence. Essa ID é usada na autenticação e na autorização. Trata-se da mesma ID de conta registrada na API do locatário. | ACxxxxxxxxxxxxxxxxxxxxxxx |
Metadados
Nome da chave de metadados | Descrição | Exemplo de valor |
---|---|---|
Função | Indica se é uma chamada de entrada ou saída para o vendedor. | ["inbound", "outbound"] |
CallerDisplayName | Nome de exibição do chamador. Se não estiver disponível, o número de telefone será exibido. | Kenny Smith |
CalleeDisplayName | Nome de exibição do destinatário. Se não estiver disponível, o número de telefone será exibido. | Alex Baker |
Aqui estão alguns exemplos de mensagens de convite e despedida com os cabeçalhos e os metadados necessários:
Mensagem de CONVITE:
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--
Mensagem de DESPEDIDA:
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
Pontos de extremidade e regiões do gravador compatíveis
A tabela a seguir lista os pontos de extremidade do gravador compatíveis e as regiões. Você pode configurar os gravadores que deseja usar nas configurações do provedor de telefonia. Para saber como isso é feito no Twilio Flex, consulte Etapa 2: Instalar o conector SIPREC e encaminhar as chamadas para o Dynamics 365.
Ponto de Extremidade | Região |
---|---|
media.recording.dynamics.com | Global (região mais próxima) |
southeastasia.media.recording.dynamics.com | Sudeste Asiático |
australiaeast.media.recording.dynamics.com | Austrália |
sam.media.recording.dynamics.com | América do Sul |
canadacentral.media.recording.dynamics.com | Canadá |
switzerlandnorth.media.recording.dynamics.com | Suíça |
eastus.media.recording.dynamics.com | US |
francecentral.media.recording.dynamics.com | França |
centralindia.media.recording.dynamics.com | Índia |
japaneast.media.recording.dynamics.com | Japão |
uae.media.recording.dynamics.com | EAU |
uksouth.media.recording.dynamics.com | Reino Unido |
westeurope.media.recording.dynamics.com | Oeste da Europa |
zaf.media.recording.dynamics.com | África do Sul |
Etapa 3: Enviar eventos em tempo real (integração do cliente do discador)
Para permitir que a inteligência de conversa forneça transcrição em tempo real e insights, o discador de terceiros pode usar dois eventos para notificar quando uma chamada começa ou termina.
Evento de chamada iniciada: quando obtém o evento "chamada iniciada", a inteligência de conversa mostra o botão de gravação e a transcrição em tempo real e insights.
Evento de chamada encerrada: quando obtém o evento "chamada encerrada", a inteligência de conversa encerra a chamada e mostra o botão Resumo completo para obter o resumo da chamada gerado por IA e os insights.
Para enviar os eventos, use a API raiseEvent na Estrutura de Integração de Canal do Dynamics 365 (CIF).
Aqui está um trecho de código de exemplo para enviar os 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);
});
Testar a integração
Depois de registrar o novo provedor com o locatário e configurar a bifurcação SIPREC, além dos eventos do discador do cliente, você poderá testar a integração criando uma nova política de gravação com o novo provedor.
Faça logon como administrador do sistema no aplicativo Hub de Vendas.
Na área Alterar, selecione Configurações do Sales Insights.
Vá para Configurações globais>Inteligência de Conversa. Na seção Provedores de chamada, você verá o provedor de terceiros que registrou.
Crie uma política de gravação para o novo provedor. Para obter mais informações, consulte Configurar Microsoft Teams para inteligência de conversa
A captura de tela a seguir é um exemplo de uma política de gravação do Twilio.
Agora, chame um usuário que faça parte do direito de acesso selecionado (em nosso exemplo, a política está habilitada para todos os direitos de acesso).
Quando o Dynamics 365 receber o evento callStarted do discador, você terá a opção de iniciar a gravação:
Depois de selecionar Gravar, você poderá ver a transcrição em tempo real durante a chamada e um resumo completo, além dos insights de chamada, ao final da chamada.