Eventos externos

Você pode definir tipos de evento de aplicativo (com base em eventos produzidos por aplicativos externos) e permitir que os usuários de seus assistentes digitais sejam notificados quando eventos desses tipos forem passados para o assistente digital.

Esses tipos de evento devem seguir a especificação Cloud Events, que define formatos comuns para dados de evento para torná-los interoperáveis entre serviços, plataformas e sistemas. Você pode ler sobre essa especificação em https://cloudevents.io/.

Workflow para Implementar um Evento do Aplicativo

  • Identifique a origem do evento.
  • No Digital Assistant, registre o tipo de evento.
  • Configure uma habilidade para consumir eventos desse tipo de evento e adicionar essa habilidade a um assistente digital.
  • Crie um canal de Eventos e mapeie-o para o assistente digital.
  • No canal Eventos criado, obtenha o URL de entrada e a chave secreta e disponibilize-os para o aplicativo externo que gera os eventos.
Observação

A habilidade que consome o evento pode fazer parte de vários assistentes digitais.

Definir um Tipo de Evento

Para que uma habilidade possa receber um evento de Nuvem, um tipo de evento deve ser definido no Oracle Digital Assistant. Para definir um tipo de evento:

  1. Clique em ícone para abrir o menu lateral para abrir o menu lateral, selecione Desenvolvimento > Eventos, clique em Novo Evento e informe um nome para o tipo de evento.

    Dica:

    Você deve usar uma convenção de nomenclatura para os tipos de evento para dar a eles um contexto significativo para ajudar outros desenvolvedores a entender o que eles fazem. Um exemplo simples é pizza.order para um tipo de evento para pedidos de pizza.
  2. Na página do novo evento recém-criado, preencha uma descrição.
  3. No campo Esquema JSON, informe o esquema do evento.

    O campo é pré-preenchido com um esquema de exemplo que contém elementos obrigatórios.

    • O atributo schema pode ter um dos seguintes valores:
      • "http://json-schema.org/draft-04/schema#"
      • "http://json-schema.org/draft-06/schema#"
      • "http://json-schema.org/draft-07/schema#"
      • "http://json-schema.org/draft/2019-09/schema#"
    • No objeto properties, você define propriedades como pares de chave/valor, em que o valor é um esquema com o qual a propriedade é validada.

      Por exemplo :

      "properties": {
          "firstName": {
            "type": "string",
            "description": "The person's first name."
          },
          "lastName": {
            "type": "string",
            "description": "The person's last name."
          },
          "age": {
            "description": "Age in years which must be equal to or greater than zero.",
            "type": "integer",
            "minimum": 0
          }
        }

      Consulte https://json-schema.org/understanding-json-schema/reference/object.html para obter mais informações sobre como definir essas propriedades.

  4. Quando terminar o trabalho no esquema e quiser congelar seu conteúdo, clique em Marcar como Finalizado.

    Nesse ponto, você pode usar esse tipo de evento em uma habilidade.

    Se, posteriormente, você determinar que precisa alterar o esquema, poderá criar uma nova versão dele.

Exemplo: Esquema do Tipo de Evento da Nuvem

{
   "$schema":"http://json-schema.org/draft-07/schema#",
   "description":"Pizza Order Schema",
   "title":"Pizza Order Schema",
   "type":"object",
   "properties":{
      "size":{
         "description":"The pizza size",
         "type":"string"
      },
      "orderid":{
         "description":"The pizza orderid",
         "type":"string"
      },
      "type":{
         "description":"The pizza type",
         "type":"string"
      },
      "topping":{
         "description":"The pizza topping",
         "type":"string"
      }
   }
}

Configurar uma Habilidade para Consumir um Evento

