GustavoandClaude Sonnet 5 3c87ab55e1 fix(v2): fix cache is_fallback bug, wire observability + data quality, drop debug webhook, fix GLPI URL
- Real bug found by code review while implementing this cycle: "Code -
  Reusar Classificacao em Cache" always hardcoded is_fallback: false when
  reconstructing a classification from memory, even when the cached
  classification was itself AI_FALLBACK. On a cache hit for a previously
  fallback-classified ticket, this would have let it skip
  applyFallbackPolicy's exclusion entirely (the policy checks
  aiClassification.is_fallback first). Fixed to derive is_fallback from
  the cached ai_classification value.
- select-top10.node.js now carries `resolucao` (ia | cache | fallback_cap)
  through to the scored item, previously dropped -- needed to tell cache
  hits apart from real AI calls in observability.
- Code - Comparar Legacy x V2 now computes the full observability summary
  (candidate_count, cache_hits/misses, ai_requested/success/errors,
  ai_fallback_count and by-reason breakdown, classification_counts,
  insufficient_context_count, actionable_real_count,
  critical_override_count, top10_count, blocked_count,
  coordination_count) and the data-quality review (buildDataQualityReview
  over INSUFFICIENT_CONTEXT tickets), both stored in the shadow_runs
  `summary` JSON column -- no new Data Table needed.
- Removed the debug webhook entirely (Debug - Ver Painel, Data Table -
  Buscar Shadow Runs Recentes debug branch, Code - Montar Painel Debug,
  Debug - Responder) and the now-unused debug-panel.node.js driver.
  Workflow went from 37 to 33 nodes. Debugging goes through n8n execution
  data, the Data Tables, and the shadow diff instead, as requested.
