Generador de alertas de error y resúmenes
Este es unOther, AIflujo de automatización del dominio deautomatización que contiene 13 nodos.Utiliza principalmente nodos como If, N8n, Set, Code, Gmail, combinando tecnología de inteligencia artificial para lograr automatización inteligente. 🧠 FloWatch 👁️ Analizar y diagnosticar errores en los flujos de trabajo n8n mediante OpenAI y correo electrónico
- •Cuenta de Google y credenciales de API de Gmail
- •Clave de API de OpenAI
Nodos utilizados (13)
Categoría
{
"id": "3b1q6ZJTxeONrpUV",
"meta": {
"instanceId": ""
},
"name": "Error Alert and Summarizer",
"tags": [],
"nodes": [
{
"id": "d29a5b06-1609-416f-bc74-0274d3321019",
"name": "Disparador de Error",
"type": "n8n-nodes-base.errorTrigger",
"position": [
-600,
-40
],
"parameters": {},
"typeVersion": 1
},
{
"id": "a71d3052-a89b-4e8e-baee-7fe245575f42",
"name": "Modelo de chat OpenAI",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
528,
180
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o",
"cachedResultName": "gpt-4o"
},
"options": {}
},
"credentials": {
"openAiApi": {
"id": "786",
"name": "OpenAi account"
}
},
"typeVersion": 1.2
},
{
"id": "e71dee7b-4dfd-49ab-8939-f3808ee112d7",
"name": "Structured Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
648,
180
],
"parameters": {
"jsonSchemaExample": "{\n\"diagnosis\":\"\",\n\"cause\":\"\",\n\"resolution\":\"\"\n}"
},
"typeVersion": 1.2
},
{
"id": "3611e9e8-f677-49c4-b06c-fa6c28f43930",
"name": "SET EMAIL",
"type": "n8n-nodes-base.set",
"position": [
-380,
-40
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "45e1443a-fb44-42f8-96ad-423197c7265b",
"name": "TO",
"type": "string",
"value": "myemail@myemail.com"
},
{
"id": "968b05dc-f476-4e13-8166-e62005d0f936",
"name": "CC",
"type": "string",
"value": "theiremail@theiremail.com"
},
{
"id": "570663c5-29c0-44fb-9992-908b7cca8136",
"name": "BCC",
"type": "string",
"value": "theiremail@theiremail.com"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "3676f72e-d06d-44f8-be35-19efe09a257e",
"name": "Nota Adhesiva",
"type": "n8n-nodes-base.stickyNote",
"position": [
-450,
-260
],
"parameters": {
"color": 3,
"height": 380,
"content": "# SET YOUR EMAILS"
},
"typeVersion": 1
},
{
"id": "f0b08a20-6ecc-4487-9a0a-30be07cc0cbb",
"name": "Nota Adhesiva1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-40,
-260
],
"parameters": {
"color": 3,
"width": 280,
"height": 380,
"content": "# Enable/Disable Manual Executions"
},
"typeVersion": 1
},
{
"id": "b35cd2a6-5f22-4e06-9bb0-880855c423a8",
"name": "Remove Manual Exec",
"type": "n8n-nodes-base.if",
"position": [
60,
-40
],
"parameters": {
"options": {
"ignoreCase": true
},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": false,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "9b2f3ff3-db9c-406b-a97f-37620dc5fab9",
"operator": {
"type": "string",
"operation": "notContains"
},
"leftValue": "={{ $json.mode }}",
"rightValue": "manual"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "2a33b02a-78f1-4243-ba7d-f217ea4d1895",
"name": "Get Failed Exec",
"type": "n8n-nodes-base.n8n",
"position": [
-160,
-40
],
"parameters": {
"options": {
"activeWorkflows": true
},
"resource": "execution",
"operation": "get",
"executionId": "={{ $('Error Trigger').item.json.execution.id }}",
"requestOptions": {}
},
"credentials": {
"n8nApi": {
"id": "786",
"name": "n8n account"
}
},
"typeVersion": 1
},
{
"id": "b36ccbf9-4e47-44fc-aed3-424b6f121329",
"name": "Extract Error Details",
"type": "n8n-nodes-base.code",
"position": [
280,
-40
],
"parameters": {
"jsCode": "// 1) Grab your full execution JSON\nconst exec = items[0].json;\n\n// 2) Build execution‐level metadata\nconst meta = {\n executionId: exec.id,\n finished: exec.finished,\n mode: exec.mode,\n status: exec.status,\n createdAt: exec.createdAt,\n startedAt: exec.startedAt,\n stoppedAt: exec.stoppedAt,\n deletedAt: exec.deletedAt,\n workflowId: exec.workflowId,\n workflowName: exec.workflowData?.name,\n retryOf: exec.retryOf,\n retrySuccessId: exec.retrySuccessId,\n};\n\n// 3) Identify trigger node name from startData\nconst runNodeFilter = exec.data?.startData?.runNodeFilter || [];\nconst triggerNodeName = runNodeFilter[0] || null;\n\n// 4) Grab the raw trigger runData\nconst runData = exec.data?.resultData?.runData || {};\nconst triggerRuns = triggerNodeName ? (runData[triggerNodeName] || []) : [];\n\n// 5) Extract the JSON payload from the first run of the trigger\nlet triggerPayload = {};\nif (triggerRuns.length && triggerRuns[0].data?.main?.[0]?.[0]?.json) {\n triggerPayload = triggerRuns[0].data.main[0][0].json;\n}\n\n// 6) Merge trigger info into meta\nmeta.triggerNodeName = triggerNodeName;\nmeta.triggerPayload = triggerPayload;\n\n// 7) Now scan for all node errors, **excluding** any nodeName that contains “SERP”\nconst allErrors = [];\nfor (const [nodeName, runs] of Object.entries(runData)) {\n // Skip any of the SERP nodes\n if (nodeName.includes('SERP')) continue;\n\n runs.forEach(run => {\n if (run.executionStatus === 'error') {\n const err = run.error || exec.data.resultData.error || {};\n const nodeDef = err.node || run.node || {};\n\n allErrors.push({\n ...meta, // exec + trigger metadata\n\n nodeName,\n nodeId: nodeDef.id,\n nodeType: nodeDef.type,\n nodeLabel: nodeDef.name,\n\n startTime: run.startTime,\n executionTime: run.executionTime,\n source: run.source,\n\n errorName: err.name,\n errorMessage: err.message,\n errorDescription: err.description,\n httpCode: err.httpCode,\n messages: err.messages,\n context: err.context,\n stack: err.stack,\n\n parameters: nodeDef.parameters,\n credentials: nodeDef.credentials,\n });\n }\n });\n}\n\n// 8) Return results\nif (!allErrors.length) {\n return [{ json: { message: '✅ No (non‑SERP) errors found in this execution.' } }];\n}\nreturn allErrors.map(e => ({ json: e }));\n"
},
"typeVersion": 2
},
{
"id": "a26fb0c8-99eb-466d-b201-89c402fa1af4",
"name": "Error Solver Agente",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
500,
-40
],
"parameters": {
"text": "=Can you please help me with this error that occured in my n8n workflow? {{ JSON.stringify($json) }}",
"options": {
"systemMessage": "You are an seasoned n8n expert with specializations in managing n8n instances and workflows. The user will provide a detailed error json object and your goal is to review, analyze and understand the error and using your expertise diagnose the error and provide a detailed report to the user with your diagnosis, cause and resolution so the user understands and can immediately fix the issue."
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 1.8
},
{
"id": "8cfd7229-3ff1-4ba1-a67d-caa21be8064f",
"name": "Establecer Diagnosis Fields",
"type": "n8n-nodes-base.set",
"position": [
876,
-40
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "fac5fbee-d63d-4148-b047-5ed5af4f2574",
"name": "error.diagnosis",
"type": "string",
"value": "={{ $json.output.diagnosis }}"
},
{
"id": "ece9388d-f667-4984-a143-7241f622fe76",
"name": "error.cause",
"type": "string",
"value": "={{ $json.output.cause }}"
},
{
"id": "acb6b34a-a651-42fc-a44a-331b2e0d745c",
"name": "error.resolution",
"type": "string",
"value": "={{ $json.output.resolution }}"
},
{
"id": "c765754b-d6d5-4592-ac3f-99a350bc3c19",
"name": "error.workflowName",
"type": "string",
"value": "={{ $('Extract Error Details').item.json.workflowName }}"
},
{
"id": "dabebc62-3e0c-4d22-afbf-54ba66a912fb",
"name": "error.workflowId",
"type": "string",
"value": "={{ $('Extract Error Details').item.json.workflowId }}"
},
{
"id": "6ab19800-9a0f-439f-bf62-7a7afc5bf958",
"name": "workflowLink",
"type": "string",
"value": "={{ $execution.resumeUrl.split('/').slice(0, 3).join('/') }}/workflow/{{ $('Extract Error Details').item.json.workflowId }}"
},
{
"id": "29daaea5-052b-46d4-8192-141db159bff2",
"name": "error.executionId",
"type": "string",
"value": "={{ $('Extract Error Details').item.json.executionId }}"
},
{
"id": "9e4e553c-c82b-41ec-8ee2-14162cdc3bd8",
"name": "executionLink",
"type": "string",
"value": "={{ $execution.resumeUrl.split('/').slice(0, 3).join('/') }}/workflow/{{ $('Extract Error Details').item.json.workflowId }}/executions/{{ $('Extract Error Details').item.json.executionId }}"
},
{
"id": "7269ea9f-ed49-46cd-89f2-d4a467da529d",
"name": "error.finished",
"type": "boolean",
"value": "={{ $('Extract Error Details').item.json.finished }}"
},
{
"id": "29a6e6d2-5058-4dd9-b2f9-3980a6a9073a",
"name": "error.startedAt",
"type": "string",
"value": "={{ $('Extract Error Details').item.json.startedAt }}"
},
{
"id": "a0ad0e13-5a6e-48db-9a80-74c09434de7f",
"name": "error.nodeName",
"type": "string",
"value": "={{ $('Extract Error Details').item.json.nodeName }}"
},
{
"id": "6c1001d4-a581-4520-9f16-a2c7cf0e1f84",
"name": "error.previousNode",
"type": "string",
"value": "={{ $('Extract Error Details').item.json.source[0].previousNode }}"
},
{
"id": "8c3402ca-3f15-44ae-9b96-ea37c174334c",
"name": "rawJson",
"type": "string",
"value": "={{ JSON.stringify($('Extract Error Details').item.json) }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "9e95edf0-b2f1-443b-9ac4-3e3b3311cad5",
"name": "Send Gmail",
"type": "n8n-nodes-base.gmail",
"position": [
1316,
-40
],
"webhookId": "2f253c1f-36c3-4d58-ba2f-3a50bb78f188",
"parameters": {
"sendTo": "={{ $('SET EMAIL').item.json.TO }}",
"message": "={{ $json.html }}",
"options": {
"ccList": "={{ $('SET EMAIL').item.json.CC }}",
"bccList": "={{ $('SET EMAIL').item.json.BCC }}",
"appendAttribution": true
},
"subject": "={{ $json.subject }}"
},
"credentials": {
"gmailOAuth2": {
"id": "786",
"name": "Gmail account"
}
},
"typeVersion": 2.1
},
{
"id": "1705ee42-0be4-41a2-8ff9-f6963eef7382",
"name": "Generate Correo electrónico",
"type": "n8n-nodes-base.code",
"position": [
1100,
-40
],
"parameters": {
"jsCode": "// 1. Pull in your error payload\nconst rawInput = items[0].json;\nconst parsed = typeof rawInput === 'string' ? JSON.parse(rawInput) : rawInput;\nconst errorArray = Array.isArray(parsed) ? parsed : [parsed];\n\n// 2. Build HTML & Markdown sections\nlet htmlSections = '';\n\n\nfor (const errObj of errorArray) {\n const {\n error: {\n workflowName,\n executionId,\n nodeName,\n previousNode,\n diagnosis,\n cause,\n resolution,\n startedAt,\n },\n workflowLink,\n executionLink,\n } = errObj;\n\n // HTML block\n htmlSections += `\n <div style=\"border:1px solid #ddd;border-radius:4px;padding:16px;margin-bottom:20px;background:#fafafa;\">\n <h3 style=\"margin:0 0 10px;color:#c0392b;font-family:Arial,sans-serif;\">\n 🛑 ${workflowName} — Error in node: ${nodeName}\n </h3>\n <p style=\"margin:4px 0;font-family:Arial,sans-serif;\">\n <strong>Workflow:</strong> \n <a href=\"${workflowLink}\" style=\"color:#2980b9;text-decoration:none;\">\n ${workflowName}\n </a><br/>\n <strong>Execution:</strong> \n <a href=\"${executionLink}\" style=\"color:#2980b9;text-decoration:none;\">\n #${executionId}\n </a><br/>\n <strong>Previous Node:</strong> ${previousNode}<br/>\n <strong>Started At:</strong> ${new Date(startedAt).toLocaleString('en-US', { timeZone: 'America/New_York' })}\n </p>\n <hr style=\"border:none;border-top:1px solid #ccc;margin:12px 0;\"/>\n <h4 style=\"margin:0 0 6px;color:#e67e22;font-family:Arial,sans-serif;\">🔍 Diagnosis</h4>\n <p style=\"margin:4px 0 12px;font-family:Arial,sans-serif;\">${diagnosis}</p>\n <h4 style=\"margin:0 0 6px;color:#e67e22;font-family:Arial,sans-serif;\">⚙️ Cause</h4>\n <p style=\"margin:4px 0 12px;font-family:Arial,sans-serif;\">${cause}</p>\n <h4 style=\"margin:0 0 6px;color:#e67e22;font-family:Arial,sans-serif;\">✅ Resolution</h4>\n <p style=\"white-space:pre-wrap;margin:4px 0;font-family:Arial,sans-serif;\">${resolution}</p>\n </div>`;\n\n// 3. Wrap up\nconst html = `\n <div style=\"font-family:Arial,sans-serif;color:#333;background:#fff;padding:20px;\">\n <h2 style=\"margin-top:0;color:#2c3e50;\">Automated Error Report</h2>\n ${htmlSections}\n <p style=\"font-size:12px;color:#777;font-family:Arial,sans-serif;\">\n This message was generated automatically by \n <a href=\"https://realsimple.dev\" style=\"color:#777;text-decoration:none;\"><b>Real Simple Solutions</b></a>.\n</p>\n<div style=\"background:#f0f4ff;padding:8px 12px;margin-top:6px;border-radius:6px;font-size:12px;font-family:Arial,sans-serif;\">\n ✨ <strong>Want more n8n AI automation templates?</strong><br>\n Check out our full collection on \n <a href=\"https://joeper.es/4jXyRub\" style=\"color:#0066cc;text-decoration:none;\"><b>Gumroad</b></a>.\n</div>\n </div>\n`;\n\n// 4. Return all three\nreturn [\n {\n json: {\n subject: `🚨 n8n Error: ${errorArray[0].error.workflowName} (#${errorArray[0].error.executionId})`,\n html\n },\n },\n];\n"
},
"typeVersion": 2
}
],
"active": true,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "be484a20-26cd-4df4-a993-f7d01c2956e6",
"connections": {
"3611e9e8-f677-49c4-b06c-fa6c28f43930": {
"main": [
[
{
"node": "2a33b02a-78f1-4243-ba7d-f217ea4d1895",
"type": "main",
"index": 0
}
]
]
},
"d29a5b06-1609-416f-bc74-0274d3321019": {
"main": [
[
{
"node": "3611e9e8-f677-49c4-b06c-fa6c28f43930",
"type": "main",
"index": 0
}
]
]
},
"Generate Email": {
"main": [
[
{
"node": "9e95edf0-b2f1-443b-9ac4-3e3b3311cad5",
"type": "main",
"index": 0
}
]
]
},
"2a33b02a-78f1-4243-ba7d-f217ea4d1895": {
"main": [
[
{
"node": "b35cd2a6-5f22-4e06-9bb0-880855c423a8",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "Error Solver Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Error Solver Agent": {
"main": [
[
{
"node": "Set Diagnosis Fields",
"type": "main",
"index": 0
}
]
]
},
"b35cd2a6-5f22-4e06-9bb0-880855c423a8": {
"main": [
[
{
"node": "b36ccbf9-4e47-44fc-aed3-424b6f121329",
"type": "main",
"index": 0
}
]
]
},
"Set Diagnosis Fields": {
"main": [
[
{
"node": "Generate Email",
"type": "main",
"index": 0
}
]
]
},
"b36ccbf9-4e47-44fc-aed3-424b6f121329": {
"main": [
[
{
"node": "Error Solver Agent",
"type": "main",
"index": 0
}
]
]
},
"e71dee7b-4dfd-49ab-8939-f3808ee112d7": {
"ai_outputParser": [
[
{
"node": "Error Solver Agent",
"type": "ai_outputParser",
"index": 0
}
]
]
}
}
}¿Cómo usar este flujo de trabajo?
Copie el código de configuración JSON de arriba, cree un nuevo flujo de trabajo en su instancia de n8n y seleccione "Importar desde JSON", pegue la configuración y luego modifique la configuración de credenciales según sea necesario.
¿En qué escenarios es adecuado este flujo de trabajo?
Intermedio - Otros, Inteligencia Artificial
¿Es de pago?
Este flujo de trabajo es completamente gratuito, puede importarlo y usarlo directamente. Sin embargo, tenga en cuenta que los servicios de terceros utilizados en el flujo de trabajo (como la API de OpenAI) pueden requerir un pago por su cuenta.
Flujos de trabajo relacionados recomendados
RealSimple Solutions
@joeperesCompartir este flujo de trabajo