Estas são as etapas gerais que você precisa seguir para que uma habilidade consuma um evento:

  1. Em uma habilidade, crie um fluxo com o componente Notificar Usuário para consumir o evento. (Este componente só está disponível para fluxos de caixas de diálogo desenvolvidos no modo Visual.)

    No runtime, quando o evento é gerado, ele é passado para a habilidade. Você pode usar expressões para acessar os dados e o contexto do evento.

  2. Se você estiver projetando o tipo de evento para direcionar usuários autenticados específicos (com IDs de usuário do domínio de identidades do OCI IAM), certifique-se de que a habilidade tenha uma Autorização usando o componente OAuth 2.0 e que você tenha vinculação de conta de canal ativada.
  3. No Fluxo Principal do fluxo de caixas de diálogo, crie um mapeamento de Evento de Aplicativo entre o evento e o fluxo que contém o estado Notificação do Usuário para o evento.
  4. Adicione a habilidade a um assistente digital.

Criar uma Notificação do Usuário para o Evento

Para que a habilidade responda ao evento, adicione um fluxo para esse evento e use um estado Notificar Usuário para exibir uma mensagem quando o evento ocorrer:

  1. Na habilidade que você deseja usar o evento, clique em Ícone Fluxos e, em seguida, clique em + Adicionar Fluxo.
  2. Digite um nome de fluxo e clique em Criar.
  3. Clique no menu O ícone do menu Adicionar Estado. no início do fluxo e, em seguida, clique em Adicionar Estado Inicial para abrir a caixa de diálogo Adicionar Estado.
    A opção Adicionar estado de início.

  4. Selecione Integração de Serviço > Notificar Usuário, preencha um nome para o estado e clique em Inserir.
  5. No inspetor de propriedades do estado Notificar Usuário inserido, selecione a guia Componente e preencha o campo Mensagem de Notificação com uma mensagem que você deseja que o usuário veja quando o evento ocorre.

    Na mensagem, você pode usar expressões no seguinte formato para acessar dados do evento:

    ${skill.system.event.value.application.data.<propertyName>}
    Observação

    Você também pode acessar informações de contexto do evento usando o seguinte tipo de expressão:
    ${skill.system.event.value.application.context.<attributeName>}
    Consulte Atributos de Contexto do Evento para obter informações sobre os atributos de contexto disponíveis.
  6. Opcionalmente, preencha a propriedade ID do Usuário com um ID para um usuário específico que você pode determinar dinamicamente de dentro do fluxo (como por meio de um componente personalizado). Essa propriedade será útil principalmente se o ID do usuário não for enviado no payload do evento e se o usuário for um usuário unificado que foi autenticado por meio de uma Autorização usando o componente OAuth 2.0 em que a propriedade Associar ao Usuário Unificado foi definida como verdadeira. Consulte Configurando a Identidade do Usuário Unificado para obter mais informações sobre usuários unificados.

Determinar o Recebedor do Evento a partir do Fluxo

Se o evento precisar ser direcionado a um usuário específico, mas esse usuário não for especificado no próprio evento, talvez seja possível determinar o usuário no fluxo que trata o evento. Estas são as etapas gerais para fazer esse trabalho:

  1. No início do fluxo que trata o evento, adicione um componente personalizado que determine o ID do usuário (com base na carga útil do evento e/ou em alguma lógica personalizada) e atribua esse ID a uma variável.
  2. Após o estado do componente personalizado, insira um componente Notificar Usuário e defina a propriedade ID do Usuário desse componente para a variável retornada pelo componente personalizado.

Criar um Identificador para o Evento Externo

Para que uma habilidade receba um evento, você cria um handler de eventos para esse evento no Fluxo Principal. No processador de eventos, mapeie o evento para o fluxo que contém o estado Notificar Usuário que você criou para receber o evento:

  1. Na lista de fluxos, selecione Fluxo Principal.
  2. Na guia Eventos desse fluxo, ao lado da seção Eventos de Aplicativo, clique em Ícone Adicionar Evento de Aplicativo.
  3. Na caixa de diálogo Criar Handler de Eventos do Aplicativo, selecione o tipo de evento, a versão do tipo de evento e o fluxo para o qual você deseja mapear o evento e clique em Fechar.
    Observação

    Somente tipos de evento finalizados são oferecidos no campo Tipo de Evento Não Resolvido.

Adicionar a habilidade a um assistente digital

