demo / app /main_app.py
Pavankumar03's picture
Upload 14 files
9e27a2c verified
raw
history blame
9.19 kB
import io
from dotenv import load_dotenv
import streamlit as st
import os
from langchain_community.document_loaders import WebBaseLoader
from chains import Chain
from portfolio import Portfolio
from utils import clean_text
import pdfplumber
import google.generativeai as genai
import base64
# Load environment variables
load_dotenv()
# Set up the Streamlit App
st.set_page_config(page_title="ATS Optimization & Cold Email Assistant")
# Initialize session state to manage first-time access
if 'page' not in st.session_state:
st.session_state.page = 'landing'
# Landing page content
if st.session_state.page == 'landing':
st.title("Welcome to the ATS Optimization & Cold Email Assistant")
st.markdown("""
This app provides two key features:
1. **ATS Analyzer** - Optimize your resume for job applications using Google Gemini.
2. **Cold Email Generator** - Automate cold email generation using Groq's LLaMA 3.1.
Please click below to get started.
""")
# Button to move to task selection
if st.button("Get Started"):
st.session_state.page = 'task_selection'
# Task selection page
if st.session_state.page == 'task_selection':
# Sidebar for navigation
st.sidebar.title("Choose the Task")
task = st.sidebar.radio("Select the task you would like to perform:", ("ATS Analyzer", "Cold Email Generator"))
# Function to configure Google Gemini for ATS Analyzer
def configure_gemini():
api_key = os.getenv("GOOGLE_API_KEY")
if not api_key:
raise ValueError("API key not found. Please set the GOOGLE_API_KEY environment variable.")
genai.configure(api_key=api_key)
def get_gemini_response(input_text, pdf_content, prompt):
model = genai.GenerativeModel('models/gemini-1.5-pro-latest')
response = model.generate_content([input_text, pdf_content, prompt])
return response.text
# Function to parse resume
def parse_resume(uploaded_file):
if uploaded_file is not None:
with pdfplumber.open(uploaded_file) as pdf:
text = ""
for page in pdf.pages:
text += page.extract_text()
return text
else:
raise FileNotFoundError("No file uploaded")
# ATS Analyzer section with Google Gemini
if task == "ATS Analyzer":
configure_gemini()
st.markdown("""
<style>
.header {
text-align: center;
font-size: 46px;
font-weight: bold;
margin-bottom: 20px;
}
</style>
<div class="header">ATS System</div>
""", unsafe_allow_html=True)
input_text = st.text_area("Job Description: ", key="input")
uploaded_file = st.file_uploader("Upload your resume (PDF)...", type=["pdf"])
if uploaded_file:
st.markdown(
'<p style="color: green; font-size: 18px;">PDF Uploaded Successfully βœ“</p>',
unsafe_allow_html=True
)
submit1 = st.button("Tell Me About the Resume")
submit2 = st.button("How Can I Improvise my Skills")
submit3 = st.button("What are the Keywords That are Missing")
submit4 = st.button("Percentage match")
input_promp = st.text_input("Queries: Feel Free to Ask here")
submit5 = st.button("Answer My Query")
input_prompt1 = """
You are an experienced Technical Human Resource Manager, your task is to review the provided resume against the job description.
Please share your professional evaluation on whether the candidate's profile aligns with the role.
Highlight the strengths, weaknesses, and missing keywords of the applicant in relation to the specified job requirements.
"""
input_prompt2 = """
You are a Technical Human Resource Manager with expertise in data science.
Share your insights on the candidate's suitability for the role from an HR perspective and offer advice on enhancing their skills.
"""
input_prompt3 = """
You are an ATS scanner with a deep understanding of data science and ATS functionality.
Evaluate the resume against the provided job description. List the missing keywords and suggest skill improvement areas.
"""
input_prompt4 = """
Evaluate the resume against the job description. Give a percentage match, missing keywords, and your final evaluation.
"""
if submit1:
if uploaded_file is not None:
pdf_content = parse_resume(uploaded_file)
response = get_gemini_response(input_text, pdf_content, input_prompt1)
st.subheader("The Response is")
st.write(response)
else:
st.write("Please upload a PDF file to proceed.")
elif submit2:
if uploaded_file is not None:
pdf_content = parse_resume(uploaded_file)
response = get_gemini_response(input_text, pdf_content, input_prompt2)
st.subheader("The Response is")
st.write(response)
else:
st.write("Please upload a PDF file to proceed.")
elif submit3:
if uploaded_file is not None:
pdf_content = parse_resume(uploaded_file)
response = get_gemini_response(input_text, pdf_content, input_prompt3)
st.subheader("The Response is")
st.write(response)
else:
st.write("Please upload a PDF file to proceed.")
elif submit4:
if uploaded_file is not None:
pdf_content = parse_resume(uploaded_file)
response = get_gemini_response(input_text, pdf_content, input_prompt4)
st.subheader("The Response is")
st.write(response)
else:
st.write("Please upload a PDF file to proceed.")
elif submit5:
if uploaded_file is not None:
pdf_content = parse_resume(uploaded_file)
response = get_gemini_response(input_promp, pdf_content, input_text)
st.subheader("The Response is")
st.write(response)
else:
st.write("Please upload a PDF file to proceed.")
footer = """
---
#### Made By [Pavankumar](https://www.linkedin.com/in/pavankumar-kurapati/)
For Queries, Reach out on [LinkedIn](https://www.linkedin.com/in/pavankumar-kurapati/)
Resume Analyzer - Making Job Applications Easier
"""
st.markdown(footer, unsafe_allow_html=True)
# Cold Email Generator using Groq's LLaMA 3.1 model
elif task == "Cold Email Generator":
chain = Chain()
portfolio = Portfolio() # Create an instance of the Portfolio class
def create_streamlit_app(llm, portfolio, clean_text):
st.title("πŸ“§ Cold Email Generator")
input_type = st.radio("Select Input Type:", ("Enter a URL", "Enter Job Description"))
if input_type == "Enter a URL":
url_input = st.text_input("Enter a URL:")
submit_button = st.button("Submit URL")
if submit_button:
try:
loader = WebBaseLoader([url_input])
data = clean_text(loader.load().pop().page_content)
portfolio.load_portfolio() # Call the method on the instance
jobs = chain.extract_jobs(data)
generate_emails(jobs, portfolio, chain) # Call the generate_emails function
except Exception as e:
st.error(f"An error occurred: {e}")
elif input_type == "Enter Job Description":
jd_input = st.text_area("Enter Job Description:")
submit_button = st.button("Submit JD")
if submit_button:
try:
data = clean_text(jd_input)
portfolio.load_portfolio() # Call the method on the instance
jobs = chain.extract_jobs(data)
generate_emails(jobs, portfolio, chain) # Call the generate_emails function
except Exception as e:
st.error(f"An error occurred: {e}")
# Define the generate_emails function before it's called
def generate_emails(jobs, portfolio, llm):
for job in jobs:
skills = job.get('skills', [])
links = portfolio.query_links(skills)
email = llm.write_mail(job, links)
st.code(email, language='markdown')
# Call the create_streamlit_app function
create_streamlit_app(chain, portfolio, clean_text)