{
  "name": "Calidad de Lata \u2014 7) Chat Asistente IA",
  "nodes": [
    {
      "id": "wh-chat",
      "name": "GET chat-lupa",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        0,
        0
      ],
      "onError": "continueRegularOutput",
      "parameters": {
        "httpMethod": "POST",
        "path": "dashboard-calidad-chat",
        "responseMode": "responseNode",
        "options": {
          "allowedOrigins": "https://dashboard.cluna.ar"
        }
      }
    },
    {
      "id": "agent-lupa",
      "name": "Lupa",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 3.1,
      "position": [
        320,
        0
      ],
      "parameters": {
        "promptType": "define",
        "text": "={{ $json.body.mensaje }}",
        "options": {
          "systemMessage": "IMPORTANTE: nunca respondas con n\u00fameros, conteos o afirmaciones sobre evidencias sin haber llamado ANTES a la tool 'Consultar evidencias de Calidad' en este mismo turno. Si todav\u00eda no la llamaste para esta pregunta, llamala primero. Nunca asumas que no hay datos sin haber consultado.\n\nSos Lupa, la asistente de Calidad de Lata de Sudamericana Bebidas. Ayud\u00e1s a operadores, supervisores y analistas a entender las evidencias fotogr\u00e1ficas que el sistema de IA revisa en las l\u00edneas de producci\u00f3n (llenadora, etiquetadora, codificadora).\n\nContexto del dominio:\n- Cada evidencia es una foto (tapa, fondo de impresi\u00f3n, pantalla del contador, o frente de la lata) enviada por Telegram y analizada con visi\u00f3n IA (gpt-4o).\n- resultado puede ser OK, No OK, o sin clasificar (pendiente).\n- confianza menor a 0.85 deriva a revisi\u00f3n manual (estado_resultado = 'revision_manual').\n- coherencia compara el lote/vencimiento/hora IMPRESOS en la lata contra los mismos datos mostrados en la PANTALLA del tablero de la l\u00ednea; coherencia=false significa que no coinciden (posible error de calibraci\u00f3n o cambio de lote no reflejado).\n- tokens mide el consumo de IA por evidencia (para estimar costo).\n- las evidencias duplicadas ya est\u00e1n excluidas de las consultas.\n\nHoy es {{ $now.format('cccc dd/MM/yyyy') }} (zona horaria Argentina).\n\nPara responder preguntas sobre datos reales, us\u00e1 SIEMPRE la tool 'Consultar evidencias de Calidad':\n- Preguntas de m\u00e9tricas, totales, comparaciones entre l\u00edneas, promedios \u2192 modo 'resumen'.\n- Preguntas sobre casos puntuales, defectos, o motivos de un desv\u00edo \u2192 modo 'detalle'.\n- Convert\u00ed expresiones de tiempo a d\u00edas: 'hoy'\u21921, 'esta semana'\u21927, 'este mes'\u219230. Si no se especifica, us\u00e1 7.\n- Si el usuario no menciona una l\u00ednea, dej\u00e1 el par\u00e1metro linea vac\u00edo para traer todas.\n\nReglas de respuesta:\n- Respond\u00e9 siempre en espa\u00f1ol, corto y directo, con los n\u00fameros concretos que devolvi\u00f3 la tool.\n- Nunca inventes cifras: si la tool no trajo datos, decilo expl\u00edcitamente ('no hay evidencias en ese per\u00edodo').\n- El chat NO renderiza markdown: nunca uses asteriscos para negrita, ni numeraci\u00f3n tipo '1.', ni guiones de lista, ni encabezados con #. Escrib\u00ed texto plano, usando saltos de l\u00ednea y ' \u2014 ' o ':' para separar ideas.\n- Si preguntan algo fuera de Calidad de Lata, respond\u00e9 amablemente que solo pod\u00e9s ayudar con temas de Calidad de Lata."
        }
      }
    },
    {
      "id": "lm-openrouter",
      "name": "OpenRouter Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "typeVersion": 1,
      "position": [
        200,
        220
      ],
      "parameters": {
        "model": "openai/gpt-4o-mini",
        "options": {
          "maxTokens": 700,
          "temperature": 0.3
        }
      },
      "credentials": {
        "openRouterApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "id": "mem-buffer",
      "name": "Memoria de sesi\u00f3n",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "typeVersion": 1.2,
      "position": [
        360,
        220
      ],
      "parameters": {
        "sessionIdType": "customKey",
        "sessionKey": "={{ $json.body.session_id }}",
        "contextWindowLength": 20
      }
    },
    {
      "id": "tool-evidencias",
      "name": "Consultar evidencias de Calidad",
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "typeVersion": 2.2,
      "position": [
        520,
        220
      ],
      "parameters": {
        "description": "Consult\u00e1 evidencias y m\u00e9tricas de Calidad de Lata. Dos modos: 'resumen' devuelve totales agregados por l\u00ednea (evidencias, OK, No OK, revisi\u00f3n manual, incoherencias, confianza media, tokens) en una ventana de d\u00edas \u2014 usalo para preguntas de m\u00e9tricas o comparaci\u00f3n entre l\u00edneas. 'detalle' devuelve hasta 30 evidencias individuales con motivo y resultado \u2014 usalo para buscar casos espec\u00edficos o defectos. Par\u00e1metros: modo ('resumen'|'detalle'), dias_atras (n\u00famero de d\u00edas hacia atr\u00e1s, ej. hoy=1, esta semana=7, este mes=30), linea (opcional, ej. 'linea-1'; vac\u00edo = todas), resultado (opcional, solo en modo detalle: 'OK'|'No OK'; vac\u00edo = todos).",
        "source": "database",
        "workflowId": {
          "__rl": true,
          "value": "1V5WzKjcmzsrJ9bO",
          "mode": "list",
          "cachedResultName": "Calidad de Lata \u2014 7b) Tool Consultar Evidencias"
        },
        "workflowInputs": {
          "mappingMode": "defineBelow",
          "value": {
            "modo": "={{ $fromAI(\"modo\", \"'resumen' para m\u00e9tricas/totales/comparaciones, 'detalle' para casos puntuales\", \"string\") }}",
            "dias_atras": "={{ $fromAI(\"dias_atras\", \"D\u00edas hacia atr\u00e1s desde hoy a consultar, como texto num\u00e9rico ej. '7'. hoy=1, esta semana=7, este mes=30\", \"string\") }}",
            "linea": "={{ $fromAI(\"linea\", \"Filtrar por l\u00ednea ej. linea-1, linea-2, linea-3. Vac\u00edo para todas\", \"string\") }}",
            "resultado": "={{ $fromAI(\"resultado\", \"Filtrar por resultado OK o No OK, solo aplica en modo detalle. Vac\u00edo para todos\", \"string\") }}"
          },
          "schema": [
            {
              "id": "modo",
              "displayName": "modo",
              "type": "string",
              "display": true
            },
            {
              "id": "dias_atras",
              "displayName": "dias_atras",
              "type": "string",
              "display": true
            },
            {
              "id": "linea",
              "displayName": "linea",
              "type": "string",
              "display": true
            },
            {
              "id": "resultado",
              "displayName": "resultado",
              "type": "string",
              "display": true
            }
          ]
        }
      }
    },
    {
      "id": "resp-chat",
      "name": "Responder chat",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        640,
        0
      ],
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ { respuesta: $json.output } }}",
        "options": {
          "responseHeaders": {
            "entries": [
              {
                "name": "Access-Control-Allow-Origin",
                "value": "https://dashboard.cluna.ar"
              },
              {
                "name": "Cache-Control",
                "value": "no-store"
              }
            ]
          }
        }
      }
    },
    {
      "id": "sticky-7",
      "name": "Nota-chat",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        0,
        -320
      ],
      "parameters": {
        "content": "### 7) Chat Asistente IA \u2014 Lupa\nPOST https://n8n.aiporvos.com/webhook/dashboard-calidad-chat\nBody: { session_id, mensaje } \u2192 { respuesta }\nCORS restringido a https://dashboard.cluna.ar (igual que WF6).\n\nModelo: OpenRouter (openai/gpt-4o-mini) \u2014 no hay credencial nativa OpenAI en esta instancia, se reusa una credencial OpenRouter existente. Si '402 payment required': la cuenta se qued\u00f3 sin cr\u00e9ditos, cambiar a la otra credencial OpenRouter disponible o cargar saldo. NO usar 'openrouter/auto': probado y no es confiable para tool-calling (a veces no llama la tool y devuelve respuesta vac\u00eda).\nMemoria: Simple Memory (n8n interno), sessionKey = session_id del dashboard, ventana 20 turnos.\nTool: sub-workflow 7b (v_evidencias_completas) \u2014 DEBE estar activo.\n\n\u26a0\ufe0f Gotchas de esta build (13/07):\n1) El bug del sanitizador del MCP revierte nodos no tocados al editar otro \u2014 re-verificar TODOS los nodos tras cualquier update.\n2) queryReplacement del sub-workflow en formato array, no comma-string (con params vac\u00edos pierde par\u00e1metros).\n3) typeVersion 1.4 de Simple Memory y 1.2 de Execute Workflow Trigger NO son soportadas por esta instancia (\u00edcono roto '?' en el canvas) \u2014 al abrir/guardar en la UI BORRA los par\u00e1metros custom. Fijado a 1.2 y 1.1 respectivamente, que s\u00ed renderizan bien.",
        "height": 320,
        "width": 760,
        "color": 4
      }
    }
  ],
  "connections": {
    "GET chat-lupa": {
      "main": [
        [
          {
            "node": "Lupa",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Lupa": {
      "main": [
        [
          {
            "node": "Responder chat",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenRouter Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Lupa",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Memoria de sesi\u00f3n": {
      "ai_memory": [
        [
          {
            "node": "Lupa",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Consultar evidencias de Calidad": {
      "ai_tool": [
        [
          {
            "node": "Lupa",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1",
    "errorWorkflow": "I59vNrbU4KKGkHXF"
  }
}