END - Finalizar Flow
O que é este Node?
O END é o node responsável por finalizar a execução do flow. Ele marca o ponto onde o processamento termina e, opcionalmente, pode enviar uma mensagem de despedida ao usuário.
Por que este Node existe?
Todo sistema precisa de um ponto de término claro. O END existe para:
- Marcar o fim da execução: O sistema precisa saber quando parar de processar o flow
- Liberar recursos: Quando o END é atingido, o sistema pode limpar memória e conexões
- Enviar mensagem de encerramento: Opcionalmente, informar o usuário que a interação terminou
- Permitir múltiplos caminhos: Flows complexos podem ter vários ENDs para diferentes finais (sucesso, erro, cancelamento)
Sem o END, o flow ficaria "pendurado" sem saber quando terminar.
Como funciona internamente?
Quando o END é executado, o sistema:
- Verifica se há mensagem: Se você passou o parâmetro
messageouendMessage - Envia a mensagem (se houver)
- Registra o término: Salva timestamp e status de conclusão
- Encerra a execução: Para o processamento do flow
- Libera recursos: Limpa contexto, variáveis temporárias, etc.
- Retorna resultado final: Indica sucesso ou falha
Código interno (basic-flow-executor.service.ts:114-139):
private async executeEnd(parameters: any, context: any): Promise<any> {
const { message, endMessage } = parameters;
this.logger.log(`🔴 END - Flow execution completed`);
const result: any = {
success: true,
data: {
action: 'flow_ended',
timestamp: new Date().toISOString(),
flowId: context.flowId || 'unknown'
}
};
// Add message only if provided
const finalMessage = message || endMessage;
if (finalMessage) {
result.data.message = finalMessage;
result.data.messageType = 'text';
}
return result;
}
Quando você DEVE usar este Node?
SEMPRE! Todo flow PRECISA ter pelo menos UM node END.
Casos de uso:
- Fim único: Flow linear com um só caminho de saída
- Múltiplos fins: Flow com branches (if/else) onde cada caminho tem seu END
- Fim com mensagem: Despedir-se do usuário
- Fim silencioso: Terminar sem mensagem adicional
Parâmetros Detalhados
message (string, opcional)
O que é: Mensagem de texto enviada ao usuário antes de finalizar o flow.
Por que usar: Dar feedback final, agradecer, ou informar próximos passos.
Quando NÃO usar: Se já enviou mensagem de despedida em node MESSAGE anterior.
endMessage (string, opcional)
O que é: Alternativa ao message (mantida por compatibilidade com versões antigas).
Diferença: Funciona igual ao message. Se ambos forem fornecidos, message tem prioridade.
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| message | string | Não | Mensagem final (opcional) |
| endMessage | string | Não | Mensagem final alternativa (compatibilidade) |
Exemplo 1: Flow Completo Básico
Objetivo: Flow simples com início, mensagem e fim
JSON para Importar
{
"name": "Flow Completo Básico",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "message_1",
"type": "message",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Mensagem Principal",
"parameters": {
"message": "Processamento realizado com sucesso!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Fim",
"parameters": {
"message": "Obrigado por usar nosso sistema!"
}
}
}
],
"edges": [
{ "source": "start_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Exemplo 2: END sem Mensagem
Objetivo: Finalizar flow sem mensagem adicional
JSON para Importar
{
"name": "Flow End Silencioso",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "message_1",
"type": "message",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Única Mensagem",
"parameters": {
"message": "Dados salvos!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Fim Silencioso"
}
}
],
"edges": [
{ "source": "start_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Exemplo 3: Múltiplos Fins (Diferentes Caminhos)
Objetivo: Flow com 2 caminhos que terminam diferente
JSON para Importar
{
"name": "Flow Múltiplos Fins",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 200 },
"data": { "label": "Início" }
},
{
"id": "message_1",
"type": "message",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Caminho Sucesso",
"parameters": {
"message": "✅ Operação bem-sucedida!"
}
}
},
{
"id": "message_2",
"type": "message",
"position": { "x": 300, "y": 300 },
"data": {
"label": "Caminho Erro",
"parameters": {
"message": "❌ Ocorreu um erro!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Fim Sucesso",
"parameters": {
"message": "Até logo!"
}
}
},
{
"id": "end_2",
"type": "end",
"position": { "x": 500, "y": 300 },
"data": {
"label": "Fim Erro",
"parameters": {
"message": "Tente novamente mais tarde."
}
}
}
],
"edges": [
{ "source": "start_1", "target": "message_1" },
{ "source": "start_1", "target": "message_2" },
{ "source": "message_1", "target": "end_1" },
{ "source": "message_2", "target": "end_2" }
]
}
Exemplo 4: END com Variáveis
Objetivo: Mensagem final personalizada com variáveis
JSON para Importar
{
"name": "Flow End Personalizado",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "message_1",
"type": "message",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Processar Dados",
"parameters": {
"message": "Processando pedido #12345..."
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Finalizar",
"parameters": {
"message": "Pedido concluído! Flow ID: {{flowId}}"
}
}
}
],
"edges": [
{ "source": "start_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Resposta do Node
{
"success": true,
"data": {
"action": "flow_ended",
"timestamp": "2025-01-15T10:35:00.000Z",
"flowId": "flow_123",
"message": "Obrigado por usar nosso sistema!",
"messageType": "text"
}
}
Se o END não tiver mensagem:
{
"success": true,
"data": {
"action": "flow_ended",
"timestamp": "2025-01-15T10:35:00.000Z",
"flowId": "flow_123"
}
}
Como Importar
- Copie o JSON do exemplo
- Vá em Flow Builder → Importar
- Cole o JSON
- Clique em Importar
- Pronto! Flow criado
Testar o Flow
- Clique em Executar
- Veja as mensagens sendo enviadas
- Flow termina automaticamente no END
- Veja o resultado final
Diferença: message vs endMessage
O END aceita dois parâmetros para compatibilidade:
message- Forma padrãoendMessage- Forma alternativa (legado)
Se ambos forem passados, message tem prioridade.
{
"parameters": {
"message": "Esta mensagem será usada"
}
}
Boas Práticas
✅ SIM: - Todo flow DEVE ter pelo menos um END - Use mensagem final para feedback ao usuário - Flows com múltiplos caminhos podem ter múltiplos ENDs
❌ NÃO: - Não deixe flow sem END - Não conecte END a outro node (ele é sempre o último)
Dicas
💡 Múltiplos fins: Use ENDs diferentes para caminhos de sucesso/erro
💡 Mensagem opcional: Pode omitir mensagem se já enviou antes
💡 Flow ID: Use {{flowId}} na mensagem para debug
Próximo Node
→ INPUT - Capturar entrada do usuário → START - Voltar para início