8
n8n 中文网amn8n.com

AI驱动的知识助手

高级

这是一个Support, AI领域的自动化工作流,包含 19 个节点。主要使用 If, Set, Merge, Function, GoogleSheets 等节点,结合人工智能技术实现智能自动化。 基于AI的知识助手,使用Google Sheets、OpenAI和Supabase向量搜索

前置要求
  • Google Sheets API 凭证
  • OpenAI API Key
  • Supabase URL 和 API Key
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 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, '&lt;').replace(/>/g, '&gt;')}</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)可能需要您自行付费。

工作流信息
难度等级
高级
节点数量19
分类2
节点类型14
难度说明

适合高级用户,包含 16+ 个节点的复杂工作流

外部链接
在 n8n.io 查看

分享此工作流