- Fixed glpi_base_url: was still V1's own placeholder
  (https://glpi.suaempresa.com.br, never a real value, not report
  anonymization) -- confirmed the real domain (https://glpi.gtigrupo.com.br)
  from the live, active GLPI x WhatsApp workflow's own GLPI API config in
  the same n8n instance. SQL still only ever receives it through
  {GLPI_BASE_URL} substitution from the Config node, never hardcoded.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 19:50:48 -03:00

Coordenador GLPI - Chamados Abertos

Projeto n8n para atuar como coordenador diario de Suporte de TI, analisando chamados abertos no GLPI e enviando no Slack os 10 chamados que precisam de acao imediata.

Objetivo

Todos os dias uteis, o workflow consulta o banco do GLPI, calcula um score operacional para cada chamado aberto e envia uma lista priorizada no Slack.

O foco nao e apenas listar chamados antigos. O ranking considera:

  • SLA vencido ou proximo de vencer
  • tempo sem interacao humana
  • prioridade, urgencia e impacto
  • idade do chamado
  • chamado sem tecnico atribuido
  • chamados em categorias e entidades reais do GLPI

Arquivos

  • Coordenador GLPI - Chamados Abertos Slack.n8n.json: workflow importavel no n8n
  • sql/top_10_chamados_abertos_glpi.sql: query base usada pelo workflow
  • .env.example: variaveis para subir n8n localmente
  • docker-compose.yml: n8n local via Docker

Como configurar

  1. Suba o n8n local, se necessario:
docker compose up -d
  1. Acesse:
http://localhost:5678
  1. Importe o workflow:
Coordenador GLPI - Chamados Abertos Slack.n8n.json
  1. Configure a credencial MySQL no node:
MySQL - Top 10 chamados abertos
  1. Abra o node Config - Coordenador GLPI e preencha:
  • slack_webhook_url: webhook do canal Slack
  • dias_sem_interacao_alerta: padrao 2
  • horas_sla_risco: padrao 8
  1. Execute pelo Manual Trigger para validar.

  2. Ative o workflow para rodar pelo Schedule Trigger - Dias uteis 08h.

Metodologia de priorizacao

Cada chamado aberto recebe um score_criticidade, mas a lista final nao e mais apenas o top 10 geral. O workflow monta a lista por blocos para evitar que chamados muito antigos monopolizem todos os dias.

Blocos do top 10:

  • 3 chamados com SLA vencido mais criticos
  • 3 chamados com maior tempo sem interacao
  • 2 chamados sem tecnico atribuido
  • 2 chamados de prioridade alta mais recentes

Se algum bloco nao tiver chamados suficientes, o complemento vem do ranking geral.

O mesmo chamado nao entra duas vezes. Se ele ja apareceu em um bloco anterior, e removido dos blocos seguintes.

Score

Pesos principais:

  • SLA vencido: +100
  • SLA vencendo nas proximas horas configuradas: +45
  • chamado sem interacao ha 7 dias ou mais: +35
  • chamado sem interacao ha 3 a 6 dias: +25
  • chamado sem interacao ha 1 a 2 dias: +10
  • prioridade GLPI: priority * 8
  • urgencia GLPI: urgency * 5
  • impacto GLPI: impact * 5
  • idade do chamado: ate +30
  • sem tecnico atribuido: +25

O resultado e ordenado por:

  1. score_criticidade desc
  2. chamados com SLA vencido primeiro
  3. maior tempo sem interacao
  4. chamados mais antigos

Reincidencia

O workflow controla reincidencia usando staticData global do n8n, sem gravar nada no banco do GLPI.

Regra:

  • apareceu 1 vez: normal
  • apareceu 2 dias seguidos: marcado como reincidente
  • apareceu 3 dias seguidos ou mais: escalar para coordenacao

Campos salvos no staticData:

  • ultima_data_disparo
  • ultimos_chamados_enviados
  • reincidencia_chamados

Se o workflow for duplicado, recriado ou importado como novo workflow, esse historico pode ser perdido porque pertence ao workflow no n8n.

Tempo sem interacao

O campo dias_sem_interacao considera a maior data encontrada entre:

  • followups publicos do chamado: date, date_mod, date_creation
  • tarefas do chamado: date, date_mod, date_creation
  • modificacao do chamado: glpi_tickets.date_mod
  • abertura do chamado: glpi_tickets.date

Isso evita marcar um chamado como parado quando alguem acabou de adicionar ou alterar uma tarefa no GLPI, mesmo que a tarefa esteja planejada para outro dia.

Se a maior data encontrada estiver no futuro por causa de uma tarefa planejada, o contador fica em 0 dias sem interacao, evitando valores negativos no relatorio.

Regra de chamados abertos

O SQL considera abertos todos os chamados com:

is_deleted = false
AND status NOT IN (5, 6)

Este gatilho principal ignora chamados das categorias:

  • ADMINISTRATIVO
  • DESENVOLVIMENTO
  • INFRA

O filtro usa o nome completo da categoria (completename) ou o nome simples (name) iniciando com esses termos, entao tambem remove subcategorias dessas filas.

No GLPI, normalmente:

  • 5: solucionado
  • 6: fechado

Campos usados

A query usa tabelas comuns do GLPI:

  • glpi_tickets
  • glpi_itilcategories
  • glpi_entities
  • glpi_itilfollowups
  • glpi_tickettasks
  • glpi_tickets_users
  • glpi_users

Se sua versao do GLPI tiver customizacoes, valide primeiro a query sql/top_10_chamados_abertos_glpi.sql diretamente no banco.

Saida no Slack

O Slack recebe uma mensagem curta com:

  • top 10 chamados para atacar hoje
  • tecnico atribuido, quando existir
  • SLA
  • dias sem interacao
  • dias aberto
  • reincidencia
  • link do chamado, se glpi_base_url estiver configurado no workflow

Campos removidos da mensagem para reduzir ruido:

  • motivo
  • acao
  • prazo

Se o agente de IA falhar, o workflow envia a mensagem curta gerada por codigo, sem depender da IA.

Agente de IA do n8n com Z IA

O workflow usa o node:

AI Agent - Revisar mensagem

Por padrao, ele esta conectado ao node:

Z IA Chat Model

Esse node usa o chat model compativel com OpenAI do n8n, mas a credencial deve ser configurada para a Z IA.

A IA nao monta mais a mensagem do zero. O node Code - Reincidencia e mensagem curta monta a mensagem final de forma deterministica, e a IA apenas revisa clareza e reduz texto.

Regras do prompt:

  • nao adicionar fatos
  • nao criar motivo
  • nao criar acao
  • nao criar prazo
  • nao alterar IDs, tecnicos, datas, SLA, dias, reincidencia ou links
  • nao usar tom agressivo

No n8n, abra o node:

Z IA Chat Model

Configure:

  • credencial Z IA
  • endpoint/base URL da Z IA, se a credencial permitir
  • modelo correto disponibilizado pela Z IA, por exemplo glm-4.5-flash

No arquivo importavel deixei o modelo como glm-4.5-flash. Se sua conta Z IA usar outro nome de modelo, troque pelo nome exato exibido na plataforma.

Se aparecer The resource you are requesting could not be found, revise principalmente:

  • Base URL da credencial: normalmente https://api.z.ai/api/paas/v4
  • Modelo: precisa existir na sua conta, por exemplo glm-4.5-flash
  • Chave API: precisa ser da Z IA, nao da OpenAI
  • Node usado: mantenha Z IA Chat Model conectado ao AI Agent - Revisar mensagem

Se a Z IA aparecer no seu n8n como node proprio, mantenha o AI Agent - Revisar mensagem e substitua somente o subnode Z IA Chat Model pelo modelo oficial da Z IA.

Recomendacao direta

Nao trate isso como relatorio bonito. Trate como fila diaria de comando.

Minha sugestao operacional:

  • rodar as 08h no canal da lideranca de suporte
  • exigir responsavel e prazo para cada um dos 10 chamados ate 10h
  • repetir apenas os chamados que continuarem parados no dia seguinte
  • se um chamado aparecer 3 dias seguidos, escalar para coordenacao/gestao
  • separar um segundo workflow para chamados sem tecnico atribuido, porque isso e falha de triagem, nao backlog comum
  • criar outro alerta intradiario para SLA vencendo nas proximas 2 horas

Se quiser resultado real, nao basta notificar. Tem que transformar a mensagem do Slack em ritual diario de cobranca.

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