Muhammad541 commited on
Commit
66f1fae
·
verified ·
1 Parent(s): 89f240b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +12 -94
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 UserInput(BaseModel):
41
- name: str
42
- skills: List[str] # Required list of categories (e.g., "General Programming", "Data Structures")
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
- # New endpoint to provide challenges
99
- @app.get("/challenges")
100
- def get_user_challenges(skills: List[str], difficulty: Optional[str] = None):
 
 
 
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)