Para que uma habilidade consuma um evento externo, ela deve fazer parte de um assistente digital. Para adicionar uma habilidade configurada para consumir um evento em um assistente digital:

  1. Clique em ícone para abrir o menu lateral para abrir o menu lateral, selecione Development > Digital Assistants e clique duas vezes no assistente digital que você deseja usar.
  2. Clique em Adicionar Habilidade.

  3. No mosaico da habilidade configurada para consumir o evento, selecione caixa de seleção para adicionar qualificação .

    Se você não encontrar a habilidade que está procurando, ela poderá ter um modo de idioma que não seja compatível com o modo de idioma do seu assistente digital. Consulte Condições para Adicionar uma Habilidade a um Assistente Digital.

  4. Clique no botão Concluído para fechar o Catálogo de Habilidades e exibir a página da habilidade no assistente digital.
  5. Role para baixo até a seção Modelo de Interação da página e certifique-se de que o valor Chamada seja o nome que você deseja que os usuários utilizem para chamar a habilidade.

    Esse nome deve seguir estas Diretrizes de Nome de Chamada.

  6. Forneça alguns exemplos de declarações que seriam típicas de como um usuário chamaria a habilidade.

    Essas declarações serão usadas como opções selecionáveis nos estados de boas-vindas e ajuda padrão do assistente digital.

Dica:

Clique em Validar e verificar as mensagens de validação para obter as declarações compartilhadas pelas habilidades registradas no seu assistente digital.

Criar um Canal para o Aplicativo Externo

Crie um canal de aplicativos para permitir que o aplicativo externo envie eventos para o Digital Assistant. Após a criação do canal, o serviço Digital Assistant designará uma chave secreta e um URL de entrada. Você precisa usar esses valores no aplicativo que gera o evento.

  1. No Digital Assistant, clique em Canais no menu esquerdo e selecione Eventos.
  2. Clique em Adicionar Canal.
  3. No campo Nome do Canal, digite um nome exclusivo para o canal.
  4. (Opcional) No campo URL do Aplicativo de Saída, digite um URL de serviço Web para o qual você deseja que qualquer mensagem de erro relacionada ao canal seja enviada por meio de uma solicitação POST.

    Se ocorrer um erro, como um problema ao iniciar uma conversa por meio do canal do usuário, o Digital Assistant enviará uma mensagem de erro como um evento do Cloud e os dados do evento conterão os atributos code e message que descrevem o erro. Por exemplo :

    {
      "code": "InvalidParameter",
      "message": "The event contains invalid or missing attributes: firstName"
    }
  5. Clique em Criar.
  6. Alterne Aplicativo Ativado para Ativado.
  7. Na lista drop-down Rota para, selecione o assistente digital que contém a habilidade que tem o fluxo para consumir o evento.
  8. Anote a chave secreta e o URL de entrada.

    Eles serão necessários pelo aplicativo externo que gera os eventos. O aplicativo externo envia mensagens enviando a solicitação POST para o URL de entrada e usa a chave secreta para autenticar suas solicitações POST.

Gerar um Evento com Base em um Aplicativo Externo

Para enviar eventos para um assistente digital de um aplicativo externo, o aplicativo deve criar uma solicitação POST para o URL de entrada do canal de eventos em que:
  • Há um cabeçalho X-Hub-Signature contendo um hash SHA-256 do corpo da solicitação usando a chave secreta do canal da aplicação. Por exemplo :
    X-Hub-Signature: sha256=<HMAC SHA-256 signature of body using the secret key for the channel>
  • O tipo de conteúdo é application/cloudevents+json.

O payload do evento pode estar em um formato estruturado (em que todos os atributos fazem parte do JSON no corpo HTTP) ou em formato binário (em que os atributos de contexto do evento estão presentes no cabeçalho com o prefixo ce-). Para saber mais sobre esses formulários, consulte https://github.com/cloudevents/spec/blob/v1.0/http-protocol-binding.md#3-http-message-mapping.

Formulário Estruturado para Envio de Eventos

O exemplo a seguir mostra o uso de formulário estruturado para enviar eventos:

