fix(n8n): torna o fluxo conversacional (texto e/ou imagem, com memoria de sessao)

O fluxo anterior encerrava sem responder quando a mensagem nao tinha imagem,
o que nao reflete um atendimento real (cliente manda texto antes/depois, ou
digita os exames em vez de mandar foto). Agora toda mensagem chega ao AI
Agent (com ou sem imagem), com memoria de conversa via Postgres, seguindo o
mesmo padrao do bot de agendamento ja usado nessa conta.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Eric
2026-08-21 09:03:16 -03:00
co-authored by Claude Sonnet 5
parent e1ea3dee53
commit 772747d74e
2 changed files with 89 additions and 15 deletions
@@ -164,6 +164,53 @@ Webhook (Z-PRO)
6. Trocar a lista de exemplo pela lista real de exames/valores no prompt do
`AI Agent`.
## Revisão 1 (2026-08-21) — fluxo conversacional (texto + imagem)
Depois do primeiro teste real, o usuário apontou que um atendimento real não
chega só como uma foto isolada: o cliente pode mandar texto antes/depois, ou
digitar os nomes dos exames em vez de (ou além de) mandar foto, tudo em
mensagens separadas. O desenho original tratava qualquer mensagem sem imagem
como "não se aplica" e encerrava sem responder — o que quebra esse caso real.
Mudanças no workflow, alinhadas ao mesmo padrão já usado pelo bot de
agendamento desta conta (`Agendamento - GChat - Z-PRO (clínica exemplo)`):
- O node **"É mensagem de imagem?"** deixou de ser um filtro que encerra o
fluxo — agora só decide se baixa a imagem antes do agente ou não. As duas
saídas (com ou sem imagem) chegam no `AI Agent`; nenhuma mensagem é mais
ignorada.
- **"Extrair campos do webhook"** agora também extrai o texto da mensagem
(`entrada`), no mesmo nome de campo usado pelos bots de agendamento que já
funcionam nessa conta.
- Adicionada **memória de conversa por sessão** (node `Memória da Sessão
(Postgres)`, reaproveitando a credencial `Postgres Agendamento - (clínica
exemplo)`, com `sessionKey` prefixado (`orcamento-<protocolo>`) para não
colidir com a memória do bot de agendamento). Isso é necessário porque cada
mensagem do WhatsApp chega como uma execução nova e separada do workflow —
sem memória persistente, o agente esqueceria o que o cliente já tinha
mandado numa mensagem anterior.
- O **system prompt do `AI Agent`** foi reescrito para ser conversacional: se
o cliente ainda não mandou nem foto nem lista de exames (nesta mensagem ou
antes, na mesma conversa), o agente pede isso educadamente em vez de
inventar um orçamento vazio; assim que houver pelo menos um exame
identificável (por imagem, texto, ou o histórico da conversa), ele monta o
orçamento normalmente.
- O envio da resposta (via sub-workflow `enviar_texto`) passou a acontecer
sempre, em toda mensagem — porque agora toda mensagem gera uma resposta do
agente (seja um pedido de mais informação, seja o orçamento final), não só
quando uma imagem é reconhecida.
### Descoberta durante o teste: payload do webhook chegou vazio
Os dois testes reais feitos pelo usuário mostraram o webhook recebendo
`body: {}` (content-length 0, user-agent `axios/1.19.0`) — ou seja, o Z-PRO
não mandou `protocol`/`entrada`/`contactName`/`number` como os bots de
agendamento recebem. Isso sugere que a URL foi configurada num campo de
webhook diferente do usado pelo ChatFlow desses bots (que é o que gera esse
formato JSON). Ainda em aberto — precisa confirmar com o usuário onde
exatamente a URL foi cadastrada no painel do Z-PRO, e ajustar pro mesmo
mecanismo usado pelos bots que já funcionam (ChatFlow → passo "Webhook").
## Fora de escopo (por enquanto)
- Fila/aprovação humana antes do envio (usuário optou por envio automático).