interview_agent / app.py
Jekyll2000's picture
Create app.py
f1e44b7 verified
raw
history blame
5.97 kB
import streamlit as st
from utils.cv_processor import evaluate_cv
from utils.interview_agent import InterviewAgent
from utils.report_generator import generate_report
import os
from datetime import datetime
def main():
st.set_page_config(page_title="AI Interview Agent", layout="wide")
st.title("AI Interview Agent")
st.write("Upload your CV and start your interview for the desired position.")
# Initialize session state
if 'interview_started' not in st.session_state:
st.session_state.interview_started = False
if 'current_question' not in st.session_state:
st.session_state.current_question = 0
if 'answers' not in st.session_state:
st.session_state.answers = []
if 'cv_evaluated' not in st.session_state:
st.session_state.cv_evaluated = False
if 'cv_rejected' not in st.session_state:
st.session_state.cv_rejected = False
# Step 1: Job Role and CV Upload
if not st.session_state.cv_evaluated:
with st.form("candidate_info"):
job_role = st.selectbox(
"Select the job role you're applying for:",
["Software Engineer", "Data Scientist", "Product Manager", "UX Designer", "DevOps Engineer"]
)
cv_file = st.file_uploader("Upload your CV (PDF or DOCX)", type=["pdf", "docx"])
submitted = st.form_submit_button("Submit")
if submitted and cv_file:
with st.spinner("Evaluating your CV..."):
# Save the uploaded file
file_path = f"data/temp_cv.{'pdf' if cv_file.type == 'application/pdf' else 'docx'}"
with open(file_path, "wb") as f:
f.write(cv_file.getbuffer())
# Evaluate CV
evaluation = evaluate_cv(file_path, job_role)
if evaluation["is_qualified"]:
st.session_state.cv_evaluated = True
st.session_state.job_role = job_role
st.session_state.cv_evaluation = evaluation
st.success("CV evaluation complete! You meet the basic requirements.")
else:
st.session_state.cv_rejected = True
st.session_state.rejection_reasons = evaluation["rejection_reasons"]
st.error("Your CV doesn't meet the requirements for this role.")
# Step 2: Interview Process
if st.session_state.cv_evaluated and not st.session_state.interview_started:
if st.button("Start Interview"):
st.session_state.interview_started = True
st.session_state.interview_agent = InterviewAgent(job_role, st.session_state.cv_evaluation["cv_summary"])
st.session_state.questions = st.session_state.interview_agent.get_questions()
st.experimental_rerun()
if st.session_state.interview_started:
interview_ui()
# Step 3: Show rejection if CV was rejected
if st.session_state.cv_rejected:
st.error("Unfortunately, your CV doesn't meet the requirements for this role.")
st.write("Reasons for rejection:")
for reason in st.session_state.rejection_reasons:
st.write(f"- {reason}")
if st.button("Try a different role"):
st.session_state.cv_rejected = False
st.session_state.cv_evaluated = False
st.experimental_rerun()
def interview_ui():
agent = st.session_state.interview_agent
questions = st.session_state.questions
# Show current question or completion
if st.session_state.current_question < len(questions):
question = questions[st.session_state.current_question]
st.subheader(f"Question {st.session_state.current_question + 1}/{len(questions)}")
st.write(question["text"])
# Answer input
answer = st.text_area("Your answer:", key=f"answer_{st.session_state.current_question}")
if st.button("Submit Answer"):
evaluation = agent.evaluate_answer(question, answer)
st.session_state.answers.append({
"question": question,
"answer": answer,
"evaluation": evaluation
})
st.session_state.current_question += 1
st.experimental_rerun()
else:
# Interview complete
st.success("Interview completed!")
final_evaluation = agent.final_evaluation(st.session_state.answers)
# Display results
st.subheader("Interview Results")
st.write(f"Overall Score: {final_evaluation['score']}/10")
st.write(f"Band: {final_evaluation['band']}")
st.subheader("Detailed Feedback")
for i, answer in enumerate(st.session_state.answers):
st.write(f"**Question {i+1}:** {answer['question']['text']}")
st.write(f"**Your Answer:** {answer['answer']}")
st.write(f"**Feedback:** {answer['evaluation']['feedback']}")
st.write("---")
# Generate and download report
report_path = generate_report(
st.session_state.job_role,
st.session_state.cv_evaluation["cv_summary"],
st.session_state.answers,
final_evaluation
)
with open(report_path, "rb") as f:
st.download_button(
"Download Interview Report",
f,
file_name=f"Interview_Report_{datetime.now().strftime('%Y%m%d_%H%M%S')}.pdf",
mime="application/pdf"
)
if st.button("Start New Interview"):
reset_session()
def reset_session():
for key in list(st.session_state.keys()):
del st.session_state[key]
st.experimental_rerun()
if __name__ == "__main__":
main()