JustusI commited on
Commit
5cbb2cb
·
verified ·
1 Parent(s): 2ac7417

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +123 -0
app.py ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import tempfile
3
+ import os
4
+ from pathlib import Path
5
+ from PyPDF2 import PdfReader
6
+ from openai import OpenAI
7
+
8
+ # Import our CrewAI resume optimization module.
9
+ from crewai_resume_optimization import optimize_resume, generate_interview_questions, extract_job_description
10
+
11
+ # ---------------------------
12
+ # Helper Function: Extract text from PDF (for resume)
13
+ # ---------------------------
14
+ def extract_pdf_text(uploaded_file):
15
+ # Check file size (limit: 10MB)
16
+ uploaded_file.seek(0, os.SEEK_END)
17
+ if uploaded_file.tell() > 10 * 1024 * 1024:
18
+ st.error("File exceeds 10MB limit.")
19
+ return ""
20
+ uploaded_file.seek(0)
21
+ reader = PdfReader(uploaded_file)
22
+ text = ""
23
+ for page in reader.pages:
24
+ page_text = page.extract_text()
25
+ if page_text:
26
+ text += page_text + "\n"
27
+ return text
28
+
29
+ # ---------------------------
30
+ # Sidebar: File Upload & Job Input Mode
31
+ # ---------------------------
32
+ st.sidebar.title("Job & Resume Setup")
33
+
34
+ # Resume upload (PDF only)
35
+ uploaded_resume = st.sidebar.file_uploader("Upload your resume (PDF, max 10MB)", type="pdf")
36
+
37
+ # Job input mode: "Job Description" vs "Job URL"
38
+ job_input_mode = st.sidebar.radio("Select Job Input Mode", ("Job Description", "Job URL"))
39
+ job_input = ""
40
+ if job_input_mode == "Job Description":
41
+ job_input = st.sidebar.text_area("Paste the job description here:")
42
+ elif job_input_mode == "Job URL":
43
+ job_input = st.sidebar.text_input("Enter the job URL:")
44
+
45
+ # Button to extract job description if URL mode is selected.
46
+ if job_input_mode == "Job URL" and st.sidebar.button("Extract Job Description"):
47
+ if job_input:
48
+ st.session_state.job_description = extract_job_description(job_input)
49
+ st.sidebar.success("Job description extracted!")
50
+ else:
51
+ st.sidebar.error("Please enter a job URL.")
52
+
53
+ # For Job Description mode, use the pasted job description.
54
+ if job_input_mode == "Job Description":
55
+ st.session_state.job_description = job_input
56
+
57
+ # Button to trigger resume optimization.
58
+ if st.sidebar.button("Optimize Resume"):
59
+ st.session_state.optimize_trigger = True
60
+
61
+ # ---------------------------
62
+ # Session State Initialization
63
+ # ---------------------------
64
+ if "resume_text" not in st.session_state:
65
+ st.session_state.resume_text = None
66
+ if "job_description" not in st.session_state:
67
+ st.session_state.job_description = None
68
+ if "optimized_resume" not in st.session_state:
69
+ st.session_state.optimized_resume = None
70
+ if "interview_questions" not in st.session_state:
71
+ st.session_state.interview_questions = None
72
+
73
+ # ---------------------------
74
+ # Process Resume Upload
75
+ # ---------------------------
76
+ if uploaded_resume is not None:
77
+ st.session_state.resume_text = extract_pdf_text(uploaded_resume)
78
+ if st.session_state.resume_text:
79
+ st.sidebar.success("Resume uploaded and processed successfully!")
80
+ else:
81
+ st.sidebar.error("Failed to extract text from the resume.")
82
+
83
+ # ---------------------------
84
+ # Main Area: Display Results
85
+ # ---------------------------
86
+ st.title("Optimized Resume & Interview Preparation")
87
+
88
+ if st.session_state.resume_text is None:
89
+ st.info("Please upload your resume from the sidebar to begin.")
90
+ else:
91
+ if st.session_state.job_description:
92
+ st.subheader("Job Description")
93
+ st.write(st.session_state.job_description)
94
+ else:
95
+ st.info("Please provide a job description (paste or extract from URL) from the sidebar.")
96
+
97
+ if st.session_state.get("optimize_trigger", False):
98
+ if st.session_state.resume_text and st.session_state.job_description:
99
+ with st.spinner("Optimizing resume..."):
100
+ st.session_state.optimized_resume = optimize_resume(st.session_state.resume_text, st.session_state.job_description)
101
+ with st.spinner("Generating interview questions..."):
102
+ st.session_state.interview_questions = generate_interview_questions(st.session_state.optimized_resume, st.session_state.job_description)
103
+ st.success("Resume optimized and interview questions generated!")
104
+ st.session_state.optimize_trigger = False
105
+ else:
106
+ st.error("Please ensure you have uploaded your resume and provided a job description.")
107
+
108
+ if st.session_state.optimized_resume:
109
+ st.header("Optimized Resume")
110
+ st.markdown(st.session_state.optimized_resume)
111
+ st.download_button("Download Optimized Resume (md)",
112
+ st.session_state.optimized_resume,
113
+ file_name="tailored_resume.md",
114
+ mime="text/markdown")
115
+ if st.session_state.interview_questions:
116
+ st.header("Interview Questions")
117
+ st.markdown(st.session_state.interview_questions)
118
+ st.download_button("Download Interview Questions (md)",
119
+ st.session_state.interview_questions,
120
+ file_name="interview_materials.md",
121
+ mime="text/markdown")
122
+
123
+ st.info("You can open the downloaded markdown (.md) files with Notepad or any text editor.")