WF3 — Fluxo Principal: Drive Inteligente¶
ID: DtIw0JQZcBM8n3ke · Status: ✅ ATIVO · Trigger: Telegram Bot (Veggi - 0432)
Objetivo¶
Receber mensagens de texto no Telegram, interpretar a intenção do usuário (com dicionário ou IA), buscar arquivos no banco de dados e enviá-los. Se não encontrar, o agente "Bia" responde em linguagem natural.
Fluxo Resumido — Caminho Feliz¶
- Usuário envia mensagem no Telegram
- Valida se é mensagem útil (descarta saudações e
/start) - Extrai entidades: linha, tipo, coleção, referência, intent
- Se necessário, aciona agente IA (OpenRouter) para extração
- Consolida entidades e define estratégia de busca
- Executa query SQL na tabela
materiais_telegram - Deduplica e padroniza os arquivos encontrados
- Envia arquivos em lote pelo Telegram
- Envia mensagem de agradecimento
Estratégias de Busca (em cascata)¶
| Prioridade | Estratégia | Campos usados |
|---|---|---|
| 1ª | Por referência exata | referencia_final ILIKE + linha + colecao + tipo |
| 2ª | Fallback de referência | referencia_final ILIKE + linha (sem coleção) |
| 3ª | Por coleção e estação | colecao_final ILIKE + linha + tipo |
| 4ª | Por linha e tipo (fuzzy) | linha ILIKE + tipo |
| 5ª | Agente Bia | Responde em linguagem natural se nenhuma busca retornar |
Controle de Volume¶
Após a deduplicação, o nó Volume Alto? verifica se o total de arquivos é maior que 10:
- ≤ 10 arquivos → envia diretamente via loop
- > 10 arquivos → Agente Bia solicita refinamento ao usuário
Envio em Lote¶
O LOOP - Lote de Envio Telegram1 processa os arquivos em lotes. Para cada item, o nó Envio de Documento envia o file_id para o chat.id do usuário.
Entre cada lote, há um Intervalo de 1s entre cada envio (nó Wait de 1 segundo) antes de retornar ao loop. Isso evita flood na API do Telegram quando há muitos arquivos para enviar.
LOOP - Lote de Envio Telegram1
├─ [true] → Envio de Documento → JS - Limitar Trigger de Agradecimento → Agradecimento
└─ [false] → Intervalo de 1s → (volta pro loop)
Dicionário de Extração Rápida¶
| Categoria | Termos reconhecidos |
|---|---|
| Linha: Sonho e Fantasia | sonho e fantasia |
| Linha: Linha Noite | linha noite, noite |
| Linha: Sleepwear | sleepwear, pijama |
| Linha: Licenciados | licenciado, licenciados, warner, marvel, dc |
| Linha: Turma da Bia | turma da bia, bia |
| Linha: Moda Praia | moda praia, praia, beach |
| Tipo: Catálogo | catalogo, catálogo, catalogos, catálogos |
| Tipo: Lookbook | lookbook, lookbooks |
| Tipo: Still | still, stills |
| Tipo: Foto | foto, fotos, imagem, imagens, fotografia, fotografias |
| Tipo: Vídeo | video, videos, vídeo, vídeos, mp4, mov |
| Tipo: Caixa | caixa, caixas, box |
| Tipo: Sacola | sacola (e variantes) |
Agentes de IA¶
AI - Agent Extrator¶
- Acionado quando o dicionário não consegue extrair as entidades
- Modelo: OpenRouter
- Memória: Redis por
chatId(contexto de extração) - Intents possíveis:
buscar_arquivos·pedir_clarificacao·conversa_livre
AI - Agente de Conversa (Bia)¶
- Personalidade de vendedora de moda simpática
- Acionado quando nenhum arquivo é encontrado ou
intent ≠ buscar_arquivos - Também acionada quando
intent = volume_alto(resultado > 10 arquivos) para pedir refinamento - Memória: Redis por
chatId(histórico de conversa)
Queries SQL de Busca¶
SQL — Buscar por Referência Exata¶
SELECT * FROM public.materiais_telegram
WHERE 1=1
AND ( {{ $json.linha_final ? "linha = '" + $json.linha_final + "'" : "TRUE" }} )
AND ( {{ $json.colecao_final ? "colecao = '" + $json.colecao_final + "'" : "TRUE" }} )
AND ( {{ $json.tipo_final
? ($json.tipo_final === 'foto'
? "tipo IN ('still','lookbook','conceito')"
: "tipo = '" + $json.tipo_final + "'")
: "TRUE" }} )
AND ( {{ $json.referencia_final ? "referencia ILIKE '%" + $json.referencia_final + "%'" : "TRUE" }} )
ORDER BY data_cadastro DESC;
SQL — Buscar por Coleção e Estação¶
SELECT * FROM public.materiais_telegram
WHERE 1=1
AND ( {{ $json.colecao_final ? "colecao ILIKE '%" + $json.colecao_final + "%'" : "FALSE" }} )
AND ( {{ $json.linha_final ? "linha ILIKE '%" + $json.linha_final + "%'" : "TRUE" }} )
AND ( {{ $json.tipo_final
? ($json.tipo_final === 'foto'
? "tipo IN ('still','lookbook','conceito')"
: "tipo = '" + $json.tipo_final + "'")
: "TRUE" }} )
ORDER BY data_cadastro DESC;
SQL — Buscar por Linha e Tipo (Fuzzy)¶
SELECT * FROM public.materiais_telegram
WHERE 1=1
AND ( {{ $json.linha_final && $json.linha_final !== 'nenhum'
? "linha ILIKE '%" + $json.linha_final + "%'"
: "1=1" }} )
AND ( {{ $json.tipo_final && $json.tipo_final !== 'nenhum'
? ($json.tipo_final === 'foto'
? "tipo IN ('still','lookbook','conceito')"
: "tipo = '" + $json.tipo_final + "'")
: "1=1" }} )
ORDER BY data_cadastro DESC;