CV_Process / cv_question.py
bsiddhharth
added try except to groq_api_key
45fe6a4
import streamlit as st
from langchain_groq import ChatGroq
from langchain.prompts import ChatPromptTemplate
import os
import tempfile
import json
from extraction import extract_cv_data, process_file, display_candidates_info # importing from your extraction.py
# Initialize environment variables
# os.environ['GROQ_API_KEY'] = os.getenv("GROQ_API_KEY")
groq_api_key = os.getenv("GROQ_API_KEY")
class InterviewQuestionGenerator:
def __init__(self):
self.llm = ChatGroq(
groq_api_key=groq_api_key,
# model_name="mixtral-8x7b-32768",
model_name = "llama3-8b-8192",
temperature=0.7,
max_tokens=4096
)
# The prompt template to generate questions based on extracted CV data
self.question_template = """
Based on the following CV excerpt, generate 5 specific basic technical interview questions
that are directly related to the candidate's experience and skills. Make sure the
questions test both their claimed knowledge and problem-solving abilities.
CV Excerpt:
{cv_text}
Skills Mentioned:
{skills}
Return the questions in the following text format:
(bold)
Question 1:\n
- Technical_question: "Your question here" \n
- Follow_up_question: "Deep dive question here" \n
- What_to_listen_for: "Key points to listen for here" \n
\n\n
Question 2:
- Technical_question: "Your question here" \n
- Follow_up_question: "Deep dive question here" \n
- What_to_listen_for: "Key points to listen for here" \n
Make sure to follow this format exactly, with the correct structure and labels for each question.
(Repeat for all 5 questions)
Be sure to make each question clear and actionable, and align it with the skills mentioned in the CV.
"""
# Using ChatPromptTemplate for question generation
self.question_prompt = ChatPromptTemplate.from_messages(
[
("system", self.question_template),
("human", "{cv_text}\n{skills}")
]
)
def generate_questions(self, cv_text: str, skills: str) -> str:
"""Generate interview questions based on CV text and skills."""
runnable = self.question_prompt | self.llm # Using Runnable instead of LLMChain
questions = runnable.invoke({
"cv_text": cv_text,
"skills": skills
})
return questions
def create_interview_questions_page():
# Initializing session state variables since they dont exist at first
if 'uploaded_file' not in st.session_state:
st.session_state.uploaded_file = None
if 'cv_text' not in st.session_state:
st.session_state.cv_text = None
if 'candidates_list' not in st.session_state:
st.session_state.candidates_list = None
if 'generated_questions' not in st.session_state:
st.session_state.generated_questions = None
st.title("Interview Question Generator")
# File uploader
uploaded_file = st.file_uploader("Upload a CV", type=['pdf', 'txt'])
# Update session state when new file is uploaded
if uploaded_file is not None and (st.session_state.uploaded_file is None or
uploaded_file.name != st.session_state.uploaded_file.name):
st.session_state.uploaded_file = uploaded_file
st.session_state.cv_text = None # Reset CV text
st.session_state.candidates_list = None # Reset candidates
st.session_state.generated_questions = None # Reset questions
# Process file if it exists in session state
if st.session_state.uploaded_file is not None:
# Only process the file if we haven't already
if st.session_state.cv_text is None:
st.session_state.cv_text = process_file(st.session_state.uploaded_file)
st.session_state.candidates_list = extract_cv_data(st.session_state.cv_text)
# Display candidates info if available
if st.session_state.candidates_list:
display_candidates_info(st.session_state.candidates_list)
# Generate questions if not already generated
if st.session_state.generated_questions is None:
candidate = st.session_state.candidates_list[0]
generator = InterviewQuestionGenerator()
questions = generator.generate_questions(
cv_text=st.session_state.cv_text,
skills=", ".join(candidate.skills)
)
st.session_state.generated_questions = questions.content
# Display the generated questions
st.subheader("Recommended Interview Questions")
st.markdown(st.session_state.generated_questions)