EVOPE Gerador
Documentação técnica do workflow EVOPE — Gerador de Relatório de Automação.
Processa arquivos de dados XLSX/XLS/CSV, analisa com IA e entrega o relatório HTML por email.
| Atributo | Valor |
|---|---|
| Nome | EVOPE — Gerador de Relatório de Automação |
| ID do Workflow | UwsLxUDVK1HPHNiD |
| Status | ● Produção |
| Total de Nós | 26 nós, 23 conexões |
| Modelo de IA | gpt-5.4-mini com ferramentas Think + Calculator |
| Serviço de Email | Gmail via OAuth2 (nó nativo n8n) |
| Trigger principal | Formulário EVOPE (n8n-nodes-base.formTrigger) |
| Trigger alternativo | Webhook externo (n8n-nodes-base.webhook) |
1Canais de Entrada #
O workflow aceita arquivos por dois canais independentes. Ambos convergem para o mesmo pipeline de validação e processamento.
| Canal | Node | Quando Usar | Resposta |
|---|---|---|---|
| Formulário EVOPE | n8n-nodes-base.formTrigger |
Upload manual pelo usuário final via UI do n8n | Resultado enviado por email — sem resposta inline |
| Webhook Externo | n8n-nodes-base.webhook |
Integração programática — a plataforma EVOPE envia o arquivo automaticamente | Responde 202 Accepted imediatamente (async), resultado por email |
Fluxo do Webhook (assíncrono)
O webhook retorna resposta imediata para não travar a requisição enquanto o processamento ocorre em background:
POST /webhook/evope/gerador
│
├── Webhook (recebe arquivo binário)
│ │
│ Preparar Dados Webhook (normaliza estrutura para o pipeline)
│ │
│ Responder Webhook ─────────────────► 202 {"status":"processing"} (imediato)
│ │
│ Validar Estrutura do Arquivo
│ │
│ [pipeline continua...] → Email com resultado
2Mapa de Nós (26) #
3Pipeline Completo #
Formulário EVOPE (upload de arquivo)
│
Validar e Sanitizar Arquivo
│
Switch (por extensão do arquivo)
├── .xlsx ──► fromXLSX ──────────────────────────────────────┐
├── .xls ──► fromXLS ──────────────────────────────────────┤
└── .csv ──► Normalizar Encoding CSV ──► fromCSV ───────────┘
│
Validar Estrutura do Arquivo
│
Verificar Erro
├── [ERRO] ──► Preparar Email de Erro ──► Enviar Email de Erro
│
└── [OK] ──► Configuração de Ferramentas
│
Processar e Agregar Dados
│
AI Agent — Análise (gpt-5.4-mini)
├── Tools: Think, Calculator
│
Extrair JSON da IA
│
Gerar HTML Final
│
Preparar Email e Anexo
│
Enviar Email Gmail ──► ✅ Relatório entregue
4Conversão de Formatos #
O workflow suporta três formatos. Cada um tem um nó específico de extração, com normalização de encoding para CSV (problema comum com arquivos exportados pelo Windows).
| Formato | Nó | Observação |
|---|---|---|
| .xlsx | fromXLSX |
Excel 2007+. Formato preferencial — preserva tipos de dados e encoding UTF-8 nativamente. |
| .xls | fromXLS |
Excel legado (97-2003). Suportado para compatibilidade com exports de sistemas antigos. |
| .csv | Normalizar Encoding CSV → fromCSV |
Passa por normalização antes da extração. Detecta e converte Latin-1/Windows-1252 para UTF-8. |
5Validação de Estrutura #
Após a extração, o nó Validar Estrutura do Arquivo verifica se os dados têm o formato esperado pelo EVOPE.
| Verificação | Ação se Falhar |
|---|---|
| Colunas obrigatórias presentes | Erro → email com lista de colunas faltantes vs esperadas |
| Arquivo não vazio (pelo menos 1 linha de dados) | Erro → email informando arquivo vazio |
| Tipos de dados coerentes | Erro → email com diagnóstico da coluna problemática |
if que bifurca o fluxo. A saída 0 (true) vai para o pipeline de erro; a saída 1 (false) continua o processamento normal.
6Processamento e Análise de IA #
Após validação, os dados passam por dois estágios: agregação determinística (JavaScript) e análise semântica (IA).
Estágio 1 — Processar e Agregar Dados (JavaScript)
| Atributo | Valor |
|---|---|
| Versão | v3.4 |
| Função | Agrega métricas por colaborador: aproveitamento, entretenimento, apps, horas trabalhadas |
| Output | JSON estruturado com arrays de colaboradores e métricas normalizadas |
Estágio 2 — AI Agent — Análise (gpt-5.4-mini)
| Atributo | Valor |
|---|---|
| Modelo | gpt-5.4-mini |
| Ferramentas | Think (raciocínio encadeado) + Calculator (precisão numérica) |
| Output esperado | JSON com insights, rankings, recomendações e análise de jornada excessiva |
| Pós-processamento | Extrair JSON da IA faz parse e validação do schema antes de prosseguir |
7Geração do Relatório HTML #
O nó Gerar HTML Final converte o JSON da IA em um relatório HTML completo.
| Característica | Detalhe |
|---|---|
| Formato | HTML com CSS inline (compatível com clientes de email) |
| Conteúdo | Rankings de colaboradores, métricas de aproveitamento, entretenimento, horas, jornada excessiva, recomendações e apps mais usados |
| Uso posterior | O mesmo HTML alimenta o Agente Conversacional como base de análise interativa |
8Envio de Email #
| Atributo | Valor |
|---|---|
| Serviço | Gmail via OAuth2 (nó nativo n8n) |
| Nó | Enviar Email Gmail |
| Preparação | Nó Preparar Email e Anexo monta assunto, corpo e anexos antes do envio |
| Conteúdo | Relatório HTML no corpo do email ou como anexo |
9Pipeline de Tratamento de Erros #
Quando a validação falha, o workflow não quebra — envia um email de diagnóstico ao usuário com instruções claras.
Verificar Erro [SAÍDA 0 = erro detectado]
│
Preparar Email de Erro
│ Inclui:
│ - Tipo de erro (estrutura inválida / arquivo vazio / encoding)
│ - Colunas encontradas vs colunas esperadas
│ - Nome do arquivo recebido
│ - Instruções para corrigir e reenviar
│
Enviar Email de Erro (Gmail)
10Webhook API #
| Atributo | Valor |
|---|---|
| Endpoint | POST /webhook/evope/gerador |
| Host | webhook.digital-ai.tech |
| Corpo esperado | Arquivo binário ou multipart/form-data |
| Resposta imediata | 202 {"status":"processing"} |
| Resultado final | Email com relatório (assíncrono) |
12Atualizações — Julho 2026 #
qY8CpZceebW3CpPW — [EVOPE] Mapa - Funções Colaboradores.Execução de validação: #15945102 — status ● success · 32.8s · HTML 18.795 chars.
| Nó | Tipo de Mudança | Problema Resolvido |
|---|---|---|
Configuração de Ferramentas | 2 novos parâmetros | Entretenimento e threshold σ agora configuráveis sem tocar código |
Processar e Agregar Dados v2.12 | Lógica JS expandida | Detecção de entretenimento + jornada excessiva automática via σ |
AI Agent — Análise (system prompt) | 3 novas regras | Mín. 5 itens de otimização, regra entretenimento, regra jornada σ |
Preparar Prompt Caminhos | Guard _semCaminhos | Evita enviar payload multi-chave para LangChain quando sem caminhos |
AI Agent — Caminhos | continueOnFail | Workflow não trava quando não há dados de caminhos |
Extrair Análise Caminhos | Guard de erro | Lê output com segurança mesmo se agente anterior falhou |
1. Configuração de Ferramentas — 2 novos parâmetros #
Adicionados dois campos ao nó Set de configuração global para que ajustes de negócio não exijam alteração de código:
| Campo | Valor padrão | Função |
|---|---|---|
config_ferramentas_entretenimento |
youtube, netflix, spotify, tiktok, instagram, facebook, twitter, amazon prime, disney+, twitch, reddit, steam, pinterest, 9gag, globoplay, deezer |
Lista CSV de apps classificados como entretenimento. Processar e Agregar Dados compara cada aplicativo/funcionalidade contra esta lista. |
config_jornada_sigma_threshold |
1.5 |
Multiplicador do desvio padrão (σ) para definir o threshold de jornada excessiva. Colaboradores com horas > média + (σ × threshold) são flagados. |
Para adicionar novos apps de entretenimento, editar apenas este nó — sem alterar o código do Processar e Agregar Dados.
2. Processar e Agregar Dados (v2.12) — Entretenimento + Desvio Padrão #
2a — Detecção de Entretenimento
Para cada grupo no loop, verifica se aplicativo ou funcionalidade da linha bate (case-insensitive) com algum app da lista appsEnt (lida de config_ferramentas_entretenimento). Campos adicionados ao objeto de grupo:
| Campo | Tipo | Descrição |
|---|---|---|
isEntretenimento | boolean | true se o grupo tem qualquer uso de entretenimento detectado |
percEntretenimento | number (0–100) | % de horas do grupo gastas em apps de entretenimento |
Exemplo: grupo "Atendimento" com 60% das horas em YouTube → isEntretenimento: true, percEntretenimento: 60. Esse dado é passado ao AI Agent — Análise que aplica a regra de resposta adequada.
2b — Jornada Excessiva via Desvio Padrão (σ)
Um threshold hardcoded (ex: "mais de 10h = excessivo") ignora o contexto da empresa. Se todos trabalham muito por natureza do setor, o sistema flagaria todos. Com desvio padrão, o threshold se adapta automaticamente à realidade do grupo — só flagando quem está significativamente acima da média dos próprios colegas.
Como o cálculo funciona (passo a passo)
Exemplo com 5 colaboradores e suas horas registradas no período:
| Colaborador | Horas |
|---|---|
| João | 8h |
| Maria | 10h |
| Carlos | 12h |
| Ana Paula | 26h |
| Marcos Rocha | 30h |
Passo 1 — Média (μ):
μ = (8 + 10 + 12 + 26 + 30) / 5 = 86 / 5 = 17.2h
Passo 2 — Desvio padrão (σ):
Calcula o quanto cada pessoa desvia da média, eleva ao quadrado (para eliminar negativos), tira a média e extrai a raiz:
σ = √[ ((8−17.2)² + (10−17.2)² + (12−17.2)² + (26−17.2)² + (30−17.2)²) / 5 ]
σ = √[ (84.6 + 51.8 + 27.0 + 77.4 + 163.8) / 5 ]
σ = √[ 404.6 / 5 ]
σ = √80.9 ≈ 9.0h
Passo 3 — Threshold dinâmico (com config_jornada_sigma_threshold = 1.5):
threshold = μ + (σ × 1.5)
threshold = 17.2 + (9.0 × 1.5)
threshold = 17.2 + 13.5 = 30.7h ← quem ultrapassar este valor é flagado
Passo 4 — Comparação e output:
| Colaborador | Horas | Acima do threshold (30.7h)? | Desvios (σ) |
|---|---|---|---|
| João | 8h | — | — |
| Maria | 10h | — | — |
| Carlos | 12h | — | — |
| Ana Paula | 26h | — (26 < 30.7) | — |
| Marcos Rocha | 30h | — (30 < 30.7) | — |
Neste exemplo ninguém seria flagado — a variação é considerada normal dentro do grupo. O sistema não gera alarme falso.
O que o sigma controla
| sigma (threshold) | Sensibilidade | Quando usar |
|---|---|---|
1.0σ | Alta — ~16% podem ser flagados | Empresas com jornadas muito homogêneas |
1.5σ ← padrão | Balanceada — pega os outliers reais | Uso geral recomendado |
2.0σ | Conservadora — apenas casos extremos | Setor com jornadas naturalmente variáveis |
3.0σ | Muito conservadora — quase ninguém | Só para desvios gravíssimos |
Output do nó
// Campo jornadaExcessiva no objeto de output do nó:
{
"colaboradores": [
{ "nome": "Marcos Rocha", "horasH": 30, "desvios": "2.0σ" },
{ "nome": "Ana Paula", "horasH": 26, "desvios": "1.6σ" }
],
"media": 12.2,
"desvioPadrao": 8.9,
"threshold": 25.5, // média + 1.5σ (valores reais da execução #15945102)
"sigma": 1.5
}
Colaboradores com horasH > threshold são incluídos em colaboradores[]. Threshold 0 é ignorado (sem dados suficientes). Para ajustar a sensibilidade, alterar config_jornada_sigma_threshold em Configuração de Ferramentas.
3. AI Agent — Análise (system prompt) — 3 novas regras #
Três regras adicionadas ao system prompt do agente para garantir qualidade e coerência nas análises:
Regra 1 — Mínimo de planos de ação
planosAcao. O HTML gerado ficava com uma tabela de otimização quase vazia — sem valor para o cliente.
Instrução adicionada ao prompt:
OBRIGATÓRIO: planosAcao deve ter MÍNIMO 5 e MÁXIMO 8 itens.
Nunca retorne menos de 5 planos de ação, mesmo que os dados sejam simples.
O agente é livre para criar planos de ação complementares (treinamentos, governança, políticas internas) quando os dados brutos não gerarem 5 oportunidades óbvias.
Regra 2 — Tratamento de Apps de Entretenimento
Lógica de decisão adicionada ao prompt:
SE isEntretenimento = true OU percEntretenimento > 20%:
→ NUNCA sugerir integração de API da ferramenta de entretenimento
→ SEMPRE sugerir uma das opções abaixo:
1. Política de Uso Aceitável (AUP) — documento formal de TI
2. Bloqueio via MDM/UEM (Microsoft Intune ou Jamf para Mac)
3. Relatório periódico de consumo com alerta de gestores
O campo percEntretenimento vem do Processar e Agregar Dados e é passado diretamente ao agente no JSON de análise.
Regra 3 — Jornada Excessiva via σ
Instrução adicionada ao prompt:
Use o campo jornadaExcessiva do JSON recebido.
Mencione os colaboradores flagados com seus desvios.
Formato obrigatório: "X colaboradores acima do threshold (média Xh + 1.5σ = Xh)"
Exemplo: "2 colaboradores acima do threshold (média 12.2h + 1.5σ = 25.5h):
- Marcos Rocha: 30h (2.0σ acima da média)
- Ana Paula: 26h (1.6σ acima da média)"
Quando jornadaExcessiva.colaboradores está vazio, o agente omite a seção — sem alerta falso.
4. Pipeline Caminhos — Bug LangChain BufferMemory corrigido (3 nós) #
O bug
"input values have 2 keys, you must specify an input key or pass only 1 key as input"Contexto:
AI Agent — Caminhos usa LangChain BufferMemory. Essa memória exige receber exatamente 1 chave como input. Quando o payload não continha dados de caminhos (links vazios), o nó anterior (Preparar Prompt Caminhos) passava o objeto dadosAnalise completo — com múltiplas chaves (grupo, colaboradores, topApps, etc.) — causando o crash. O workflow inteiro travava e nenhum relatório era gerado.
Fix em 3 camadas
Camada 1 — Preparar Prompt Caminhos (prevenção upstream):
// Antes (bugado): passava dadosAnalise completo mesmo sem caminhos
return [{ json: dadosAnalise }]; // ← múltiplas chaves → crash BufferMemory
// Depois (correto): guard quando sem dados
if (links.length === 0) {
return [{ json: { _semCaminhos: true } }]; // ← 1 chave apenas → sem crash
}
return [{ json: { prompt: promptFormatado } }]; // ← 1 chave → OK
Camada 2 — AI Agent — Caminhos (tolerância a falha):
// Configuração adicionada ao nó:
onError: "continueRegularOutput" // = continueOnFail habilitado
// Efeito: mesmo que o agente falhe internamente,
// o item de erro é passado adiante e o workflow continua.
// Sem isso, qualquer erro aqui travava toda a execução.
Camada 3 — Extrair Análise Caminhos (guard downstream):
// Antes (bugado): acessava output diretamente
const aiResponse = items[0].json.output; // ← quebra se output não existe
// Depois (correto): verifica flags antes de acessar
const firstItem = items[0]?.json || {};
const aiResponse = (!firstItem._semCaminhos && !firstItem.error)
? (firstItem.output || firstItem.text || '')
: ''; // string vazia — Gerar HTML Final trata ausência omitindo a seção
| Nó | Tipo de fix | Efeito |
|---|---|---|
Preparar Prompt Caminhos | Prevenção — guard upstream | Garante que apenas 1 chave chegue ao BufferMemory |
AI Agent — Caminhos | Tolerância — continueOnFail | Workflow não trava se agente falhar internamente |
Extrair Análise Caminhos | Defesa — guard downstream | Retorna string vazia de forma segura; HTML omite seção |
Regra geral aprendida: Nós LangChain com BufferMemory sempre devem receber exatamente 1 chave de input. Quando dados podem estar ausentes, usar guard _semCaminhos + continueOnFail + guard no nó seguinte é o padrão de segurança adotado.
Workflow: Relatório de Grupos — Correções Jul/26
Workflow: eJ4CTb9f4fxSS04d · Nó modificado: Processar Dados Grupos + AI Agent - Analise (system prompt) · Validado em 25/07/2026
1. Remoção do totalizador "Master" da análise #
GruposDetalhes sempre é o grupo-raiz (ex: "Master") — um consolidado de todos os subgrupos. O workflow anterior tratava essa linha como um grupo real, causando:
- Média de aproveitamento distorcida (63,3% virava a referência em vez dos subgrupos reais)
- "Pergunta que muda o jogo" comparando o total com suas próprias partes — incoerente
- Totalizador podendo aparecer como "Destaque Negativo" mesmo sendo só um consolidado
Fix aplicado — filtro por nome (robusto)
Em vez de slice(1) cego (que dependia da posição), o fix detecta o totalizador pelo campo GrupoID ou por grupos sem subgrupos abaixo deles. Isso é robusto para qualquer estrutura que a EVOPE envie:
// Antes (frágil): removia sempre a 1ª linha por posição
const grupos = allGrupos.slice(1);
// Depois (robusto): identifica totalizador por GrupoID === "0" ou por nome de contexto
const totalizador = allGrupos.find(g =>
g.GrupoID === '0' || g.GrupoID === 0 ||
(nomeGrupoContexto && g.GrupoColaborador &&
g.GrupoColaborador.toLowerCase() === nomeGrupoContexto.toLowerCase())
) || allGrupos[0];
const grupos = allGrupos.filter(g => g !== totalizador);
// totalColaboradores vem do totalizador (dado correto), não dos subgrupos
var totalColabs = totalizador
? (totalizador.QtdColaboradoresTotal || 0)
: (grupos.length > 0 ? (grupos[0].QtdColaboradoresTotal || 0) : 0);
| Antes | Depois |
|---|---|
| "4 grupos" (incluía Master) | "3 grupos" (apenas subgrupos reais) |
| Média de 63,3% (puxada pelo total) | Média de 65,1% (calculada nos subgrupos) |
| Master podia aparecer como Destaque Negativo | Master nunca aparece na análise |
totalColaboradores pego do 1º grupo | totalColaboradores sempre vem do totalizador |
2. Renomeação dos campos: Burnout → Jornada Excessiva #
PropBurnout / PropBurnoutPercentage, que não representavam corretamente o dado (na verdade, jornada excessiva de trabalho). Isso causava:
- A IA analisava os dados mas não conseguia identificar corretamente o contexto ("não existe informação de jornada excessiva por grupo" — erro reportado em produção)
- Output do relatório exibia "Burnout: 38,5%" no lugar de "Jornada Excessiva: 38,5%"
- Critérios de grupo positivo/negativo usavam
PropBurnoutPercentagecomo threshold — confuso para o cliente
Campos renomeados na EVOPE
| Campo antigo (EVOPE) | Campo novo (EVOPE) | Usado no workflow como |
|---|---|---|
PropBurnout | JornadaExcessiva | jornadaExcessivaQtd (quantidade) |
PropBurnoutPercentage | JornadaExcessivaPercentage | jornadaExcessivaPct (percentual) |
Mudanças no system prompt do AI Agent
Todas as referências a PropBurnoutPercentage e burnout% foram substituídas no prompt do AI Agent - Analise:
| Antes (prompt) | Depois (prompt) |
|---|---|
PropBurnoutPercentage < 15% | jornadaExcessivaPct < 15% |
burnout% nos labels de grupo | jornada excessiva% |
"grupo com burnout mais elevado" | "grupo com jornada excessiva mais elevada" |
qtdColaboradoresEmBurnout, percentualEmBurnout | jornadaExcessivaQtd, jornadaExcessivaPct |
3. Validação com payloads reais #
Após as correções, foram realizados testes com os payloads reais das 2 execuções disponíveis no histórico do n8n, mais 2 simulações com dados de grupos e campos novos:
| Execução | Empresa | Tipo | Resultado |
|---|---|---|---|
15918466 (23/07) | EmpresaID 187 | Mapa (real) | ✅ Score 24/100 · gargalos corretos · sem referência a Burnout |
15932523 (24/07) | EmpresaID 8 | Mapa (real) | ✅ Score gerado · fluxos críticos multi-métrica corretos |
| Simulação (25/07) | Teste | Grupos (3 subgrupos) | ✅ Master removido · 3 grupos analisados · label "jornada excessiva" correto |
| Simulação (25/07) | Teste | Grupos c/ jornada alta | ✅ Grupos negativos por jornadaExcessivaPct ≥ 15% · critérios corretos |
Nota: Não existem execuções reais de Grupos com os campos JornadaExcessiva no histórico do n8n — o sistema EVOPE ainda estava enviando PropBurnout nas execuções anteriores. A validação dos campos novos foi feita via simulação com payload idêntico ao formato documentado acima.
11AI Agent — Análise #
| Atributo | Detalhe |
|---|---|
| Tipo | @n8n/n8n-nodes-langchain.agent |
| Modelo | gpt-5.4-mini (nó OpenAI Chat Model) |
| Ferramenta Think |
@n8n/n8n-nodes-langchain.toolThinkPermite ao agente raciocinar em etapas antes de formular a análise final |
| Ferramenta Calculator |
@n8n/n8n-nodes-langchain.toolCalculatorGarante precisão em cálculos de médias, percentuais e comparações |
| Diferença vs AI Agent Chat | Este agente é stateless — sem memória de sessão. Cada geração de relatório é independente. O AI Agent Chat (Agente Conversacional) tem memória PostgreSQL. |