Spaces:
Sleeping
Sleeping
Commit
Β·
df0629c
1
Parent(s):
de546e3
Remove dot from requirements.txt and update project files
Browse files- README.md +6 -6
- app.py +107 -0
- docs/README.md +40 -0
- docs/architecture-diagam.svg +118 -0
- docs/crewai_logo.svg +71 -0
- knowledge/CV_Mohan.pdf +0 -0
- output/company_research.json +38 -0
- output/final_report.md +125 -0
- output/job_analysis.json +174 -0
- output/optimized_resume.md +125 -0
- output/resume_optimization.json +67 -0
- pyproject.toml +33 -0
- requirements.txt +5 -0
- runtime.txt +1 -0
- src/resume_crew/__init__.py +0 -0
- src/resume_crew/config/agents.yaml +51 -0
- src/resume_crew/config/tasks.yaml +198 -0
- src/resume_crew/crew.py +141 -0
- src/resume_crew/main.py +20 -0
- src/resume_crew/models.py +224 -0
- src/resume_crew/tools/__init__.py +0 -0
- src/resume_crew/tools/custom_tool.py +19 -0
- uv.lock +0 -0
README.md
CHANGED
@@ -1,12 +1,12 @@
|
|
1 |
---
|
2 |
-
title:
|
3 |
-
emoji:
|
4 |
colorFrom: indigo
|
5 |
-
colorTo:
|
6 |
sdk: gradio
|
7 |
-
sdk_version: 5.15.0
|
8 |
app_file: app.py
|
9 |
-
pinned:
|
10 |
---
|
11 |
|
12 |
-
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
|
|
1 |
---
|
2 |
+
title: Resume Optimizer
|
3 |
+
emoji: π
|
4 |
colorFrom: indigo
|
5 |
+
colorTo: blue
|
6 |
sdk: gradio
|
7 |
+
sdk_version: "5.15.0"
|
8 |
app_file: app.py
|
9 |
+
pinned: true
|
10 |
---
|
11 |
|
12 |
+
Check out the configuration reference at [Hugging Face Docs](https://huggingface.co/docs/hub/spaces-config-reference)
|
app.py
ADDED
@@ -0,0 +1,107 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import datetime
|
3 |
+
import gradio as gr
|
4 |
+
from markdown_pdf import MarkdownPdf, Section
|
5 |
+
import sys
|
6 |
+
|
7 |
+
# Ensure `src` is in Python's module search path
|
8 |
+
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "src")))
|
9 |
+
|
10 |
+
from resume_crew.crew import ResumeCrew
|
11 |
+
|
12 |
+
|
13 |
+
# Set backend directories for Hugging Face Spaces
|
14 |
+
UPLOAD_DIR = "/tmp/uploads"
|
15 |
+
OUTPUT_DIR = "/tmp/output"
|
16 |
+
|
17 |
+
os.makedirs(UPLOAD_DIR, exist_ok=True)
|
18 |
+
os.makedirs(OUTPUT_DIR, exist_ok=True)
|
19 |
+
|
20 |
+
def convert_md_to_pdf(md_path: str) -> str:
|
21 |
+
"""Convert Markdown to PDF and save it in OUTPUT_DIR."""
|
22 |
+
if not os.path.isfile(md_path):
|
23 |
+
return ""
|
24 |
+
with open(md_path, "r", encoding="utf-8") as f:
|
25 |
+
md_content = f.read()
|
26 |
+
pdf_obj = MarkdownPdf(toc_level=2)
|
27 |
+
pdf_obj.add_section(Section(md_content))
|
28 |
+
|
29 |
+
pdf_filename = os.path.splitext(os.path.basename(md_path))[0] + ".pdf"
|
30 |
+
pdf_path = os.path.join(OUTPUT_DIR, pdf_filename)
|
31 |
+
|
32 |
+
pdf_obj.save(pdf_path)
|
33 |
+
return pdf_path if os.path.isfile(pdf_path) else ""
|
34 |
+
|
35 |
+
def process_resume(model_choice, new_resume, company_name, job_url, openai_api_key, serper_api_key):
|
36 |
+
"""Handles file upload, API keys, resume processing, and returns PDFs."""
|
37 |
+
current_date = datetime.datetime.now().strftime("%Y%m%d")
|
38 |
+
|
39 |
+
if not openai_api_key or not serper_api_key:
|
40 |
+
return ("Error: Please enter both OpenAI and Serper API keys.", None, None, None)
|
41 |
+
|
42 |
+
if new_resume is None or not hasattr(new_resume, "name") or not new_resume.name.strip():
|
43 |
+
return ("Error: Please upload a resume.", None, None, None)
|
44 |
+
|
45 |
+
resume_path = os.path.join(UPLOAD_DIR, new_resume.name)
|
46 |
+
|
47 |
+
with open(resume_path, "wb") as f:
|
48 |
+
f.write(new_resume.read())
|
49 |
+
|
50 |
+
crew_instance = ResumeCrew(
|
51 |
+
model=model_choice,
|
52 |
+
openai_api_key=openai_api_key,
|
53 |
+
serper_api_key=serper_api_key,
|
54 |
+
resume_pdf_path=resume_path
|
55 |
+
)
|
56 |
+
|
57 |
+
crew = crew_instance.crew()
|
58 |
+
if crew:
|
59 |
+
crew.kickoff(inputs={'job_url': job_url, 'company_name': company_name})
|
60 |
+
|
61 |
+
def md_to_pdf_in_dir(md_filename):
|
62 |
+
md_path = os.path.join(OUTPUT_DIR, md_filename)
|
63 |
+
if os.path.isfile(md_path):
|
64 |
+
return convert_md_to_pdf(md_path)
|
65 |
+
return ""
|
66 |
+
|
67 |
+
pdf_opt = md_to_pdf_in_dir("optimized_resume.md")
|
68 |
+
pdf_final = md_to_pdf_in_dir("final_report.md")
|
69 |
+
pdf_int = md_to_pdf_in_dir("interview_questions.md")
|
70 |
+
|
71 |
+
message = f"Processing completed using model {model_choice}. Files are stored temporarily."
|
72 |
+
|
73 |
+
return message, pdf_opt, pdf_final, pdf_int
|
74 |
+
|
75 |
+
model_choices = {
|
76 |
+
"GPT-4o-mini": "gpt-4o-mini-2024-07-18",
|
77 |
+
"GPT-4o": "gpt-4o-2024-08-06",
|
78 |
+
"o3-mini": "o3-mini-2025-01-31",
|
79 |
+
"o1-mini": "o1-mini-2024-09-12"
|
80 |
+
}
|
81 |
+
|
82 |
+
with gr.Blocks(css=".output-column { width: 700px; }") as demo:
|
83 |
+
with gr.Row():
|
84 |
+
with gr.Column(scale=0.8):
|
85 |
+
gr.Markdown("## Resume Optimization System")
|
86 |
+
openai_api_key_input = gr.Textbox(label="OpenAI API Key", type="password")
|
87 |
+
serper_api_key_input = gr.Textbox(label="Serper API Key", type="password")
|
88 |
+
model_dropdown = gr.Dropdown(choices=list(model_choices.values()), label="Select Model")
|
89 |
+
new_resume_file = gr.File(label="Upload New Resume PDF", file_types=[".pdf"])
|
90 |
+
company_name_text = gr.Textbox(label="Company Name")
|
91 |
+
job_url_text = gr.Textbox(label="Job URL")
|
92 |
+
run_button = gr.Button("Run")
|
93 |
+
|
94 |
+
# Define output components
|
95 |
+
result_text = gr.Textbox(label="Status", interactive=False)
|
96 |
+
pdf_opt_out = gr.File(label="Optimized Resume PDF")
|
97 |
+
pdf_final_out = gr.File(label="Final Report PDF")
|
98 |
+
pdf_int_out = gr.File(label="Interview Questions PDF")
|
99 |
+
|
100 |
+
# Connect button
|
101 |
+
run_button.click(
|
102 |
+
process_resume,
|
103 |
+
inputs=[model_dropdown, new_resume_file, company_name_text, job_url_text, openai_api_key_input, serper_api_key_input],
|
104 |
+
outputs=[result_text, pdf_opt_out, pdf_final_out, pdf_int_out]
|
105 |
+
)
|
106 |
+
|
107 |
+
demo.launch()
|
docs/README.md
ADDED
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Resume Optimization System Architecture
|
2 |
+
|
3 |
+

