Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -37,20 +37,9 @@ bert_model = SentenceTransformer('paraphrase-MiniLM-L6-v2')
|
|
37 |
vectorizer = TfidfVectorizer()
|
38 |
|
39 |
# Pydantic model for request body
|
40 |
-
class
|
41 |
-
|
42 |
-
|
43 |
-
answers: Optional[Dict[str, Dict[str, str]]] = None # Optional answers
|
44 |
-
|
45 |
-
# Evaluate coding answers
|
46 |
-
def evaluate_coding_with_time(user_code, correct_code, start_time):
|
47 |
-
end_time = time.time()
|
48 |
-
execution_time = end_time - start_time
|
49 |
-
vectorized = vectorizer.fit_transform([user_code, correct_code])
|
50 |
-
similarity = cosine_similarity(vectorized)[0][1] * 100
|
51 |
-
if execution_time > 120:
|
52 |
-
similarity -= (execution_time - 120) * 0.1
|
53 |
-
return round(max(similarity, 0), 2)
|
54 |
|
55 |
# Get coding challenges
|
56 |
def get_coding_challenges(categories: List[str], num_questions=5, difficulty: Optional[str] = None):
|
@@ -65,42 +54,21 @@ def get_coding_challenges(categories: List[str], num_questions=5, difficulty: Op
|
|
65 |
skill_challenges[category] = []
|
66 |
return skill_challenges
|
67 |
|
68 |
-
# Assign proficiency level
|
69 |
-
def get_proficiency_level(score):
|
70 |
-
if score >= 80:
|
71 |
-
return "Expert"
|
72 |
-
elif score >= 50:
|
73 |
-
return "Intermediate"
|
74 |
-
else:
|
75 |
-
return "Beginner"
|
76 |
-
|
77 |
-
# Recommend courses
|
78 |
-
def recommend_courses(weak_skills):
|
79 |
-
if not weak_skills:
|
80 |
-
return []
|
81 |
-
courses = course_df[course_df['skills'].str.contains('|'.join(weak_skills), case=False, na=False)]
|
82 |
-
return courses[['course_title', 'Organization']].head(5).to_dict(orient="records")
|
83 |
-
|
84 |
-
# Recommend jobs
|
85 |
-
def recommend_jobs(skills):
|
86 |
-
if not skills:
|
87 |
-
return []
|
88 |
-
job_df["job_embeddings"] = job_df["job_description"].apply(lambda x: bert_model.encode(str(x)))
|
89 |
-
user_embedding = bert_model.encode(" ".join(skills))
|
90 |
-
job_df["BERT_Similarity"] = job_df["job_embeddings"].apply(lambda x: cosine_similarity([x], [user_embedding])[0][0])
|
91 |
-
top_jobs = job_df.sort_values(by="BERT_Similarity", ascending=False).head(5)
|
92 |
-
return top_jobs[["job_title", "company", "location", "BERT_Similarity"]].to_dict(orient="records")
|
93 |
-
|
94 |
@app.get("/")
|
95 |
def read_root():
|
96 |
return {"message": "Skill Assessment API"}
|
97 |
|
98 |
-
#
|
99 |
-
@app.
|
100 |
-
def get_user_challenges(
|
|
|
|
|
|
|
101 |
if not skills:
|
102 |
raise HTTPException(status_code=400, detail="Skills list cannot be empty")
|
|
|
103 |
challenges = get_coding_challenges(skills, difficulty=difficulty)
|
|
|
104 |
# Return only questions and difficulty (exclude solutions for the user)
|
105 |
return {
|
106 |
"challenges": {
|
@@ -112,56 +80,6 @@ def get_user_challenges(skills: List[str], difficulty: Optional[str] = None):
|
|
112 |
}
|
113 |
}
|
114 |
|
115 |
-
@app.post("/assess")
|
116 |
-
def assess_skills(user_input: UserInput):
|
117 |
-
user_name = user_input.name
|
118 |
-
user_skills = user_input.skills
|
119 |
-
|
120 |
-
if not user_skills:
|
121 |
-
raise HTTPException(status_code=400, detail="Skills list cannot be empty")
|
122 |
-
|
123 |
-
challenges = get_coding_challenges(user_skills)
|
124 |
-
|
125 |
-
user_scores = {}
|
126 |
-
for skill, challenge_list in challenges.items():
|
127 |
-
if not challenge_list:
|
128 |
-
user_scores[skill] = 0
|
129 |
-
continue
|
130 |
-
|
131 |
-
total_score = 0
|
132 |
-
num_questions = len(challenge_list)
|
133 |
-
|
134 |
-
if user_input.answers and skill in user_input.answers:
|
135 |
-
for challenge in challenge_list:
|
136 |
-
question = challenge["question"]
|
137 |
-
if question in user_input.answers[skill]:
|
138 |
-
start_time = time.time() - 10 # Simulate execution time
|
139 |
-
user_code = user_input.answers[skill][question]
|
140 |
-
correct_code = challenge["solutions"]
|
141 |
-
score = evaluate_coding_with_time(user_code, correct_code, start_time)
|
142 |
-
total_score += score
|
143 |
-
else:
|
144 |
-
total_score += 0
|
145 |
-
else:
|
146 |
-
total_score = 50 * num_questions
|
147 |
-
|
148 |
-
user_scores[skill] = round(total_score / num_questions, 2)
|
149 |
-
|
150 |
-
proficiency_levels = {skill: get_proficiency_level(score) for skill, score in user_scores.items()}
|
151 |
-
weak_skills = [skill for skill, level in proficiency_levels.items() if level in ["Beginner", "Intermediate"]]
|
152 |
-
|
153 |
-
courses = recommend_courses(weak_skills)
|
154 |
-
jobs = recommend_jobs(user_skills)
|
155 |
-
|
156 |
-
return {
|
157 |
-
"name": user_name,
|
158 |
-
"skills": user_skills,
|
159 |
-
"scores": user_scores,
|
160 |
-
"proficiency_levels": proficiency_levels,
|
161 |
-
"recommended_courses": courses,
|
162 |
-
"recommended_jobs": jobs
|
163 |
-
}
|
164 |
-
|
165 |
if __name__ == "__main__":
|
166 |
import uvicorn
|
167 |
-
uvicorn.run(app, host="0.0.0.0", port=7860)
|
|
|
37 |
vectorizer = TfidfVectorizer()
|
38 |
|
39 |
# Pydantic model for request body
|
40 |
+
class ChallengeRequest(BaseModel):
|
41 |
+
skills: List[str] # List of categories (e.g., "General Programming", "Data Structures")
|
42 |
+
difficulty: Optional[str] = None # Optional difficulty level
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
43 |
|
44 |
# Get coding challenges
|
45 |
def get_coding_challenges(categories: List[str], num_questions=5, difficulty: Optional[str] = None):
|
|
|
54 |
skill_challenges[category] = []
|
55 |
return skill_challenges
|
56 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
57 |
@app.get("/")
|
58 |
def read_root():
|
59 |
return {"message": "Skill Assessment API"}
|
60 |
|
61 |
+
# **Updated `/challenges` Endpoint to Accept JSON Body**
|
62 |
+
@app.post("/challenges")
|
63 |
+
def get_user_challenges(request: ChallengeRequest):
|
64 |
+
skills = request.skills
|
65 |
+
difficulty = request.difficulty
|
66 |
+
|
67 |
if not skills:
|
68 |
raise HTTPException(status_code=400, detail="Skills list cannot be empty")
|
69 |
+
|
70 |
challenges = get_coding_challenges(skills, difficulty=difficulty)
|
71 |
+
|
72 |
# Return only questions and difficulty (exclude solutions for the user)
|
73 |
return {
|
74 |
"challenges": {
|
|
|
80 |
}
|
81 |
}
|
82 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
83 |
if __name__ == "__main__":
|
84 |
import uvicorn
|
85 |
+
uvicorn.run(app, host="0.0.0.0", port=7860)
|