Compartilhar via


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:

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

  2. Bifurcar a mídia: bifurque o fluxo de áudio para os gravadores da inteligência de conversa usando um protocolo SIPREC.

  3. 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:

Diagrama representando o fluxo de integração

Etapa 1: Registrar o provedor

  1. Crie um aplicativo da ID do Microsoft Entra.

  2. Adicione permissão de API para gravação de mídia:

    1. No aplicativo ID do Microsoft Entra criado por você, vá até Permissões de API.

    2. Selecione Adicionar permissão.

    3. Em APIs usadas pela organização, procure Gravação de Mídia do Dynamics 365 Sales e selecione: Captura de tela da opção Gravação de Mídia

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

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

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

  5. 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:

Captura de tela de uma comunicação de amostra 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.

  1. Faça logon como administrador do sistema no aplicativo Hub de Vendas.

  2. Na área Alterar, selecione Configurações do Sales Insights.

  3. Vá para Configurações globais>Inteligência de Conversa. Na seção Provedores de chamada, você verá o provedor de terceiros que registrou.

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

captura de tela 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:

Captura de tela da notificação para gravar chamadas

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.

Exibir e compreender a página de resumo da chamada