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 인증 정보
카테고리
{
"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 Intelligence Engine\n\n**Deep analysis of candidate's GitHub profile and repositories.**\n\n**Profile Analysis:**\n- Account age & experience\n- Follower/following metrics\n- Public repository count\n- Bio and company info\n\n**Repository Intelligence:**\n- Language distribution\n- Framework detection (30+)\n- Total stars & forks\n- Recent activity tracking\n\n**Technology Detection:**\n- Frontend: React, Vue, Angular\n- Backend: Express, Django, Flask\n- Mobile: React Native, Flutter\n- DevOps: Docker, AWS, Kubernetes\n\n**Smart Features:**\n- Handles missing profiles gracefully\n- Calculates experience automatically\n- Ranks technologies by usage\n- Identifies trending skills"
},
"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 Resume Analysis\n\n**VLM Run processes resumes to extract structured candidate data.**\n\n**Features:**\n- Contact information extraction\n- Skills identification\n- Experience parsing\n- Education details\n- Social profile detection\n\n**Advanced Extraction:**\n- Name, email, phone\n- GitHub & LinkedIn URLs\n- Work history\n- Technical skills\n- Certifications\n\n**Output:**\n- Structured JSON data\n- Normalized fields\n- Ready for analysis\n\n**Benefits:**\n- Eliminates manual data entry\n- Consistent formatting\n- Accurate extraction\n- Scalable processing"
},
"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": "## 📧 Resume Intake Processing\n\n**Monitors Gmail for incoming resume submissions and automatically triggers processing.**\n\n**Process:**\n1. Watches inbox every minute\n2. Detects emails with attachments\n3. Auto-triggers on new resumes\n4. Downloads PDF attachments\n\n**Supported Formats:**\n- PDF resumes\n- DOC/DOCX files\n- Various layouts\n- Multi-page documents\n\n**Trigger Conditions:**\n- New email received\n- Contains attachments\n- Attachment download enabled\n- Real-time processing"
},
"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 Resume Processing & GitHub Analysis\n\n**Overview:**\nAutomatically processes resumes received via email and generates comprehensive candidate profiles with AI-powered resume parsing and GitHub analysis.\n\n**Workflow:**\n1. 📧 Monitor Gmail for resume submissions\n2. 🤖 Parse resume with AI extraction\n3. 🔍 Analyze GitHub profile (if available)\n4. 📊 Create comprehensive candidate profile\n5. 💬 Notify team via Slack + save to Sheets\n6. ✉️ Send acknowledgment to candidate\n\n**Perfect for:**\n- HR departments\n- Technical recruiting\n- Talent acquisition teams\n- Startup hiring\n- Developer assessment\n\n**Requirements:**\n- VLM Run API access\n- Gmail OAuth2\n- Google Sheets access\n- Slack webhook\n- GitHub API (optional authentication)"
},
"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": "## 📊 Multi-Channel Output\n\n**Delivers comprehensive candidate data across multiple platforms.**\n\n**Google Sheets Integration:**\n- Structured candidate database\n- 20+ data columns\n- Searchable & filterable\n- Historical tracking\n\n**Slack Notifications:**\n- Instant team alerts\n- Rich candidate summaries\n- GitHub profile highlights\n- Technology breakdown\n\n**Email Automation:**\n- Professional acknowledgments\n- Personalized messages\n- GitHub profile mentions\n- Builds candidate experience\n\n**Benefits:**\n- Centralized data storage\n- Real-time team updates\n- Professional communication\n- Streamlined hiring process"
},
"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 실행으로 이력서 파싱",
"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 시트에 저장",
"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": {
"09f1229a-4638-44b2-8244-139b9b9022de": {
"main": [
[
{
"node": "4f4fd7ca-fc02-44c1-a617-02eec8aedbdb",
"type": "main",
"index": 0
},
{
"node": "bdf7d44b-b13e-4bfc-bbb5-0fabe8abd40a",
"type": "main",
"index": 0
},
{
"node": "e8f89ee8-2bcd-464a-8ec8-2be11bf1c2b2",
"type": "main",
"index": 0
}
]
]
},
"7f58201c-7656-4aae-9423-52680aa37b82": {
"main": [
[
{
"node": "09f1229a-4638-44b2-8244-139b9b9022de",
"type": "main",
"index": 0
}
]
]
},
"2c851eda-2501-4b8a-a855-9ac5cb750d3c": {
"main": [
[
{
"node": "7ac5cbc4-828c-42d1-addf-162458ac6fda",
"type": "main",
"index": 0
}
]
]
},
"7ac5cbc4-828c-42d1-addf-162458ac6fda": {
"main": [
[
{
"node": "7f58201c-7656-4aae-9423-52680aa37b82",
"type": "main",
"index": 0
}
]
]
},
"1b32ce5f-3213-43b0-a604-be204c1ae476": {
"main": [
[
{
"node": "7f58201c-7656-4aae-9423-52680aa37b82",
"type": "main",
"index": 1
}
]
]
},
"29ef7e94-6c03-4e0c-98e6-3720b6e078cb": {
"main": [
[
{
"node": "2c851eda-2501-4b8a-a855-9ac5cb750d3c",
"type": "main",
"index": 0
},
{
"node": "19528631-4eab-420b-9601-25d96e65b9c8",
"type": "main",
"index": 0
}
]
]
},
"1134c82c-77e6-438d-8fbc-77807837db17": {
"main": [
[
{
"node": "29ef7e94-6c03-4e0c-98e6-3720b6e078cb",
"type": "main",
"index": 0
}
],
[
{
"node": "09f1229a-4638-44b2-8244-139b9b9022de",
"type": "main",
"index": 0
}
]
]
},
"19528631-4eab-420b-9601-25d96e65b9c8": {
"main": [
[
{
"node": "1b32ce5f-3213-43b0-a604-be204c1ae476",
"type": "main",
"index": 0
}
]
]
},
"4c4d9503-4b4a-4a95-bf64-67d4e0acc7b2": {
"main": [
[
{
"node": "a888c038-d826-4cd0-aefc-f9aca346a7f2",
"type": "main",
"index": 0
}
]
]
},
"a888c038-d826-4cd0-aefc-f9aca346a7f2": {
"main": [
[
{
"node": "1134c82c-77e6-438d-8fbc-77807837db17",
"type": "main",
"index": 0
}
]
]
}
}
}이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
고급 - 인공지능
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
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
이 워크플로우 공유