Skip to content
mobius1qwe edited this page Nov 13, 2026 · 1 revision

Home > Chatbot > Conversa em etapas

Conversa em etapas (fluxo)

Important

Em desenvolvimento (2.0). Ainda não está numa versão lançada e pode mudar.

Nível: iniciante

Em uma frase: TRALChatFlow monta, só no Object Inspector, uma conversa que pergunta uma coisa de cada vez (nome, CPF, plano, e-mail), confere cada resposta e guarda tudo na sessão da conversa, sem um if no seu código.

Você vai precisar: o pacote RALModuleChatPackage e um robô com pelo menos um canal. Para retomar a conversa depois de reiniciar o programa, PersistFile no robô ou o TRALChatDBStore (abaixo).

Montando no Object Inspector

  1. Solte um TRALChatFlow no form e ligue Bot.
  2. StartCommand: o comando que começa a conversa, sem a barra (cadastro para /cadastro).
  3. Em Steps, uma etapa por pergunta:
etapa (Name) Prompt Validation outros
nome Qual é o seu nome? fvText
idade Prazer, {nome}! Quantos anos você tem? fvInteger
plano Qual plano? fvOptions Options: basico=Básico, pro=Pro; Branches: pro=email; NextStep: @end
email Para qual e-mail vai a nota? fvEmail
  1. FinishText: Pronto, {nome}! Plano {plano} contratado.

Um nome entre chaves no texto vira a resposta guardada com aquele nome.

Como a conversa anda

  • Cada resposta é conferida por Validation: texto, número inteiro, número (com ponto ou vírgula), e-mail, data (dia/mês/ano ou ano-mês-dia), uma das Options, expressão regular (Pattern), mídia, localização ou contato. Resposta inválida recebe ErrorText (ou um texto pronto para o tipo) e a mesma pergunta continua valendo.
  • Options viram botões; num canal sem botões, viram uma lista numerada e "2" vale como o segundo botão. Também vale escrever o id ou o texto da opção.
  • Depois da resposta, vai para a etapa de Branches (resposta=etapa), senão a de NextStep, senão a seguinte da lista. @end encerra.
  • As respostas ficam na sessão da conversa com o nome da etapa (ou Variable): leia em OnFinish com AContext.GetValue('email'), ou depois com Bot.Sessions.GetValue(canal, conversa, 'email').
  • Enquanto o fluxo roda numa conversa, as mensagens dela vão para ele e não para os comandos e o OnMessage do robô. As outras conversas seguem normais.

Saídas

  • CancelWords (padrão cancel; com ou sem barra) encerra: OnCancel com fsCancelled e CancelText.
  • Resposta depois de Timeout segundos (padrão 600): OnCancel com fsTimeout, TimeoutText, e a mensagem segue para o robô como se o fluxo não existisse.
  • MaxAttempts respostas inválidas seguidas (padrão 3): OnCancel com fsAttempts.
  • O próprio StartCommand no meio do fluxo recomeça do início.

Pelo código

procedure TForm1.FluxoAcabou(Sender: TObject; AContext: TRALChatFlowContext);
begin
  GravarCliente(AContext.GetValue('nome'), AContext.GetValue('email'));
end;

procedure TForm1.ConfereIdade(Sender: TObject; AContext: TRALChatFlowContext);
begin
  // a regra da aplicação por cima de fvInteger
  if AContext.Valid and (StrToInt(AContext.Answer) < 18) then
  begin
    AContext.Valid := False;
    AContext.ErrorText := 'Só para maiores de 18.';
  end;
end;
  • OnAnswer da etapa pode recusar (Valid), trocar a resposta (Answer) ou escolher a próxima etapa (NextStep); OnEnter muda a pergunta antes de ela sair.
  • Start(canal, conversa) começa o fluxo pela aplicação (um lembrete, por exemplo), e Cancel encerra; IsRunning e CurrentStep dizem onde a conversa está.

Reiniciar sem perder a conversa

A etapa em que cada conversa está fica nas sessões do robô. Com PersistFile no robô (um arquivo-diário gravado a cada mudança) ou com um TRALChatDBStore em Store, o programa que reinicia no meio continua da mesma pergunta.

Sessões no banco

TRALChatDBStore (pacote RALModuleChatDBPackage, requer o RALDBPackage) guarda as sessões numa tabela do banco de um TRALDBModule, e serve para várias instâncias do programa, em várias máquinas, atendendo o mesmo robô:

  FStore := TRALChatDBStore.Create(Self);
  FStore.DBModule := FBanco;           // o TRALDBModule: driver, conexão e pool
  FBot.Store := FStore;
  • A tabela (TableName, padrão ral_chat_store) é criada no primeiro uso (AutoCreate), em Firebird, PostgreSQL, MySQL ou SQLite.
  • O que expirou é apagado a cada PurgeEvery gravações, ou quando você chama Purge.
  • Serve também a qualquer outro uso de TRALKeyValueStore.

Erros comuns

sintoma causa o que fazer
"O fluxo ... não tem etapa chamada ..." NextStep ou Branches com um nome que não existe confira os nomes das etapas
o fluxo não começa StartCommand com a barra, ou Channels sem o canal escreva sem a barra
a conversa recomeça do zero depois de reiniciar sessões só na memória PersistFile ou TRALChatDBStore

Veja também

Começar

Servidor

MQTT 🚧

E-mail 🚧

Chatbot 🚧

Cliente

Motores

Avançado

Ajuda

🚧 = em desenvolvimento, pode mudar

Clone this wiki locally