Automacao GLPIandClaude Sonnet 5 bdfa675d89 Adiciona V2 do relatorio GLPI: camada deterministica + IA com fallback
Evolui a automacao (V1 preservada, intocada) para uma V2 com:

- Camada deterministica (src/v2): calendario operacional (porta fiel da
  logica da V1), queries SQL somente-leitura (indicadores, ranking com
  IDs, contexto de chamados, baseline historico), deteccao de anomalia
  (spike de categoria/cliente, concentracao, tendencia de backlog),
  memoria/fingerprint de insights com transicao de estado (new ->
  persisting -> normalizing -> resolved), mensagens curtas (fallback V1 e
  V2). 97 testes automatizados (node --test).

- Camada de IA (structured output via OpenAI, schema JSON validado em
  codigo, nunca confia em numeros vindos da IA): prompt de "Analista
  Operacional", fallback automatico e seguro quando a IA falha/expira/
  retorna JSON invalido.

- Workflow n8n "[DEV] GLPI - Relatorio Operacional IA v2" (id
  3x5kb58TeBCvirm6, INATIVO) criado e validado ao vivo no DEV
  (devn8n.gtigrupo.com.br) via webhook temporario (removido apos os
  testes) com SHADOW_MODE/DEV_MODE ligados — nenhuma mensagem real
  enviada, nenhuma escrita no GLPI.

