---
title: Ciclo de Vida do Fluxo
slug: helper-plus/ciclo-de-vida-do-fluxo
description: Learn how to utilize the Dialogue Engine in Botpress for building chatbot conversations. Discover the essential components such as flows, nodes, and actions. Dive into the concept of transitions and states in chatbot frameworks, as well as session timeout
createdAt: 2022-08-29T12:44:31.000Z
---

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.

![](https://api.archbee.com/api/optimize/pu5VMc-2TW3GQX4ly5Xp7/HzA3sKl8c-CmPgw9iTpTC_image.png)

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

:::hint{type="info"}
🖊️ <u>**Nota**</u>**:&#x20;**&#x41;tualmente, 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&#x20;**&#x61;tiva (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&#xA0;**(A), **onReceive** (B) e **onNext&#xA0;**(C).

![](https://api.archbee.com/api/optimize/pu5VMc-2TW3GQX4ly5Xp7/val_7_m0YwSyJ87_Nq_u1_image.png)

### 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`*.

![](https://api.archbee.com/api/optimize/pu5VMc-2TW3GQX4ly5Xp7/kEb4pWiNTzH78y-5rxTtR_image.png)

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

:::hint{type="info"}
🖊️ <u>**Nota**</u>**:**
**Casos especiais:&#xA;**&#x31;. Se nenhuma condição for definida, o comportamento padrão será o fim da conversa.
2\. Se houver condições definidas, mas nenhuma corresponder, nada acontecerá. O nó atual permanece ativo e fluirá quando uma condição for correspondida. Por padrão, o *onNext* só será repetido após *onReceive&#x20;*&#x73;er invocado novamente.
:::

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.

![](https://api.archbee.com/api/optimize/pu5VMc-2TW3GQX4ly5Xp7/w-34rFSohxnlaKHGLNGGN_image.png)

:::hint{type="info"}
🖊️ <u>**Nota**</u>**:**

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. 

:::BlockQuote
<u>**Por exemplo**</u>, é possível salvar as informações de contato do usuário em um banco de dados externo ou informar ao usuário como entrar em contato consigo ou informar ao usuário que sua sessão expirou.
:::

## 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 `*&#x65; 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. 

:::BlockQuote
<u>**Por exemplo**</u>, é possível salvar as informações de contato do usuário em um banco de dados externo ou informar ao usuário como entrar em contato consigo ou informar ao usuário que sua sessão expirou.
:::

:::hint{type="warning"}
⚠ <u>**Atenção**</u>**!**
Depois que o mecanismo de diálogo tiver processado o tempo limite, excluirá a sessão.
:::

## Ações

Uma **ação&#xA0;**&#xE9; 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:

- <u>**Script**</u>**:&#x20;**&#x75;ma ação definida pelo usuário que é usada para executar um código personalizado.
- <u>**Saída**</u>**:&#x20;**&#x75;ma ação de saída que é usada para fazer um chatbot produzir algo.

:::hint{type="info"}
🖊️ <u>**Nota**</u>**:**

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

1. Instale o módulo de habilidade desejado;
2. Navegue até o fluxo selecionado;
3. Localize a barra de ferramentas Inserir habilidade à esquerda da interface do construtor de fluxo;
4. Selecione sua habilidade;
5. Preencher o formulário;
6. Clique em qualquer lugar no fluxo para inserir a habilidade.

![](https://api.archbee.com/api/optimize/pu5VMc-2TW3GQX4ly5Xp7/FdFDMmiWdDG-A29-KFnnv_image.png)

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

![](https://api.archbee.com/api/optimize/pu5VMc-2TW3GQX4ly5Xp7/4fxG7PHv0p6FQsFuyLnAh_image.png)

:::hint{type="info"}
🖊️ <u>**Nota**</u>**:**<u>****</u>
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*.
:::
