This workflow follows the Chainllm → Execute Workflow Trigger recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"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
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
googleApigooglePalmApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Agro Bi. Uses lmChatGoogleGemini, googleBigQuery, executeWorkflowTrigger, chainLlm. Event-driven trigger; 7 nodes.
Source: https://github.com/santinote9-droid/tuclima-mundial/blob/8a042ba155cd628889eb8eef2b54df6fdde37101/n8n/agro_BI.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Energia Bi. Uses lmChatGoogleGemini, googleBigQuery, executeWorkflowTrigger, chainLlm. Event-driven trigger; 7 nodes.
Aereo Bi. Uses lmChatGoogleGemini, googleBigQuery, executeWorkflowTrigger, chainLlm. Event-driven trigger; 7 nodes.
Naval Bi. Uses lmChatGoogleGemini, googleBigQuery, executeWorkflowTrigger, chainLlm. Event-driven trigger; 7 nodes.
Content - Newsletter Agent. Uses formTrigger, chainLlm, outputParserStructured, httpRequest. Event-driven trigger; 91 nodes.
Host Your Own AI Deep Research Agent with n8n, Apify and OpenAI. Uses outputParserStructured, lmChatOpenAi, formTrigger, chainLlm. Event-driven trigger; 87 nodes.