AI驱动的知识助手
这是一个Engineering, AI领域的自动化工作流,包含 14 个节点。主要使用 Set, Code, Gmail, HttpRequest, GithubTrigger 等节点,结合人工智能技术实现智能自动化。 基于AI的知识助手,使用Google Sheets、OpenAI和Supabase向量搜索
- •Google 账号和 Gmail API 凭证
- •可能需要目标 API 的认证凭证
- •GitHub Personal Access Token
{
"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)可能需要您自行付费。
相关工作流推荐
Akhil Varma Gadiraju
@akhilv7I'm a full stack developer passionate about building intelligent, scalable solutions that automate workflows and enhance productivity. I love working at the intersection of AI, APIs, and automation—using tools like n8n to streamline processes, integrate data, and unlock smarter decision-making. Whether it's crafting custom backend services or designing intuitive frontends, I’m always exploring ways to build more with less manual effort.
分享此工作流