curl --location --request POST 'https://<server>/events/v2/listeners/appevent/channels/<id>' \
--header 'Content-Type: application/cloudevents+json' \
--header 'X-Hub-Signature: sha256=<SHA256 encoded request body using the channel's secret key>' \
--data-raw \

'{
    "specversion": "1.0",           //Version # of Digital Assistant's Events support
    "type": "<event_name>",         //The event type that the skill is listening for
    "source": "< event source>",    //URI-reference - identifies the context in which an event happened
    "id": "<event id>",             //Unique id for the event
    "version":"<event version>",    //An extension attribute(not part of CloudEvent spec) for the version # of the event type
    "data": {                       //The business data that matches with the schema defined for the event  
           
          }
}'

Formulário para envio de eventos em Node.js

async pushEvent(eventName, eventVersion, userId, channelName, eventData){
  try {

    // Build event data
    const event = {
      specversion: "1.0",           //Version # of Digital Assistant's Events support
      type: eventName, // Name of Event you created in ODA
	  source: "< event source>",    //URI-reference - identifies the context in which an event happened
      id: "<event id>",             //Unique id for the event
      time: "2022-09-07T21:19:24Z", // Any Date value will do now
      channelname: <channelName>,   // Can be set to System_Global_Test if you want to test in tester
      version: <eventVersion>, // version of the event that you defined in Digital Assistant
      userid: <userId>,
      datacontenttype: "application/json",
      data: <eventData> // JSON object represting your payload which should confirm to the event's JSON schema
    };

    // Build Required headers
    const headers = {
      "X-Hub-Signature" : this._buildSignatureHeader(event, <EVENTS_CHANNEL_SECRET_KEY> , "utf8"),
      "Content-Type" : "application/cloudevents+json"
    };

    // POST to EVENT_LISTENER_CHANNEL_URL
    ....
    
  } catch (error) {
    logger.error(error.message);
    const errorMessage = `Error pushing event [ ${eventData} ] to Digital Assistant`;
    logger.debug(errorMessage);

    throw new Error(error.message);	
  }
}



_buildSignatureHeader(body, secret, encoding) {
  const buf = Buffer.from(JSON.stringify(body), "utf8");
  return "sha256=" + this._buildSignature(buf, secret, encoding);
}

_buildSignature(buf, secret, encoding) {
  const hmac = crypto.createHmac("sha256", Buffer.from(secret || "", encoding || "utf8"));
  if (buf) {
    hmac.update(buf);
  }
  return hmac.digest("hex");
}

Atributos de Payload do Evento

Estes são atributos comuns que você pode usar em um payload de evento:

  • specversion: (Obrigatório) Número da versão do suporte a Eventos do Digital Assistant. Atualmente, o único valor válido é 1.0.
  • type: (Obrigatório) O tipo de evento que a habilidade está atendendo. Isso precisa corresponder ao nome do tipo de evento especificado na tarefa Definir um Tipo de Evento.
  • source: (Obrigatório) Identifica o contexto no qual um evento ocorreu. Pode ser uma string de formato livre.
  • id: (Obrigatório) O ID exclusivo que é gerado para o evento pelo aplicativo.
  • version: (Obrigatório) O nome da versão do tipo de evento que está sendo enviado. Você deve incluir um valor para esse atributo na carga útil do evento e ele deve corresponder ao valor fornecido para a versão do tipo de evento fornecida na tarefa Criar um Handler para o Evento Externo.
    Observação

    Este atributo é um dos atributos de extensão, o que significa que ele não faz parte da especificação CloudEvent.
  • data: (Obrigatório) Os dados de negócios que correspondem ao esquema definido para o evento.

Atributos de Contexto de Evento

Para cada evento gerado, o Digital Assistant adiciona atributos de extensão que descrevem o contexto no qual o evento é gerado. Ferramentas e códigos de aplicativos podem usar essas informações para identificar itens como a origem dos eventos gerados e seu relacionamento com outros eventos. Você também pode especificar valores para esses atributos na carga útil do evento.

