AI驱动的RAG文档处理与聊天机器人 - Google Drive、Supabase、OpenAI
高级
这是一个AI, IT Ops领域的自动化工作流,包含 35 个节点。主要使用 Set, Code, Limit, Switch, SplitOut 等节点,结合人工智能技术实现智能自动化。 基于Google Drive、Supabase和OpenAI的AI驱动RAG文档处理与聊天机器人
前置要求
- •Google Drive API 凭证
- •OpenAI API Key
- •Google Gemini API Key
- •Supabase URL 和 API Key
使用的节点 (35)
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
"meta": {
"instanceId": "d1786ab0d745a7498abf13a9c2cdabb1374c006e889b79eef64ce0386b8f8a41",
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "f13af0a4-02e8-41b4-9ad8-55443604f031",
"name": "遍历项目",
"type": "n8n-nodes-base.splitInBatches",
"position": [
540,
-80
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "3a3a9bee-fd2c-48fb-a946-850bdd574b21",
"name": "从 PDF 提取",
"type": "n8n-nodes-base.extractFromFile",
"position": [
1720,
-120
],
"parameters": {
"options": {},
"operation": "pdf"
},
"typeVersion": 1
},
{
"id": "42a44446-4cd9-4b8f-bcc8-dc912954e515",
"name": "从 CSV 提取",
"type": "n8n-nodes-base.extractFromFile",
"position": [
1720,
80
],
"parameters": {
"options": {}
},
"typeVersion": 1
},
{
"id": "2141dbdd-4fce-4306-a852-581b138864e4",
"name": "默认数据加载器",
"type": "@n8n/n8n-nodes-langchain.documentDefaultDataLoader",
"position": [
3800,
80
],
"parameters": {
"options": {
"metadata": {
"metadataValues": [
{
"name": "file_id",
"value": "={{ $('Set File ID').first().json.file_id}}"
},
{
"name": "title",
"value": "={{ $('Create Metadata Title & Description').item.json.output.title }}"
},
{
"name": "description",
"value": "={{ $('Create Metadata Title & Description').item.json.output.description }}"
}
]
}
},
"jsonData": "={{ $json.concatenated_text }}",
"jsonMode": "expressionData"
},
"typeVersion": 1
},
{
"id": "af8b85b1-1cfa-4b76-b94e-48213ae232d8",
"name": "Google Drive 触发器文件已创建",
"type": "n8n-nodes-base.googleDriveTrigger",
"position": [
280,
-80
],
"parameters": {
"event": "fileCreated",
"options": {},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
},
"triggerOn": "specificFolder",
"folderToWatch": {
"__rl": true,
"mode": "url",
"value": "https://drive.google.com/drive/u/0/folders/1B-Wl-ktVFbTmX685DB978jNvs9Ihnxiv"
}
},
"credentials": {
"googleDriveOAuth2Api": {
"id": "SEUhrgz30NMJS3cH",
"name": "Google Drive account"
}
},
"typeVersion": 1
},
{
"id": "97304af3-3a09-4724-8e87-7fff0ece6eca",
"name": "字符文本分割器",
"type": "@n8n/n8n-nodes-langchain.textSplitterCharacterTextSplitter",
"position": [
3900,
260
],
"parameters": {
"separator": "###SPLIT###"
},
"typeVersion": 1
},
{
"id": "af31206c-94e6-48fe-895e-f8a000486457",
"name": "设置文件 ID",
"type": "n8n-nodes-base.set",
"position": [
800,
-60
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "0144a9a7-6e73-46c4-979f-838ad5c62b89",
"name": "file_id",
"type": "string",
"value": "={{ $json.id }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "580b1192-be67-46f1-aea4-ae1aaeab10ea",
"name": "下载文件",
"type": "n8n-nodes-base.googleDrive",
"position": [
1040,
-60
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Set File ID').item.json.file_id }}"
},
"options": {
"googleFileConversion": {
"conversion": {
"docsToFormat": "application/pdf"
}
}
},
"operation": "download"
},
"credentials": {
"googleDriveOAuth2Api": {
"id": "SEUhrgz30NMJS3cH",
"name": "Google Drive account"
}
},
"typeVersion": 3
},
{
"id": "af92c035-f1f0-47e4-b542-c13a7386892b",
"name": "Switch",
"type": "n8n-nodes-base.switch",
"position": [
1320,
-60
],
"parameters": {
"rules": {
"values": [
{
"outputKey": "application/pdf",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "e959d5a8-d311-4a29-b400-7c07468a72fe",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $binary.data.mimeType }}",
"rightValue": "application/pdf"
}
]
},
"renameOutput": true
},
{
"outputKey": "text/csv",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "d5ae6f2d-e62d-4e08-aa06-629e6dfa7ee8",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $binary.data.mimeType }}",
"rightValue": "text/csv"
}
]
},
"renameOutput": true
}
]
},
"options": {}
},
"typeVersion": 3.2
},
{
"id": "1a2575ef-8792-4389-84ea-a016c5ba535e",
"name": "结构化输出解析器",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
2540,
160
],
"parameters": {
"jsonSchemaExample": "{\n\t\"title\": \"Test Title (Replace it with real title\",\n \"description\":\"Test Description (Replace it with real description)\"\n}"
},
"typeVersion": 1.2
},
{
"id": "0c8ba080-daab-493d-8c7d-4f1c7e9fb1e7",
"name": "Google Gemini 聊天模型",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
3320,
40
],
"parameters": {
"options": {},
"modelName": "models/gemini-1.5-flash"
},
"credentials": {
"googlePalmApi": {
"id": "gdaO8lU3HwsldifM",
"name": "Google Gemini(PaLM) Api account"
}
},
"typeVersion": 1
},
{
"id": "e12a0a90-a1d7-4de0-901a-58ce35b95675",
"name": "处理上下文",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
3160,
-120
],
"parameters": {
"text": "=<document> \n{{ $('Document Data').first().json.data }}\n</document> \n\nHere is the chunk we want to situate within the overall document:\n\n<chunk> \n{{ $json.chunk }}\n</chunk> \n\nPlease:\n- Provide a short and succinct **context** to situate this chunk within the document for improved search retrieval.\n- Return the **original chunk** exactly as provided unless a correction is necessary.\n- If the chunk contains an **incomplete number, percentage, or entity**, correct it using the full document.\n- If part of a **sentence is cut off**, reconstruct the missing words only if necessary for clarity.\n- If the chunk is part of a table, include the complete table entry to maintain data integrity\n- Do not add any additional explanations or formatting beyond the required output.\n\nFill in the following format:\n[succinct context] : [original chunk or corrected version if necessary]\n\nYour response should contain only the text that replaces these placeholders, without including the placeholder labels themselves.",
"promptType": "define"
},
"typeVersion": 1.6
},
{
"id": "d6f500ba-c0f3-4cc8-af60-e2c38307582c",
"name": "文档数据",
"type": "n8n-nodes-base.set",
"position": [
1980,
-120
],
"parameters": {
"mode": "raw",
"options": {},
"jsonOutput": "={\n \"data\": {{ JSON.stringify($json.text) }}\n} "
},
"typeVersion": 3.4
},
{
"id": "de223e76-1d95-41a9-b1ff-961d8b744044",
"name": "拆分输出",
"type": "n8n-nodes-base.splitOut",
"position": [
2780,
-120
],
"parameters": {
"options": {
"destinationFieldName": "chunk"
},
"fieldToSplitOut": "chunks"
},
"typeVersion": 1
},
{
"id": "7d2eb334-a73c-4777-b4a9-757356201311",
"name": "限制",
"type": "n8n-nodes-base.limit",
"position": [
2960,
-120
],
"parameters": {
"maxItems": 20
},
"typeVersion": 1
},
{
"id": "d8f88a96-bed6-461a-ae5f-6924c655ba84",
"name": "摘要",
"type": "n8n-nodes-base.summarize",
"position": [
3480,
-120
],
"parameters": {
"options": {},
"fieldsToSummarize": {
"values": [
{
"field": "text",
"separateBy": "other",
"aggregation": "concatenate",
"customSeparator": "###SPLIT###"
}
]
}
},
"typeVersion": 1.1
},
{
"id": "820dda10-a369-4415-a739-16f197d0b1ad",
"name": "Embeddings OpenAI",
"type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
"position": [
3680,
80
],
"parameters": {
"options": {}
},
"credentials": {
"openAiApi": {
"id": "MGwGMKEkdcjzlYCw",
"name": "OpenAi account"
}
},
"typeVersion": 1.2
},
{
"id": "1a622d78-d5f1-498d-8882-1cbc9166e4b4",
"name": "将数据添加到 Supabase Vector Store",
"type": "@n8n/n8n-nodes-langchain.vectorStoreSupabase",
"position": [
3680,
-120
],
"parameters": {
"mode": "insert",
"options": {},
"tableName": {
"__rl": true,
"mode": "list",
"value": "documents",
"cachedResultName": "documents"
}
},
"credentials": {
"supabaseApi": {
"id": "XijKo1j1EsG3XUhz",
"name": "Supabase account"
}
},
"typeVersion": 1.1
},
{
"id": "51d8e196-8752-4fe7-a182-c4a00d3caefa",
"name": "Google Gemini 聊天模型1",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
2340,
180
],
"parameters": {
"options": {},
"modelName": "models/gemini-1.5-flash"
},
"credentials": {
"googlePalmApi": {
"id": "gdaO8lU3HwsldifM",
"name": "Google Gemini(PaLM) Api account"
}
},
"typeVersion": 1
},
{
"id": "23b491e1-3732-46eb-a62b-c86b975df894",
"name": "便签",
"type": "n8n-nodes-base.stickyNote",
"position": [
200,
-260
],
"parameters": {
"color": 4,
"width": 1960,
"height": 560,
"content": "## 📁 来自 Google Drive 的数据处理"
},
"typeVersion": 1
},
{
"id": "5d95cc1c-5dec-4238-8ecc-d47d5c107e53",
"name": "便签1",
"type": "n8n-nodes-base.stickyNote",
"position": [
2220,
-260
],
"parameters": {
"color": 4,
"width": 1940,
"height": 700,
"content": "## 🧠 RAG 数据上传管道"
},
"typeVersion": 1
},
{
"id": "d5ab29ee-d9a6-48c6-a2d5-20374cda6296",
"name": "创建元数据标题和描述",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
2280,
-120
],
"parameters": {
"text": "=Create metadata title and metadata description based on the document specified below (below ##Document). Metadata title and metadata description will be used to seperate data in vector DB that will be used for RAG.\n\n##Document\n{{ $('Document Data').item.json.data }}",
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 1.6
},
{
"id": "8eddba99-f77b-4b85-b2ef-0aa68762b851",
"name": "拆分成块",
"type": "n8n-nodes-base.code",
"position": [
2620,
-120
],
"parameters": {
"jsCode": "const chunkSize = 1000;\nconst chunkOverlap = 200;\n//const text = $node[\"ABC\"].json.data.replace(/\\n/, '');\nconst text = $items(\"Document Data\")[0].json.data.replace(/\\n/, '');\n\nconst chunks = [];\nlet remainingText = text;\n\nwhile (remainingText.length > 0) {\n let splitPoint;\n\n // Try splitting at paragraph level first\n splitPoint = remainingText.lastIndexOf(\"\\n\\n\", chunkSize);\n \n // If no paragraph split, try splitting at sentence level\n if (splitPoint === -1) {\n splitPoint = remainingText.lastIndexOf(\". \", chunkSize);\n }\n\n // If no sentence split, try splitting at word level\n if (splitPoint === -1) {\n splitPoint = remainingText.lastIndexOf(\" \", chunkSize);\n }\n\n // If still no split point, force cut at chunkSize\n if (splitPoint === -1 || splitPoint < chunkSize * 0.5) { \n splitPoint = chunkSize; // Hard split if no good split point\n }\n\n // Extract chunk and adjust remaining text with overlap\n let chunk = remainingText.substring(0, splitPoint).trim();\n chunks.push(chunk);\n\n // Move the pointer forward while keeping the overlap\n remainingText = remainingText.substring(Math.max(0, splitPoint - chunkOverlap)).trim();\n\n // Break if remaining text is too small to form another chunk\n if (remainingText.length < chunkSize * 0.2) {\n chunks.push(remainingText);\n break;\n }\n}\n\nreturn { chunks };"
},
"typeVersion": 2
},
{
"id": "2cd80097-3f90-441a-b0ef-08b43c30981b",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
1900,
-740
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"id": "MGwGMKEkdcjzlYCw",
"name": "OpenAi account"
}
},
"typeVersion": 1.2
},
{
"id": "03ae06b7-c804-4e35-bac5-17836123771a",
"name": "Supabase Vector Store",
"type": "@n8n/n8n-nodes-langchain.vectorStoreSupabase",
"position": [
2200,
-700
],
"parameters": {
"mode": "retrieve-as-tool",
"topK": 20,
"options": {},
"toolName": "documents",
"tableName": {
"__rl": true,
"mode": "list",
"value": "documents",
"cachedResultName": "documents"
},
"toolDescription": "Work with your data in Supabase Vector Store"
},
"credentials": {
"supabaseApi": {
"id": "XijKo1j1EsG3XUhz",
"name": "Supabase account"
}
},
"typeVersion": 1.1
},
{
"id": "c22f1100-86b0-4d49-b0b5-baa3f997c0a0",
"name": "AI 代理",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
1940,
-960
],
"parameters": {
"text": "=User Input:\n{{ $json.chatInput }}",
"options": {
"systemMessage": "=You're an internal company knowledge assistants. Your job is to answer questions using the files in the Vector Database. Here's how to do it:\n\nCheck Vector Database First\n- Search for similar test chunks using RAG.\n- If you find matches, use them to answer the question. \n- If you find relevant matches and need additional context to support the answer, prioritize retrieving it from documents that share the same metadata \"file_id\" & \"title\" before exploring other sources.\"\n\nNo Answer Found?\n- Clearly say: \"I couldn't find this in the databases\"\n- Never guess or invent answers.\n\nExample Response:\n\"Netflix grew revenue in Streaming services by 20% in 2024.\""
},
"promptType": "define"
},
"typeVersion": 1.8
},
{
"id": "8ff3b246-2078-4c69-934a-fde989c5dbda",
"name": "嵌入 OpenAI1",
"type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
"position": [
2280,
-520
],
"parameters": {
"options": {}
},
"credentials": {
"openAiApi": {
"id": "MGwGMKEkdcjzlYCw",
"name": "OpenAi account"
}
},
"typeVersion": 1.2
},
{
"id": "4fc4edb9-b5a1-4d4b-b571-cf665cf4eae1",
"name": "当收到聊天消息时",
"type": "@n8n/n8n-nodes-langchain.chatTrigger",
"position": [
1700,
-960
],
"webhookId": "2d4c41cb-c8b7-49c7-a8eb-ebd3dd9ff46d",
"parameters": {
"options": {}
},
"typeVersion": 1.1
},
{
"id": "3fc29837-d177-4af0-a842-57705ef8b97d",
"name": "简单记忆",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
2060,
-700
],
"parameters": {
"contextWindowLength": 10
},
"typeVersion": 1.3
},
{
"id": "27ca3852-baac-41fa-a8bc-620dd36fac2d",
"name": "便签 2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1520,
-1080
],
"parameters": {
"color": 4,
"width": 1180,
"height": 760,
"content": "## AI Chat Agent - 与存储在 Supabase Vector Store 中的文档聊天"
},
"typeVersion": 1
},
{
"id": "ee2b6e9d-a49b-435e-bc38-7d3a4e989ca5",
"name": "便签7",
"type": "n8n-nodes-base.stickyNote",
"position": [
340,
-1080
],
"parameters": {
"color": 5,
"width": 460,
"height": 320,
"content": "## 📄 基于 AI 的 RAG 文档处理和聊天机器人,使用 Google Drive、Supabase、OpenAI"
},
"typeVersion": 1
},
{
"id": "f533c790-36d0-4f7e-a004-1ab64fdbd046",
"name": "便签8",
"type": "n8n-nodes-base.stickyNote",
"position": [
-480,
-260
],
"parameters": {
"color": 5,
"width": 660,
"height": 1500,
"content": "## 📋 数据处理和 RAG 工作流"
},
"typeVersion": 1
},
{
"id": "2090caca-8fff-461b-a9b5-5460b8978c3c",
"name": "便签6",
"type": "n8n-nodes-base.stickyNote",
"position": [
1520,
-1640
],
"parameters": {
"color": 5,
"width": 1160,
"height": 520,
"content": ""
},
"typeVersion": 1
},
{
"id": "989d4cef-fae3-4163-a51e-58cf9aafac61",
"name": "### 替换 Airtable 连接",
"type": "n8n-nodes-base.stickyNote",
"position": [
820,
-1080
],
"parameters": {
"color": 5,
"width": 660,
"height": 760,
"content": ""
},
"typeVersion": 1
},
{
"id": "8d2661d4-3bdc-456e-bba0-766d89ab3ece",
"name": "便签 3",
"type": "n8n-nodes-base.stickyNote",
"position": [
2860,
20
],
"parameters": {
"color": 5,
"width": 340,
"height": 300,
"content": "📌 **理解 Limit 节点**"
},
"typeVersion": 1
}
],
"pinData": {},
"connections": {
"Limit": {
"main": [
[
{
"node": "Process Context",
"type": "main",
"index": 0
}
]
]
},
"Switch": {
"main": [
[
{
"node": "Extract from PDF",
"type": "main",
"index": 0
}
],
[
{
"node": "Extract from CSV",
"type": "main",
"index": 0
}
]
]
},
"AI Agent": {
"main": [
[]
]
},
"Split Out": {
"main": [
[
{
"node": "Limit",
"type": "main",
"index": 0
}
]
]
},
"Summarize": {
"main": [
[
{
"node": "Add Data to Supabase Vector Store",
"type": "main",
"index": 0
}
]
]
},
"Set File ID": {
"main": [
[
{
"node": "Download FIle",
"type": "main",
"index": 0
}
]
]
},
"Document Data": {
"main": [
[
{
"node": "Create Metadata Title & Description",
"type": "main",
"index": 0
}
]
]
},
"Download FIle": {
"main": [
[
{
"node": "Switch",
"type": "main",
"index": 0
}
]
]
},
"Simple Memory": {
"ai_memory": [
[
{
"node": "AI Agent",
"type": "ai_memory",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[],
[
{
"node": "Set File ID",
"type": "main",
"index": 0
}
]
]
},
"Process Context": {
"main": [
[
{
"node": "Summarize",
"type": "main",
"index": 0
}
]
]
},
"Extract from CSV": {
"main": [
[
{
"node": "Document Data",
"type": "main",
"index": 0
}
]
]
},
"Extract from PDF": {
"main": [
[
{
"node": "Document Data",
"type": "main",
"index": 0
}
]
]
},
"Embeddings OpenAI": {
"ai_embedding": [
[
{
"node": "Add Data to Supabase Vector Store",
"type": "ai_embedding",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Split into chunks": {
"main": [
[
{
"node": "Split Out",
"type": "main",
"index": 0
}
]
]
},
"Embeddings OpenAI1": {
"ai_embedding": [
[
{
"node": "Supabase Vector Store",
"type": "ai_embedding",
"index": 0
}
]
]
},
"Default Data Loader": {
"ai_document": [
[
{
"node": "Add Data to Supabase Vector Store",
"type": "ai_document",
"index": 0
}
]
]
},
"Supabase Vector Store": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Character Text Splitter": {
"ai_textSplitter": [
[
{
"node": "Default Data Loader",
"type": "ai_textSplitter",
"index": 0
}
]
]
},
"Google Gemini Chat Model": {
"ai_languageModel": [
[
{
"node": "Process Context",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "Create Metadata Title & Description",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Google Gemini Chat Model1": {
"ai_languageModel": [
[
{
"node": "Create Metadata Title & Description",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"When chat message received": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Google Drive Trigger File Created": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Create Metadata Title & Description": {
"main": [
[
{
"node": "Split into chunks",
"type": "main",
"index": 0
}
]
]
}
}
}常见问题
如何使用这个工作流?
复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。
这个工作流适合什么场景?
高级 - 人工智能, IT 运维
需要付费吗?
本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。
相关工作流推荐
宠物店 4
🐶 宠物店预约 AI 代理
If
Set
Code
+41
187 节点Bruno Dias
人工智能
[模板] AI宠物店 v8
🐶 AI宠物店助手 - 集成GPT-4o、Google日历和WhatsApp/Instagram/Facebook
If
N8n
Set
+38
244 节点Amanda Benks
销售
AI 代理餐厅 [模板]
🤖 WhatsApp、Instagram 和 Messenger 的 AI 餐厅助手
If
N8n
Set
+37
239 节点Amanda Benks
其他
在可视化参考库中探索n8n节点
在可视化参考库中探索n8n节点
If
Ftp
Set
+93
113 节点I versus AI
其他
上下文混合RAG AI文案
Google Drive到Supabase上下文向量数据库同步用于RAG应用
If
Set
Code
+25
76 节点Michael Taleb
AI RAG 检索增强
递归混合RAG 1
使用Google Drive、OpenAI和Gemini RAG进行递归分块的文档处理
Set
Code
Switch
+18
25 节点Mohsin Ali
内部知识库
工作流信息
难度等级
高级
节点数量35
分类2
节点类型22
作者
Billy Christi
@billyI'm a professional software engineer and n8n expert with a passion for building scalable, no-code and low-code automation workflows. I specialize in creating seamless integrations between APIs, CRMs, and everyday tools to help businesses save time, reduce manual work, and operate smarter. Whether it's automating marketing pipelines, backend systems, or approval processes, I turn complex logic into simple, powerful workflows with n8n.
外部链接
在 n8n.io 查看 →
分享此工作流