Ir para o conteúdo

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

  1. Usuário envia mensagem no Telegram
  2. Valida se é mensagem útil (descarta saudações e /start)
  3. Extrai entidades: linha, tipo, coleção, referência, intent
  4. Se necessário, aciona agente IA (OpenRouter) para extração
  5. Consolida entidades e define estratégia de busca
  6. Executa query SQL na tabela materiais_telegram
  7. Deduplica e padroniza os arquivos encontrados
  8. Envia arquivos em lote pelo Telegram
  9. Envia mensagem de agradecimento

Estratégias de Busca (em cascata)

Prioridade Estratégia Campos usados
Por referência exata referencia_final ILIKE + linha + colecao + tipo
Fallback de referência referencia_final ILIKE + linha (sem coleção)
Por coleção e estação colecao_final ILIKE + linha + tipo
Por linha e tipo (fuzzy) linha ILIKE + tipo
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;