Repository navigation
chatbot fluxo
Home > Chatbot > Conversa em etapas
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).
- Solte um
TRALChatFlowno form e ligueBot. -
StartCommand: o comando que começa a conversa, sem a barra (cadastropara/cadastro). - 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 |
-
FinishText:Pronto, {nome}! Plano {plano} contratado.
Um nome entre chaves no texto vira a resposta guardada com aquele nome.
- 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 dasOptions, expressão regular (Pattern), mídia, localização ou contato. Resposta inválida recebeErrorText(ou um texto pronto para o tipo) e a mesma pergunta continua valendo. -
Optionsviram 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 deNextStep, senão a seguinte da lista.@endencerra. - As respostas ficam na sessão da conversa com o nome da etapa (ou
Variable): leia emOnFinishcomAContext.GetValue('email'), ou depois comBot.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
OnMessagedo robô. As outras conversas seguem normais.
-
CancelWords(padrãocancel; com ou sem barra) encerra:OnCancelcomfsCancelledeCancelText. - Resposta depois de
Timeoutsegundos (padrão 600):OnCancelcomfsTimeout,TimeoutText, e a mensagem segue para o robô como se o fluxo não existisse. -
MaxAttemptsrespostas inválidas seguidas (padrão 3):OnCancelcomfsAttempts. - O próprio
StartCommandno meio do fluxo recomeça do início.
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;-
OnAnswerda etapa pode recusar (Valid), trocar a resposta (Answer) ou escolher a próxima etapa (NextStep);OnEntermuda a pergunta antes de ela sair. -
Start(canal, conversa)começa o fluxo pela aplicação (um lembrete, por exemplo), eCancelencerra;IsRunningeCurrentStepdizem onde a conversa está.
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.
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ãoral_chat_store) é criada no primeiro uso (AutoCreate), em Firebird, PostgreSQL, MySQL ou SQLite. - O que expirou é apagado a cada
PurgeEverygravações, ou quando você chamaPurge. - Serve também a qualquer outro uso de
TRALKeyValueStore.
| 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
|
Começar
Servidor
- Rotas e parâmetros
- Rotas avançadas: tipos, grupos, versões 🚧
- Ler o pedido e responder
- Objetos no corpo 🚧
- Resposta em fluxo 🚧
- Plugins 🚧
- Serviços (contêiner de dependências) 🚧
- Barramento de eventos 🚧
- Autenticação
- Banco de dados (DBWare)
- Servir site e arquivos
- JSON-RPC 2.0 🚧
- Servidor MCP (IA) 🚧
-
Protocol Buffers 🚧
- gRPC 🚧
- WebSocket 🚧
- Hubs (WebSocket) 🚧
- Swagger e Postman
- Servidor SOAP 🚧
- WS-Security 🚧
- HTTPS
- Criptografia ponto a ponto
- Segurança para produção
- Colocar no ar
- Desempenho
- Testes em memória 🚧
MQTT 🚧
- O que é e quando usar 🚧
- Cliente MQTT 🚧
- Broker MQTT 🚧
- MQTT-SN 🚧
- Ponte REST 🚧
- Segurança 🚧
- Rede ruim 🚧
E-mail 🚧
- Mensagens 🚧
- Enviar 🚧
- Receber 🚧
- Ler a caixa postal 🚧
- Verificar o que chega 🚧
- Servir caixas postais 🚧
- S/MIME 🚧
- OpenPGP 🚧
Chatbot 🚧
- O robô e os canais 🚧
- Telegram 🚧
- Gateways REST (WhatsApp não oficial) 🚧
- Discord 🚧
- Slack 🚧
- Microsoft Teams 🚧
- Conversa em etapas 🚧
Cliente
Motores
- Qual motor escolher?
- Compatibilidade
- Recursos
- QUIC
- Motor NgHttp2 (HTTP/2) 🚧
- Motor XSocket 🚧
- Motor AdvancedHTTP (experimental) 🚧
Avançado
Ajuda
- Problemas comuns
- Atualizar o Indy
- Várias versões do Delphi
- Vídeos e guias
- Módulos de terceiros
- Licenças
- Contribuir
- Roadmap e changelog
🚧 = em desenvolvimento, pode mudar