Ciclo de Vida do Fluxo
O Botpress usa o que chamamos de Mecanismo de Diálogo para lidar com as conversas, que é responsável por cada interação. Ele lida com a entrada do usuário e a resposta do chatbot.
O mecanismo de diálogo usa fluxos que representam a lógica geral de conversação de um chatbot. Um fluxo é então composto de nós que executam uma série de instruções. As instruções fazem parte de um ciclo de vida do Node e podem executar ações.
Uma ação é um trecho de código, geralmente código que você mesmo escreveu, código fornecido pelo Botpress ou outros.
Fluxos
Um fluxo de trabalho permite dividir um chatbot complexo em vários fluxos menores. Dividir o chatbot em vários fluxos facilita a manutenção e é possível reutilizar esses fluxos ao criar outros fluxos de trabalho ou até mesmo outros chatbots.
Vamos dar uma olhada no nosso bot de suporte do Botpress Blitz. Podemos adicionar três fluxos para lidar com problemas, tíquetes e solução de problemas.

Ciclo de Vida do Fluxo
Um fluxo sempre começa no início startNodede seu *.flow.jsonarquivo, sendo o fluxo Principal o primeiro a ser executado no início de cada conversa. O nó inicial aponta para o nó que deve ser executado primeiro pelo nome. Uma vez que o nó é selecionado, o Mecanismo de Diálogo enfileirará as instruções do nó ativo e executará as instruções sequencialmente.
O mecanismo de diálogo é baseado em eventos e não é bloqueante por padrão, o que significa que um fluxo executará tudo o que puder gerenciar até precisar esperar.
🖊️ Nota: Atualmente, existem dois motivos para um fluxo aguardar:
- Um nó é marcado como aguardando entrada do usuário;
- Um nó não pode corresponder a uma condição para fazer a transição para outro nó;
- Um nó não possui instrução de transição.
Depois que o primeiro nó for processado, o mecanismo de diálogo prosseguirá para o próximo nó no fluxo até chegar ao final. Os fluxos são bastante simples. Os nós também têm um ciclo de vida próprio. Eles fazem o trabalho pesado em um fluxo.
Armazenamento
Os fluxos são armazenados como arquivos JSON nos arquivos de origem do chatbot. No contexto deste tutorial, os fluxos são armazenados na data/bots/blitz/flows/pasta. Cada fluxo é dividido em dois arquivos: a lógica (*.flow.json) e as propriedades visuais específicas (*.ui.json). O motivo para dividi-los é facilitar a manutenção e a revisão das alterações.
- *.ui.json os arquivos quase sempre podem ser ignorados nas revisões de código, pois não agetam a funcionalidade do chatbot.
- *.flow.json os arquivos também poderiam, em teoria, ser criados manualmente pelos desenvolvedores em vez de usar a GUI. Este é o caso das Habilidades, que serão abordadas adiante.
Nós
Os nós são as unidades primárias da lógica conversacional do seu chatbot. Uma conversação ativa (que chamamos de sessão) sempre tem um e apenas um nó ativo. Um nó geralmente faz a transição para outro nó ou fluxo. Quando não houver mais transições, a conversa termina. A seguinte mensagem do usuário fará parte de uma sessão totalmente nova.
Um nó é separado em três estágios diferentes: onEnter (A), onReceive (B) e onNext (C).

OnEnter
onEnter é uma lista de instruções executadas quando o nó é inserido. Se várias ações forem definidas, seu chatbot executará todas elas sequencialmente.
OnReceive
onReceive é uma lista de instruções executadas quando o nó recebe uma mensagem do usuário enquanto ele está ativo. Assim que uma ação for definida, o nó estará automaticamente aguardando a entrada do usuário (nó laranja).
Quando esta propriedade é deixada sem uso, o nó é não bloqueante (preto), o que significa que fluirá direto do onEnter para o onNext.

OnNext
onNext (também chamado de Transitions) é exatamente a mesma coisa que Flow-wide Transitions, exceto que as condições são avaliadas apenas após onReceive ou onEnter serem executadas.
Uma Transition sempre tem um alvo que chamamos de Destination. Pode ser:
- Um nó diferente;
- Um fluxo diferente;
- O fluxo anterior;
- Em si (loopback em si);
- O fim da conversa.
Estado
Cada conversa tem um estado associado. O estado é criado quando a sessão de conversação é iniciada e é destruído quando a sessão é encerrada.
Um estado é criado antes que o nó de entrada seja inserido.