|
4 |
+
|
5 |
+
This document provides an overview of the resume optimization system architecture.
|
6 |
+
|
7 |
+
## System Components
|
8 |
+
|
9 |
+
### 1. Input Sources
|
10 |
+
|
11 |
+
- Resume (PDF format)
|
12 |
+
- Job URL
|
13 |
+
- Company Name
|
14 |
+
|
15 |
+
### 2. Analysis Agents
|
16 |
+
|
17 |
+
- **Job Analyzer**: Uses ScrapeWebsiteTool to analyze job descriptions
|
18 |
+
- **Resume Analyzer**: Uses PDFKnowledgeSource to analyze resumes
|
19 |
+
- **Company Researcher**: Uses SerperDevTool for company research
|
20 |
+
|
21 |
+
### 3. Structured Data
|
22 |
+
|
23 |
+
JSON files storing analysis results:
|
24 |
+
|
25 |
+
- job_analysis.json
|
26 |
+
- resume_optimization.json
|
27 |
+
- company_research.json
|
28 |
+
|
29 |
+
### 4. Report Generators
|
30 |
+
|
31 |
+
- **Resume Writer**: Creates optimized resumes
|
32 |
+
- **Report Generator**: Creates comprehensive reports
|
33 |
+
|
34 |
+
### 5. Output Files
|
35 |
+
|
36 |
+
Markdown files:
|
37 |
+
|
38 |
+
- optimized_resume.md
|
39 |
+
- final_report.md
|
40 |
+
|
docs/architecture-diagam.svg
ADDED
|
docs/crewai_logo.svg
ADDED
|
knowledge/CV_Mohan.pdf
ADDED
Binary file (111 kB). View file
|
|
output/company_research.json
ADDED
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"recent_developments": [
|
3 |
+
"Reported a record revenue of about $16 billion in 2023, reflecting consistent overall growth.",
|
4 |
+
"Heightened focus on generative AI and digital transformation services in client engagements.",
|
5 |
+
"Continued expansion of sustainability consulting through new acquisitions and capabilities.",
|
6 |
+
"Publication of research such as 'The State of Organizations 2023' and ongoing industry-specific outlook reports."
|
7 |
+
],
|
8 |
+
"culture_and_values": [
|
9 |
+
"Strong emphasis on diversity, equity, and inclusion with a commitment to creating an inclusive environment.",
|
10 |
+
"Client-centric approach underpinned by integrity and ethical conduct in delivering measurable impact.",
|
11 |
+
"Collaborative, team-based culture fostering knowledge exchange and professional growth.",
|
12 |
+
"Ongoing investment in innovation and thought leadership through strategic insights and large-scale research."
|
13 |
+
],
|
14 |
+
"market_position": {
|
15 |
+
"ranking": [
|
16 |
+
"Recognized as one of the top global management consulting firms with a broad client portfolio across industries."
|
17 |
+
],
|
18 |
+
"competitors": [
|
19 |
+
"Boston Consulting Group (BCG)",
|
20 |
+
"Bain & Company",
|
21 |
+
"Accenture",
|
22 |
+
"Deloitte"
|
23 |
+
]
|
24 |
+
},
|
25 |
+
"growth_trajectory": [
|
26 |
+
"Maintained strong year-over-year growth in key practice areas such as digital, analytics, and sustainability.",
|
27 |
+
"Expanding global headcount, surpassing 45,000 employees as part of continued worldwide hiring efforts.",
|
28 |
+
"Heightened industry focus on emerging markets and technology innovation to drive future service growth.",
|
29 |
+
"Extensive acquisitions and strategic partnerships to strengthen implementation and digital transformation offerings."
|
30 |
+
],
|
31 |
+
"interview_questions": [
|
32 |
+
"Tell me about yourself and why you want to join McKinsey.",
|
33 |
+
"Walk me through a challenging project you worked on, and how you overcame obstacles.",
|
34 |
+
"What are some aspects of our culture or values that resonate with you, and why?",
|
35 |
+
"Case interview: How would you approach solving a clientβs profitability issue in a specific industry?",
|
36 |
+
"Behavioral interview: Describe a time you led a team under high pressure and discuss the results you achieved."
|
37 |
+
]
|
38 |
+
}
|
output/final_report.md
ADDED
@@ -0,0 +1,125 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Executive Summary
|
2 |
+
|
3 |
+
### Overall Match Score: 88%
|
4 |
+
Your profile demonstrates strong alignment with the Associate role at McKinsey, driven by robust quantitative analysis, leadership experience, and effective communication skills.
|
5 |
+
|
6 |
+
### Quick Wins
|
7 |
+
β’ Emphasize your advanced education (MBA, PhD) and relevant CFA/FRM credentials
|
8 |
+
β’ Leverage your finance and data analysis background to position yourself for strategy and analytics engagements at McKinsey
|
9 |
+
β’ Highlight your teaching and mentoring experience as a powerful example of communication, leadership, and collaboration
|
10 |
+
|
11 |
+
### Key Strengths
|
12 |
+
β’ Deep quantitative problem-solving abilities (financial modeling, hypothesis testing, data-driven insights)
|
13 |
+
β’ Strong educational background (MBA, ongoing PhD) and recognition for academic excellence
|
14 |
+
β’ Leadership skills demonstrated through team-based projects and teaching experience
|
15 |
+
β’ Proven collaboration and communication abilities from cross-functional work
|
16 |
+
|
17 |
+
### Improvement Areas
|
18 |
+
β’ Limited direct consulting project experience β reframe prior financial roles in a consulting-oriented narrative
|
19 |
+
β’ Broadening industry exposure beyond finance to showcase readiness for a variety of McKinsey engagements
|
20 |
+
|
21 |
+
### Action Items Priority List
|
22 |
+
1. π₯ Refine your resume to showcase consulting transferrable skills and highlight collaborative problem-solving
|
23 |
+
2. π Prepare targeted examples of collaboration, leadership, and client-focused results using the STAR method
|
24 |
+
3. βοΈ Research diverse McKinsey practice areas to speak knowledgeably about broad industry challenges
|
25 |
+
|
26 |
+
---
|
27 |
+
|
28 |
+
# Job Fit Analysis
|
29 |
+
|
30 |
+
### Detailed Score Breakdown
|
31 |
+
| Category | Match Score |
|
32 |
+
|-------------------------|------------:|
|
33 |
+
| Overall Match | 0.88 |
|
34 |
+
| Technical Skills | 0.90 |
|
35 |
+
| Soft Skills | 0.85 |
|
36 |
+
| Experience | 0.85 |
|
37 |
+
| Education | 1.00 |
|
38 |
+
| Industry | 0.80 |
|
39 |
+
|
40 |
+
### Skills Match Assessment
|
41 |
+
β’ **Technical Skills (0.90)**
|
42 |
+
- Quantitative analysis, hypothesis testing, financial modeling, data/statistical analysis
|
43 |
+
- Expert-level proficiency in Stata and Python
|
44 |
+
|
45 |
+
β’ **Soft Skills (0.85)**
|
46 |
+
- Teaching, communication, inclusive teamwork, leadership/mentoring
|
47 |
+
- Strong ability to collaborate cross-functionally
|
48 |
+
|
49 |
+
β’ **Experience Alignment (0.85)**
|
50 |
+
- Investment research and asset allocation experience is transferable to client problem-solving
|
51 |
+
- Project leadership at Fidelity Investments showcases an ability to convert insights into action
|
52 |
+
|
53 |
+
---
|
54 |
+
|
55 |
+
# Optimization Overview
|
56 |
+
|
57 |
+
### Key Resume Improvements
|
58 |
+
β’ **Add a Consulting-Oriented Summary**
|
59 |
+
- βAnalytical consultant with expertise in quantitative problem-solving, data analysis, and hypothesis testingβ¦β
|
60 |
+
|
61 |
+
β’ **Reframe Experience Bullets**
|
62 |
+
- Fidelity Investments: Emphasize cross-functional leadership and hypothesis testing in portfolio management
|
63 |
+
- Futures First Info. Services: Highlight collaboration in algorithmic trading and data-driven tools
|
64 |
+
|
65 |
+
β’ **Teaching & Research Experience**
|
66 |
+
- Connect teaching responsibilities to client communication and leadership skills
|
67 |
+
|
68 |
+
### ATS Optimization Results
|
69 |
+
β’ Incorporation of consulting keywords (e.g., βClient engagement,β βStakeholder management,β βStrategic analysis,β βHypothesis testingβ)
|
70 |
+
β’ Clear, concise bullet points with quantifiable outcomes to improve overall ATS matching
|
71 |
+
|
72 |
+
### Impact Metrics
|
73 |
+
β’ Expected to raise overall match from 88% to ~91% by clearly mapping prior work experiences to consulting frameworks
|
74 |
+
β’ Increased recruiter clarity on your transferable skills (finance, data, leadership) for McKinseyβs engagement needs
|
75 |
+
|
76 |
+
---
|
77 |
+
|
78 |
+
# Company Insights
|
79 |
+
|
80 |
+
### Culture Fit Analysis
|
81 |
+
β’ McKinsey emphasizes collaborative, team-based problem-solving, which aligns with your proven track record in cross-functional work at Fidelity and as a teaching fellow
|
82 |
+
β’ Insight generation and data-driven analysis are central to McKinseyβs client engagements, directly matching your background
|
83 |
+
|
84 |
+
### Interview Preparation Tips
|
85 |
+
β’ Prepare to address case interviews: structure problem-solving clearly, emphasize hypothesis testing and data analysis
|
86 |
+
β’ Tie in personal stories: highlight how youβve managed high-stakes projects or delivered recommendations to senior stakeholders
|
87 |
+
β’ Articulate a deep understanding of McKinseyβs valuesβclient impact, inclusive culture, professional growth
|
88 |
+
|
89 |
+
### Key Talking Points
|
90 |
+
β’ Demonstrate knowledge of McKinseyβs recent focus on AI/digital transformation and sustainability consulting
|
91 |
+
β’ Showcase how your finance and academic background can support a variety of client industries (beyond purely financial)
|
92 |
+
β’ Emphasize readiness to travel and collaborate with diverse teams globally
|
93 |
+
|
94 |
+
---
|
95 |
+
|
96 |
+
# Next Steps
|
97 |
+
|
98 |
+
### Prioritized Action Items
|
99 |
+
1. **High Priority (π₯)**
|
100 |
+
- Update your resume with the recommended content and formatting suggestions
|
101 |
+
- Begin case interview practice and refine your structured approach to problem-solving
|
102 |
+
2. **Mid Priority (βοΈ)**
|
103 |
+
- Gather specific, quantifiable achievements (e.g., βIncreased efficiency by 20% in asset-management processesβ)
|
104 |
+
- Connect with McKinsey consultants/alumni to gain deeper insight into the Associate role requirements
|
105 |
+
3. **Ongoing (π±)**
|
106 |
+
- Maintain a strong network, remain updated on McKinseyβs thought leadership (research reports, acquisitions, etc.)
|
107 |
+
- Continue skill development in non-financial industries through reading, online courses, or cross-industry projects
|
108 |
+
|
109 |
+
### Skill Development Plan
|
110 |
+
β’ **Consulting Methodologies & Frameworks**
|
111 |
+
- Familiarize yourself with standard strategy frameworks (MECE, Porterβs Five Forces) and typical McKinsey problem structures
|
112 |
+
β’ **Industry Broadening**
|
113 |
+
- Expand exposure beyond finance to show readiness for diverse projects (healthcare, tech, consumer goods, etc.)
|
114 |
+
β’ **Leadership & Communication**
|
115 |
+
- Practice stakeholder communication and building narratives around data insights
|
116 |
+
- Demonstrate synergy between academic research and real-world impact
|
117 |
+
|
118 |
+
### Application Strategy
|
119 |
+
β’ Integrate your updated resume and cover letter targeted to McKinseyβs consulting style
|
120 |
+
β’ Draw upon your finance experience as a foundation for broader problem-solving
|
121 |
+
β’ During interviews, articulate specific ways your skills will deliver client impact and measurable value
|
122 |
+
|
123 |
+
---
|
124 |
+
|
125 |
+
**Good luck with your McKinsey application!** Focus on demonstrating both your technical acumen and your collaborative, client-centric mindset. Your unique blend of finance, academic research, and leadership abilities positions you well for a successful career in strategy consulting.
|
output/job_analysis.json
ADDED
@@ -0,0 +1,174 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"technical_skills": [
|
3 |
+
"Quantitative problem solving",
|
4 |
+
"Data analysis and research",
|
5 |
+
"Hypothesis testing",
|
6 |
+
"Logical reasoning"
|
7 |
+
],
|
8 |
+
"soft_skills": [
|
9 |
+
"Collaboration",
|
10 |
+
"Inclusive teamwork",
|
11 |
+
"Effective verbal and written communication",
|
12 |
+
"Leadership and mentoring abilities",
|
13 |
+
"Adaptability in ambiguous environments"
|
14 |
+
],
|
15 |
+
"experience_requirements": [
|
16 |
+
"Bachelorβs degree; advanced graduate degree (MBA, PhD) or equivalent experience",
|
17 |
+
"Experience leading and driving independent workstreams",
|
18 |
+
"Strong analytical experience, especially with quantitative data"
|
19 |
+
],
|
20 |
+
"key_responsibilities": [
|
21 |
+
"Work in teams of 3-5 consultants to solve client problems",
|
22 |
+
"Gather and analyze information, formulate and test hypotheses",
|
23 |
+
"Communicate recommendations to client management",
|
24 |
+
"Implement solutions collaboratively with client team members",
|
25 |
+
"Travel to client site as needed"
|
26 |
+
],
|
27 |
+
"education_requirements": [
|
28 |
+
"Bachelorβs degree minimum",
|
29 |
+
"Advanced graduate degree (MBA, PhD) preferred",
|
30 |
+
"Equivalent (5+ years) work experience in relevant fields may substitute"
|
31 |
+
],
|
32 |
+
"nice_to_have": [
|
33 |
+
"Familiarity with strategy and operations in diverse industries",
|
34 |
+
"Experience with global financial markets or consulting background"
|
35 |
+
],
|
36 |
+
"job_title": "Associate",
|
37 |
+
"department": "Consulting",
|
38 |
+
"reporting_structure": "Reports to Engagement Manager and Partners",
|
39 |
+
"job_level": "Associate",
|
40 |
+
"location_requirements": {
|
41 |
+
"primary_location": "Global offices",
|
42 |
+
"travel_percentage": "Up to 80% depending on client needs"
|
43 |
+
},
|
44 |
+
"work_schedule": "Full-time",
|
45 |
+
"travel_requirements": "Potentially frequent travel to client locations",
|
46 |
+
"compensation": {
|
47 |
+
"base_salary_range": "$192,000 USD (US) / $200,000 CAD (Canada)",
|
48 |
+
"bonus_eligibility": "Yes, based on performance"
|
49 |
+
},
|
50 |
+
"benefits": [
|
51 |
+
"Medical, dental, and vision coverage",
|
52 |
+
"Parental leave and family planning",
|
53 |
+
"Retirement contribution plan",
|
54 |
+
"Professional development and mentoring",
|
55 |
+
"Mental health and wellness support"
|
56 |
+
],
|
57 |
+
"tools_and_technologies": [
|
58 |
+
"Advanced analytics tools",
|
59 |
+
"Spreadsheets",
|
60 |
+
"Presentation software"
|
61 |
+
],
|
62 |
+
"industry_knowledge": [
|
63 |
+
"Financial services",
|
64 |
+
"Healthcare systems",
|
65 |
+
"Consumer packaged goods",
|
66 |
+
"Public sector",
|
67 |
+
"Technology, media, and multiple other industries"
|
68 |
+
],
|
69 |
+
"certifications_required": [],
|
70 |
+
"security_clearance": null,
|
71 |
+
"team_size": "3-5 consultants per engagement",
|
72 |
+
"key_projects": [
|
73 |
+
"Client performance improvement engagements",
|
74 |
+
"Strategy formulation and implementation projects"
|
75 |
+
],
|
76 |
+
"cross_functional_interactions": [
|
77 |
+
"Collaboration with data scientists",
|
78 |
+
"Interaction with designers and researchers",
|
79 |
+
"Client management and stakeholders"
|
80 |
+
],
|
81 |
+
"career_growth": [
|
82 |
+
"Frequent mentoring and coaching",
|
83 |
+
"Professional development manager to guide staffing and education",
|
84 |
+
"Broad exposure to multiple industries"
|
85 |
+
],
|
86 |
+
"training_provided": [
|
87 |
+
"Onboarding and orientation",
|
88 |
+
"Consulting effectiveness training",
|
89 |
+
"Ongoing leadership development"
|
90 |
+
],
|
91 |
+
"diversity_inclusion": "Strong commitment to equal opportunity and inclusive environment",
|
92 |
+
"company_values": [
|
93 |
+
"Client impact",
|
94 |
+
"Inclusive culture",
|
95 |
+
"Professional growth",
|
96 |
+
"Integrity",
|
97 |
+
"Collaboration"
|
98 |
+
],
|
99 |
+
"job_url": "https://www.mckinsey.com/careers/search-jobs/jobs/associate-15178",
|
100 |
+
"posting_date": "May 26, 2023",
|
101 |
+
"application_deadline": null,
|
102 |
+
"special_instructions": [
|
103 |
+
"Apply via McKinseyβs career site",
|
104 |
+
"Review additional regional requirements if applicable"
|
105 |
+
],
|
106 |
+
"match_score": {
|
107 |
+
"overall_match": 0.88,
|
108 |
+
"technical_skills_match": 0.9,
|
109 |
+
"soft_skills_match": 0.85,
|
110 |
+
"experience_match": 0.85,
|
111 |
+
"education_match": 1.0,
|
112 |
+
"industry_match": 0.8,
|
113 |
+
"skill_details": [
|
114 |
+
{
|
115 |
+
"skill_name": "Quantitative problem-solving",
|
116 |
+
"required": true,
|
117 |
+
"match_level": 0.9,
|
118 |
+
"years_experience": 5.0,
|
119 |
+
"context_score": 0.9
|
120 |
+
},
|
121 |
+
{
|
122 |
+
"skill_name": "Data / statistical analysis",
|
123 |
+
"required": true,
|
124 |
+
"match_level": 0.9,
|
125 |
+
"years_experience": 5.0,
|
126 |
+
"context_score": 0.9
|
127 |
+
},
|
128 |
+
{
|
129 |
+
"skill_name": "Financial / investment domain knowledge",
|
130 |
+
"required": false,
|
131 |
+
"match_level": 0.8,
|
132 |
+
"years_experience": 7.0,
|
133 |
+
"context_score": 0.8
|
134 |
+
},
|
135 |
+
{
|
136 |
+
"skill_name": "Communication / presentation",
|
137 |
+
"required": true,
|
138 |
+
"match_level": 0.85,
|
139 |
+
"years_experience": null,
|
140 |
+
"context_score": 0.85
|
141 |
+
},
|
142 |
+
{
|
143 |
+
"skill_name": "Leadership / team collaboration",
|
144 |
+
"required": true,
|
145 |
+
"match_level": 0.85,
|
146 |
+
"years_experience": null,
|
147 |
+
"context_score": 0.85
|
148 |
+
}
|
149 |
+
],
|
150 |
+
"strengths": [
|
151 |
+
"Advanced education including ongoing PhD and MBA",
|
152 |
+
"Strong finance and investment background",
|
153 |
+
"Quantitative research and data analysis expertise",
|
154 |
+
"Teaching and communication experience"
|
155 |
+
],
|
156 |
+
"gaps": [
|
157 |
+
"Limited direct consulting project experience",
|
158 |
+
"Exposure primarily focused on finance rather than broad-based industries"
|
159 |
+
],
|
160 |
+
"scoring_factors": {
|
161 |
+
"technical_skills_weight": 0.35,
|
162 |
+
"soft_skills_weight": 0.2,
|
163 |
+
"experience_weight": 0.25,
|
164 |
+
"education_weight": 0.1,
|
165 |
+
"industry_weight": 0.1
|
166 |
+
}
|
167 |
+
},
|
168 |
+
"score_explanation": [
|
169 |
+
"Strong educational background and quantitative skills match technical requirements well",
|
170 |
+
"Soft skills demonstrated through teaching experience and academic collaboration",
|
171 |
+
"Relevant industry experience in finance but less exposure to other McKinsey client sectors",
|
172 |
+
"Overall score derived from weighted average of technical, soft, experience, education, and industry match"
|
173 |
+
]
|
174 |
+
}
|
output/optimized_resume.md
ADDED
@@ -0,0 +1,125 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Aditya Mohan
|
2 |
+
Harvard Business School, Boston, MA 02163
|
3 |
+
Phone: 857-312-5685
|
4 |
+
Email: [email protected]
|
5 |
+
|
6 |
+
## Professional Summary
|
7 |
+
Analytical consultant with expertise in quantitative problem-solving, data analysis, and hypothesis testing, seeking to leverage leadership and collaboration skills to drive impactful client solutions at McKinsey. Adept at communicating complex concepts, managing cross-functional stakeholders, and facilitating data-driven decision-making in high-stakes environments.
|
8 |
+
|
9 |
+
## Education
|
10 |
+
|
11 |
+
**Harvard Business School**
|
12 |
+
PhD, Business Administration, May 2022 (expected)
|
13 |
+
β’ 2017β2022 (expected)
|
14 |
+
|
15 |
+
**Columbia Business School**
|
16 |
+
MBA, Finance and Economics, May 2016
|
17 |
+
β’ GMAT: 790 (99th percentile)
|
18 |
+
β’ Honors:
|
19 |
+
- Eli Ginzberg Memorial Prize for outstanding work in economics
|
20 |
+
- GPA 4.09/4.0 (Top 5% of class)
|
21 |
+
- Deanβs Honors with Distinction
|
22 |
+
- Michael Corasaniti Fellowship for Security Analysis
|
23 |
+
β’ 2014β2016
|
24 |
+
|
25 |
+
**Indian Institute of Technology (IIT), Kharagpur, India**
|
26 |
+
B.Tech (Honors), Energy Engineering, May 2006
|
27 |
+
β’ 2002β2006
|
28 |
+
β’ National Talent Search Scholarship (Awarded to top 1000 Indian students)
|
29 |
+
|
30 |
+
## Key Skills
|
31 |
+
- Quantitative analysis and statistical modeling
|
32 |
+
- Consulting-oriented communication and presentation
|
33 |
+
- Structured problem-solving and hypothesis testing
|
34 |
+
- Leadership and mentoring in team environments
|
35 |
+
- Collaboration with cross-functional stakeholders
|
36 |
+
- Client engagement and stakeholder management
|
37 |
+
- Data-driven decision-making and insight generation
|
38 |
+
- Cross-functional collaboration and team leadership
|
39 |
+
- Strategic analysis and financial modeling
|
40 |
+
- Communication skills in high-pressure situations
|
41 |
+
|
42 |
+
## Experience
|
43 |
+
|
44 |
+
### Fidelity Investments (2007β2014), Boston & Bangalore
|
45 |
+
**Asset-Allocation Analyst (Boston: 2010β2014, Bangalore: 2007β2010)**
|
46 |
+
- Led cross-functional investment research teams overseeing $2B in global fixed income assets, leveraging quantitative analysis and hypothesis testing to optimize portfolio performance and drive client-focused, data-driven decisions.
|
47 |
+
- Spearheaded a team-based project demonstrating final recommendations to senior stakeholders in a high-stakes environment, enhancing client engagement and showcasing consulting-oriented communication.
|
48 |
+
- Successfully implemented process improvements that resulted in measurable efficiency gains, driving strategic analysis and cost savings for the investment research function.
|
49 |
+
|
50 |
+
### Futures First Info. Services (2006β2007), Gurgaon, India
|
51 |
+
**Derivatives Trader**
|
52 |
+
- Collaborated with an automated trading group to develop correlation-based algorithmic tools, applying logical reasoning and financial modeling to deliver actionable market insights and drive investment strategies.
|
53 |
+
- Traded futures and options on German government bonds (Bunds, Bobl, Schatz) and Euribor futures, using data-driven decision-making to achieve consistent returns.
|
54 |
+
- Developed strategic insights for a new market entry, contributing to an immediate performance impact and demonstrating strong problem-solving capabilities.
|
55 |
+
|
56 |
+
## Research & Teaching Experience
|
57 |
+
|
58 |
+
- **Harvard Business School (Teaching Fellow)**
|
59 |
+
- Leveraged strong communication and leadership skills to mentor MBA candidates in Financial Analysis and Business Valuation, fostering a collaborative learning environment and applying real-world data interpretation techniques.
|
60 |
+
- Taught and coached in Accounting, Business Analysis, and Valuation courses for MBA and Law School programs.
|
61 |
+
|
62 |
+
- **Columbia Business School (Teaching Assistant)**
|
63 |
+
- Supported Corporate Finance, Capital Markets, and Global Economic Environment courses, demonstrating strong communication skills and an ability to clarify complex concepts.
|
64 |
+
|
65 |
+
### Selected Research
|
66 |
+
- **Job Market Paper**: βRatings based incentives and institutional investor response: Evidence from the mutual fund marketβ
|
67 |
+
- Investigated how Morningstar ratings incentivize mutual fund managers to improve risk-adjusted returns, showing that manager behavior is driven by both investor flow considerations and career concerns.
|
68 |
+
|
69 |
+
- **Payment Practices Transparency and Customer-Supplier Contracting** (with J. Grewal and G. PΓ©rez-Cavazos)
|
70 |
+
- Studied the 2017 Payment Practices Disclosure Regulation in the U.K. and found that small and medium-sized enterprises reduced accounts receivable by 7.0% after mandated disclosure. Results indicate reputation effects prompt larger firms to accelerate payable settlements.
|
71 |
+
|
72 |
+
## Additional Information
|
73 |
+
- Credentials: Chartered Financial Analyst (CFA), Financial Risk Manager (FRM)
|
74 |
+
- Skilled in advanced analytics using Stata and Python to drive data-driven insights
|
75 |
+
- Adept at communicating results to stakeholders and senior leadership
|
76 |
+
- Tools previously used: LaTeX for academic writing
|
77 |
+
|
78 |
+
## References
|
79 |
+
- **Charles C.Y. Wang (Chair)**
|
80 |
+
Glenn and Mary Jane Creamer Associate Professor, Accounting & Management
|
81 |
+
Harvard Business School
|
82 |
+
+1 (617) 496-9633 | [email protected]
|
83 |
+
|
84 |
+
- **Suraj Srinivasan**
|
85 |
+
Philip J. Stomberg Professor, Accounting & Management
|
86 |
+
Harvard Business School
|
87 |
+
+1 (617) 495-6993 | [email protected]
|
88 |
+
|
89 |
+
- **Gerardo PΓ©rez-Cavazos**
|
90 |
+
Assistant Professor of Accounting
|
91 |
+
Rady School of Management, University of California, San Diego
|
92 |
+
+1 (773) 870-1023 | [email protected]
|
93 |
+
|
94 |
+
---
|
95 |
+
|
96 |
+
## Explanations of Changes (Change Log)
|
97 |
+
|
98 |
+
1. **Added Professional Summary**
|
99 |
+
- New section emphasizes consulting strengths, quantitative problem-solving, leadership, and collaboration.
|
100 |
+
|
101 |
+
2. **Revised Fidelity Investments Bullet**
|
102 |
+
- Updated language to highlight cross-functional collaboration, hypothesis testing, and data-driven decisions for better alignment with consulting and McKinseyβs values.
|
103 |
+
|
104 |
+
3. **Revised Futures First Info. Services Bullet**
|
105 |
+
- Emphasized collaboration, financial modeling, and insight-generation to demonstrate consulting-oriented problem-solving.
|
106 |
+
|
107 |
+
4. **Enhanced Research & Teaching Descriptions**
|
108 |
+
- Showcased leadership, communication, and real-world data interpretation skills to align with the collaborative and client-focused nature of consulting roles.
|
109 |
+
|
110 |
+
5. **Restructured Additional Information**
|
111 |
+
- Clearly stated CFA and FRM credentials and added emphasis on advanced analytics and stakeholder communication skills.
|
112 |
+
|
113 |
+
6. **Key Skills Section**
|
114 |
+
- Created a dedicated section to spotlight relevant consulting and quantitative skills, ensuring these keywords are present for ATS compatibility (client engagement, hypothesis testing, data-driven decision-making, etc.).
|
115 |
+
|
116 |
+
7. **Achievements Integration**
|
117 |
+
- Incorporated bullet points on team-based projects, process improvements, and strategic insights with quantified or high-impact results to illustrate capacity for delivering client-ready recommendations.
|
118 |
+
|
119 |
+
8. **Reverse Chronological Order**
|
120 |
+
- Maintained the standard format with most recent roles/education first, ensuring a clear and ATS-friendly structure.
|
121 |
+
|
122 |
+
9. **Preserved Original Education Details and Research**
|
123 |
+
- Retained academic honors, research specifics, and references while reformatting for clarity and ATS scanning.
|
124 |
+
|
125 |
+
These enhancements ensure the resume is ATS-optimized, highlights consulting-relevant competencies, and aligns with McKinseyβs values of leadership, collaboration, and impact.
|
output/resume_optimization.json
ADDED
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"content_suggestions": [
|
3 |
+
{
|
4 |
+
"section": "Professional Summary / Objective",
|
5 |
+
"before": "No existing summary focused on consulting strengths",
|
6 |
+
"after": "Add a brief summary: βAnalytical consultant with expertise in quantitative problem-solving, data analysis, and hypothesis testing, seeking to leverage leadership and collaboration skills to drive impactful client solutions at McKinsey.β",
|
7 |
+
"rationale": "Including a concise, tailored summary showcases your consulting readiness and highlights the core skills McKinsey values (problem-solving, leadership, collaboration)."
|
8 |
+
},
|
9 |
+
{
|
10 |
+
"section": "Experience - Fidelity Investments",
|
11 |
+
"before": "βLed investment research for assets totaling $2 Billion...β",
|
12 |
+
"after": "βLed cross-functional investment research teams overseeing $2B in global fixed income assets, leveraging quantitative analysis and hypothesis testing to optimize portfolio performance and drive client-focused, data-driven decisions.β",
|
13 |
+
"rationale": "Reframing highlights collaboration, hypothesis testing, and the ability to implement data-driven approaches, which align with McKinseyβs emphasis on teamwork and problem-solving."
|
14 |
+
},
|
15 |
+
{
|
16 |
+
"section": "Experience - Futures First Info. Services",
|
17 |
+
"before": "Discusses trading experience but lacks consulting-oriented language",
|
18 |
+
"after": "βCollaborated with an automated trading group to develop correlation-based algorithmic tools, applying logical reasoning and financial modeling to deliver actionable market insights and drive investment strategies.β",
|
19 |
+
"rationale": "Shifting language to emphasize collaboration, financial modeling, and analytical insights creates stronger alignment with consulting skill sets, like insight-generation and collaborative problem-solving."
|
20 |
+
},
|
21 |
+
{
|
22 |
+
"section": "Research & Teaching Experience",
|
23 |
+
"before": "Heavily focused on academic achievements without explicit ties to consulting scenarios",
|
24 |
+
"after": "βLeveraged strong communication and leadership skills to mentor MBA candidates in Financial Analysis and Business Valuation, fostering a collaborative learning environment and applying real-world data interpretation techniques.β",
|
25 |
+
"rationale": "Highlighting teaching as leadership and collaboration experience underscores your ability to guide teams, a crucial attribute for client engagements and internal collaboration at McKinsey."
|
26 |
+
},
|
27 |
+
{
|
28 |
+
"section": "Additional Information",
|
29 |
+
"before": "βChartered Financial Analyst; Financial Risk Manager (GARP)... Tools: Stata, Python, Latexβ",
|
30 |
+
"after": "βCredentials: Chartered Financial Analyst (CFA), Financial Risk Manager (FRM). Skilled in advanced analytics using Stata and Python to drive data-driven insights. Adept at communicating results to stakeholders.β",
|
31 |
+
"rationale": "Restructuring this section clarifies your strong technical credentials and ability to present complex information to stakeholders, bridging a key skill set for McKinsey consultant roles."
|
32 |
+
}
|
33 |
+
],
|
34 |
+
"skills_to_highlight": [
|
35 |
+
"Quantitative analysis and statistical modeling",
|
36 |
+
"Consulting-oriented communication and presentation",
|
37 |
+
"Structured problem-solving and hypothesis testing",
|
38 |
+
"Leadership and mentoring in team environments",
|
39 |
+
"Collaboration with cross-functional stakeholders"
|
40 |
+
],
|
41 |
+
"achievements_to_add": [
|
42 |
+
"Led a team-based project demonstrating final recommendations to senior stakeholders in a high-stakes environment",
|
43 |
+
"Successfully implemented process improvements that resulted in measurable cost savings or efficiency gains",
|
44 |
+
"Developed strategic insights for a new market entry or product launch with immediate impact on firm performance"
|
45 |
+
],
|
46 |
+
"keywords_for_ats": [
|
47 |
+
"Client engagement",
|
48 |
+
"Consulting",
|
49 |
+
"Data-driven decision-making",
|
50 |
+
"Hypothesis testing",
|
51 |
+
"Cross-functional collaboration",
|
52 |
+
"Stakeholder management",
|
53 |
+
"Strategic analysis",
|
54 |
+
"Team leadership",
|
55 |
+
"Problem-solving",
|
56 |
+
"Financial modeling",
|
57 |
+
"Insight generation",
|
58 |
+
"Communication skills"
|
59 |
+
],
|
60 |
+
"formatting_suggestions": [
|
61 |
+
"Create a dedicated 'Consulting Skills' or 'Key Skills' section below education to emphasize relevant strengths for McKinsey.",
|
62 |
+
"Use consistent font size and alignment across all section headers for a cleaner look.",
|
63 |
+
"Shorten select bullet points in Experience and highlight quantifiable outcomes (e.g., βIncreased efficiency 20%...β or βSaved $X millionβ¦β).",
|
64 |
+
"Use reverse chronological order (most recent experience first) to align with standard resume practices.",
|
65 |
+
"Ensure contact information (phone number, email) is clearly listed at the top, keeping it consistent and easy to locate for ATS parsing."
|
66 |
+
]
|
67 |
+
}
|
pyproject.toml
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
[project]
|
2 |
+
name = "resume_crew"
|
3 |
+
version = "0.1.0"
|
4 |
+
description = "Resume optimization using CrewAI"
|
5 |
+
authors = [{ name = "Your Name", email = "[email protected]" }]
|
6 |
+
requires-python = ">=3.10,<3.13"
|
7 |
+
dependencies = [
|
8 |
+
"crewai[tools]>=0.95.0,<1.0.0",
|
9 |
+
"ollama>=0.4.7",
|
10 |
+
"gradio>=5.15.0",
|
11 |
+
"markdown-pdf>=1.3.3",
|
12 |
+
"gradio-pdf>=0.0.22"
|
13 |
+
]
|
14 |
+
|
15 |
+
[project.scripts]
|
16 |
+
resume_crew = "resume_crew.main:run"
|
17 |
+
run_crew = "resume_crew.main:run"
|
18 |
+
train = "resume_crew.main:train"
|
19 |
+
replay = "resume_crew.main:replay"
|
20 |
+
test = "resume_crew.main:test"
|
21 |
+
|
22 |
+
[build-system]
|
23 |
+
requires = ["hatchling"]
|
24 |
+
build-backend = "hatchling.build"
|
25 |
+
|
26 |
+
[tool.setuptools]
|
27 |
+
packages = ["resume_crew"]
|
28 |
+
|
29 |
+
[tool.hatch.build.targets.sdist]
|
30 |
+
include = ["src/resume_crew"]
|
31 |
+
|
32 |
+
[tool.crewai]
|
33 |
+
type = "crew"
|
requirements.txt
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
crewai[tools]>=0.95.0,<1.0.0
|
2 |
+
ollama>=0.4.7
|
3 |
+
gradio>=5.15.0
|
4 |
+
markdown-pdf>=1.3.3
|
5 |
+
gradio-pdf>=0.0.22
|
runtime.txt
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
python-3.10.6
|
src/resume_crew/__init__.py
ADDED
File without changes
|
src/resume_crew/config/agents.yaml
ADDED
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
resume_analyzer:
|
2 |
+
role: "Resume Optimization Expert"
|
3 |
+
goal: "Analyze resumes and provide structured optimization suggestions"
|
4 |
+
backstory: >
|
5 |
+
You are a resume optimization specialist with deep knowledge of ATS systems
|
6 |
+
and modern resume best practices. You excel at analyzing PDF resumes and
|
7 |
+
providing actionable suggestions for improvement. Your recommendations always
|
8 |
+
focus on both human readability and ATS compatibility.
|
9 |
+
|
10 |
+
job_analyzer:
|
11 |
+
role: "Job Requirements Analyst"
|
12 |
+
goal: "Analyze job descriptions and score candidate fit"
|
13 |
+
backstory: >
|
14 |
+
You are an expert in job market analysis and candidate evaluation. Your strength
|
15 |
+
lies in breaking down job requirements into clear categories and providing
|
16 |
+
detailed scoring based on candidate qualifications. You understand both technical
|
17 |
+
and soft skills requirements, and can evaluate experience levels accurately.
|
18 |
+
|
19 |
+
company_researcher:
|
20 |
+
role: "Company Intelligence Specialist"
|
21 |
+
goal: "Research companies and prepare interview insights"
|
22 |
+
backstory: >
|
23 |
+
You are a corporate research expert who excels at gathering and analyzing
|
24 |
+
the latest company information. You know how to find and synthesize data
|
25 |
+
from various sources to create comprehensive company profiles and prepare
|
26 |
+
candidates for interviews.
|
27 |
+
|
28 |
+
resume_writer:
|
29 |
+
role: "Resume Markdown Specialist"
|
30 |
+
goal: "Create beautifully formatted, ATS-optimized resumes in markdown"
|
31 |
+
backstory: >
|
32 |
+
You are a resume writing expert who specializes in creating markdown-formatted
|
33 |
+
resumes. You know how to transform structured optimization suggestions into
|
34 |
+
beautifully formatted, ATS-friendly documents that maintain professionalism
|
35 |
+
while showcasing candidate strengths effectively.
|
36 |
+
|
37 |
+
report_generator:
|
38 |
+
role: "Career Report Generator and Markdown Specialist"
|
39 |
+
goal: "Create comprehensive, visually appealing, and actionable reports from job application analysis"
|
40 |
+
backstory: >
|
41 |
+
You are an expert in data visualization, technical writing, and Markdown formatting.
|
42 |
+
You excel at combining data from multiple JSON sources to create cohesive,
|
43 |
+
visually appealing reports. Your specialty is transforming structured analysis
|
44 |
+
into clear, actionable insights with proper markdown formatting, emojis, and
|
45 |
+
visual elements that make information both appealing and easily digestible.
|
46 |
+
|
47 |
+
interview_question_generator:
|
48 |
+
role: "Interview Preparation Specialist"
|
49 |
+
goal: "Generate a list of interview questions based on the optimized resume, job description, and company research."
|
50 |
+
backstory: >
|
51 |
+
You are an expert in synthesizing interview questions. Use all available insights from the candidate's optimized resume, the job requirements, and company research data to generate tailored, strategic, and thought-provoking interview questions that cover technical, behavioral, and situational topics.
|
src/resume_crew/config/tasks.yaml
ADDED
@@ -0,0 +1,198 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
analyze_job_task:
|
2 |
+
description: >
|
3 |
+
Analyze the {job_url} description and score the candidate's fit based on their resume.
|
4 |
+
Output will be saved as structured JSON data.
|
5 |
+
|
6 |
+
1. Extract Requirements:
|
7 |
+
- Technical skills (required vs nice-to-have)
|
8 |
+
- Soft skills
|
9 |
+
- Experience levels
|
10 |
+
- Education requirements
|
11 |
+
- Industry knowledge
|
12 |
+
|
13 |
+
2. Score Technical Skills (35% of total):
|
14 |
+
- For each required skill:
|
15 |
+
* Match Level (0-1): How well does candidate's experience match?
|
16 |
+
* Years Experience: Compare to required years
|
17 |
+
* Context Score: How relevant is their usage of the skill?
|
18 |
+
- Calculate weighted average based on skill importance
|
19 |
+
|
20 |
+
3. Score Soft Skills (20% of total):
|
21 |
+
- Identify soft skills from resume
|
22 |
+
- Compare against job requirements
|
23 |
+
- Consider context and demonstration of skills
|
24 |
+
|
25 |
+
4. Score Experience (25% of total):
|
26 |
+
- Years of relevant experience
|
27 |
+
- Role similarity
|
28 |
+
- Industry relevance
|
29 |
+
- Project scope and complexity
|
30 |
+
|
31 |
+
5. Score Education (10% of total):
|
32 |
+
- Degree level match
|
33 |
+
- Field of study relevance
|
34 |
+
- Additional certifications
|
35 |
+
|
36 |
+
6. Score Industry Knowledge (10% of total):
|
37 |
+
- Years in similar industry
|
38 |
+
- Domain expertise
|
39 |
+
- Industry-specific achievements
|
40 |
+
|
41 |
+
7. Calculate Overall Score:
|
42 |
+
- Weighted average of all components
|
43 |
+
- Identify key strengths and gaps
|
44 |
+
- Provide detailed scoring explanation
|
45 |
+
|
46 |
+
expected_output: >
|
47 |
+
Structured JSON data containing job analysis and scoring details according to
|
48 |
+
the JobRequirements model schema.
|
49 |
+
agent: job_analyzer
|
50 |
+
|
51 |
+
optimize_resume_task:
|
52 |
+
description: >
|
53 |
+
Review the provided resume against the job analysis and create structured optimization suggestions.
|
54 |
+
Output will be saved as structured JSON data.
|
55 |
+
|
56 |
+
1. Content Analysis:
|
57 |
+
- Compare resume content with job requirements
|
58 |
+
- Identify missing keywords and skills
|
59 |
+
- Analyze achievement descriptions
|
60 |
+
- Check for ATS compatibility
|
61 |
+
|
62 |
+
2. Structure Review:
|
63 |
+
- Evaluate section organization
|
64 |
+
- Check formatting consistency
|
65 |
+
- Assess information hierarchy
|
66 |
+
- Verify contact details
|
67 |
+
|
68 |
+
3. Generate Suggestions:
|
69 |
+
- Content improvements with before/after examples
|
70 |
+
- Skills to highlight based on job match
|
71 |
+
- Achievements to add or modify
|
72 |
+
- ATS optimization recommendations
|
73 |
+
|
74 |
+
expected_output: >
|
75 |
+
Structured JSON data containing detailed optimization suggestions according to
|
76 |
+
the ResumeOptimization model schema.
|
77 |
+
agent: resume_analyzer
|
78 |
+
context: [analyze_job_task]
|
79 |
+
|
80 |
+
research_company_task:
|
81 |
+
description: >
|
82 |
+
Research {company_name} and prepare the latest (year 2025) and comprehensive analysis.
|
83 |
+
Output will be saved as structured JSON data.
|
84 |
+
|
85 |
+
1. Company Overview:
|
86 |
+
- Recent developments and news
|
87 |
+
- Culture and values
|
88 |
+
- Market position
|
89 |
+
- Growth trajectory
|
90 |
+
|
91 |
+
2. Interview Preparation:
|
92 |
+
- Common interview questions
|
93 |
+
- Company-specific topics
|
94 |
+
- Recent projects or initiatives
|
95 |
+
- Key challenges and opportunities
|
96 |
+
|
97 |
+
expected_output: >
|
98 |
+
Structured JSON data containing company research results according to
|
99 |
+
the CompanyResearch model schema.
|
100 |
+
agent: company_researcher
|
101 |
+
context: [analyze_job_task, optimize_resume_task]
|
102 |
+
|
103 |
+
generate_resume_task:
|
104 |
+
description: >
|
105 |
+
Using the optimization suggestions and job analysis from previous steps,
|
106 |
+
create a polished resume in markdown format.
|
107 |
+
Do not add markdown code blocks like '```'.
|
108 |
+
|
109 |
+
1. Content Integration:
|
110 |
+
- Incorporate optimization suggestions
|
111 |
+
- Add missing keywords and skills
|
112 |
+
- Enhance achievement descriptions
|
113 |
+
- Ensure ATS compatibility
|
114 |
+
|
115 |
+
2. Formatting:
|
116 |
+
- Use proper markdown headers (#, ##, ###)
|
117 |
+
- Apply consistent styling
|
118 |
+
- Create clear section hierarchy
|
119 |
+
- Use bullet points effectively
|
120 |
+
|
121 |
+
3. Documentation:
|
122 |
+
- Track changes made
|
123 |
+
- Note preserved elements
|
124 |
+
- Explain optimization choices
|
125 |
+
|
126 |
+
expected_output: >
|
127 |
+
A beautifully formatted markdown resume document that:
|
128 |
+
- Incorporates all optimization suggestions
|
129 |
+
- Uses proper markdown formatting
|
130 |
+
- Is ATS-friendly
|
131 |
+
- Documents all changes made
|
132 |
+
agent: resume_writer
|
133 |
+
context: [optimize_resume_task, analyze_job_task, research_company_task]
|
134 |
+
|
135 |
+
generate_report_task:
|
136 |
+
description: >
|
137 |
+
Create an executive summary report using data from previous steps.
|
138 |
+
Format in markdown without code blocks '```'.
|
139 |
+
|
140 |
+
1. Data Integration:
|
141 |
+
- Job analysis and scores
|
142 |
+
- Resume optimization details
|
143 |
+
- Company research insights
|
144 |
+
- Final resume changes
|
145 |
+
|
146 |
+
2. Report Sections:
|
147 |
+
## Executive Summary
|
148 |
+
- Overall match score and quick wins
|
149 |
+
- Key strengths and improvement areas
|
150 |
+
- Action items priority list
|
151 |
+
|
152 |
+
## Job Fit Analysis
|
153 |
+
- Detailed score breakdown
|
154 |
+
- Skills match assessment
|
155 |
+
- Experience alignment
|
156 |
+
|
157 |
+
## Optimization Overview
|
158 |
+
- Key resume improvements
|
159 |
+
- ATS optimization results
|
160 |
+
- Impact metrics
|
161 |
+
|
162 |
+
## Company Insights
|
163 |
+
- Culture fit analysis
|
164 |
+
- Interview preparation tips
|
165 |
+
- Key talking points
|
166 |
+
|
167 |
+
## Next Steps
|
168 |
+
- Prioritized action items
|
169 |
+
- Skill development plan
|
170 |
+
- Application strategy
|
171 |
+
|
172 |
+
3. Formatting:
|
173 |
+
- Use proper markdown headers
|
174 |
+
- Include relevant emojis
|
175 |
+
- Create tables where appropriate
|
176 |
+
- Use bullet points for scannability
|
177 |
+
|
178 |
+
expected_output: >
|
179 |
+
A comprehensive markdown report that combines all analyses into an
|
180 |
+
actionable, clear document with concrete next steps.
|
181 |
+
agent: report_generator
|
182 |
+
context: [analyze_job_task, optimize_resume_task, research_company_task]
|
183 |
+
|
184 |
+
generate_interview_questions_task:
|
185 |
+
description: >
|
186 |
+
Synthesize interview questions using insights from the optimized resume, job description, and company research.
|
187 |
+
expected_output: >
|
188 |
+
Structured JSON data containing a list of interview questions.
|
189 |
+
agent: interview_question_generator
|
190 |
+
context: [optimize_resume_task, analyze_job_task, research_company_task]
|
191 |
+
|
192 |
+
generate_interview_questions_md_task:
|
193 |
+
description: >
|
194 |
+
Produce a Markdown-formatted document of interview questions for easy reading.
|
195 |
+
expected_output: >
|
196 |
+
A Markdown document listing the interview questions with formatting.
|
197 |
+
agent: interview_question_generator
|
198 |
+
context: [optimize_resume_task, analyze_job_task, research_company_task]
|
src/resume_crew/crew.py
ADDED
@@ -0,0 +1,141 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from crewai import Agent, Crew, Process, Task, LLM
|
2 |
+
from crewai.project import CrewBase, agent, crew, task
|
3 |
+
from crewai_tools import SerperDevTool, ScrapeWebsiteTool
|
4 |
+
from crewai.knowledge.source.pdf_knowledge_source import PDFKnowledgeSource
|
5 |
+
from .models import (
|
6 |
+
JobRequirements,
|
7 |
+
ResumeOptimization,
|
8 |
+
CompanyResearch,
|
9 |
+
InterviewQuestions
|
10 |
+
)
|
11 |
+
|
12 |
+
@CrewBase
|
13 |
+
class ResumeCrew():
|
14 |
+
"""ResumeCrew for resume optimization and interview preparation"""
|
15 |
+
|
16 |
+
agents_config = 'config/agents.yaml'
|
17 |
+
tasks_config = 'config/tasks.yaml'
|
18 |
+
|
19 |
+
def __init__(self, model: str, openai_api_key: str, serper_api_key: str, resume_pdf_path: str) -> None:
|
20 |
+
"""
|
21 |
+
Initialize ResumeCrew with the selected model and user-provided API keys.
|
22 |
+
"""
|
23 |
+
self.model = model
|
24 |
+
self.openai_api_key = openai_api_key # Store user-provided OpenAI API Key
|
25 |
+
self.serper_api_key = serper_api_key # Store user-provided Serper API Key
|
26 |
+
self.resume_pdf = PDFKnowledgeSource(file_paths=[resume_pdf_path]) # Use user-uploaded resume
|
27 |
+
|
28 |
+
@agent
|
29 |
+
def resume_analyzer(self) -> Agent:
|
30 |
+
return Agent(
|
31 |
+
config=self.agents_config['resume_analyzer'],
|
32 |
+
verbose=True,
|
33 |
+
llm=LLM(self.model, api_key=self.openai_api_key), # Use user-provided OpenAI API Key
|
34 |
+
knowledge_sources=[self.resume_pdf]
|
35 |
+
)
|
36 |
+
|
37 |
+
@agent
|
38 |
+
def job_analyzer(self) -> Agent:
|
39 |
+
return Agent(
|
40 |
+
config=self.agents_config['job_analyzer'],
|
41 |
+
verbose=True,
|
42 |
+
tools=[ScrapeWebsiteTool()],
|
43 |
+
llm=LLM(self.model, api_key=self.openai_api_key) # Use dynamic API key
|
44 |
+
)
|
45 |
+
|
46 |
+
@agent
|
47 |
+
def company_researcher(self) -> Agent:
|
48 |
+
return Agent(
|
49 |
+
config=self.agents_config['company_researcher'],
|
50 |
+
verbose=True,
|
51 |
+
tools=[SerperDevTool(api_key=self.serper_api_key)], # Use user-provided Serper API Key
|
52 |
+
llm=LLM(self.model, api_key=self.openai_api_key), # Use dynamic API key
|
53 |
+
knowledge_sources=[self.resume_pdf]
|
54 |
+
)
|
55 |
+
|
56 |
+
@agent
|
57 |
+
def resume_writer(self) -> Agent:
|
58 |
+
return Agent(
|
59 |
+
config=self.agents_config['resume_writer'],
|
60 |
+
verbose=True,
|
61 |
+
llm=LLM(self.model, api_key=self.openai_api_key)
|
62 |
+
)
|
63 |
+
|
64 |
+
@agent
|
65 |
+
def report_generator(self) -> Agent:
|
66 |
+
return Agent(
|
67 |
+
config=self.agents_config['report_generator'],
|
68 |
+
verbose=True,
|
69 |
+
llm=LLM(self.model, api_key=self.openai_api_key)
|
70 |
+
)
|
71 |
+
|
72 |
+
@agent
|
73 |
+
def interview_question_generator(self) -> Agent:
|
74 |
+
return Agent(
|
75 |
+
config=self.agents_config['interview_question_generator'],
|
76 |
+
verbose=True,
|
77 |
+
llm=LLM(self.model, api_key=self.openai_api_key)
|
78 |
+
)
|
79 |
+
|
80 |
+
@task
|
81 |
+
def analyze_job_task(self) -> Task:
|
82 |
+
return Task(
|
83 |
+
config=self.tasks_config['analyze_job_task'],
|
84 |
+
output_file='output/job_analysis.json',
|
85 |
+
output_pydantic=JobRequirements
|
86 |
+
)
|
87 |
+
|
88 |
+
@task
|
89 |
+
def optimize_resume_task(self) -> Task:
|
90 |
+
return Task(
|
91 |
+
config=self.tasks_config['optimize_resume_task'],
|
92 |
+
output_file='output/resume_optimization.json',
|
93 |
+
output_pydantic=ResumeOptimization
|
94 |
+
)
|
95 |
+
|
96 |
+
@task
|
97 |
+
def research_company_task(self) -> Task:
|
98 |
+
return Task(
|
99 |
+
config=self.tasks_config['research_company_task'],
|
100 |
+
output_file='output/company_research.json',
|
101 |
+
output_pydantic=CompanyResearch
|
102 |
+
)
|
103 |
+
|
104 |
+
@task
|
105 |
+
def generate_resume_task(self) -> Task:
|
106 |
+
return Task(
|
107 |
+
config=self.tasks_config['generate_resume_task'],
|
108 |
+
output_file='output/optimized_resume.md'
|
109 |
+
)
|
110 |
+
|
111 |
+
@task
|
112 |
+
def generate_report_task(self) -> Task:
|
113 |
+
return Task(
|
114 |
+
config=self.tasks_config['generate_report_task'],
|
115 |
+
output_file='output/final_report.md'
|
116 |
+
)
|
117 |
+
|
118 |
+
@task
|
119 |
+
def generate_interview_questions_task(self) -> Task:
|
120 |
+
return Task(
|
121 |
+
config=self.tasks_config['generate_interview_questions_task'],
|
122 |
+
output_file='output/interview_questions.json',
|
123 |
+
output_pydantic=InterviewQuestions
|
124 |
+
)
|
125 |
+
|
126 |
+
@task
|
127 |
+
def generate_interview_questions_md_task(self) -> Task:
|
128 |
+
return Task(
|
129 |
+
config=self.tasks_config['generate_interview_questions_md_task'],
|
130 |
+
output_file='output/interview_questions.md'
|
131 |
+
)
|
132 |
+
|
133 |
+
@crew
|
134 |
+
def crew(self) -> Crew:
|
135 |
+
return Crew(
|
136 |
+
agents=self.agents,
|
137 |
+
tasks=self.tasks,
|
138 |
+
verbose=True,
|
139 |
+
process=Process.sequential,
|
140 |
+
knowledge_sources=[self.resume_pdf]
|
141 |
+
)
|
src/resume_crew/main.py
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/usr/bin/env python
|
2 |
+
import sys
|
3 |
+
import warnings
|
4 |
+
|
5 |
+
from resume_crew.crew import ResumeCrew
|
6 |
+
|
7 |
+
warnings.filterwarnings("ignore", category=SyntaxWarning, module="pysbd")
|
8 |
+
|
9 |
+
def run():
|
10 |
+
"""
|
11 |
+
Run the resume optimization crew.
|
12 |
+
"""
|
13 |
+
inputs = {
|
14 |
+
'job_url': 'https://www.mckinsey.com/careers/search-jobs/jobs/associate-15178',
|
15 |
+
'company_name': 'Mckinsey & Co.'
|
16 |
+
}
|
17 |
+
ResumeCrew().crew().kickoff(inputs=inputs)
|
18 |
+
|
19 |
+
if __name__ == "__main__":
|
20 |
+
run()
|
src/resume_crew/models.py
ADDED
@@ -0,0 +1,224 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from typing import List, Dict, Optional
|
2 |
+
from pydantic import BaseModel, Field, confloat
|
3 |
+
|
4 |
+
class SkillScore(BaseModel):
|
5 |
+
skill_name: str = Field(description="Name of the skill being scored")
|
6 |
+
required: bool = Field(description="Whether this skill is required or nice-to-have")
|
7 |
+
match_level: confloat(ge=0, le=1) = Field(description="How well the candidate's experience matches (0-1)")
|
8 |
+
years_experience: Optional[float] = Field(description="Years of experience with this skill", default=None)
|
9 |
+
context_score: confloat(ge=0, le=1) = Field(
|
10 |
+
description="How relevant the skill usage context is to the job requirements",
|
11 |
+
default=0.5
|
12 |
+
)
|
13 |
+
|
14 |
+
class JobMatchScore(BaseModel):
|
15 |
+
overall_match: confloat(ge=0, le=100) = Field(
|
16 |
+
description="Overall match percentage (0-100)"
|
17 |
+
)
|
18 |
+
technical_skills_match: confloat(ge=0, le=100) = Field(
|
19 |
+
description="Technical skills match percentage"
|
20 |
+
)
|
21 |
+
soft_skills_match: confloat(ge=0, le=100) = Field(
|
22 |
+
description="Soft skills match percentage"
|
23 |
+
)
|
24 |
+
experience_match: confloat(ge=0, le=100) = Field(
|
25 |
+
description="Experience level match percentage"
|
26 |
+
)
|
27 |
+
education_match: confloat(ge=0, le=100) = Field(
|
28 |
+
description="Education requirements match percentage"
|
29 |
+
)
|
30 |
+
industry_match: confloat(ge=0, le=100) = Field(
|
31 |
+
description="Industry experience match percentage"
|
32 |
+
)
|
33 |
+
skill_details: List[SkillScore] = Field(
|
34 |
+
description="Detailed scoring for each skill",
|
35 |
+
default_factory=list
|
36 |
+
)
|
37 |
+
strengths: List[str] = Field(
|
38 |
+
description="List of areas where candidate exceeds requirements",
|
39 |
+
default_factory=list
|
40 |
+
)
|
41 |
+
gaps: List[str] = Field(
|
42 |
+
description="List of areas needing improvement",
|
43 |
+
default_factory=list
|
44 |
+
)
|
45 |
+
scoring_factors: Dict[str, float] = Field(
|
46 |
+
description="Weights used for different scoring components",
|
47 |
+
default_factory=lambda: {
|
48 |
+
"technical_skills": 0.35,
|
49 |
+
"soft_skills": 0.20,
|
50 |
+
"experience": 0.25,
|
51 |
+
"education": 0.10,
|
52 |
+
"industry": 0.10
|
53 |
+
}
|
54 |
+
)
|
55 |
+
|
56 |
+
class JobRequirements(BaseModel):
|
57 |
+
technical_skills: List[str] = Field(
|
58 |
+
description="List of required technical skills",
|
59 |
+
default_factory=list
|
60 |
+
)
|
61 |
+
soft_skills: List[str] = Field(
|
62 |
+
description="List of required soft skills",
|
63 |
+
default_factory=list
|
64 |
+
)
|
65 |
+
experience_requirements: List[str] = Field(
|
66 |
+
description="List of experience requirements",
|
67 |
+
default_factory=list
|
68 |
+
)
|
69 |
+
key_responsibilities: List[str] = Field(
|
70 |
+
description="List of key job responsibilities",
|
71 |
+
default_factory=list
|
72 |
+
)
|
73 |
+
education_requirements: List[str] = Field(
|
74 |
+
description="List of education requirements",
|
75 |
+
default_factory=list
|
76 |
+
)
|
77 |
+
nice_to_have: List[str] = Field(
|
78 |
+
description="List of preferred but not required skills",
|
79 |
+
default_factory=list
|
80 |
+
)
|
81 |
+
job_title: str = Field(
|
82 |
+
description="Official job title",
|
83 |
+
default=""
|
84 |
+
)
|
85 |
+
department: Optional[str] = Field(
|
86 |
+
description="Department or team within the company",
|
87 |
+
default=None
|
88 |
+
)
|
89 |
+
reporting_structure: Optional[str] = Field(
|
90 |
+
description="Who this role reports to and any direct reports",
|
91 |
+
default=None
|
92 |
+
)
|
93 |
+
job_level: Optional[str] = Field(
|
94 |
+
description="Level of the position (e.g., Entry, Senior, Lead)",
|
95 |
+
default=None
|
96 |
+
)
|
97 |
+
location_requirements: Dict[str, str] = Field(
|
98 |
+
description="Location details including remote/hybrid options",
|
99 |
+
default_factory=dict
|
100 |
+
)
|
101 |
+
work_schedule: Optional[str] = Field(
|
102 |
+
description="Expected work hours and schedule flexibility",
|
103 |
+
default=None
|
104 |
+
)
|
105 |
+
travel_requirements: Optional[str] = Field(
|
106 |
+
description="Expected travel frequency and scope",
|
107 |
+
default=None
|
108 |
+
)
|
109 |
+
compensation: Dict[str, str] = Field(
|
110 |
+
description="Salary range and compensation details if provided",
|
111 |
+
default_factory=dict
|
112 |
+
)
|
113 |
+
benefits: List[str] = Field(
|
114 |
+
description="List of benefits and perks",
|
115 |
+
default_factory=list
|
116 |
+
)
|
117 |
+
tools_and_technologies: List[str] = Field(
|
118 |
+
description="Specific tools, software, or technologies used",
|
119 |
+
default_factory=list
|
120 |
+
)
|
121 |
+
industry_knowledge: List[str] = Field(
|
122 |
+
description="Required industry-specific knowledge",
|
123 |
+
default_factory=list
|
124 |
+
)
|
125 |
+
certifications_required: List[str] = Field(
|
126 |
+
description="Required certifications or licenses",
|
127 |
+
default_factory=list
|
128 |
+
)
|
129 |
+
security_clearance: Optional[str] = Field(
|
130 |
+
description="Required security clearance level if any",
|
131 |
+
default=None
|
132 |
+
)
|
133 |
+
team_size: Optional[str] = Field(
|
134 |
+
description="Size of the immediate team",
|
135 |
+
default=None
|
136 |
+
)
|
137 |
+
key_projects: List[str] = Field(
|
138 |
+
description="Major projects or initiatives mentioned",
|
139 |
+
default_factory=list
|
140 |
+
)
|
141 |
+
cross_functional_interactions: List[str] = Field(
|
142 |
+
description="Teams or departments this role interacts with",
|
143 |
+
default_factory=list
|
144 |
+
)
|
145 |
+
career_growth: List[str] = Field(
|
146 |
+
description="Career development and growth opportunities",
|
147 |
+
default_factory=list
|
148 |
+
)
|
149 |
+
training_provided: List[str] = Field(
|
150 |
+
description="Training or development programs offered",
|
151 |
+
default_factory=list
|
152 |
+
)
|
153 |
+
diversity_inclusion: Optional[str] = Field(
|
154 |
+
description="D&I statements or requirements",
|
155 |
+
default=None
|
156 |
+
)
|
157 |
+
company_values: List[str] = Field(
|
158 |
+
description="Company values mentioned in the job posting",
|
159 |
+
default_factory=list
|
160 |
+
)
|
161 |
+
job_url: str = Field(
|
162 |
+
description="URL of the job posting",
|
163 |
+
default=""
|
164 |
+
)
|
165 |
+
posting_date: Optional[str] = Field(
|
166 |
+
description="When the job was posted",
|
167 |
+
default=None
|
168 |
+
)
|
169 |
+
application_deadline: Optional[str] = Field(
|
170 |
+
description="Application deadline if specified",
|
171 |
+
default=None
|
172 |
+
)
|
173 |
+
special_instructions: List[str] = Field(
|
174 |
+
description="Any special application instructions or requirements",
|
175 |
+
default_factory=list
|
176 |
+
)
|
177 |
+
match_score: JobMatchScore = Field(
|
178 |
+
description="Detailed scoring of how well the candidate matches the job requirements",
|
179 |
+
default_factory=JobMatchScore
|
180 |
+
)
|
181 |
+
score_explanation: List[str] = Field(
|
182 |
+
description="Detailed explanation of how scores were calculated",
|
183 |
+
default_factory=list
|
184 |
+
)
|
185 |
+
|
186 |
+
class ResumeOptimization(BaseModel):
|
187 |
+
content_suggestions: List[Dict[str, str]] = Field(
|
188 |
+
description="List of content optimization suggestions with 'before' and 'after' examples"
|
189 |
+
)
|
190 |
+
skills_to_highlight: List[str] = Field(
|
191 |
+
description="List of skills that should be emphasized based on job requirements"
|
192 |
+
)
|
193 |
+
achievements_to_add: List[str] = Field(
|
194 |
+
description="List of achievements that should be added or modified"
|
195 |
+
)
|
196 |
+
keywords_for_ats: List[str] = Field(
|
197 |
+
description="List of important keywords for ATS optimization"
|
198 |
+
)
|
199 |
+
formatting_suggestions: List[str] = Field(
|
200 |
+
description="List of formatting improvements"
|
201 |
+
)
|
202 |
+
|
203 |
+
class CompanyResearch(BaseModel):
|
204 |
+
recent_developments: List[str] = Field(
|
205 |
+
description="List of recent company news and developments"
|
206 |
+
)
|
207 |
+
culture_and_values: List[str] = Field(
|
208 |
+
description="Key points about company culture and values"
|
209 |
+
)
|
210 |
+
market_position: Dict[str, List[str]] = Field(
|
211 |
+
description="Information about market position, including competitors and industry standing"
|
212 |
+
)
|
213 |
+
growth_trajectory: List[str] = Field(
|
214 |
+
description="Information about company's growth and future plans"
|
215 |
+
)
|
216 |
+
interview_questions: List[str] = Field(
|
217 |
+
description="Strategic questions to ask during the interview"
|
218 |
+
)
|
219 |
+
|
220 |
+
class InterviewQuestions(BaseModel):
|
221 |
+
questions: List[str] = Field(
|
222 |
+
description="List of interview questions synthesized from the optimized resume, job description, and company research.",
|
223 |
+
default_factory=list
|
224 |
+
)
|
src/resume_crew/tools/__init__.py
ADDED
File without changes
|
src/resume_crew/tools/custom_tool.py
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from crewai.tools import BaseTool
|
2 |
+
from typing import Type
|
3 |
+
from pydantic import BaseModel, Field
|
4 |
+
|
5 |
+
|
6 |
+
class MyCustomToolInput(BaseModel):
|
7 |
+
"""Input schema for MyCustomTool."""
|
8 |
+
argument: str = Field(..., description="Description of the argument.")
|
9 |
+
|
10 |
+
class MyCustomTool(BaseTool):
|
11 |
+
name: str = "Name of my tool"
|
12 |
+
description: str = (
|
13 |
+
"Clear description for what this tool is useful for, your agent will need this information to use it."
|
14 |
+
)
|
15 |
+
args_schema: Type[BaseModel] = MyCustomToolInput
|
16 |
+
|
17 |
+
def _run(self, argument: str) -> str:
|
18 |
+
# Implementation goes here
|
19 |
+
return "this is an example of a tool output, ignore it and move along."
|
uv.lock
ADDED
The diff for this file is too large to render.
See raw diff
|
|