错误警报和摘要生成器
中级
这是一个Other, AI领域的自动化工作流,包含 13 个节点。主要使用 If, N8n, Set, Code, Gmail 等节点,结合人工智能技术实现智能自动化。 🧠 FloWatch 👁️ 通过OpenAI和电子邮件分析与诊断n8n工作流错误
前置要求
- •Google 账号和 Gmail API 凭证
- •OpenAI API Key
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
"id": "3b1q6ZJTxeONrpUV",
"meta": {
"instanceId": ""
},
"name": "错误警报和摘要生成器",
"tags": [],
"nodes": [
{
"id": "d29a5b06-1609-416f-bc74-0274d3321019",
"name": "错误触发器",
"type": "n8n-nodes-base.errorTrigger",
"position": [
-600,
-40
],
"parameters": {},
"typeVersion": 1
},
{
"id": "a71d3052-a89b-4e8e-baee-7fe245575f42",
"name": "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": "结构化输出解析器",
"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": "设置邮箱",
"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": "便签",
"type": "n8n-nodes-base.stickyNote",
"position": [
-450,
-260
],
"parameters": {
"color": 3,
"height": 380,
"content": "# 设置您的邮箱"
},
"typeVersion": 1
},
{
"id": "f0b08a20-6ecc-4487-9a0a-30be07cc0cbb",
"name": "便签1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-40,
-260
],
"parameters": {
"color": 3,
"width": 280,
"height": 380,
"content": "# 启用/禁用手动执行"
},
"typeVersion": 1
},
{
"id": "b35cd2a6-5f22-4e06-9bb0-880855c423a8",
"name": "移除手动执行",
"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": "获取失败执行",
"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": "提取错误详情",
"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": "错误解决代理",
"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": "设置诊断字段",
"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": "发送 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": "生成邮件",
"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": {
"SET EMAIL": {
"main": [
[
{
"node": "Get Failed Exec",
"type": "main",
"index": 0
}
]
]
},
"Error Trigger": {
"main": [
[
{
"node": "SET EMAIL",
"type": "main",
"index": 0
}
]
]
},
"Generate Email": {
"main": [
[
{
"node": "Send Gmail",
"type": "main",
"index": 0
}
]
]
},
"Get Failed Exec": {
"main": [
[
{
"node": "Remove Manual Exec",
"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
}
]
]
},
"Remove Manual Exec": {
"main": [
[
{
"node": "Extract Error Details",
"type": "main",
"index": 0
}
]
]
},
"Set Diagnosis Fields": {
"main": [
[
{
"node": "Generate Email",
"type": "main",
"index": 0
}
]
]
},
"Extract Error Details": {
"main": [
[
{
"node": "Error Solver Agent",
"type": "main",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "Error Solver Agent",
"type": "ai_outputParser",
"index": 0
}
]
]
}
}
}常见问题
如何使用这个工作流?
复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。
这个工作流适合什么场景?
中级 - 其他, 人工智能
需要付费吗?
本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。
相关工作流推荐
转录评估器
使用DeepGram和GPT-4o的音频对话分析与可视化
Set
Code
Html
+15
54 节点RealSimple Solutions
人工智能
转录评估器 V2
🔊 浏览器录音音频转录与AI分析(使用Deepgram和GPT-4o)
Set
Code
Html
+15
54 节点RealSimple Solutions
人工智能
AI 代理餐厅 [模板]
🤖 WhatsApp、Instagram 和 Messenger 的 AI 餐厅助手
If
N8n
Set
+37
239 节点Amanda Benks
其他
通过AI代理从Telegram记录餐食营养到Google Sheets
使用AI代理从Telegram记录餐食营养信息到Google Sheets
If
Set
Code
+11
23 节点PollupAI
其他
🌍 AI WhatsApp翻译器 + 语音转录器与HubSpot集成
基于OpenAI Whisper和GPT-4的多语言WhatsApp翻译器,集成HubSpot
If
N8n
Set
+18
107 节点Amanda Benks
其他
🌲 使用Gmail和GPT-40进行可持续发展报告审计的AI代理
🌲 使用Gmail和GPT-40进行可持续发展报告审计的AI代理
If
Code
Gmail
+6
14 节点Samir Saci
其他