Veja a seguir uma lista dos atributos de extensão (todos do tipo String):

  • version: O nome da versão do tipo de evento que está sendo enviado. Você deve incluir um valor para esse atributo na carga útil do evento e ele deve corresponder ao valor fornecido para a versão do tipo de evento fornecida na tarefa Criar um Handler para o Evento Externo.
  • userid: O ID do usuário ao qual a mensagem está sendo direcionada. Pode assumir uma das seguintes duas formas:
    • Um ID de usuário do OCI IAM. Nesse caso, você também precisa incluir o atributo usertenancy no payload.
    • Um ID de usuário fornecido pelo canal. Nesse caso, você também precisa incluir o atributo channelname no payload.
      Observação

      Para o Twilio, esse valor seria o número do celular do usuário.
  • usertenancy: O nome da tenancy do OIC IAM do provedor de identidades do usuário.
  • channelname: O nome do canal por meio do qual o assistente digital é exposto.
  • tenancy: O nome da tenancy do Oracle Cloud Infrastructure para a instância do Digital Assistant. (Normalmente, você não precisaria incluir explicitamente esse atributo, pois as informações sobre a tenancy são transmitidas nos cabeçalhos de solicitação.)

Exemplo: Payload do Evento

{
    "specversion": "1.0",
    "type": "com.pizzastore.pizza.ordercreated",
    "source": "pizzastore/orders",
    "id": "12345678-90ab-cdef-1234-567890abcdef",
    "time": "2022-08-10T12:31:00Z",
    "contenttype": "application/json",
    "tenancy": "mydigitalassistantinstance",
    "version": "1.0",
    "data": {"size": "Large",
            "type": "Veg"
          }
}

Exemplo: Payload com ID de Usuário do OCI IAM

Se precisar informar o ID de usuário do OCI IAM para o usuário no payload, você também especificará os atributos userid e usertenancy:

{
    "specversion": "1.0",           //Version # of Digital Assistant's Events support
    "type": "<event_name>",         //The event type that the skill is listening for
    "source": "< event source>",    //URI-reference - identifies the context in which an event happened
    "id": "<event id>",             //Unique id for the event
    "version":"<event version>",    //An extension attribute(not part of CloudEvent spec) for the version # of the event type
    "userid":"<IAM user id>",      //An extension attribute(not part of CloudEvent spec) for the user ID  
    "usertenancy":<IAM tenancy>",  //Extension attribute, IAM
    "data": {                       //The business data that matches with the schema defined for the event  
           
          }
}
Observação

Se o evento for projetado para informar o ID de usuário do OCI IAM em seu payload, certifique-se de que a habilidade tenha uma Autorização usando o componente OAuth 2.0 e que sua propriedade Associar ao Usuário Unificado esteja definida como Verdadeiro.

Exemplo: Payload com ID de Usuário e Nome do Canal

Para assistentes digitais expostos por meio dos canais Twilio e Web, o aplicativo externo também pode notificar os usuários especificando o nome do canal e o ID do usuário fornecido pelo canal.

{
    "specversion": "1.0",            //Version # of Digital Assistant's Events support
    "type": "<name_of_event_type>",  //The event type that the skill is listening for
    "source": "< event source>",     //URI-reference - identifies the context in which an event happened
    "id": "<event id>",              //Unique id for the event
    "version":"<event version>",     //An extension attribute(not part of CloudEvent spec) for the version # of the event type
    "userid":"<channel user id>",    //An extension attribute(not part of CloudEvent spec) for the user ID
    "channelname":"<channel name>",  //Name of the channel through which the digital assistant is exposed
    "data": {                        //The business data that matches with the schema defined for the event  
           
          }
}

Publicar um Evento de uma Habilidade

Além de consumir eventos externos em uma habilidade, você pode usar a habilidade para publicar eventos de tipos registrados no Oracle Digital Assistant em um aplicativo externo. Você pode fazer isso com o componente Publicar Evento (na categoria Integração de Serviço). Quando um evento é gerado dessa forma, ele é publicado no URL especificado no URL do Aplicativo de Saída especificado no canal do aplicativo externo.