Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| from crewai import Agent, Task, Crew | |
| from pypdf import PdfReader | |
| import os | |
| # Page setup | |
| st.title("π€ Job Application Bot") | |
| st.subheader("Upload JD and Resume β Get Cover Letter") | |
| # API Key input | |
| api_key = st.text_input("Enter OpenAI API Key", type="password") | |
| # File uploads | |
| jd_file = st.file_uploader("Upload Job Description (PDF)", type="pdf") | |
| resume_file = st.file_uploader("Upload Your Resume (PDF)", type="pdf") | |
| # Analyze button | |
| if st.button("Analyze & Generate Cover Letter"): | |
| if not api_key: | |
| st.error("Please enter your OpenAI API key") | |
| elif not jd_file or not resume_file: | |
| st.error("Please upload both files") | |
| else: | |
| os.environ["OPENAI_API_KEY"] = api_key | |
| # Extract text from JD | |
| with st.spinner("Reading Job Description..."): | |
| jd_reader = PdfReader(jd_file) | |
| jd_text = "" | |
| for page in jd_reader.pages: | |
| jd_text += page.extract_text() | |
| # Extract text from Resume | |
| with st.spinner("Reading Resume..."): | |
| resume_reader = PdfReader(resume_file) | |
| resume_text = "" | |
| for page in resume_reader.pages: | |
| resume_text += page.extract_text() | |
| # Create Agents | |
| with st.spinner("AI Agents Working..."): | |
| job_analyzer = Agent( | |
| role='Job Requirements Analyst', | |
| goal='Analyze job descriptions and extract key requirements', | |
| backstory='You are an expert recruiter who deeply understands what companies look for in AI and ML candidates.', | |
| verbose=False | |
| ) | |
| writer = Agent( | |
| role='Cover Letter Writer', | |
| goal='Write a personalized and compelling cover letter', | |
| backstory='You are an expert career coach who writes amazing cover letters that get candidates hired.', | |
| verbose=False | |
| ) | |
| # Create Tasks | |
| analyze_task = Task( | |
| description=f'Analyze this job description and extract top 5 requirements: {jd_text}', | |
| agent=job_analyzer, | |
| expected_output='A list of top 5 key requirements for this job.' | |
| ) | |
| write_task = Task( | |
| description=f'Write a cover letter based on this resume: {resume_text} for this job: {jd_text}', | |
| agent=writer, | |
| expected_output='A professional cover letter ready to send.' | |
| ) | |
| # Run Crew | |
| crew = Crew( | |
| agents=[job_analyzer, writer], | |
| tasks=[analyze_task, write_task], | |
| verbose=False | |
| ) | |
| result = crew.kickoff() | |
| # Show Results | |
| st.success("Done! π") | |
| st.subheader("Your Cover Letter") | |
| st.write(str(result)) |