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)可能需要您自行付费。
相关工作流推荐
OnboardAIgen - Slack x Jira x Drive 入职自动化工作流
通过 Slack、Jira 和 Google Workspace 集成实现员工入职自动化
If
Set
Code
+13
77 节点Velebit from Innovatio
人力资源
自动博客推广器 - 社交媒体帖子发布器
基于GPT的AI驱动博客文章推广器,用于Instagram、Facebook和X平台
If
Set
Code
+12
44 节点LukaszB
人工智能
基于AI的MIS代理
基于AI的管理信息系统代理
If
Set
Code
+29
129 节点Kumar Shivam
客户支持
高级AI演示(在AI开发者第14次聚会中展示)
高级AI演示(在AI开发者第14次聚会中展示)
If
Code
Gmail
+19
39 节点Max Tkacz
构建模块
HRMate 修复
使用LlamaIndex和GPT-4o-mini自动化候选人筛选,生成个性化邮件回复
If
Set
Code
+8
30 节点Khairul Muhtadin
人力资源
使用GPT-4o、WordPress和LinkedIn发布自动化RSS内容到博客文章
使用GPT-4o、WordPress和LinkedIn发布自动化RSS内容到博客文章
If
Set
Code
+21
40 节点Immanuel
人工智能
工作流信息
难度等级
高级
节点数量18
分类1
节点类型10
作者
Shahrear
@shahrearI’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 查看 →
分享此工作流