JustusI commited on
Commit
3ab3a40
·
verified ·
1 Parent(s): ff60dd7

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +138 -0
app.py ADDED
@@ -0,0 +1,138 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import tempfile
3
+ import os
4
+ import random
5
+ import json
6
+ from pathlib import Path
7
+ from PyPDF2 import PdfReader
8
+ from openai import OpenAI
9
+
10
+ # Import our CrewAI resume optimization module
11
+ from crewai_resume_optimization import optimize_resume, generate_interview_questions
12
+
13
+ # ---------------------------
14
+ # Helper Function: Extract text from PDF (for resume)
15
+ # ---------------------------
16
+ def extract_pdf_text(uploaded_file):
17
+ # Ensure file size is less than 10MB
18
+ uploaded_file.seek(0, os.SEEK_END)
19
+ if uploaded_file.tell() > 10 * 1024 * 1024:
20
+ st.error("File exceeds 10MB limit.")
21
+ return ""
22
+ uploaded_file.seek(0)
23
+ reader = PdfReader(uploaded_file)
24
+ text = ""
25
+ for page in reader.pages:
26
+ page_text = page.extract_text()
27
+ if page_text:
28
+ text += page_text + "\n"
29
+ return text
30
+
31
+ # ---------------------------
32
+ # OpenAI Helper for Keyword Extraction
33
+ # ---------------------------
34
+ def extract_keywords_from_text(text):
35
+ prompt = f"Extract the most important keywords from the following job input, separated by commas:\n\n{text}"
36
+ messages = [
37
+ {"role": "system", "content": "You are a job analysis assistant."},
38
+ {"role": "user", "content": prompt}
39
+ ]
40
+ client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
41
+ completion = client.chat.completions.create(model="gpt-4o-mini", messages=messages)
42
+ return completion.choices[0].message.content.strip()
43
+
44
+ # ---------------------------
45
+ # Sidebar: File Upload & Input Mode
46
+ # ---------------------------
47
+ st.sidebar.title("Job & Resume Setup")
48
+
49
+ # Resume upload (PDF only)
50
+ uploaded_resume = st.sidebar.file_uploader("Upload your resume (PDF, max 10MB)", type="pdf")
51
+
52
+ # Job input mode selection: "Job Description" vs "Job URL"
53
+ mode = st.sidebar.radio("Select Job Input Mode", ("Job Description", "Job URL"))
54
+ job_input = ""
55
+ if mode == "Job Description":
56
+ job_input = st.sidebar.text_area("Paste the job description here:")
57
+ elif mode == "Job URL":
58
+ job_input = st.sidebar.text_input("Enter the job URL:")
59
+
60
+ # Button to extract keywords from job input.
61
+ if st.sidebar.button("Extract Keywords"):
62
+ if job_input:
63
+ # For simplicity, we use the same function regardless of mode.
64
+ st.session_state.job_keywords = extract_keywords_from_text(job_input)
65
+ st.sidebar.success("Keywords extracted!")
66
+ else:
67
+ st.sidebar.error("Please provide job input.")
68
+
69
+ # Button to trigger optimization.
70
+ if st.sidebar.button("Optimize Resume"):
71
+ st.session_state.optimize_trigger = True
72
+
73
+ # ---------------------------
74
+ # Session State Initialization
75
+ # ---------------------------
76
+ if "resume_text" not in st.session_state:
77
+ st.session_state.resume_text = None
78
+ if "job_keywords" not in st.session_state:
79
+ st.session_state.job_keywords = None
80
+ if "optimized_resume" not in st.session_state:
81
+ st.session_state.optimized_resume = None
82
+ if "interview_questions" not in st.session_state:
83
+ st.session_state.interview_questions = None
84
+
85
+ # ---------------------------
86
+ # Process Resume Upload
87
+ # ---------------------------
88
+ if uploaded_resume is not None:
89
+ st.session_state.resume_text = extract_pdf_text(uploaded_resume)
90
+ if st.session_state.resume_text:
91
+ st.sidebar.success("Resume uploaded and processed successfully!")
92
+ else:
93
+ st.sidebar.error("Failed to extract text from the resume.")
94
+
95
+ # ---------------------------
96
+ # Main Area: Display Results
97
+ # ---------------------------
98
+ st.title("Optimized Resume & Interview Preparation")
99
+
100
+ if st.session_state.resume_text is None:
101
+ st.info("Please upload your resume from the sidebar to begin.")
102
+ else:
103
+ # Display job keywords if available.
104
+ if st.session_state.job_keywords:
105
+ st.subheader("Extracted Job Keywords")
106
+ st.write(st.session_state.job_keywords)
107
+ else:
108
+ st.info("Please provide job input and extract keywords from the sidebar.")
109
+
110
+ # Trigger optimization if requested.
111
+ if st.session_state.get("optimize_trigger", False):
112
+ if st.session_state.resume_text and st.session_state.job_keywords:
113
+ with st.spinner("Optimizing resume..."):
114
+ st.session_state.optimized_resume = optimize_resume(st.session_state.resume_text, st.session_state.job_keywords)
115
+ with st.spinner("Generating interview questions..."):
116
+ st.session_state.interview_questions = generate_interview_questions(st.session_state.optimized_resume, st.session_state.job_keywords)
117
+ st.success("Resume optimized and interview questions generated!")
118
+ st.session_state.optimize_trigger = False
119
+ else:
120
+ st.error("Please ensure you have uploaded your resume and extracted job keywords.")
121
+
122
+ # Display the optimized resume and interview questions if available.
123
+ if st.session_state.optimized_resume:
124
+ st.header("Optimized Resume")
125
+ st.markdown(st.session_state.optimized_resume)
126
+ st.download_button("Download Optimized Resume (md)",
127
+ st.session_state.optimized_resume,
128
+ file_name="tailored_resume.md",
129
+ mime="text/markdown")
130
+ if st.session_state.interview_questions:
131
+ st.header("Interview Questions")
132
+ st.markdown(st.session_state.interview_questions)
133
+ st.download_button("Download Interview Questions (md)",
134
+ st.session_state.interview_questions,
135
+ file_name="interview_materials.md",
136
+ mime="text/markdown")
137
+
138
+ st.info("You can open the downloaded markdown (.md) files with Notepad or any text editor.")