- tools/build_v2_workflow.js + build_v2_workflow_assemble.js: geram o
  workflow n8n a partir de src/v2/*.js (Code nodes remotos nao importam
  arquivos locais), mantendo uma unica fonte de verdade testada.

Bugs reais encontrados e corrigidos durante a validacao ao vivo:
- glpi_tickets nao tem coluna "solution" nesta versao do schema.
- Nodes MySQL/DataTable sem "Execute Once" executavam 1x por item
  recebido do node anterior; a cadeia amplificava ate ~76 mil execucoes
  na query de baseline por cliente, causando o timeout real observado.
  Corrigido com executeOnce=true nos 8 nodes afetados e reescrita da
  query de baseline para nao depender de JOIN com tabela de dimensao.
- IF "Pode Enviar" usava o operador booleano invertido (checava "e
  true" em vez de "e false"), o que quase permitia envio real ao Slack
  mesmo com SHADOW_MODE/DEV_MODE ligados.
- gpt-5.5 exige max_completion_tokens (nao max_tokens) e gasta o
  orcamento em tokens de raciocinio; ajustado para 3000 tokens +
  reasoning_effort=low.

Validado ao vivo contra dados reais do GLPI DEV (20/08/2026): IA gerou
insights reais com evidencia auditavel, memoria persistiu entre
execucoes (occurrences incrementando, normalizacao detectada),
resultado 200 confirmando envio suprimido (shadow mode).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-25 08:49:45 -03:00
2026-07-05 10:39:46 -03:00
2026-07-04 23:58:38 -03:00
2026-07-06 14:58:29 -03:00

Resumo Diário GLPI - MVP

Workflow N8N inicial para gerar um resumo diário de chamados usando dados simulados.

Subir o N8N com Docker

  1. Copie .env.example para .env.
  2. Edite .env e troque N8N_BASIC_AUTH_PASSWORD e N8N_ENCRYPTION_KEY.
  3. Suba o container:
docker compose up -d
  1. Acesse:
http://localhost:5678
  1. Para parar:
docker compose down

Arquivo

  • Resumo Diario GLPI - MVP.n8n.json
  • Resumo Diario GLPI - Real Slack.n8n.json
  • Resumo Diario GLPI - SQL Slack.n8n.json
  • Resumo Semanal GLPI - SQL Slack.n8n.json
  • sql/indicadores_diario_glpi.sql
  • sql/indicadores_semana_glpi.sql

Workflow Recomendado

Use este workflow para o relatório automatico correto:

  • Resumo Diario GLPI - SQL Slack.n8n.json

Essa versão roda de segunda a sexta as 08:00 e escolhe o periodo automaticamente:

  • terca-feira: envia o relatorio da segunda-feira
  • quarta-feira: envia o relatorio da terca-feira
  • quinta-feira: envia o relatorio da quarta-feira
  • sexta-feira: envia o relatorio da quinta-feira
  • segunda-feira: envia o relatorio da semana anterior inteira, de segunda a domingo

Essa versão usa a regra aprendida com a query semanal, aplicada ao periodo selecionado:

  • chamados abertos no periodo: glpi_tickets.date entre data_inicio e data_fim
  • chamados fechados no periodo: glpi_tickets.closedate entre data_inicio e data_fim
  • chamados fechados no periodo podem ter sido abertos em qualquer data anterior
  • filtro is_deleted = false
  • filtro de categorias pelas árvores 7, 16, 17 e 18 usando ancestors_cache

Como configurar o SQL automatico

  1. Importe Resumo Diario GLPI - SQL Slack.n8n.json.
  2. Configure a credencial MySQL no node MySQL - Indicadores diario GLPI.
  3. Configure a credencial de IA/OpenAI no node Z IA Chat Model.
  4. Abra Config - Diario SQL e preencha:
  • data_alvo: deixe vazio para o modo automatico ou use 2026-07-03 para teste manual de um dia especifico
  • slack_webhook_url
  • openai_model, padrão gpt-5.5
  1. Execute pelo Manual Trigger para testar.
  2. Ative o workflow para usar o Schedule Trigger - Dias uteis 08h.

Se o agente de IA falhar, o workflow envia o resumo fallback sem IA com os números SQL.

Agente de IA

O workflow usa os nodes nativos de IA do N8N:

  • AI Agent - Coordenador GLPI: melhora o texto do relatorio antes do Slack
  • Z IA Chat Model: chat model conectado ao agente pela entrada Chat Model

O agente recebe o resumo tecnico gerado pelo SQL e deve apenas melhorar a comunicacao. Ele foi instruido a nao inventar numeros.

Workflow SQL Recomendado

Para bater exatamente com os indicadores do GLPI, use:

  • Resumo Semanal GLPI - SQL Slack.n8n.json

Essa versão consulta diretamente o banco MySQL/MariaDB do GLPI e executa a mesma lógica da query de referência:

  • abertos pela coluna glpi_tickets.date
  • fechados pela coluna glpi_tickets.closedate
  • filtro is_deleted = false
  • filtro de categorias pelas árvores 7, 16, 17 e 18 usando ancestors_cache

Isso é diferente da API REST, que pode não trazer todos os chamados necessários para reproduzir o indicador semanal, principalmente porque chamados fechados na semana podem ter sido abertos em semanas anteriores.

Como configurar

  1. Importe Resumo Semanal GLPI - SQL Slack.n8n.json.
  2. Configure a credencial MySQL no node MySQL - Indicadores semana GLPI.
  3. Abra Config - Slack e OpenAI e preencha:
  • slack_webhook_url
  • openai_api_key
  • openai_model, padrão gpt-5.5
  1. Execute pelo Manual Trigger.

Se a OpenAI falhar, o workflow envia um resumo fallback sem IA com os números da query.

Como usar

  1. No N8N, vá em Workflows.
  2. Clique em Import from File.
  3. Selecione Resumo Diario GLPI - MVP.n8n.json.
  4. Abra o node OpenAI - Gerar resumo.
  5. Selecione sua credencial da OpenAI.
  6. Execute o workflow pelo Manual Trigger.

Fluxo

Manual Trigger
↓
Set - Dados simulados
↓
Code - Calcular indicadores
↓
OpenAI - Gerar resumo

Próxima etapa

Depois que o MVP estiver gerando o texto corretamente, substitua o node Set - Dados simulados pelos nodes HTTP Request do GLPI.

Workflow Real com GLPI e Slack

Importe o arquivo:

  • Resumo Diario GLPI - Real Slack.n8n.json

Depois da importação, abra o node Config - GLPI e Slack e preencha:

  • glpi_url: URL base do GLPI, exemplo https://glpi.suaempresa.com.br
  • glpi_app_token: App Token do GLPI
  • glpi_user_token: User Token do usuário de integração
  • slack_webhook_url: URL do Incoming Webhook do Slack
  • range_tickets: quantidade buscada na API, exemplo 0-999
  • page_size: tamanho de cada pagina buscada no GLPI, padrao 1000
  • page_count: quantidade de paginas por ordenacao, padrao 2
  • data_alvo: data do relatório. Deixe vazio para usar o dia atual, ou informe uma data como 2026-07-03 ou 03/07/26
  • openai_api_key: chave da OpenAI usada pelo node OpenAI - Gerar resumo
  • openai_model: modelo usado na OpenAI, padrão gpt-5.5

O node OpenAI - Gerar resumo usa HTTP Request direto para https://api.openai.com/v1/chat/completions.

O workflow busca tickets em paginas e combina duas ordenacoes:

  • id DESC, para capturar chamados abertos recentemente
  • date_mod DESC, para capturar chamados antigos que foram modificados, solucionados ou fechados recentemente

Depois ele remove duplicados por id e filtra no N8N pela data_alvo. O cálculo separa:

  • chamados abertos na data, usando date_creation, date ou data_abertura
  • chamados fechados na data, usando solvedate, closedate ou data_fechamento
  • pendentes, usando o status atual do ticket filtrado

Na base atual, o GLPI informou 1216 tickets. Por isso o padrão recomendado é page_size=1000 e page_count=2, cobrindo 0-1999 por ordenação sem estourar o total. Se aumentar page_count, o GLPI pode retornar ERROR_RANGE_EXCEED_TOTAL para páginas acima do total existente.

Execute pelo Manual Trigger primeiro. Depois que validar, troque por Schedule Trigger.

Para gerar o relatório da sexta-feira 03/07/2026, use no campo data_alvo:

2026-07-03

Criar Webhook no Slack

  1. Acesse https://api.slack.com/apps.
  2. Crie ou abra um app do Slack.
  3. Ative Incoming Webhooks.
  4. Crie um webhook para o canal desejado.
  5. Copie a URL para o campo slack_webhook_url.

Fluxo Real

Manual Trigger
↓
Config - GLPI e Slack
↓
HTTP - GLPI initSession
↓
HTTP - GLPI buscar tickets
↓
Code - Filtrar chamados de hoje
↓
Code - Calcular indicadores
↓
OpenAI - Gerar resumo
↓
HTTP - Slack enviar mensagem
↓
HTTP - GLPI killSession

Observação

Os campos retornados pelo GLPI podem variar conforme versão e configuração. Se o node Code - Filtrar chamados de hoje retornar categoria ou cliente como ID em vez de nome, ajuste o mapeamento depois de ver o retorno real da API.

Erro Slack 400 - no_text

Se o node HTTP - Slack enviar mensagem retornar 400 - no_text, o corpo da requisição foi enviado sem o campo text.

No node HTTP - Slack enviar mensagem, configure:

  • Method: POST
  • Send Body: ativo
  • Body Content Type: JSON
  • Specify Body: Using JSON
  • JSON Body:
{
  "text": "{{ $json.text }}"
}

Erro OpenAI too many requests

Se o node OpenAI - Gerar resumo retornar The service is receiving too many requests from you, a OpenAI respondeu com limite de uso/rate limit.

Verifique:

  • Se a chave openai_api_key está correta
  • Se a conta OpenAI tem crédito/billing ativo
  • Se houve muitas execuções seguidas em pouco tempo
  • Se o modelo gpt-4o-mini está disponível para a chave usada

O workflow importável já está configurado com retry:

  • 3 tentativas
  • 30 segundos entre tentativas
  • limite de resposta de 700 tokens

Se a OpenAI continuar falhando, o workflow continua a execução e envia ao Slack um resumo técnico gerado pelo node Code - Preparar mensagem Slack, sem IA.

S
Description
No description provided
Readme
353 KiB
Languages
JavaScript 99.3%
Python 0.7%