🖊️ Nota:
O estado é global para a conversa, portanto, se a conversa abranger vários fluxos, todos eles compartilharão o mesmo estado.
Tempo Limite da Sessão
O mecanismo de diálogo aguardará a entrada de um usuário. Depois de um tempo, se o usuário não responder, a sessão terá Timeout.
O tempo limite permite encerrar a conversa normalmente, se necessário. Também pode ser útil fazer algum processamento antes de excluir a sessão.
Fluxo de Tempo Limite
É possível utilizar um fluxo de tempo limite para lidar com sua lógica de tempo limite. Funciona como um fluxo regular. Adicione um Flow chamado timeout.flow.json ao seu chatbot e especificar um nó inicial.
Em seguida, o mecanismo de diálogo detectará seu fluxo de tempo limite na próxima vez que um usuário atingir o tempo limite.
Nó de Tempo Limite
Muito semelhante ao Timeout Flow, o Timeout Node deve ser chamado timeout e deve pertencer ao fluxo atual. Não é necessário vinculá-lo a nenhum outro nó. O mecanismo de diálogo detectará o nó com base em seu nome.
Transição de Tempo Limite
Outra opção que requer alguma codificação é adicionar a propriedade timeout Node ao seu *.flow.json arquivo e atribuí-la ao nome do nó que deve lidar com o tempo limite. Novamente, pode ser qualquer nó; ele não precisa ser chamado de uma maneira O mecanismo de diálogo aguardará a entrada de um usuário.
Depois de um tempo, se o usuário não responder, a sessão terá Timeout.
O tempo limite permite encerrar a conversa normalmente, se necessário. Também pode ser útil fazer algum processamento antes de excluir a sessão.
⚠ Atenção! Depois que o mecanismo de diálogo tiver processado o tempo limite, excluirá a sessão.
Ações
Uma ação é um código JavaScript que é executado em uma Node.jsVM. Pode ser o que desejar: chamar uma API, armazenar algo no banco de dados ou armazenar algo no Key-value Store. As ações são chamadas por onEnter e onReceive instruções. Existem dois tipos de ações:
- Script: uma ação definida pelo usuário que é usada para executar um código personalizado.
- Saída: uma ação de saída que é usada para fazer um chatbot produzir algo.
🖊️ Nota:
Para saber mais sobre Ações, consulte a seção Editor de código
Habilidades
Depois de criar alguns fluxos e bots, será notado rapidamente que existem alguns padrões comuns que são implementados repetidamente. Assim, as habilidades vêm à ajuda.
As habilidades são abstrações de nível superior sobre fluxos que servem como geradores de fluxo dinâmico. Podem ser vistos como componentes reutilizáveis entre vários fluxos ou até vários chatbots.
Habilidades de Instalação
Um módulo deve expor todas as habilidades. Os módulos podem hospedar qualquer número de habilidades. Instale o módulo necessário e terá acesso às suas habilidades.
Usando habilidades
As habilidades devem ser usadas pela GUI do Botpress Flows. Depois
- Instale o módulo de habilidade desejado;
- Navegue até o fluxo selecionado;
- Localize a barra de ferramentas Inserir habilidade à esquerda da interface do construtor de fluxo;
- Selecione sua habilidade;
- Preencher o formulário;
- Clique em qualquer lugar no fluxo para inserir a habilidade.

Persistência
As habilidades são armazenadas como fluxos na data/bots/your bot/flows/skillspasta. Os nós de habilidade na Interface do Studio têm o nome da habilidade anexado ao nome do nó, tornando-os facilmente identificáveis.
Habilidades de Edição
Depois que um nó de habilidade for gerado, clique sobre ele e em Editar no painel direito para editá-lo, o que atualizará o fluxo gerado automaticamente nos bastidores.

🖊️ Nota: Embora seja possível renomear sua habilidade para qualquer nome que desejar, é considerado uma prática recomendada anexar o tipo de habilidade ao nome do nó, por exemplo, choice-choose-topping.