Automacao GLPIandClaude Sonnet 5 9475e68cb1 Corrige bug real de idempotencia: message_hash nao deve fazer parte do send_key
Bug encontrado AO VIVO durante o teste controlado de envio (secao 14): a
IA (gpt-5.5) nao e deterministica. Duas chamadas para o MESMO periodo
(mesmo report_type+data) geraram insights com textos diferentes, portanto
message_hash diferente, portanto send_key diferente — o retry do MESMO
periodo passou pela deteccao de duplicata como se fosse outro relatorio.

Resultado real: 3 mensagens verdadeiras enviadas ao canal C0BJNBTPFT5
para o periodo 'diario 2026-08-24' antes de eu interromper e corrigir
(execucoes 16744, 16746 e uma terceira ja em voo quando a guarda foi
revertida). Estado revertido imediatamente (DEV_MODE/SHADOW_MODE=true,
workflow desativado) assim que o padrao foi identificado.

Correcao: src/v2/sendGuard.js#buildSendKey agora usa so
report_type+period_start+period_end+destination (SEM message_hash) — a
identidade de um relatorio e o PERIODO, nao o texto exato produzido pela
IA. message_hash continua calculado e armazenado, so para diagnostico.

As 3 linhas reais gravadas na Data Table dev_glpi_v2_send_log foram
normalizadas manualmente (send_key sem sufixo de hash) para que a
protecao de duplicata funcione corretamente para qualquer nova tentativa
do mesmo periodo daqui pra frente.

Testes novos: sendGuard.test.js e pipeline.test.js ganharam testes de
regressao reproduzindo exatamente este cenario (retry do mesmo periodo
com aiCall/mensagem diferente -> send_key igual -> duplicata bloqueada).

Canal Slack real confirmado nesta sessao: D06JK4GEK8E (DM) foi tentado
primeiro e falhou com channel_not_found (bot sem acesso); o usuario optou
por reaproveitar C0BJNBTPFT5 (canal do workflow irmao Coordenador GLPI,
onde o bot ja e membro).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-25 09:44:44 -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%