{
  "nodes": [
    {
      "parameters": {},
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        864,
        0
      ],
      "id": "c1cf4392-5937-484b-84ce-4f16c9d03570",
      "name": "When clicking \u2018Execute workflow\u2019"
    },
    {
      "parameters": {
        "modelName": "models/gemini-3.1-pro-preview-customtools",
        "options": {
          "maxOutputTokens": 2000
        }
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "typeVersion": 1,
      "position": [
        1136,
        448
      ],
      "id": "bc9787c0-ca61-4cae-a09d-82e1a6fc3f28",
      "name": "Google Gemini Chat Model",
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "1f72fe46-407a-4573-a895-ccdd680b3b6e",
              "name": "output",
              "value": "={{ $('Function').item.json.output }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        2000,
        240
      ],
      "id": "303a8853-ea83-41f3-8e19-249be9bfc2d1",
      "name": "Edit Fields"
    },
    {
      "parameters": {
        "authentication": "serviceAccount",
        "projectId": {
          "__rl": true,
          "value": "proyecto-bi-488218",
          "mode": "list",
          "cachedResultName": "proyecto-BI",
          "cachedResultUrl": "https://console.cloud.google.com/bigquery?project=proyecto-bi-488218"
        },
        "sqlQuery": "INSERT INTO `proyecto-bi-488218.datos_clima.datos_sectoriales`\n(\n  timestamp,\n  session_id,\n  sector,\n  cultivo,\n  region,\n  temperatura_suelo,\n  humedad_relativa,\n  precipitacion,\n  horas_sol,\n  fase_lunar,\n  ai_recommendations,\n  metadata\n)\nVALUES\n(\n  -- \u2705 Timestamp con parsing seguro y fallback\n  COALESCE(\n    SAFE.PARSE_TIMESTAMP('%Y-%m-%dT%H:%M:%E*SZ', @timestamp),\n    CURRENT_TIMESTAMP()\n  ),\n  \n  -- \u2705 Session ID con sanitizaci\u00f3n\n  COALESCE(\n    NULLIF(TRIM(@session_id), ''), \n    CONCAT('agro-auto-', FORMAT_TIMESTAMP('%Y%m%d-%H%M%S', CURRENT_TIMESTAMP()))\n  ),\n  \n  -- \u2705 Sector fijo para AGRO\n  'AGRO',\n  \n  -- \u2705 Cultivo normalizado\n  CASE \n    WHEN UPPER(TRIM(@cultivo)) IN ('TRIGO', 'WHEAT') THEN 'Trigo'\n    WHEN UPPER(TRIM(@cultivo)) IN ('MAIZ', 'MA\u00cdZ', 'CORN') THEN 'Ma\u00edz'\n    WHEN UPPER(TRIM(@cultivo)) IN ('ARROZ', 'RICE') THEN 'Arroz'\n    WHEN UPPER(TRIM(@cultivo)) IN ('SOJA', 'SOYBEAN') THEN 'Soja'\n    WHEN UPPER(TRIM(@cultivo)) IN ('TOMATE', 'TOMATO') THEN 'Tomate'\n    WHEN UPPER(TRIM(@cultivo)) IN ('OLIVO', 'OLIVE') THEN 'Olivo'\n    WHEN UPPER(TRIM(@cultivo)) IN ('VID', 'UVA', 'GRAPE', 'WINE') THEN 'Vid'\n    WHEN TRIM(@cultivo) IS NULL OR TRIM(@cultivo) = '' THEN 'Cultivo no especificado'\n    ELSE REGEXP_REPLACE(TRIM(@cultivo), r'[^a-zA-Z\u00e1\u00e9\u00ed\u00f3\u00fa\u00c1\u00c9\u00cd\u00d3\u00da\u00f1\u00d1\\s]', '')\n  END,\n  \n  -- \u2705 Regi\u00f3n con validaci\u00f3n de longitud\n  CASE \n    WHEN LENGTH(TRIM(@region)) > 100 THEN SUBSTR(TRIM(@region), 1, 100)\n    WHEN TRIM(@region) IS NULL OR TRIM(@region) = '' THEN 'Regi\u00f3n no especificada'\n    ELSE TRIM(@region)\n  END,\n  \n  -- \u2705 Temperatura suelo - CONVERSI\u00d3N SEGURA STRING \u2192 FLOAT64 (\u00b0C)\n  CASE \n    WHEN SAFE_CAST(@temperatura_suelo AS FLOAT64) IS NOT NULL \n         AND SAFE_CAST(@temperatura_suelo AS FLOAT64) BETWEEN -20 AND 50 \n    THEN SAFE_CAST(@temperatura_suelo AS FLOAT64)\n    ELSE 15.0\n  END,\n  \n  -- \u2705 Humedad relativa - CONVERSI\u00d3N SEGURA STRING \u2192 FLOAT64 (%)\n  CASE \n    WHEN SAFE_CAST(@humedad_relativa AS FLOAT64) IS NOT NULL \n         AND SAFE_CAST(@humedad_relativa AS FLOAT64) BETWEEN 0 AND 100 \n    THEN SAFE_CAST(@humedad_relativa AS FLOAT64)\n    ELSE 50.0\n  END,\n  \n  -- \u2705 Precipitaci\u00f3n - CONVERSI\u00d3N SEGURA STRING \u2192 FLOAT64 (mm)\n  CASE \n    WHEN SAFE_CAST(@precipitacion AS FLOAT64) IS NOT NULL \n         AND SAFE_CAST(@precipitacion AS FLOAT64) BETWEEN 0 AND 500 \n    THEN SAFE_CAST(@precipitacion AS FLOAT64)\n    ELSE 0.0\n  END,\n  \n  -- \u2705 Horas sol - CONVERSI\u00d3N SEGURA STRING \u2192 FLOAT64\n  CASE \n    WHEN SAFE_CAST(@horas_sol AS FLOAT64) IS NOT NULL \n         AND SAFE_CAST(@horas_sol AS FLOAT64) BETWEEN 0 AND 24 \n    THEN SAFE_CAST(@horas_sol AS FLOAT64)\n    ELSE 8.0\n  END,\n  \n  -- \u2705 Fase lunar normalizada\n  CASE \n    WHEN UPPER(TRIM(@fase_lunar)) IN ('NUEVA', 'NEW_MOON') THEN 'Luna Nueva'\n    WHEN UPPER(TRIM(@fase_lunar)) IN ('CRECIENTE', 'WAXING_CRESCENT') THEN 'Luna Creciente'\n    WHEN UPPER(TRIM(@fase_lunar)) IN ('CUARTO_CRECIENTE', 'FIRST_QUARTER') THEN 'Cuarto Creciente'\n    WHEN UPPER(TRIM(@fase_lunar)) IN ('LLENA', 'FULL_MOON') THEN 'Luna Llena'\n    WHEN UPPER(TRIM(@fase_lunar)) IN ('MENGUANTE', 'WANING_GIBBOUS') THEN 'Luna Menguante'\n    WHEN UPPER(TRIM(@fase_lunar)) IN ('CUARTO_MENGUANTE', 'LAST_QUARTER') THEN 'Cuarto Menguante'\n    ELSE 'Sin datos'\n  END,\n  \n  -- \u2705 Recomendaciones AI con sanitizaci\u00f3n y l\u00edmite\n  CASE \n    WHEN LENGTH(TRIM(@ai_recommendations)) > 5000 THEN SUBSTR(TRIM(@ai_recommendations), 1, 5000)\n    WHEN TRIM(@ai_recommendations) IS NULL OR TRIM(@ai_recommendations) = '' THEN 'Recomendaciones no disponibles'\n    ELSE REGEXP_REPLACE(TRIM(@ai_recommendations), r'[^\\w\\s\u00e1\u00e9\u00ed\u00f3\u00fa\u00c1\u00c9\u00cd\u00d3\u00da\u00f1\u00d1.,;:()\\-\\n\\r]', '')\n  END,\n  \n  -- \u2705 Metadata JSON con validaci\u00f3n\n  CASE \n    WHEN @metadata IS NOT NULL AND @metadata != '' THEN @metadata\n    ELSE '{\"source\":\"default\",\"processed\":true}'\n  END\n);\n\n-- \u2705 SELECT para generar OUTPUT y continuar flujo\nSELECT \n  'SUCCESS' as status,\n  'Datos agr\u00edcolas insertados correctamente' as message,\n  CURRENT_TIMESTAMP() as processed_at,\n  'AGRO' as sector;\n\n",
        "options": {
          "queryParameters": {
            "namedParameters": [
              {
                "name": "timestamp",
                "value": "={{ $('Function').item.json.timestamp }}"
              },
              {
                "name": "session_id",
                "value": "={{ $('Function').item.json.session_id}}"
              },
              {
                "name": "cultivo",
                "value": "={{ $('Function').item.json.cultivo }}"
              },
              {
                "name": "region",
                "value": "={{ $('Function').item.json.region }}"
              },
              {
                "name": "temperatura_suelo",
                "value": "={{ $('Function').item.json.temperatura_suelo }}"
              },
              {
                "name": "humedad_relativa",
                "value": "={{ $('Function').item.json.humedad_relativa }}"
              },
              {
                "name": "precipitacion",
                "value": "={{ $('Function').item.json.precipitacion }}"
              },
              {
                "name": "horas_sol",
                "value": "={{ $('Function').item.json.horas_sol }}"
              },
              {
                "name": "fase_lunar",
                "value": "={{ $('Function').item.json.fase_lunar }}"
              },
              {
                "name": "ai_recommendations",
                "value": "={{ $('Function').item.json.ai_recommendations }}"
              },
              {
                "name": "metadata",
                "value": "={{ $('Function').item.json.metadata }}"
              },
              {
                "name": "sector",
                "value": "={{ $('Function').item.json.sector }}"
              }
            ]
          }
        }
      },
      "type": "n8n-nodes-base.googleBigQuery",
      "typeVersion": 2.1,
      "position": [
        1776,
        240
      ],
      "id": "8b24d427-8964-4beb-b205-991d14315bbb",
      "name": "Execute a SQL query",
      "credentials": {
        "googleApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const inputData = $input.first().json; \nconst texto_bruto = inputData.output || inputData.text || \"\";\n\n// Extrae el texto completo de la variable\nconst extraerTexto = (campo, fallback) => {\n    const regex = new RegExp(`${campo}[:\\\\s]+([^\\\\n]+)`, 'i');\n    const match = texto_bruto.match(regex);\n    return match ? match[1].trim() : fallback;\n};\n\n// NUEVO: Agarra solo el PRIMER n\u00famero de la lista separada por comas para BigQuery\nconst extraerPrimerNumero = (campo, fallback) => {\n    const texto = extraerTexto(campo, \"\");\n    if (!texto) return fallback;\n    const primerNumero = texto.split(',')[0].trim(); \n    return parseFloat(primerNumero.replace(',', '.')) || fallback;\n};\n\nconst reporte_limpio = texto_bruto.replace(/\\[MOSTRAR_GRAFICO\\][\\s\\S]*/i, \"\").trim();\n\nreturn [{\n    json: {\n        // --- DATOS PARA BIGQUERY ---\n        timestamp: new Date().toISOString(),\n        session_id: inputData.session_id || `agro-${Date.now()}`,\n        sector: \"AGRO\", \n        \n        cultivo: extraerTexto(\"cultivo\", \"S/D\"),\n        region: extraerTexto(\"region\", \"S/D\"),\n        temperatura_suelo: extraerPrimerNumero(\"temperatura_suelo\", 18),\n        humedad_relativa: extraerPrimerNumero(\"humedad_relativa\", 50),\n        precipitacion: extraerPrimerNumero(\"precipitacion\", 0),\n        horas_sol: extraerPrimerNumero(\"horas_sol\", 8),\n        fase_lunar: extraerTexto(\"fase_lunar\", \"S/D\"),\n        \n        ai_recommendations: reporte_limpio,\n        metadata: JSON.stringify({ status: \"success\" }),\n\n        // --- DATOS PARA EL FRONTEND (Lleva las listas completas) ---\n        output: texto_bruto \n    }\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1552,
        240
      ],
      "id": "adb2af20-6ae0-4fa0-b96e-4001335c0ba3",
      "name": "Function"
    },
    {
      "parameters": {
        "workflowInputs": {
          "values": [
            {
              "name": "query"
            }
          ]
        }
      },
      "type": "n8n-nodes-base.executeWorkflowTrigger",
      "typeVersion": 1.1,
      "position": [
        992,
        240
      ],
      "id": "e405ce0a-315f-49f9-8e71-f4b8c43ad3a9",
      "name": "When Executed by Another Workflow"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Eres el Especialista en Visualizaci\u00f3n Agroclim\u00e1tica de TuClima. La IA principal ya decidi\u00f3 enviarte aqu\u00ed porque el usuario solicit\u00f3 gr\u00e1ficos/visualizaciones agr\u00edcolas.\n\n**\ud83c\udfaf TU \u00daNICA FUNCI\u00d3N:**\n1. **RECIBIR:** Datos agroclim\u00e1ticos de la IA principal  \n2. **PROCESAR:** Aplicar motores de c\u00e1lculo agr\u00edcolas\n3. **VISUALIZAR:** Generar estructura para Power BI\n4. **ENVIAR:** Al siguiente nodo con link Power BI\n\n**\ud83d\udeab NO BUSQUES PALABRAS CLAVE:** La IA principal ya filtr\u00f3. Tu asumes que SIEMPRE debes hacer visualizaciones.\n\n### \ud83c\udfaf MISI\u00d3N ESPEC\u00cdFICA:\nYa est\u00e1s activado para crear visualizaciones agroclim\u00e1ticas. Procesa los datos recibidos y genera:\n- Gr\u00e1ficos de tendencias GDD\n- Ventanas de pulverizaci\u00f3n \n- Heat maps de suelo\n- Dashboards agr\u00edcolas completos\n\n### \ud83e\uddee MOTORES DE C\u00c1LCULO OBLIGATORIOS:\n\n**1. \ud83c\udf31 MOTOR DE CRECIMIENTO (GDD - Grados D\u00edas de Desarrollo):**\n- F\u00f3rmula Base: ((T_Max + T_Min) / 2) - 10\n- Si el resultado < 0, usar 0\n- Para Ma\u00edz, base t\u00e9rmica = 10\u00b0C\n- Interpretaci\u00f3n:\n  * 0-5: Crecimiento Nulo\n  * 5-10: Crecimiento Lento  \n  * 10-15: Crecimiento Moderado\n  * >15: Crecimiento Vigoroso\n- Acumulaci\u00f3n diaria cr\u00edtica para fotos\u00edntesis y desarrollo fenol\u00f3gico\n\n**2. \ud83d\ude9c MOTOR DE PULVERIZACI\u00d3N (Delta T - Calidad de Gota):**\n- F\u00f3rmula: Temp - (Temp * Humedad / 100) - 1.5\n- Si el resultado < 0, usar 0.5\n- Rangos cr\u00edticos:\n  * < 2: \ud83d\udd34 RIESGO INVERSI\u00d3N (gota suspendida, deriva masiva)\n  * 2-8: \ud83d\udfe2 \u00d3PTIMA (m\u00e1xima absorci\u00f3n sist\u00e9mica)\n  * 8-10: \ud83d\udfe1 MARGINAL (usar gota gruesa o coadyuvantes)\n  * >10: \ud83d\udd34 CR\u00cdTICA (evaporaci\u00f3n instant\u00e1nea, p\u00e9rdida econ\u00f3mica)\n- Factor adicional: Si Viento > 15 km/h = CR\u00cdTICO independiente de Delta T\n\n**3. \ud83c\udf21\ufe0f MOTOR DE SUELO (Estratigraf\u00eda T\u00e9rmica):**\n- Profundidades cr\u00edticas y sus significados:\n  * 0 cm (Superficie): Riesgo \"golpe de calor\" en pl\u00e1ntulas, volatilidad herbicidas\n  * 6 cm (Cama de Siembra): CR\u00cdTICO para germinaci\u00f3n, ma\u00edz requiere >10\u00b0C estables\n  * 18 cm (Ra\u00edz Activa): Absorci\u00f3n nutrientes, si T<15\u00b0C bloqueo de F\u00f3sforo\n  * 54 cm (Profundo): Inercia t\u00e9rmica y reserva h\u00eddrica\n\n**4. \ud83d\udca7 BALANCE H\u00cdDRICO & ESTR\u00c9S (VPD):**\n- Balance: Lluvia - ETo (Evapotranspiraci\u00f3n)\n- VPD (D\u00e9ficit de Presi\u00f3n de Vapor):\n  * >1.6 kPa: \ud83d\udd34 ESTR\u00c9S H\u00cdDRICO (cierre de estomas)\n  * 0.4-1.6 kPa: \ud83d\udfe2 RANGO \u00d3PTIMO\n  * <0.4 kPa: \ud83d\udfe1 RIESGO F\u00daNGICO (hoja mojada)\n\n### \ud83d\udcca FORMATO DE RESPUESTA OBLIGATORIO:\n\n```\n[Frase introductoria profesional sobre la situaci\u00f3n agroclim\u00e1tica]\n\n\ud83d\ude9c REPORTE AGRO INTELLIGENCE: [Ubicaci\u00f3n especificada]\n\n\ud83c\udf21\ufe0f CRECIMIENTO VEGETAL:\nGDD Diario: [C\u00e1lculo] grados-d\u00eda ([Estado: Nulo/Lento/Moderado/Vigoroso])\nAcumulaci\u00f3n Semanal: [Estimado] grados-d\u00eda\n\n\ud83d\udca6 VENTANA DE PULVERIZACI\u00d3N:\nDelta T: [C\u00e1lculo] \u00b0C \u2192 [\ud83d\udfe2 \u00d3PTIMA / \ud83d\udfe1 MARGINAL / \ud83d\udd34 CR\u00cdTICA]\nCondici\u00f3n de Deriva: Viento [X] km/h \u2192 [SEGURO / RIESGO / PROHIBIDO]\nHorario Recomendado: [Ventana temporal espec\u00edfica]\n\n\ud83c\udf31 PERFIL T\u00c9RMICO DEL SUELO:\n\u2022 Superficie (0cm): [X]\u00b0C - [Estado de riesgo]\n\u2022 Cama Siembra (6cm): [X]\u00b0C - [Evaluaci\u00f3n germinaci\u00f3n] \n\u2022 Ra\u00edz Activa (18cm): [X]\u00b0C - [Estado absorci\u00f3n nutrientes]\n\u2022 Reserva (54cm): [X]\u00b0C - [Inercia t\u00e9rmica]\n\n\ud83d\udca7 BALANCE H\u00cdDRICO:\nLluvia: [X]mm | ETo: [X]mm | Balance: [X]mm ([D\u00c9FICIT/SUPER\u00c1VIT])\nEstr\u00e9s H\u00eddrico (VPD): [X] kPa \u2192 [\ud83d\udfe2 \u00d3PTIMO / \ud83d\udfe1 VIGILANCIA / \ud83d\udd34 ESTR\u00c9S]\n\n\u26a0\ufe0f RECOMENDACIONES OPERATIVAS:\n\u2022 PRIORIDAD ALTA: [Acci\u00f3n espec\u00edfica inmediata]\n\u2022 MONITOREO: [Aspectos a vigilar]\n\u2022 VENTANA \u00d3PTIMA: [Timing para operaciones]\n\nSi el usuario pide un an\u00e1lisis general, calcula los 4 motores obligatorios.\n\nNUEVA REGLA: Si el usuario pide un gr\u00e1fico de un DATO PUNTUAL (ej: solo humedad o solo GDD), enf\u00f3cate \u00fanicamente en ese dato. Omite los motores que no tengan relaci\u00f3n para hacer el reporte m\u00e1s r\u00e1pido y directo.\n```\n\n### \ud83d\udeab RESTRICCIONES CR\u00cdTICAS:\n- NUNCA analices condiciones navales, a\u00e9reas o energ\u00e9ticas\n- SIEMPRE enfoca todo hacia impacto agr\u00edcola\n- NO uses terminolog\u00eda de otros sectores\n- SIEMPRE calcula los 4 motores obligatorios\n- Si faltan datos meteorol\u00f3gicos, solic\u00edtalos espec\u00edficamente\n\n**\u23f0 REGLA DE TIEMPO (FUTURO AGR\u00cdCOLA):**\nSi el an\u00e1lisis es para MA\u00d1ANA o fecha futura:\n- Cambia \"Condiciones Actuales\" por \"PROYECCI\u00d3N AGR\u00cdCOLA PARA [FECHA]\"\n- Usa verbos futuros: \"Se proyecta\", \"Condiciones esperadas\", \"Ventana prevista\"\n- Enfoca en planificaci\u00f3n de operaciones agr\u00edcolas\n\n**\ud83d\udcc4 PROTOCOLO DE OFERTA DE DOCUMENTOS T\u00c9CNICOS:**\nCuando proporciones un an\u00e1lisis agroclim\u00e1tico completo, SIEMPRE ofrecer:\n\"Para tus registros de campo y planificaci\u00f3n agr\u00edcola, \u00bfdeseas que genere un Informe T\u00e9cnico Agron\u00f3mico en PDF con este an\u00e1lisis?\"\n\n**\ud83d\udcca ACTIVACI\u00d3N POWER BI AGR\u00cdCOLA:**\nSelecciona segun te pida el usuario el tipo de grafico que quiere que hagas. Si no te especifica selecciona a tu criterio segun los datos que te pida:\n\n**L\u00d3GICA DE SELECCI\u00d3N:**\n1.  \u2192 L\u00edneas: `b2e3ea8eca90022b5c02`\n2. \u2192 Barras: `74eefb24516597981019`\n3. \u2192 L\u00edneas+Barras: `f9f1fe12a7682da2d98e`\n4. \u2192 Mapas: `b3ef452f50d98e112de7`\n5. \u2192 \u00c1reas: `e2a68c8e0910ae36e338`\n6. \u2192 An\u00e1lisis: `0c1e509440ac517a88a5`\n\n**\ud83d\udcca FORMATO FINAL OBLIGATORIO PARA EL GR\u00c1FICO:**\nPara que el sistema dibuje el gr\u00e1fico interactivo, DEBES terminar tu respuesta EXACTAMENTE con este bloque. \n\nREGLA DE TIEMPO CR\u00cdTICA: \n- Si piden varios datos temporales (horas o d\u00edas), TIENES ESTRICTAMENTE PROHIBIDO rellenar la lista con ceros o inventar los datos (ej: 15.8, 0, 0, 0, 0). \n- DEBES leer el pron\u00f3stico completo y extraer o calcular el valor REAL para CADA UNO de los puntos en el tiempo. \n- La cantidad de etiquetas debe ser IGUAL a la cantidad de n\u00fameros, y TODOS los n\u00fameros deben ser reales.\n- Si piden un dato est\u00e1tico/actual: Pon un solo valor por l\u00ednea.\n\n\ud83d\udea8 REGLA DE FORMATO CR\u00cdTICA Y OBLIGATORIA (INQUEBRANTABLE):\nTu respuesta final DEBE terminar SIEMPRE con el siguiente bloque de datos. \nREGLAS ESTRICTAS:\n1. Debes escribir literalmente la etiqueta \"[MOSTRAR_GRAFICO]\".\n2. Cada variable DEBE ir en una NUEVA L\u00cdNEA (Prohibido escribir todo en un solo p\u00e1rrafo).\n3. Escribe solo los n\u00fameros separados por comas. \u00a1NO USES CORCHETES `[]` ALREDEDOR DE LOS N\u00daMEROS!\n\nEJEMPLO EXACTO DE C\u00d3MO DEBES RESPONDER AL FINAL:\n\n\"[MOSTRAR_GRAFICO]\"\netiquetas: [Ej: Lunes, Martes, Mi\u00e9rcoles... o 08:00, 12:00, 16:00...]\ncultivo: [Nombre del cultivo]\nregion: [Nombre de la regi\u00f3n/ubicaci\u00f3n]\ntemperatura_suelo: [Ej: 18, 19, 20, 22]\nhumedad_relativa: [Ej: 45, 50, 60, 55]\nprecipitacion: [Ej: 0, 2, 0, 0]\nhoras_sol: [Ej: 8, 9, 7, 8]\nfase_lunar: [Fase lunar]\nviento_direccion: [Ej: 360, 45, 90, 180, 270] (\u00a1USAR SOLO GRADOS DE 0 a 360!)\n4. ANTI-BOTONES VAC\u00cdOS (OMISI\u00d3N RADICAL): Si no tienes los datos reales para una variable espec\u00edfica (por ejemplo, si te piden visibilidad_nm pero solo tienes en km, o si faltan datos de olas), TIENES ESTRICTAMENTE PROHIBIDO incluir el nombre de esa variable en tu lista final. BORRA la l\u00ednea por completo. Si incluyes una variable vac\u00eda o con ceros, el frontend crear\u00e1 un bot\u00f3n roto. Solo imprime las variables que tengan datos reales.\n\n**\ud83d\udccd REGLA CR\u00cdTICA DE UBICACI\u00d3N:**\nSi por alg\u00fan error t\u00e9cnico la IA principal no te pas\u00f3 la ubicaci\u00f3n, devuelve este mensaje exacto para que la IA principal se lo retransmita al usuario: ''\u26a0\ufe0f Error: Necesito que especifiques la ciudad, regi\u00f3n o zona agr\u00edcola para generar el dashboard'.\n\n\n### \ud83c\udfaf PALABRAS CLAVE DE ACTIVACI\u00d3N:\n**YA NO APLICA:** La IA principal se encarga del routing. Si llegaste aqu\u00ed, es porque ya debes generar visualizaciones agr\u00edcolas.\n\n\u26a0\ufe0f **IMPORTANTE:** NO busques palabras clave. Asume que TODA consulta que recibes requiere visualizaci\u00f3n Power BI.\n\n\n\n---\nDatos a analisar:\n{{ $json.query || $json.text || $json.chatInput || \"Genera el reporte para el gr\u00e1fico solicitado con estos datos: \" + JSON.stringify($json) }}",
        "batching": {}
      },
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.9,
      "position": [
        1184,
        240
      ],
      "id": "5f49edef-4215-4429-913c-01742fa6fb1c",
      "name": "Basic LLM Chain"
    }
  ],
  "connections": {
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Basic LLM Chain",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields": {
      "main": [
        []
      ]
    },
    "Execute a SQL query": {
      "main": [
        [
          {
            "node": "Edit Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Function": {
      "main": [
        [
          {
            "node": "Execute a SQL query",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When Executed by Another Workflow": {
      "main": [
        [
          {
            "node": "Basic LLM Chain",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Basic LLM Chain": {
      "main": [
        [
          {
            "node": "Function",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "meta": {
    "templateCredsSetupCompleted": true
  }
}