{
  "name": "Analista RSS",
  "nodes": [
    {
      "parameters": {},
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        -608,
        -112
      ],
      "id": "96391591-4f2b-48ad-ba6d-7b3b1edf3bed",
      "name": "When clicking ‘Execute workflow’"
    },
    {
      "parameters": {
        "url": "https://feeds.elpais.com/mrss-s/pages/ep/site/elpais.com/section/mexico/portada",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        -416,
        0
      ],
      "id": "68c810c1-8cd0-411a-bb39-0948f0664038",
      "name": "HTTP Request"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "n8n-nodes-base.xml",
      "typeVersion": 1,
      "position": [
        -208,
        0
      ],
      "id": "74e12cc3-498c-4364-924c-ccd8025d2bb3",
      "name": "XML"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "69920d50-67fe-4579-b1d3-fbbfbbd2d432",
              "name": "items",
              "value": "={{ $json.rss.channel.item }}",
              "type": "array"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        32,
        0
      ],
      "id": "79244d81-8129-4497-93e8-0ed5436758b5",
      "name": "items"
    },
    {
      "parameters": {
        "jsCode": "// Obtenemos el array de items del primer input\nconst feedItems = $input.first().json.items;\n\n// Creamos un nuevo array mapeado y limpio\nconst cleanedItems = feedItems.map(entry => {\n  const rawHtml = entry[\"content:encoded\"] || entry.description || \"\";\n\n  const textOnly = rawHtml\n    .replace(/<[^>]*>/g, ' ')   // Quita HTML\n    .replace(/\\s+/g, ' ')       // Colapsa espacios\n    .replace(/&nbsp;/gi, ' ')   // Decodifica &nbsp;\n    .replace(/&amp;/gi, '&')    // Decodifica &\n    .replace(/&quot;/gi, '\"')   // Decodifica \"\n    .replace(/&#39;/gi, \"'\")    // Decodifica '\n    .trim();\n\n  return {\n    json: {\n      title: entry.title,\n      link: entry.link,\n      description: textOnly\n    }\n  };\n});\n\n// Devolvemos solo los primeros 2\nreturn cleanedItems.slice(0, 1);\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        240,
        0
      ],
      "id": "093a71af-a748-4d32-8ba7-fd64ffc464a5",
      "name": "Code"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Eres un analista de noticias con tono profesional, imparcial y directo. \nTu tarea: resumir y clasificar cada noticia con el máximo realismo, sin suavizar hechos aunque sean explícitos o violentos.\n\nPara CADA noticia recibida (con campos: title, link, description):\n\nTitulo: {{ $json.title }}\nlink: {{ $json.link }}\ndescription: {{ $json.description }}\n\n\n\n1. **Resumen**:\n   - Sintetiza en 2 a 4 frases los hechos clave.\n   - No opines, no suavices, no omitas detalles importantes aunque sean duros.\n   - Si el texto contiene HTML, elimínalo antes de procesar.\n\n2. **Categoría**:\n   - Asigna una de estas etiquetas, o crea una nueva si no encaja: \n     * Política / Gobierno\n     * Narcotráfico / Crimen Organizado\n     * Conflictos Internacionales / Guerra\n     * Economía / Negocios\n     * Sociedad / Justicia\n     * Desastres / Accidentes\n     * Cultura / Deporte\n   - Sé preciso y consistente. Ejemplo: si hay violencia, clasifica en la categoría relacionada aunque la violencia sea secundaria.\n\n3. **Formato de salida texto plano**\n4. No uses adjetivos emocionales ni calificativos políticos.\n5. Incluye el link tal cual se recibió para trazabilidad. ",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 2.2,
      "position": [
        480,
        0
      ],
      "id": "b7c9dd85-154f-444d-80df-80f6898debc3",
      "name": "AI Agent"
    },
    {
      "parameters": {
        "model": "gemma2:2b",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOllama",
      "typeVersion": 1,
      "position": [
        352,
        208
      ],
      "id": "d16392f9-515f-47bb-bf88-78c080a59c71",
      "name": "Ollama Chat Model",
      "credentials": {
        "ollamaApi": {
          "id": "NVaEseanO3KP3sPb",
          "name": "Ollama account"
        }
      }
    },
    {
      "parameters": {
        "sessionIdType": "customKey",
        "sessionKey": "user_id"
      },
      "type": "@n8n/n8n-nodes-langchain.memoryMongoDbChat",
      "typeVersion": 1,
      "position": [
        544,
        208
      ],
      "id": "02c8775a-9f17-41d2-98b3-25aab75c920c",
      "name": "MongoDB Chat Memory",
      "credentials": {
        "mongoDb": {
          "id": "pyN9vA08m2uuk0Y8",
          "name": "MongoDB account"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// Obtenemos todos los elementos de entrada\nconst items = $input.all();\n\nreturn items.map(item => {\n  const rawOutput = item.json.output || \"\";\n\n  // Limpiador de Markdown y espacios\n  const cleanText = rawOutput\n    // Quita encabezados tipo ## o #\n    .replace(/^#+\\s*/gm, '')\n    // Quita viñetas tipo *, -, + al inicio de línea\n    .replace(/^[\\*\\-\\+]\\s*/gm, '')\n    // Quita asteriscos de negritas o itálicas\n    .replace(/\\*\\*/g, '')\n    .replace(/\\*/g, '')\n    // Quita guiones de listas si quedan\n    .replace(/^\\s*-\\s*/gm, '')\n    // Reemplaza múltiples saltos de línea por uno solo\n    .replace(/\\n{2,}/g, '\\n')\n    // Colapsa espacios múltiples\n    .replace(/[ \\t]+/g, ' ')\n    .trim();\n\n  return {\n    json: {\n      output: cleanText\n    }\n  };\n});\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        832,
        0
      ],
      "id": "b0d9c3a1-f711-4aec-88d2-ec5dd864df81",
      "name": "Code1"
    },
    {
      "parameters": {
        "path": "8039b7c1-1104-4898-b798-0b43c37315d4",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -608,
        112
      ],
      "id": "2650d6ad-94e1-4de0-a237-7c50182c2124",
      "name": "Webhook",
      "webhookId": "8039b7c1-1104-4898-b798-0b43c37315d4"
    }
  ],
  "pinData": {},
  "connections": {
    "When clicking ‘Execute workflow’": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request": {
      "main": [
        [
          {
            "node": "XML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "XML": {
      "main": [
        [
          {
            "node": "items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "items": {
      "main": [
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Ollama Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "MongoDB Chat Memory": {
      "ai_memory": [
        [
          {
            "node": "AI Agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent": {
      "main": [
        [
          {
            "node": "Code1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "ae7921df-fa07-475f-86bd-e81b5fe6e6bb",
  "meta": {
    "templateCredsSetupCompleted": true,
    "instanceId": "4a062dbd67887ddbd503ff65c2d13de0856a6e9bd7c7a35c3a6c6abd185a902d"
  },
  "id": "3TE3dkAV73JlpK7B",
  "tags": []
}