8
n8n 中文网amn8n.com

AI简历处理与GitHub分析(VLM运行)

高级

这是一个AI领域的自动化工作流,包含 18 个节点。主要使用 If, Code, Gmail, Merge, Slack 等节点,结合人工智能技术实现智能自动化。 AI简历处理与GitHub分析(VLM运行)

前置要求
  • Google 账号和 Gmail API 凭证
  • Slack Bot Token 或 Webhook URL
  • 可能需要目标 API 的认证凭证
  • Google Sheets API 凭证
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
  "meta": {
    "instanceId": "0a7ae129a7d703150135f6cc24d0469f20ffd22b5ed59c23ee3e0608264e6d98",
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "bdf7d44b-b13e-4bfc-bbb5-0fabe8abd40a",
      "name": "发送确认邮件",
      "type": "n8n-nodes-base.gmail",
      "position": [
        -20,
        1140
      ],
      "webhookId": "959be407-da29-4fef-bb85-ac5cc6b41a6d",
      "parameters": {
        "sendTo": "={{ $json.contact_info.email }}",
        "message": "We will get in touch shortly.",
        "options": {
          "senderName": "VLM Run",
          "appendAttribution": false
        },
        "subject": "Thanks for Your Interest"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "7MVziRpoyD8arghO",
          "name": "Gmail account 2"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "72290874-1493-4980-a445-ac5d5f752ebd",
      "name": "🔍 GitHub分析文档3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1460,
        100
      ],
      "parameters": {
        "color": 7,
        "width": 1260,
        "height": 640,
        "content": "## 🔍 GitHub智能引擎"
      },
      "typeVersion": 1
    },
    {
      "id": "2cc059ed-deb1-4cd6-bc35-a840e7e3fb9f",
      "name": "🤖 AI处理文档1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1860,
        100
      ],
      "parameters": {
        "color": 3,
        "width": 380,
        "height": 880,
        "content": "## 🤖 AI简历分析"
      },
      "typeVersion": 1
    },
    {
      "id": "92d64d61-d690-4d68-8ee7-ebb0f231c02c",
      "name": "📧 接收文档1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2260,
        100
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 880,
        "content": "## 📧 简历接收处理"
      },
      "typeVersion": 1
    },
    {
      "id": "a6a81e04-0f29-44c6-aa81-0b642517b7bb",
      "name": "📋 工作流概览1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2740,
        100
      ],
      "parameters": {
        "color": 7,
        "width": 460,
        "height": 880,
        "content": "## 📋 AI简历处理和GitHub分析"
      },
      "typeVersion": 1
    },
    {
      "id": "3d3a320b-b63d-4248-a01e-6f75fb77b716",
      "name": "📊 输出文档1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -180,
        100
      ],
      "parameters": {
        "color": 7,
        "width": 420,
        "height": 1240,
        "content": "## 📊 多渠道输出"
      },
      "typeVersion": 1
    },
    {
      "id": "4c4d9503-4b4a-4a95-bf64-67d4e0acc7b2",
      "name": "监控Gmail中的简历",
      "type": "n8n-nodes-base.gmailTrigger",
      "position": [
        -2160,
        760
      ],
      "parameters": {
        "simple": false,
        "filters": {},
        "options": {
          "downloadAttachments": true
        },
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        }
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "7MVziRpoyD8arghO",
          "name": "Gmail account 2"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "a888c038-d826-4cd0-aefc-f9aca346a7f2",
      "name": "使用VLM Run解析简历",
      "type": "@vlm-run/n8n-nodes-vlmrun.vlmRun",
      "position": [
        -1720,
        760
      ],
      "parameters": {
        "file": "attachment_0",
        "domain": "document.resume"
      },
      "credentials": {
        "vlmRunApi": {
          "id": "cF5KpbVmnt36bdWr",
          "name": "VLM Run account 6"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "1134c82c-77e6-438d-8fbc-77807837db17",
      "name": "检查GitHub个人资料",
      "type": "n8n-nodes-base.if",
      "position": [
        -1360,
        760
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "e28a7d82-d42c-4ce0-9a7d-7f9ef94090c2",
              "operator": {
                "type": "string",
                "operation": "exists",
                "singleValue": true
              },
              "leftValue": "={{ $json.response.contact_info.github }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "29ef7e94-6c03-4e0c-98e6-3720b6e078cb",
      "name": "提取GitHub用户名",
      "type": "n8n-nodes-base.code",
      "position": [
        -1080,
        540
      ],
      "parameters": {
        "jsCode": "const url = $input.first().json.response.contact_info.github\nconst username = url.split('github.com/')[1].split('/')[0];\nreturn [{ json: { username } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "2c851eda-2501-4b8a-a855-9ac5cb750d3c",
      "name": "获取GitHub个人资料",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -840,
        340
      ],
      "parameters": {
        "url": "=https://api.github.com/users/{{ $json.username }}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "19528631-4eab-420b-9601-25d96e65b9c8",
      "name": "获取GitHub仓库",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -840,
        540
      ],
      "parameters": {
        "url": "=https://api.github.com/users/{{ $json.username }}/repos",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "7ac5cbc4-828c-42d1-addf-162458ac6fda",
      "name": "处理个人资料数据",
      "type": "n8n-nodes-base.code",
      "position": [
        -620,
        340
      ],
      "parameters": {
        "jsCode": "const user = items[0].json;\n\n// Parse creation and update dates\nconst created = new Date(user.created_at);\nconst updated = new Date(user.updated_at);\n\n// Calculate difference in milliseconds\nconst diffTime = Math.abs(updated - created);\n\n// Convert milliseconds to years\nconst years = diffTime / (1000 * 60 * 60 * 24 * 365.25);\n\n// Round to nearest whole number\nconst experience = `~${Math.round(years)}`;\n\n// Return desired output\nreturn [\n  {\n    json: {\n      login: user.login,\n      public_repos: user.public_repos,\n      followers: user.followers,\n      experience\n    }\n  }\n];"
      },
      "typeVersion": 2
    },
    {
      "id": "1b32ce5f-3213-43b0-a604-be204c1ae476",
      "name": "分析仓库数据",
      "type": "n8n-nodes-base.code",
      "position": [
        -600,
        540
      ],
      "parameters": {
        "jsCode": "// Initialize counts\nlet languageCount = {};\nlet frameworkCount = {};\nlet totalStars = 0;\nlet totalForks = 0;\n\n// Full list of frameworks, libraries, and tools\nconst knownFrameworks = [\n  \"React\", \"Angular\", \"Vue\", \"Bootstrap\", \"Tailwind\", \"jQuery\",\n  \"Node\", \"Express\", \"Django\", \"Flask\", \"Spring Boot\", \"Laravel\", \"Rails\",\n  \"React Native\", \"Flutter\", \"Ionic\",\n  \"MongoDB\", \"MySQL\", \"PostgreSQL\", \"Firebase\",\n  \"Docker\", \"Jenkins\", \"GitHub\", \"GitLab\", \"AWS\", \"Azure\", \"Netlify\", \"Vercel\",\n  \"Jest\", \"Mocha\", \"Cypress\", \"Selenium\",\n  \"FastAPI\", \"Redux\", \"Redux Toolkit\"\n];\n\n// Helper function to extract frameworks\nfunction extractFrameworks(text) {\n  if (!text) return [];\n\n  const matches = new Set();\n  const lowerText = text.toLowerCase();\n\n  for (const fw of knownFrameworks) {\n    if (lowerText.includes(fw.toLowerCase())) {\n      matches.add(fw);\n    }\n  }\n\n  return Array.from(matches);\n}\n\n// Loop through repositories\nfor (const item of items) {\n  const repo = item.json;\n\n  // Count languages\n  const lang = repo.language;\n  if (lang) {\n    languageCount[lang] = (languageCount[lang] || 0) + 1;\n  }\n\n  // Count frameworks from description and topics\n  const descFrameworks = extractFrameworks(repo.description);\n  const topicFrameworks = extractFrameworks((repo.topics || []).join(\" \"));\n  const allFrameworks = new Set([...descFrameworks, ...topicFrameworks]);\n\n  for (const fw of allFrameworks) {\n    frameworkCount[fw] = (frameworkCount[fw] || 0) + 1;\n  }\n\n  // Add stars and forks\n  totalStars += repo.stargazers_count || 0;\n  totalForks += repo.forks_count || 0;\n}\n\n// Return combined result\nreturn [\n  {\n    json: {\n      languageCount,\n      frameworkCount,\n      totalStars,\n      totalForks\n    }\n  }\n];"
      },
      "typeVersion": 2
    },
    {
      "id": "7f58201c-7656-4aae-9423-52680aa37b82",
      "name": "合并GitHub数据",
      "type": "n8n-nodes-base.merge",
      "position": [
        -360,
        540
      ],
      "parameters": {
        "numberInputs": 3
      },
      "typeVersion": 3.1
    },
    {
      "id": "09f1229a-4638-44b2-8244-139b9b9022de",
      "name": "扁平化响应",
      "type": "n8n-nodes-base.code",
      "position": [
        -500,
        780
      ],
      "parameters": {
        "jsCode": "const allItems = $input.all();\n\n// Defensive checks to ensure indexes exist\nconst resumeData = allItems[0]?.json?.response || {};\nconst githubData = allItems[1]?.json || {};\nconst repoData = allItems[2]?.json || {};\n\n// Merge into one object\nconst mergedData = {\n  ...githubData,\n  ...resumeData,\n  ...repoData\n};\n\n// Return as single item array\nreturn [\n  {\n    json: mergedData\n  }\n];"
      },
      "typeVersion": 2
    },
    {
      "id": "e8f89ee8-2bcd-464a-8ec8-2be11bf1c2b2",
      "name": "保存到Google Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -20,
        780
      ],
      "parameters": {
        "columns": {
          "value": {
            "Name": "={{ $json.contact_info.full_name }}",
            "Email": "={{ $json.contact_info.email }}",
            "Phone no.": "={{ $json.contact_info.phone }}",
            "Github URL": "={{ $json.contact_info.github }}",
            "C++ Projects": "={{ $json.languageCount?.cpp || null }}",
            "LinkedIn URL": "={{ $json.contact_info.linkedin }}",
            "Java Projects": "={{ $json.languageCount?.Java || null }}",
            "React Projects": "={{ $json.languageCount?.React || null }}",
            "Python Projects": "={{ $json.languageCount?.Python || null }}",
            "GitHub Experience": "={{ $json.expeience || null }}",
            "GitHub Fork Count": "={{ $json.totalForks || null}}",
            "GitHub Star Count": "={{ $json.totalStars || null }}",
            "Github Repo Count": "={{ $json.public_repos || null }}",
            "Javascript Projects": "={{ $json.languageCount?.JavaScript || null }}",
            "TypeScript Projects": "={{ $json.languageCount?.TypeScript || null }}",
            "Github follower count": "={{ $json.followers || null }}"
          },
          "schema": [
            {
              "id": "Name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Phone no.",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Phone no.",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Github URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Github URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "LinkedIn URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "LinkedIn URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "GitHub Experience",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "GitHub Experience",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Github follower count",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Github follower count",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Github Repo Count",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Github Repo Count",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "GitHub Star Count",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "GitHub Star Count",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "GitHub Fork Count",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "GitHub Fork Count",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Javascript Projects",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Javascript Projects",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "TypeScript Projects",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "TypeScript Projects",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Python Projects",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Python Projects",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "C++ Projects",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "C++ Projects",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Java Projects",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Java Projects",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "React Projects",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "React Projects",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Name"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1q-272l0Ha8qz981Y0rGI8jXu-6zja5DSwiFZmHahQe8/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1q-272l0Ha8qz981Y0rGI8jXu-6zja5DSwiFZmHahQe8",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1q-272l0Ha8qz981Y0rGI8jXu-6zja5DSwiFZmHahQe8/edit?usp=drivesdk",
          "cachedResultName": "Candidate VLM Run n8n"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "PUb43NJG1YGrwYl2",
          "name": "Google Sheets account 2"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "4f4fd7ca-fc02-44c1-a617-02eec8aedbdb",
      "name": "发送Slack通知",
      "type": "n8n-nodes-base.slack",
      "position": [
        -20,
        960
      ],
      "webhookId": "40bb1048-877d-4221-91ff-3cb7923dbdd8",
      "parameters": {
        "text": "=🚨 *New Job Application Received!*\n\n📨 *Candidate Name:* {{ $json.contact_info.full_name }}\n📧 *Email:* <mailto:{{ $json.contact_info.email }}|{{ $json.contact_info.email }}>\n\n📝 A new application has just been submitted. Check <https://docs.google.com/spreadsheets/d/1DWi8rZy6LPHFe7JDzPXuIh_VO027P20C3Om9Owf--1g/edit?gid=0#gid=0/|here> for full details.",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C08S3SR2LUW",
          "cachedResultName": "workflow-testing"
        },
        "otherOptions": {
          "mrkdwn": true
        }
      },
      "credentials": {
        "slackApi": {
          "id": "sNMFh7sXAUyWsuXd",
          "name": "Slack account 2"
        }
      },
      "typeVersion": 2.3
    }
  ],
  "pinData": {},
  "connections": {
    "Flatten Response": {
      "main": [
        [
          {
            "node": "Send Slack Notification",
            "type": "main",
            "index": 0
          },
          {
            "node": "Send Acknowledgement Email",
            "type": "main",
            "index": 0
          },
          {
            "node": "Save to Google Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Combine GitHub Data": {
      "main": [
        [
          {
            "node": "Flatten Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch GitHub Profile": {
      "main": [
        [
          {
            "node": "Process Profile Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process Profile Data": {
      "main": [
        [
          {
            "node": "Combine GitHub Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyze Repository Data": {
      "main": [
        [
          {
            "node": "Combine GitHub Data",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Extract GitHub Username": {
      "main": [
        [
          {
            "node": "Fetch GitHub Profile",
            "type": "main",
            "index": 0
          },
          {
            "node": "Fetch GitHub Repositories",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check for Github Profile": {
      "main": [
        [
          {
            "node": "Extract GitHub Username",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Flatten Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch GitHub Repositories": {
      "main": [
        [
          {
            "node": "Analyze Repository Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Monitor Gmail for Resumes": {
      "main": [
        [
          {
            "node": "Parse Resume with VLM Run",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Resume with VLM Run": {
      "main": [
        [
          {
            "node": "Check for Github Profile",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
常见问题

如何使用这个工作流?

复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。

这个工作流适合什么场景?

高级 - 人工智能

需要付费吗?

本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。

工作流信息
难度等级
高级
节点数量18
分类1
节点类型10
难度说明

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

作者
Shahrear

Shahrear

@shahrear

I’m Shahrear, a Software Engineer with over 5 years of experience in full-stack development and workflow automation. I specialize in building intelligent, scalable automations using n8n, helping teams streamline operations and boost productivity. I’m also an expert in developing custom n8n nodes, with published work on npm - including the @vlm-run/n8n-nodes-vlmrun package. https://github.com/vlm-run/n8n-nodes-vlmrun

外部链接
在 n8n.io 查看

分享此工作流