Spaces:
Running
Running
File size: 4,680 Bytes
c9939ff 85c58a5 c9939ff 1a89091 c9939ff 78cbc5c c9939ff 1a89091 85c58a5 78cbc5c 85c58a5 78cbc5c 1a89091 78cbc5c ab5d533 78cbc5c 85c58a5 c9939ff ab5d533 85c58a5 1a89091 85c58a5 1a89091 ab5d533 85c58a5 1a89091 ab5d533 1a89091 ab5d533 85c58a5 1a89091 78cbc5c 1a89091 85c58a5 c9939ff 85c58a5 1a89091 85c58a5 1a89091 85c58a5 1a89091 85c58a5 1a89091 |
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 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
import os
import json
import streamlit as st
from huggingface_hub import InferenceClient
from dotenv import load_dotenv
# Load environment variables
load_dotenv()
hf_token = os.getenv("HUGGINGFACEHUB_API_TOKEN")
client = InferenceClient(provider="auto", api_key=hf_token)
# Streamlit configuration
st.set_page_config(
page_title="Interview Prep Bot",
page_icon="🧠",
layout="centered"
)
st.title("🎓 Interview Preparation Chatbot")
# Initialize session state
if "questions" not in st.session_state:
st.session_state.questions = []
if "topic" not in st.session_state:
st.session_state.topic = "Machine Learning"
if "score" not in st.session_state:
st.session_state.score = 0
if "correct_count" not in st.session_state:
st.session_state.correct_count = 0
if "incorrect_count" not in st.session_state:
st.session_state.incorrect_count = 0
# Sidebar: Topic selection and scoring
st.sidebar.header("Practice Topic")
st.session_state.topic = st.sidebar.selectbox(
"Select a topic:",
["Machine Learning","Data Structures","Python","Generative AI","Computer Vision","Deep Learning"],
index=["Machine Learning","Data Structures","Python","Generative AI","Computer Vision","Deep Learning"].index(st.session_state.topic)
)
st.sidebar.markdown("---")
st.sidebar.header("Your Score")
st.sidebar.markdown(f"**Total:** {len(st.session_state.questions)}")
st.sidebar.markdown(f"**Correct:** {st.session_state.correct_count}")
st.sidebar.markdown(f"**Incorrect:** {st.session_state.incorrect_count}")
st.sidebar.markdown(f"**Points:** {st.session_state.score}")
# Function to fetch an MCQ question with debug logging
def fetch_question(topic):
prompt = {
"role": "system",
"content": (
f"You are an expert interviewer. Generate a multiple-choice question on the topic of {topic}. "
"Respond with a JSON object: {\"question\": str, \"options\": [str, ...], \"correct_index\": int}."
)
}
try:
response = client.chat.completions.create(
model="mistralai/Mistral-7B-Instruct-v0.1",
messages=[prompt]
)
content = response.choices[0].message["content"].strip()
# Debug: show raw response
st.write("**[DEBUG] Raw response:**")
st.code(content)
data = json.loads(content)
except Exception as e:
st.error(f"Failed to fetch or parse question: {e}")
# If content exists, display it for debugging
try:
st.write("**[DEBUG] Last content before error:**")
st.code(content)
except Exception:
pass
return None
# Validate structure
question = data.get("question")
options = data.get("options")
correct_index = data.get("correct_index")
if not question or not isinstance(options, list) or correct_index is None:
st.error("Invalid question structure.")
st.write("**[DEBUG] Parsed JSON:**")
st.json(data)
return None
return {"question": question, "options": options, "correct_index": correct_index}
# Buttons to get or advance questions
if not st.session_state.questions:
if st.button("Get Question"):
q = fetch_question(st.session_state.topic)
if q:
st.session_state.questions.append({**q, "selected": None, "submitted": False})
else:
if st.button("Next Question"):
q = fetch_question(st.session_state.topic)
if q:
st.session_state.questions.append({**q, "selected": None, "submitted": False})
# Display questions and capture answers
for idx, q in enumerate(st.session_state.questions):
st.markdown(f"### Question {idx+1}")
st.write(q["question"])
opts = q["options"]
sel = st.radio(
"Choose an answer:",
options=list(range(len(opts))),
format_func=lambda i: opts[i],
index=q["selected"] if q["selected"] is not None else 0,
key=f"radio_{idx}",
disabled=q["submitted"]
)
st.session_state.questions[idx]["selected"] = sel
if not q["submitted"]:
if st.button("Submit Answer", key=f"submit_{idx}"):
st.session_state.questions[idx]["submitted"] = True
if sel == q["correct_index"]:
st.success("Correct! +10 points")
st.session_state.score += 10
st.session_state.correct_count += 1
else:
st.error(f"Incorrect! Correct: {opts[q['correct_index']]} (-10 points)")
st.session_state.score -= 10
st.session_state.incorrect_count += 1
# Footer
st.markdown("---")
st.markdown("*Correct: +10 pts | Incorrect: -10 pts*")
|