AI驱动的知识助手
高级
这是一个Support, AI领域的自动化工作流,包含 19 个节点。主要使用 If, Set, Merge, Function, GoogleSheets 等节点,结合人工智能技术实现智能自动化。 基于AI的知识助手,使用Google Sheets、OpenAI和Supabase向量搜索
前置要求
- •Google Sheets API 凭证
- •OpenAI API Key
- •Supabase URL 和 API Key
使用的节点 (19)
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
"meta": {
"instanceId": "7d8066d2f56a07000fe7d753d3eeabf0ecdf68413466f30d10afe0906f058427",
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "7f2ffaa3-9829-44fb-980b-373c09b8eaab",
"name": "Github触发器",
"type": "n8n-nodes-base.githubTrigger",
"position": [
-500,
-180
],
"webhookId": "e2daea05-4e51-4dc2-8a4e-37e165a12bf1",
"parameters": {
"owner": {
"__rl": true,
"mode": "url",
"value": "https://github.com/akhilv77"
},
"events": [
"push"
],
"options": {},
"repository": {
"__rl": true,
"mode": "list",
"value": "relevance",
"cachedResultUrl": "https://github.com/akhilv77/relevance",
"cachedResultName": "relevance"
}
},
"credentials": {
"githubApi": {
"id": "PSygiwMjdjFDImYb",
"name": "GitHub account"
}
},
"typeVersion": 1
},
{
"id": "1d9880f7-d8b4-4405-873b-cf6c7dde9f58",
"name": "HTTP 请求",
"type": "n8n-nodes-base.httpRequest",
"position": [
-60,
-180
],
"parameters": {
"url": "=https://api.github.com/repos/{{ $json.body.repository.owner.name }}/{{ $json.body.repository.name }}/commits/{{ $json.body.head_commit.id }}",
"options": {},
"sendHeaders": true,
"authentication": "predefinedCredentialType",
"headerParameters": {
"parameters": [
{}
]
},
"nodeCredentialType": "githubOAuth2Api"
},
"typeVersion": 4.2,
"alwaysOutputData": false
},
{
"id": "a2afa7ad-f3d6-4c33-bdda-f79a36a327e0",
"name": "Gmail",
"type": "n8n-nodes-base.gmail",
"position": [
976,
-180
],
"webhookId": "88d96e90-68ae-4149-a8a3-1aeb12bca678",
"parameters": {
"sendTo": "akhilgadiraju@gmail.com",
"message": "={{ $json.html }}",
"options": {},
"subject": "Code Review"
},
"credentials": {
"gmailOAuth2": {
"id": "wqFUFuFpF5eRAp4E",
"name": "Gmail OAuth2 - Akhil"
}
},
"typeVersion": 2.1
},
{
"id": "aedd9de4-6069-4c1e-976d-2b234576b06a",
"name": "代码",
"type": "n8n-nodes-base.code",
"position": [
160,
-180
],
"parameters": {
"jsCode": "function formatPatch(patch) {\n if (!patch) return '';\n\n const lines = patch.split('\\n');\n let formatted = '';\n\n lines.forEach(line => {\n let color = '#000000'; // default text\n if (line.startsWith('+')) {\n color = '#237804'; // green\n } else if (line.startsWith('-')) {\n color = '#cf1322'; // red\n } else if (line.startsWith('@@')) {\n color = '#595959'; // gray for hunk headers\n }\n\n formatted += `<div style=\"color: ${color}; font-family: monospace;\">${line.replace(/</g, '<').replace(/>/g, '>')}</div>`;\n });\n\n return formatted;\n}\n\nfunction renderResponse(data, repoDetails) {\n const items = Array.isArray(data) ? data : [data];\n\n let html = ``;\n\n // Repo Info\n html += `\n <div style=\"margin: 20px 10px; padding: 15px; background-color: #f0f9ff; border-left: 5px solid #1890ff; font-family: Arial, sans-serif;\">\n <h2 style=\"margin-top: 0; color: #0050b3;\">🔗 Repository Info</h2>\n <p style=\"margin: 5px 0;\"><strong>Name:</strong> <a href=\"${repoDetails.repo_url}\" target=\"_blank\" style=\"color: #007acc;\">${repoDetails.name}</a></p>\n <p style=\"margin: 5px 0;\"><strong>Owner:</strong> ${repoDetails.owner_name}</p>\n </div>\n `;\n\n // Commit Info\n html += `\n <div style=\"margin: 20px 10px; padding: 15px; background-color: #e6f7ff; border-left: 5px solid #52c41a; font-family: Arial, sans-serif;\">\n <h3 style=\"margin-top: 0; color: #237804;\">✅ Commit Info</h3>\n <p style=\"margin: 5px 0;\"><strong>Author:</strong> ${repoDetails.author.name}</p>\n <p style=\"margin: 5px 0;\"><strong>Email:</strong> ${repoDetails.author.email}</p>\n <p style=\"margin: 5px 0;\"><strong>Date:</strong> ${repoDetails.author.date}</p>\n <p style=\"margin: 5px 0;\"><strong>Message:</strong> ${repoDetails.commit_message}</p>\n </div>\n `;\n\n // Changed files\n items.forEach(item => {\n html += `\n <section style=\"border: 1px solid #d9d9d9; margin: 10px; padding: 15px; border-radius: 8px; background-color: #ffffff; font-family: Arial, sans-serif;\">\n <h3 style=\"margin-top: 0; color: #262626;\">📄 File: ${item.filename}</h3>\n <p><strong>Status:</strong> <span style=\"color: #fa8c16;\">${item.status}</span></p>\n <p><strong>SHA:</strong> <code style=\"background-color: #f5f5f5; padding: 2px 6px; border-radius: 3px;\">${item.sha}</code></p>\n <p>\n <strong>➕ Additions:</strong> ${item.additions}, \n <strong>➖ Deletions:</strong> ${item.deletions}, \n <strong>✏️ Changes:</strong> ${item.changes}\n </p>\n <div style=\"background-color: #f6f6f6; padding: 10px; overflow-x: auto; border-radius: 5px; font-size: 13px; line-height: 1.4; border-left: 3px solid #d9d9d9;\">\n ${formatPatch(item.patch)}\n </div>\n </section>\n `;\n });\n\n return [{\n json: {\n htmlOutput: html\n }\n }];\n}\n\n// Input parsing\nlet data = $input.first().json.files;\n\nlet repo_details = {\n id: $('Github Trigger').first().json.body.repository.id,\n name: $('Github Trigger').first().json.body.repository.name,\n owner_name: $('Github Trigger').first().json.body.repository.owner.name,\n repo_url: $('Github Trigger').first().json.body.repository.html_url,\n author: $input.first().json.commit.author,\n commit_message: $('Github Trigger').first().json.body.commits[0].message\n};\n\nreturn renderResponse(data, repo_details);\n"
},
"typeVersion": 2
},
{
"id": "d790ebbb-64f2-4c1d-99d4-d44b778d7e58",
"name": "解析器",
"type": "n8n-nodes-base.set",
"position": [
-280,
-180
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "1fdc93f7-ebe7-4dd0-b3ec-caa079543c9e",
"name": "body.repository.id",
"type": "number",
"value": "={{ $json.body.repository.id }}"
},
{
"id": "1ccd2e84-f8a4-4629-9a93-c345beb6c376",
"name": "body.repository.name",
"type": "string",
"value": "={{ $json.body.repository.name }}"
},
{
"id": "73464699-e678-4852-a612-a82daa02f474",
"name": "body.repository.owner.name",
"type": "string",
"value": "={{ $json.body.repository.owner.name }}"
},
{
"id": "4178463f-5bc1-4230-b152-908af1c3e8e9",
"name": "body.head_commit.id",
"type": "string",
"value": "={{ $json.body.head_commit.id }}"
},
{
"id": "f47b9183-9c87-40f0-bdaa-ad5c367c552b",
"name": "body.head_commit.added",
"type": "array",
"value": "={{ $json.body.head_commit.added }}"
},
{
"id": "e471d686-decd-40ea-9a23-f3afe5e1f184",
"name": "body.head_commit.removed",
"type": "array",
"value": "={{ $json.body.head_commit.removed }}"
},
{
"id": "21c2ddf1-b38d-40e3-a899-8e761a096ff1",
"name": "body.head_commit.modified",
"type": "array",
"value": "={{ $json.body.head_commit.modified }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "2000b06f-2065-43df-94dc-8bcc6d38f600",
"name": "输出解析器",
"type": "n8n-nodes-base.code",
"position": [
756,
-180
],
"parameters": {
"jsCode": "let output = $('Code').first().json.htmlOutput + $input.first().json.output;\nreturn [\n {\n json: {\n html: output\n }\n }\n];"
},
"typeVersion": 2
},
{
"id": "d1d76c26-9572-47d0-8d5e-dda2b178dfdf",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
380,
-180
],
"parameters": {
"text": "=You are an AI code reviewer. You are given an HTML snippet that includes commit metadata and code diffs.\n\nYour job is to analyze only the code changes in the diff and return a single HTML block with your observations.\n\nYour review must include:\n✅ Functional issues (e.g., syntax or logic errors)\n\n✅ Style or readability issues (e.g., naming, formatting)\n\n✅ Suggestions or improvements based on the type of file (e.g., HTML, JS, Python, etc.)\n\n✅ Spelling or grammar errors in comments, strings, and documentation\n\n✅ Security issues (e.g., unsanitized inputs, use of eval, secrets in code)\n\nFormat your response as ONE of the following HTML blocks:\n🟨 If any suggestions, improvements, or security concerns are found:\n\n<div style=\"margin: 20px 10px; padding: 15px; background-color: #fffbe6; border-left: 5px solid #faad14; font-family: Arial, sans-serif;\">\n <h3 style=\"margin-top: 0; color: #d48806;\">🛠️ AI Code Review Summary</h3>\n <ul style=\"margin: 0; padding-left: 20px;\">\n <li><strong>Summary:</strong> [Brief summary of what changed]</li>\n <li><strong>Suggestion:</strong> [What can be improved: spelling, logic, naming, formatting, etc.]</li>\n <li><strong>Security Review:</strong> [Any security concern, or write “No security issues found”]</li>\n </ul>\n</div>\n✅ If there are no issues at all, return only this block:\n\n<div style=\"margin: 20px 10px; padding: 15px; background-color: #f6ffed; border-left: 5px solid #52c41a; font-family: Arial, sans-serif;\">\n <h3 style=\"margin-top: 0; color: #389e0d;\">✅ Code Review Result</h3>\n <p style=\"margin: 0;\">No issues detected in the recent commit. All changes look good! 🎉</p>\n</div>\n⚠️ Important:\n\nDo not return any other explanation or markdown outside the single HTML block.\n\nUse context from the diff (file type, filenames, comments, content).\n\nMake sure the output is clean, actionable, and visually consistent.\n\n {{ $json.htmlOutput }}",
"options": {},
"promptType": "define"
},
"typeVersion": 1.8
},
{
"id": "aa0d60c3-de08-4ede-8e83-a41fe5917489",
"name": "简单记忆",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
528,
40
],
"parameters": {
"sessionKey": "dsfklasdyerbmnabfdaghkjhgashgkjhgaksjdhfgaoaiwrqwkbclayga",
"sessionIdType": "customKey"
},
"typeVersion": 1.3
},
{
"id": "c17c6c0d-ca9c-428e-a094-f4552d32e8d0",
"name": "Groq聊天模型",
"type": "@n8n/n8n-nodes-langchain.lmChatGroq",
"position": [
408,
40
],
"parameters": {
"model": "llama-3.1-8b-instant",
"options": {}
},
"credentials": {
"groqApi": {
"id": "HJl5cdJzjhf727zW",
"name": "Groq - Akhil"
}
},
"typeVersion": 1
},
{
"id": "34f15fd6-354d-4890-a6a7-dfe5e5b9ab07",
"name": "结束工作流",
"type": "n8n-nodes-base.noOp",
"position": [
1196,
-180
],
"parameters": {},
"typeVersion": 1
},
{
"id": "151e34ff-2dfe-4421-9311-aa5155195d29",
"name": "便签",
"type": "n8n-nodes-base.stickyNote",
"position": [
-560,
-300
],
"parameters": {
"height": 120,
"content": "## 👨💻 Github 触发器"
},
"typeVersion": 1
},
{
"id": "5bc8c0fe-b21a-47d9-a346-01ec2bd74c74",
"name": "便签1",
"type": "n8n-nodes-base.stickyNote",
"position": [
360,
-300
],
"parameters": {
"width": 280,
"height": 100,
"content": "## 自定义 AI 代理"
},
"typeVersion": 1
},
{
"id": "86c25475-ccd9-4556-ba60-e4647b0df269",
"name": "便签2",
"type": "n8n-nodes-base.stickyNote",
"position": [
320,
160
],
"parameters": {
"height": 100,
"content": "## 自定义 LLM"
},
"typeVersion": 1
},
{
"id": "ad3cbae3-a1bc-4bad-a546-b0c100a8bc78",
"name": "便签3",
"type": "n8n-nodes-base.stickyNote",
"position": [
940,
-20
],
"parameters": {
"height": 100,
"content": "## 邮件更新"
},
"typeVersion": 1
}
],
"pinData": {},
"connections": {
"Code": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Gmail": {
"main": [
[
{
"node": "End Workflow",
"type": "main",
"index": 0
}
]
]
},
"Parser": {
"main": [
[
{
"node": "HTTP Request",
"type": "main",
"index": 0
}
]
]
},
"AI Agent": {
"main": [
[
{
"node": "Output Parser",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request": {
"main": [
[
{
"node": "Code",
"type": "main",
"index": 0
}
]
]
},
"Output Parser": {
"main": [
[
{
"node": "Gmail",
"type": "main",
"index": 0
}
]
]
},
"Simple Memory": {
"ai_memory": [
[
{
"node": "AI Agent",
"type": "ai_memory",
"index": 0
}
]
]
},
"Github Trigger": {
"main": [
[
{
"node": "Parser",
"type": "main",
"index": 0
}
]
]
},
"Groq Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
}
}
}常见问题
如何使用这个工作流?
复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。
这个工作流适合什么场景?
高级 - 客户支持, 人工智能
需要付费吗?
本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。
相关工作流推荐
在可视化参考库中探索n8n节点
在可视化参考库中探索n8n节点
If
Ftp
Set
+93
113 节点I versus AI
其他
基于AI的MIS代理
基于AI的管理信息系统代理
If
Set
Code
+29
129 节点Kumar Shivam
客户支持
n8n人力资源代理
基于WhatsApp、GPT-4分类和Google Workspace的自动化人力资源服务系统
If
Set
Code
+19
65 节点Tanay Agarwal
人力资源
宠物店 4
🐶 宠物店预约 AI 代理
If
Set
Code
+41
187 节点Bruno Dias
人工智能
AI邮件自动回复系统 - 邮箱RAG智能代理
AI邮件自动回复系统 - 邮箱RAG智能代理
If
Set
Gmail
+18
34 节点LukaszB
客户支持
AI智能助手:与Supabase存储和Google Drive文件对话
AI智能助手:与Supabase存储和Google Drive文件对话
If
Set
Wait
+20
62 节点Mark Shcherbakov
工程