File size: 3,996 Bytes
8288982
3f580e6
8288982
3f580e6
 
8288982
 
 
 
3f580e6
 
8288982
3f580e6
 
8288982
 
3f580e6
8288982
3f580e6
 
 
 
 
 
8288982
 
3f580e6
 
 
 
 
 
 
 
e52d3e8
3f580e6
 
 
 
 
 
e52d3e8
3f580e6
 
e52d3e8
 
 
3f580e6
e52d3e8
 
 
 
 
 
 
 
 
3f580e6
e52d3e8
 
3f580e6
e52d3e8
8288982
3f580e6
 
 
 
 
 
 
 
 
e52d3e8
 
 
 
 
 
 
3f580e6
 
8288982
3f580e6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e52d3e8
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import os
import streamlit as st
from langchain_community.document_loaders import UnstructuredPDFLoader
from langchain_huggingface import HuggingFaceEndpoint, ChatHuggingFace
import tempfile

os.environ["HF_TOKEN"]=os.getenv('HF_Token')
os.environ["HUGGINGFACEHUB_API_KEY"]=os.getenv('HF_Token')

llm_skeleton = HuggingFaceEndpoint(
    repo_id="deepseek-ai/DeepSeek-R1",
    provider="nebius",
    temperature=0.7,
    max_new_tokens=150,
    task="conversational"
)

llm = ChatHuggingFace(
    llm=llm_skeleton,
    repo_id="deepseek-ai/DeepSeek-R1",
    provider="nebius",
    temperature=0.7,
    max_new_tokens=150,
    task="conversational"
)

def extract_text_from_pdf(uploaded_file):
    try:
        with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as tmp_file:
            tmp_file.write(uploaded_file.read())
            tmp_path = tmp_file.name
        loader = UnstructuredPDFLoader(tmp_path)
        return loader.load()[0].page_content
    except Exception as e:
        st.error(f"⚠️ Error reading PDF file: {e}")
        return ""

def extract_text_from_txt(uploaded_file):
    try:
        return uploaded_file.read().decode("utf-8")
    except Exception as e:
        st.error(f"⚠️ Error reading text file: {e}")
        return ""

st.set_page_config(page_title="SmartHire AI – Resume & JD Analyzer", layout="centered")
st.markdown("<h1 style='text-align:center;'>πŸ€– SmartHire AI</h1>", unsafe_allow_html=True)
st.markdown("<h4 style='text-align:center;color:gray;'>AI-powered Resume & Job Description Analyzer</h4><br>", unsafe_allow_html=True)

with st.container():
    st.markdown("### πŸ“‚ Upload Center")
    col1, col2 = st.columns(2)
    with col1:
        resume_file = st.file_uploader("Upload Candidate Resume (PDF)", type=["pdf"])
    with col2:
        jd_file = st.file_uploader("Upload Job Description (PDF or TXT)", type=["pdf", "txt"])
    
    jd_text = st.text_area("πŸ“‹ Or paste the Job Description text below", height=150)


if st.button("πŸš€ Analyze Now"):
    if not resume_file and not (jd_file or jd_text):
        st.warning("⚠️ Please upload at least one resume or job description.")
    else:
        if resume_file:
            resume_text = extract_text_from_pdf(resume_file)
            if resume_text:
                resume_prompt = (
                    "Extract the following from the resume:\n"
                    "1. Name\n2. Education\n3. Experience\n4. Skills\n5. Project Names and Results\n\n"
                    f"Resume:\n{resume_text}"
                )
                resume_data = llm.invoke(resume_prompt)
                st.markdown("---")
                st.subheader("πŸ“˜ Candidate Summary")
                st.markdown(f"""
                <div style='background-color:#eef6fb;padding:15px;border-left:5px solid #0099cc;border-radius:6px'>
                    {resume_data}
                </div>
                """, unsafe_allow_html=True)

        jd_text_extracted = ""
        if jd_file:
            if jd_file.type == "application/pdf":
                jd_text_extracted = extract_text_from_pdf(jd_file)
            elif jd_file.type == "text/plain":
                jd_text_extracted = extract_text_from_txt(jd_file)
        elif jd_text:
            jd_text_extracted = jd_text

        if jd_text_extracted:
            jd_prompt = (
                "Extract the following from the job description:\n"
                "1. Job ID\n2. Company Name\n3. Role\n4. Experience Required\n5. Skills Required\n"
                "6. Education Required\n7. Location\n\n"
                f"Job Description:\n{jd_text_extracted}"
            )
            jd_data = llm.invoke(jd_prompt)
            st.markdown("---")
            st.subheader("πŸ“„ Job Role Breakdown")
            st.markdown(f"""
            <div style='background-color:#fff7e6;padding:15px;border-left:5px solid #ffaa00;border-radius:6px'>
                {jd_data}
            </div>
            """, unsafe_allow_html=True)