API速率限制与认证FAQ测试
高级
这是一个Document Extraction, AI Summarization领域的自动化工作流,包含 19 个节点。主要使用 If, Set, Code, Gmail, Slack 等节点。 使用GPT-4o-mini、Google表格和Slack提醒自动化API常见问题质量测试
前置要求
- •Google 账号和 Gmail API 凭证
- •Slack Bot Token 或 Webhook URL
- •Google Sheets API 凭证
- •OpenAI API Key
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
"id": "9F7rxHKt3weSqZaD",
"meta": {
"instanceId": "8443f10082278c46aa5cf3acf8ff0f70061a2c58bce76efac814b16290845177",
"templateCredsSetupCompleted": true
},
"name": "API 速率限制与认证 FAQ 测试",
"tags": [
{
"id": "DWhGhh4ifGbElCsl",
"name": "Quality Assurance",
"createdAt": "2025-11-03T11:37:00.082Z",
"updatedAt": "2025-11-03T11:37:00.082Z"
},
{
"id": "OaQsaj1GDsV2DDag",
"name": "AI",
"createdAt": "2025-11-03T11:37:00.112Z",
"updatedAt": "2025-11-03T11:37:00.112Z"
},
{
"id": "u5sfzrVZ11a9nsuB",
"name": "Documentation",
"createdAt": "2025-11-03T11:37:00.152Z",
"updatedAt": "2025-11-03T11:37:00.152Z"
}
],
"nodes": [
{
"id": "35aa638c-cbaa-4125-877d-68560d49de34",
"name": "当点击\"执行工作流\"时",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-944,
3312
],
"parameters": {},
"typeVersion": 1
},
{
"id": "86fc4b54-b1b5-4de7-b98d-22abd8f4ba25",
"name": "部分:数据输入",
"type": "n8n-nodes-base.stickyNote",
"position": [
-848,
3088
],
"parameters": {
"color": 7,
"width": 580,
"content": "## 📥 数据输入"
},
"typeVersion": 1
},
{
"id": "dc53c187-0fc4-45e0-a415-13acc67a41f4",
"name": "部分:AI 评估",
"type": "n8n-nodes-base.stickyNote",
"position": [
-128,
3088
],
"parameters": {
"color": 7,
"width": 400,
"height": 144,
"content": "## 🤖 AI 评估"
},
"typeVersion": 1
},
{
"id": "861caa0a-4607-4a31-9682-a193652fb9b1",
"name": "部分:存储",
"type": "n8n-nodes-base.stickyNote",
"position": [
480,
3088
],
"parameters": {
"color": 7,
"width": 480,
"content": "## 💾 结果存储"
},
"typeVersion": 1
},
{
"id": "6e69317c-4cdb-4871-b2e4-0f7dc8022fe5",
"name": "部分:提醒",
"type": "n8n-nodes-base.stickyNote",
"position": [
1152,
3040
],
"parameters": {
"color": 7,
"width": 540,
"content": "## 📢 通知"
},
"typeVersion": 1
},
{
"id": "073ad6bd-87e2-409d-ab43-2546907c1aef",
"name": "📋 工作流概览1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1536,
3056
],
"parameters": {
"width": 420,
"height": 552,
"content": "## 工作原理"
},
"typeVersion": 1
},
{
"id": "aa25afd0-e903-4352-a809-a995941dbee0",
"name": "⚙️ 配置1",
"type": "n8n-nodes-base.set",
"position": [
-736,
3312
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "config_sheet_id",
"name": "sheet_id",
"type": "string",
"value": "1ABC_REPLACE_WITH_YOUR_SHEET_ID_xyz123"
},
{
"id": "config_threshold_critical",
"name": "threshold_critical",
"type": "number",
"value": 5
},
{
"id": "config_threshold_warning",
"name": "threshold_warning",
"type": "number",
"value": 7
},
{
"id": "config_threshold_good",
"name": "threshold_good",
"type": "number",
"value": 8
},
{
"id": "config_slack_channel",
"name": "slack_channel_id",
"type": "string",
"value": "C09GNB90TED"
},
{
"id": "config_batch_size",
"name": "batch_size",
"type": "number",
"value": 10
},
{
"id": "config_test_sheet",
"name": "test_sheet_name",
"type": "string",
"value": "TestSet"
},
{
"id": "config_results_sheet",
"name": "results_sheet_name",
"type": "string",
"value": "Results"
},
{
"id": "config_history_sheet",
"name": "history_sheet_name",
"type": "string",
"value": "History"
},
{
"id": "run_id",
"name": "run_id",
"type": "string",
"value": "={{ $now.format('yyyyMMdd-HHmmss') }}"
}
]
}
},
"typeVersion": 3.3
},
{
"id": "653f3c13-0665-48ad-93a3-ed24e860518f",
"name": "📖 获取 FAQ1",
"type": "n8n-nodes-base.googleSheets",
"position": [
-512,
3312
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "name",
"value": "={{ $json.test_sheet_name }}"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.sheet_id }}"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "s4dP1fNuVZ2gWvs3",
"name": "Google Sheets account"
}
},
"typeVersion": 4.4
},
{
"id": "e27c8068-5afc-4cd7-8204-6ba2a43e5b48",
"name": "🔍 验证和清理数据1",
"type": "n8n-nodes-base.code",
"position": [
-288,
3312
],
"parameters": {
"jsCode": "// Validate and clean FAQ data\nconst items = $input.all();\nconst config = items[0].json;\nconst cleanedItems = [];\n\nfor (let i = 0; i < items.length; i++) {\n const item = items[i];\n \n // Skip if it's the config item or header row\n if (item.json.sheet_id || i === 0) continue;\n \n // Get question and answer (handle different column name formats)\n const question = item.json.Question || item.json.question || item.json.A || '';\n const answer = item.json.Answer || item.json.answer || item.json.B || '';\n \n // Skip empty rows\n if (!question || !answer || question.trim() === '' || answer.trim() === '') {\n continue;\n }\n \n // Create cleaned item\n cleanedItems.push({\n json: {\n question: question.trim(),\n answer: answer.trim(),\n row_number: i,\n run_id: config.run_id,\n sheet_id: config.sheet_id,\n batch_size: config.batch_size,\n threshold_critical: config.threshold_critical,\n threshold_warning: config.threshold_warning,\n threshold_good: config.threshold_good\n }\n });\n}\n\nif (cleanedItems.length === 0) {\n throw new Error('No valid FAQ entries found in the sheet. Please check your data format.');\n}\n\nconsole.log(`Validated ${cleanedItems.length} FAQ entries for processing`);\nreturn cleanedItems;"
},
"typeVersion": 2
},
{
"id": "5db219e2-af99-4386-b3f9-c53a79cc9cf6",
"name": "🤖 AI 评估器1",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-64,
3312
],
"parameters": {
"text": "=You are an expert technical documentation reviewer specializing in API documentation, authentication systems, and rate limiting policies.\n\n**Task:** Evaluate the quality and completeness of this FAQ entry.\n\n**Question:** {{ $json.question }}\n\n**Answer:** {{ $json.answer }}\n\n**Evaluation Criteria:**\n1. **Completeness (0-3 points)**: Does it address edge cases and scenarios?\n2. **Clarity (0-3 points)**: Is the explanation clear and unambiguous?\n3. **Technical Accuracy (0-2 points)**: Are technical details correct?\n4. **Actionability (0-2 points)**: Can users act on this information?\n\n**Output Requirements:**\nProvide ONLY valid JSON with this exact structure:\n{\n \"score\": <number 0-10>,\n \"explanation\": \"<brief one-sentence explanation>\",\n \"strengths\": \"<what's good about this answer>\",\n \"improvements\": \"<specific suggestions for improvement>\"\n}\n\n**Important:** Return ONLY the JSON object, no additional text.",
"options": {
"systemMessage": "You are a technical documentation quality analyst. Provide objective, constructive evaluations in valid JSON format only."
}
},
"typeVersion": 1.2
},
{
"id": "9bc66b99-cb86-4c3e-abc4-fa6fa8685e29",
"name": "Azure OpenAI1",
"type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
"position": [
16,
3536
],
"parameters": {
"model": "gpt-4o-mini",
"options": {
"maxTokens": 500,
"temperature": 0.3
}
},
"credentials": {
"azureOpenAiApi": {
"id": "C3WzT18XqF8OdVM6",
"name": "Azure Open AI account"
}
},
"typeVersion": 1
},
{
"id": "e2a58c64-1552-43ae-a7df-2bf665ea52a1",
"name": "📊 解析和丰富结果1",
"type": "n8n-nodes-base.code",
"position": [
304,
3312
],
"parameters": {
"jsCode": "// Parse and enrich AI evaluation results with error handling\nconst items = $input.all();\nconst enrichedItems = [];\n\nfor (const item of items) {\n try {\n // Get the AI output\n const aiOutput = item.json.output || '{}';\n \n // Try to parse JSON from the output\n let evaluation;\n try {\n // Handle case where output might have markdown code blocks\n const jsonMatch = aiOutput.match(/\\{[\\s\\S]*\\}/);\n const jsonString = jsonMatch ? jsonMatch[0] : aiOutput;\n evaluation = JSON.parse(jsonString);\n } catch (parseError) {\n console.error('Failed to parse AI response:', aiOutput);\n evaluation = {\n score: 0,\n explanation: 'AI response parsing failed',\n strengths: 'N/A',\n improvements: 'Error in evaluation - needs manual review'\n };\n }\n \n // Determine severity level\n let severity = 'good';\n let severity_emoji = '✅';\n \n if (evaluation.score < item.json.threshold_critical) {\n severity = 'critical';\n severity_emoji = '🔴';\n } else if (evaluation.score < item.json.threshold_warning) {\n severity = 'warning';\n severity_emoji = '⚠️';\n } else if (evaluation.score < item.json.threshold_good) {\n severity = 'acceptable';\n severity_emoji = '🟡';\n }\n \n // Create enriched item\n enrichedItems.push({\n json: {\n // Original data\n question: item.json.question,\n answer: item.json.answer,\n row_number: item.json.row_number,\n run_id: item.json.run_id,\n \n // Evaluation results\n score: evaluation.score || 0,\n explanation: evaluation.explanation || 'No explanation provided',\n strengths: evaluation.strengths || 'N/A',\n improvements: evaluation.improvements || 'N/A',\n \n // Metadata\n severity: severity,\n severity_emoji: severity_emoji,\n timestamp: new Date().toISOString(),\n evaluated_at: new Date().toLocaleString('en-US', { \n timeZone: 'UTC',\n dateStyle: 'medium',\n timeStyle: 'short'\n }),\n \n // For filtering\n needs_attention: evaluation.score < item.json.threshold_warning,\n \n // Config passthrough\n sheet_id: item.json.sheet_id\n }\n });\n } catch (error) {\n console.error('Error processing item:', error);\n // Add error item to results\n enrichedItems.push({\n json: {\n question: item.json.question || 'Unknown',\n answer: item.json.answer || 'Unknown',\n score: 0,\n explanation: `Processing error: ${error.message}`,\n severity: 'error',\n severity_emoji: '❌',\n timestamp: new Date().toISOString(),\n needs_attention: true,\n sheet_id: item.json.sheet_id,\n run_id: item.json.run_id\n }\n });\n }\n}\n\nconsole.log(`Processed ${enrichedItems.length} evaluations`);\nreturn enrichedItems;"
},
"typeVersion": 2
},
{
"id": "ad83a4b8-4cdc-40a3-b5de-49fb85ac205c",
"name": "💾 保存详细结果1",
"type": "n8n-nodes-base.googleSheets",
"position": [
528,
3312
],
"parameters": {
"columns": {
"value": {
"Score": "={{ $json.score }}",
"Run ID": "={{ $json.run_id }}",
"Question": "={{ $json.question }}",
"Severity": "={{ $json.severity_emoji }} {{ $json.severity.toUpperCase() }}",
"Strengths": "={{ $json.strengths }}",
"Timestamp": "={{ $json.evaluated_at }}",
"Explanation": "={{ $json.explanation }}",
"Improvements": "={{ $json.improvements }}"
},
"mappingMode": "defineBelow"
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "Results"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.sheet_id }}"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "s4dP1fNuVZ2gWvs3",
"name": "Google Sheets account"
}
},
"typeVersion": 4.4
},
{
"id": "853e8bba-0d8e-413a-b6fb-959e8ea1896c",
"name": "📈 生成摘要报告1",
"type": "n8n-nodes-base.code",
"position": [
752,
3312
],
"parameters": {
"jsCode": "// Generate comprehensive summary report\nconst items = $input.all();\n\nif (items.length === 0) {\n return [{\n json: {\n error: 'No items to summarize'\n }\n }];\n}\n\n// Calculate statistics\nconst scores = items.map(item => item.json.score);\nconst totalFaqs = scores.length;\nconst avgScore = (scores.reduce((a, b) => a + b, 0) / totalFaqs).toFixed(2);\nconst maxScore = Math.max(...scores);\nconst minScore = Math.min(...scores);\n\n// Count by severity\nconst critical = items.filter(item => item.json.severity === 'critical').length;\nconst warning = items.filter(item => item.json.severity === 'warning').length;\nconst acceptable = items.filter(item => item.json.severity === 'acceptable').length;\nconst good = items.filter(item => item.json.severity === 'good').length;\n\n// Calculate pass rate (score >= 7)\nconst passCount = scores.filter(s => s >= 7).length;\nconst passRate = ((passCount / totalFaqs) * 100).toFixed(1);\n\n// Get config from first item\nconst config = items[0].json;\n\n// Find top 3 worst performing FAQs\nconst worstFaqs = items\n .sort((a, b) => a.json.score - b.json.score)\n .slice(0, 3)\n .map(item => ({\n question: item.json.question.substring(0, 100),\n score: item.json.score,\n improvements: item.json.improvements\n }));\n\n// Create summary\nconst summary = {\n json: {\n // Summary stats\n run_id: config.run_id,\n timestamp: new Date().toISOString(),\n total_faqs: totalFaqs,\n average_score: parseFloat(avgScore),\n max_score: maxScore,\n min_score: minScore,\n pass_rate: parseFloat(passRate),\n \n // Severity breakdown\n critical_count: critical,\n warning_count: warning,\n acceptable_count: acceptable,\n good_count: good,\n \n // Status\n overall_status: critical > 0 ? 'CRITICAL' : warning > 0 ? 'NEEDS_ATTENTION' : 'HEALTHY',\n \n // Worst performers\n worst_performers: JSON.stringify(worstFaqs),\n \n // For display\n summary_text: `📊 FAQ Quality Report\\n\\n` +\n `📈 Overall Score: ${avgScore}/10 (${passRate}% pass rate)\\n` +\n `📝 Total FAQs Evaluated: ${totalFaqs}\\n\\n` +\n `🎯 Severity Breakdown:\\n` +\n ` 🔴 Critical: ${critical}\\n` +\n ` ⚠️ Warning: ${warning}\\n` +\n ` 🟡 Acceptable: ${acceptable}\\n` +\n ` ✅ Good: ${good}\\n\\n` +\n `📉 Score Range: ${minScore} - ${maxScore}`,\n \n // For alerts\n needs_alert: critical > 0 || warning > 0,\n sheet_id: config.sheet_id,\n \n // Pass through all items for next node\n all_results: items\n }\n};\n\nconsole.log('Summary generated:', summary.json.summary_text);\nreturn [summary];"
},
"typeVersion": 2
},
{
"id": "0cf75d4f-f2e1-47ca-91f1-4ddffd9ff987",
"name": "📊 保存到历史1",
"type": "n8n-nodes-base.googleSheets",
"position": [
976,
3312
],
"parameters": {
"columns": {
"value": {
"Good": "={{ $json.good_count }}",
"Run ID": "={{ $json.run_id }}",
"Status": "={{ $json.overall_status }}",
"Warning": "={{ $json.warning_count }}",
"Critical": "={{ $json.critical_count }}",
"Pass Rate": "={{ $json.pass_rate }}%",
"Timestamp": "={{ $json.timestamp }}",
"Acceptable": "={{ $json.acceptable_count }}",
"Total FAQs": "={{ $json.total_faqs }}",
"Average Score": "={{ $json.average_score }}"
},
"mappingMode": "defineBelow"
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "History"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.sheet_id }}"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "s4dP1fNuVZ2gWvs3",
"name": "Google Sheets account"
}
},
"typeVersion": 4.4
},
{
"id": "5390e894-108c-462c-8b4e-85fa481a631c",
"name": "⚠️ 检查是否需要提醒1",
"type": "n8n-nodes-base.if",
"position": [
1200,
3312
],
"parameters": {
"options": {},
"conditions": {
"boolean": [
{
"value1": "={{ $json.needs_alert }}",
"value2": true
}
]
}
},
"typeVersion": 2
},
{
"id": "24cdee69-2017-47ba-961f-198a6bea352f",
"name": "💬 发送 Slack 提醒1",
"type": "n8n-nodes-base.slack",
"position": [
1424,
3232
],
"webhookId": "32545389-7dfc-490c-b4e4-933298983f3e",
"parameters": {
"text": "=🚨 *FAQ Quality Alert* 🚨\n\n{{ $json.summary_text }}\n\n---\n\n⚠️ *Action Required:*\n{{ $json.critical_count > 0 ? '🔴 ' + $json.critical_count + ' CRITICAL issues need immediate attention\\n' : '' }}{{ $json.warning_count > 0 ? '⚠️ ' + $json.warning_count + ' warnings should be reviewed\\n' : '' }}\n📋 View full details: https://docs.google.com/spreadsheets/d/{{ $json.sheet_id }}/edit#gid=0\n\n*Run ID:* `{{ $json.run_id }}`",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "id",
"value": "C09GNB90TED"
},
"otherOptions": {}
},
"credentials": {
"slackApi": {
"id": "rNqvWj9TfChPVRYY",
"name": "Slack account vivek"
}
},
"typeVersion": 2.1
},
{
"id": "4e661beb-0009-4de3-8388-fb7221b9afad",
"name": "✅ 完成摘要1",
"type": "n8n-nodes-base.set",
"position": [
1632,
3408
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "complete_message",
"name": "completion_message",
"type": "string",
"value": "=✅ FAQ Quality Check Complete!\n\nRun ID: {{ $json.run_id }}\nTotal FAQs Evaluated: {{ $json.total_faqs }}\nAverage Score: {{ $json.average_score }}/10\nPass Rate: {{ $json.pass_rate }}%\n\nResults saved to Google Sheets.\n{{ $json.needs_alert ? 'Alerts sent to team.' : 'No alerts needed - all FAQs meeting quality standards!' }}"
},
{
"id": "results_url",
"name": "results_url",
"type": "string",
"value": "=https://docs.google.com/spreadsheets/d/{{ $json.sheet_id }}/edit"
}
]
}
},
"typeVersion": 3.3
},
{
"id": "e93ce33f-4bbe-476b-82f3-e122987bae3a",
"name": "发送消息1",
"type": "n8n-nodes-base.gmail",
"position": [
1872,
3312
],
"webhookId": "0e92bde1-6732-420d-a95e-94378cfee529",
"parameters": {
"sendTo": "info@example.com",
"message": "={{ $json.text }}",
"options": {},
"subject": "={{ $json.text }}",
"emailType": "text"
},
"credentials": {
"gmailOAuth2": {
"id": "RchiXdmY8WaQhOSJ",
"name": "Gmail account"
}
},
"typeVersion": 2.1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "3fb46229-1e78-4bb1-9e72-90cfba38bf71",
"connections": {
"Azure OpenAI1": {
"ai_languageModel": [
[
{
"node": "🤖 AI Evaluator1",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"📖 Fetch FAQs1": {
"main": [
[
{
"node": "🔍 Validate & Clean Data1",
"type": "main",
"index": 0
}
]
]
},
"🤖 AI Evaluator1": {
"main": [
[
{
"node": "📊 Parse & Enrich Results1",
"type": "main",
"index": 0
}
]
]
},
"⚙️ Configuration1": {
"main": [
[
{
"node": "📖 Fetch FAQs1",
"type": "main",
"index": 0
}
]
]
},
"📊 Save to History1": {
"main": [
[
{
"node": "⚠️ Check if Alerts Needed1",
"type": "main",
"index": 0
}
]
]
},
"💬 Send Slack Alert1": {
"main": [
[
{
"node": "✅ Completion Summary1",
"type": "main",
"index": 0
}
]
]
},
"✅ Completion Summary1": {
"main": [
[
{
"node": "Send a message1",
"type": "main",
"index": 0
}
]
]
},
"💾 Save Detailed Results1": {
"main": [
[
{
"node": "📈 Generate Summary Report1",
"type": "main",
"index": 0
}
]
]
},
"🔍 Validate & Clean Data1": {
"main": [
[
{
"node": "🤖 AI Evaluator1",
"type": "main",
"index": 0
}
]
]
},
"📊 Parse & Enrich Results1": {
"main": [
[
{
"node": "💾 Save Detailed Results1",
"type": "main",
"index": 0
}
]
]
},
"📈 Generate Summary Report1": {
"main": [
[
{
"node": "📊 Save to History1",
"type": "main",
"index": 0
}
]
]
},
"⚠️ Check if Alerts Needed1": {
"main": [
[
{
"node": "💬 Send Slack Alert1",
"type": "main",
"index": 0
},
{
"node": "✅ Completion Summary1",
"type": "main",
"index": 0
}
],
[
{
"node": "✅ Completion Summary1",
"type": "main",
"index": 0
}
]
]
},
"When clicking ‘Execute workflow’": {
"main": [
[
{
"node": "⚙️ Configuration1",
"type": "main",
"index": 0
}
]
]
}
}
}常见问题
如何使用这个工作流?
复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。
这个工作流适合什么场景?
高级 - 文档提取, AI 摘要总结
需要付费吗?
本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。
相关工作流推荐
自动化依赖更新跟踪
使用 GPT-4o、Slack、Jira 和 Google Sheets 进行依赖更新风险分析
If
Set
Code
+8
23 节点Rahul Joshi
开发运维
个性化拒绝/下一步邮件
使用Google Sheets、GPT-4o-mini、Gmail和ClickUp自动化候选人拒绝
If
Set
Code
+7
38 节点Rahul Joshi
人力资源
支持收件箱到常见问题解答回填(Gmail/Outlook)
使用GPT-4o、Gmail、Notion和Slack将支持邮件转换为常见问题解答
If
Code
Gmail
+7
21 节点Rahul Joshi
工单管理
新开发人员入职自动化
使用 GPT-4o 实现员工入职自动化:Jira、Notion 和 Gmail 集成
If
Set
Code
+9
21 节点Rahul Joshi
人力资源
反馈保存和报告生成
使用Azure OpenAI和Google Sheets分析销售交易结果并生成报告
Set
Code
Email Send
+6
28 节点Rahul Joshi
客户关系管理
结构化面试反馈收集
使用GPT-4o-mini、Gmail和ClickUp任务跟踪自动化候选人拒绝
If
Code
Gmail
+6
18 节点Rahul Joshi
人力资源
工作流信息
难度等级
高级
节点数量19
分类2
节点类型10
作者
Rahul Joshi
@rahul08Rahul Joshi is a seasoned technology leader specializing in the n8n automation tool and AI-driven workflow automation. With deep expertise in building open-source workflow automation and self-hosted automation platforms, he helps organizations eliminate manual processes through intelligent n8n ai agent automation solutions.
外部链接
在 n8n.io 查看 →
分享此工作流