Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
|
@@ -75,6 +75,114 @@ if HF_TOKEN:
|
|
| 75 |
logger.error(f"Attempt {attempt + 1} failed to initialize Hugging Face API: {str(e)}")
|
| 76 |
time.sleep(2 ** attempt) # Exponential backoff
|
| 77 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 78 |
# ========== ENHANCED MODEL LOADER ==========
|
| 79 |
class ModelLoader:
|
| 80 |
def __init__(self):
|
|
@@ -2577,12 +2685,9 @@ def create_enhanced_interface():
|
|
| 2577 |
results.append("\n**Safety Schools:**")
|
| 2578 |
results.extend([f"- {school}" for school in college_recs['safety'][:3]])
|
| 2579 |
|
| 2580 |
-
|
| 2581 |
-
|
| 2582 |
-
|
| 2583 |
-
'grad_status': grad_status,
|
| 2584 |
-
'college_recs': college_recs
|
| 2585 |
-
}
|
| 2586 |
|
| 2587 |
# Update visualizations
|
| 2588 |
viz_updates = [
|
|
@@ -2880,25 +2985,6 @@ def create_enhanced_interface():
|
|
| 2880 |
outputs=goal_target_value
|
| 2881 |
)
|
| 2882 |
|
| 2883 |
-
# Add goal functionality
|
| 2884 |
-
add_goal_btn.click(
|
| 2885 |
-
fn=lambda gt, desc, date, val: (
|
| 2886 |
-
goal_tracker.add_goal(name.value, gt, desc, date.isoformat(), val),
|
| 2887 |
-
update_goals_display(name.value)
|
| 2888 |
-
),
|
| 2889 |
-
inputs=[goal_type, goal_description, goal_target_date, goal_target_value],
|
| 2890 |
-
outputs=[goals_output, goal_viz]
|
| 2891 |
-
)
|
| 2892 |
-
|
| 2893 |
-
# Generate calendar functionality
|
| 2894 |
-
generate_calendar_btn.click(
|
| 2895 |
-
fn=lambda date: (
|
| 2896 |
-
update_calendar_display(name.value, date)
|
| 2897 |
-
),
|
| 2898 |
-
inputs=calendar_start_date,
|
| 2899 |
-
outputs=[calendar_output, calendar_viz]
|
| 2900 |
-
)
|
| 2901 |
-
|
| 2902 |
def update_goals_display(profile_name):
|
| 2903 |
goals = goal_tracker.get_goals(profile_name)
|
| 2904 |
if not goals:
|
|
@@ -2980,15 +3066,37 @@ def create_enhanced_interface():
|
|
| 2980 |
"\n".join(calendar_html) if calendar_html else "<div class='alert-box'>No study sessions scheduled yet</div>",
|
| 2981 |
gr.update(visible=study_calendar.create_calendar_visualization(calendar) is not None)
|
| 2982 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2983 |
|
| 2984 |
# Navigation logic
|
| 2985 |
-
def navigate_to_tab(tab_index: int, tab_completed_status):
|
| 2986 |
-
|
| 2987 |
-
|
| 2988 |
-
if tab_index <= current_tab:
|
| 2989 |
-
return gr.Tabs(selected=tab_index), gr.update(visible=False)
|
| 2990 |
-
|
| 2991 |
-
# Check all previous tabs are completed
|
| 2992 |
for i in range(tab_index):
|
| 2993 |
if not tab_completed_status.get(i, False):
|
| 2994 |
messages = [
|
|
@@ -2999,7 +3107,7 @@ def create_enhanced_interface():
|
|
| 2999 |
"Please complete the previous steps first"
|
| 3000 |
]
|
| 3001 |
return (
|
| 3002 |
-
gr.Tabs(selected=i),
|
| 3003 |
gr.update(
|
| 3004 |
value=f"<div class='error-message'>⛔ {messages[i]}</div>",
|
| 3005 |
visible=True
|
|
|
|
| 75 |
logger.error(f"Attempt {attempt + 1} failed to initialize Hugging Face API: {str(e)}")
|
| 76 |
time.sleep(2 ** attempt) # Exponential backoff
|
| 77 |
|
| 78 |
+
# ========== LEARNING STYLE QUIZ ==========
|
| 79 |
+
class LearningStyleQuiz:
|
| 80 |
+
def __init__(self):
|
| 81 |
+
self.questions = [
|
| 82 |
+
"When learning something new, I prefer to:",
|
| 83 |
+
"I remember information best when I:",
|
| 84 |
+
"When giving directions, I:",
|
| 85 |
+
"When I'm bored, I tend to:",
|
| 86 |
+
"When learning a new skill, I prefer to:",
|
| 87 |
+
"When studying, I like to:",
|
| 88 |
+
"I prefer teachers who:",
|
| 89 |
+
"When solving problems, I:"
|
| 90 |
+
]
|
| 91 |
+
|
| 92 |
+
self.options = [
|
| 93 |
+
["See diagrams and charts", "Listen to explanations", "Read about it", "Try it out hands-on"],
|
| 94 |
+
["See pictures or diagrams", "Hear someone explain it", "Read about it", "Do something physical with it"],
|
| 95 |
+
["Draw a map", "Give verbal instructions", "Write down directions", "Demonstrate or guide physically"],
|
| 96 |
+
["Doodle or look around", "Talk to myself or others", "Read or imagine things", "Fidget or move around"],
|
| 97 |
+
["Watch demonstrations", "Listen to instructions", "Read instructions", "Jump in and try it"],
|
| 98 |
+
["Use highlighters and diagrams", "Discuss with others", "Read and take notes", "Move around or use objects"],
|
| 99 |
+
["Use visual aids", "Give interesting lectures", "Provide reading materials", "Include hands-on activities"],
|
| 100 |
+
["Draw pictures or diagrams", "Talk through options", "Make lists", "Try different solutions physically"]
|
| 101 |
+
]
|
| 102 |
+
|
| 103 |
+
self.learning_styles = {
|
| 104 |
+
'visual': "**Visual** learners prefer seeing information in charts, diagrams, and pictures.",
|
| 105 |
+
'auditory': "**Auditory** learners prefer hearing information spoken and learn best through lectures and discussions.",
|
| 106 |
+
'reading/writing': "**Reading/Writing** learners prefer information displayed as words and learn best through reading and note-taking.",
|
| 107 |
+
'kinesthetic': "**Kinesthetic** learners prefer physical experience and learn best through hands-on activities and movement."
|
| 108 |
+
}
|
| 109 |
+
|
| 110 |
+
def evaluate_quiz(self, *answers):
|
| 111 |
+
"""Evaluate quiz answers and determine learning style"""
|
| 112 |
+
if not answers or any(a is None for a in answers):
|
| 113 |
+
raise gr.Error("Please answer all questions before submitting")
|
| 114 |
+
|
| 115 |
+
style_counts = {
|
| 116 |
+
'visual': 0,
|
| 117 |
+
'auditory': 0,
|
| 118 |
+
'reading/writing': 0,
|
| 119 |
+
'kinesthetic': 0
|
| 120 |
+
}
|
| 121 |
+
|
| 122 |
+
# Map each answer to a learning style
|
| 123 |
+
for answer in answers:
|
| 124 |
+
if answer.startswith("See") or answer.startswith("Draw") or answer.startswith("Watch") or "diagram" in answer.lower():
|
| 125 |
+
style_counts['visual'] += 1
|
| 126 |
+
elif answer.startswith("Listen") or answer.startswith("Hear") or answer.startswith("Talk") or "lecture" in answer.lower():
|
| 127 |
+
style_counts['auditory'] += 1
|
| 128 |
+
elif answer.startswith("Read") or "note" in answer.lower() or "write" in answer.lower():
|
| 129 |
+
style_counts['reading/writing'] += 1
|
| 130 |
+
elif answer.startswith("Try") or "physical" in answer.lower() or "hands-on" in answer.lower():
|
| 131 |
+
style_counts['kinesthetic'] += 1
|
| 132 |
+
|
| 133 |
+
primary_style = max(style_counts, key=style_counts.get)
|
| 134 |
+
secondary_styles = sorted(style_counts.items(), key=lambda x: x[1], reverse=True)[1:3]
|
| 135 |
+
|
| 136 |
+
# Generate results
|
| 137 |
+
result = [
|
| 138 |
+
"## 🎯 Your Learning Style Results",
|
| 139 |
+
f"Your primary learning style is **{primary_style.capitalize()}**",
|
| 140 |
+
self.learning_styles[primary_style],
|
| 141 |
+
"",
|
| 142 |
+
"### Tips for Your Learning Style:"
|
| 143 |
+
]
|
| 144 |
+
|
| 145 |
+
if primary_style == 'visual':
|
| 146 |
+
result.extend([
|
| 147 |
+
"- Use color coding in your notes",
|
| 148 |
+
"- Create mind maps and diagrams",
|
| 149 |
+
"- Watch educational videos to visualize concepts",
|
| 150 |
+
"- Highlight or underline important information"
|
| 151 |
+
])
|
| 152 |
+
elif primary_style == 'auditory':
|
| 153 |
+
result.extend([
|
| 154 |
+
"- Record lectures and listen to them",
|
| 155 |
+
"- Explain concepts out loud to yourself",
|
| 156 |
+
"- Participate in study groups",
|
| 157 |
+
"- Use rhymes or songs to remember information"
|
| 158 |
+
])
|
| 159 |
+
elif primary_style == 'reading/writing':
|
| 160 |
+
result.extend([
|
| 161 |
+
"- Write detailed summaries in your own words",
|
| 162 |
+
"- Create question-answer sets for each topic",
|
| 163 |
+
"- Rewrite your notes to reinforce learning",
|
| 164 |
+
"- Read textbooks and articles on the subject"
|
| 165 |
+
])
|
| 166 |
+
elif primary_style == 'kinesthetic':
|
| 167 |
+
result.extend([
|
| 168 |
+
"- Use hands-on activities when possible",
|
| 169 |
+
"- Study while moving or pacing",
|
| 170 |
+
"- Create physical models to represent concepts",
|
| 171 |
+
"- Take frequent short breaks to move around"
|
| 172 |
+
])
|
| 173 |
+
|
| 174 |
+
result.extend([
|
| 175 |
+
"",
|
| 176 |
+
"### Secondary Learning Styles:",
|
| 177 |
+
f"1. {secondary_styles[0][0].capitalize()}",
|
| 178 |
+
f"2. {secondary_styles[1][0].capitalize()}"
|
| 179 |
+
])
|
| 180 |
+
|
| 181 |
+
return "\n".join(result)
|
| 182 |
+
|
| 183 |
+
# Initialize learning style quiz
|
| 184 |
+
learning_style_quiz = LearningStyleQuiz()
|
| 185 |
+
|
| 186 |
# ========== ENHANCED MODEL LOADER ==========
|
| 187 |
class ModelLoader:
|
| 188 |
def __init__(self):
|
|
|
|
| 2685 |
results.append("\n**Safety Schools:**")
|
| 2686 |
results.extend([f"- {school}" for school in college_recs['safety'][:3]])
|
| 2687 |
|
| 2688 |
+
if gpa_analysis.get('improvement_tips'):
|
| 2689 |
+
results.append("\n**Improvement Tips:**")
|
| 2690 |
+
results.extend([f"- {tip}" for tip in gpa_analysis['improvement_tips']])
|
|
|
|
|
|
|
|
|
|
| 2691 |
|
| 2692 |
# Update visualizations
|
| 2693 |
viz_updates = [
|
|
|
|
| 2985 |
outputs=goal_target_value
|
| 2986 |
)
|
| 2987 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2988 |
def update_goals_display(profile_name):
|
| 2989 |
goals = goal_tracker.get_goals(profile_name)
|
| 2990 |
if not goals:
|
|
|
|
| 3066 |
"\n".join(calendar_html) if calendar_html else "<div class='alert-box'>No study sessions scheduled yet</div>",
|
| 3067 |
gr.update(visible=study_calendar.create_calendar_visualization(calendar) is not None)
|
| 3068 |
)
|
| 3069 |
+
|
| 3070 |
+
# Add goal functionality
|
| 3071 |
+
add_goal_btn.click(
|
| 3072 |
+
fn=lambda gt, desc, date, val: (
|
| 3073 |
+
goal_tracker.add_goal(name.value, gt, desc, date.isoformat(), val),
|
| 3074 |
+
update_goals_display(name.value)
|
| 3075 |
+
),
|
| 3076 |
+
inputs=[goal_type, goal_description, goal_target_date, goal_target_value],
|
| 3077 |
+
outputs=[goals_output, goal_viz]
|
| 3078 |
+
).then(
|
| 3079 |
+
fn=lambda: name.value,
|
| 3080 |
+
inputs=None,
|
| 3081 |
+
outputs=None
|
| 3082 |
+
).then(
|
| 3083 |
+
fn=update_goals_display,
|
| 3084 |
+
inputs=name,
|
| 3085 |
+
outputs=[goals_output, goal_viz]
|
| 3086 |
+
)
|
| 3087 |
+
|
| 3088 |
+
# Generate calendar functionality
|
| 3089 |
+
generate_calendar_btn.click(
|
| 3090 |
+
fn=lambda date: (
|
| 3091 |
+
update_calendar_display(name.value, date)
|
| 3092 |
+
),
|
| 3093 |
+
inputs=calendar_start_date,
|
| 3094 |
+
outputs=[calendar_output, calendar_viz]
|
| 3095 |
+
)
|
| 3096 |
|
| 3097 |
# Navigation logic
|
| 3098 |
+
def navigate_to_tab(tab_index: int, tab_completed_status: dict):
|
| 3099 |
+
# Check if all previous tabs are completed
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3100 |
for i in range(tab_index):
|
| 3101 |
if not tab_completed_status.get(i, False):
|
| 3102 |
messages = [
|
|
|
|
| 3107 |
"Please complete the previous steps first"
|
| 3108 |
]
|
| 3109 |
return (
|
| 3110 |
+
gr.Tabs(selected=i), # Go to first incomplete tab
|
| 3111 |
gr.update(
|
| 3112 |
value=f"<div class='error-message'>⛔ {messages[i]}</div>",
|
| 3113 |
visible=True
|