Spaces:
Sleeping
Sleeping
File size: 9,591 Bytes
925ac52 |
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 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 |
"""
AI Programming Tutor - Full Version with Fine-tuned Model Support
Works on Hugging Face Spaces with fallback to demo mode
Version: 2.0 - No Demo Fallback, Shows Detailed Errors
"""
import streamlit as st
import os
# Configure page
st.set_page_config(
page_title="AI Programming Tutor",
page_icon="π€",
layout="wide"
)
# Try to import the fine-tuned model components
try:
from fine import ProgrammingEducationAI, ComprehensiveFeedback
MODEL_AVAILABLE = True
except Exception as e:
MODEL_AVAILABLE = False
# Note: Using public model - no HF_TOKEN required
HF_TOKEN = None # Set to None for public model
# Demo feedback function removed - app now shows actual errors instead of falling back to demo
def main():
st.title("π€ AI Programming Tutor")
st.markdown("### Enhancing Programming Education with Generative AI")
# Sidebar for model selection
with st.sidebar:
st.header("βοΈ Settings")
if MODEL_AVAILABLE:
model_option = st.selectbox(
"Choose Model:",
["Use Demo Mode", "Use Fine-tuned Model"],
help="Demo mode works immediately. Fine-tuned model requires loading."
)
else:
model_option = "Use Demo Mode"
st.warning("β οΈ Fine-tuned model not available - using demo mode")
st.info(
"π‘ To enable AI model: Make sure your model is uploaded to HF Model Hub as public")
student_level = st.selectbox(
"Student Level:",
["beginner", "intermediate", "advanced"],
help="Adjusts feedback complexity"
)
st.markdown("---")
st.markdown("### π About")
st.markdown("""
This AI tutor provides structured feedback on programming code:
- **Strengths**: What you did well
- **Weaknesses**: Areas for improvement
- **Issues**: Problems to fix
- **Improvements**: Step-by-step guidance
- **Learning Points**: Key concepts to understand
- **Questions**: Test your comprehension
- **Code Fix**: Improved version
""")
# Show model status
if MODEL_AVAILABLE:
st.success("β
Fine-tuned model available")
st.success("π Using public model - no authentication required")
# Show current model path
st.info(f"π Model path: FaroukTomori/codellama-7b-programming-education")
# Show if model is loaded in session
if 'ai_tutor' in st.session_state:
st.success("β
Model loaded in session")
else:
st.info("β³ Model not loaded yet - will load when you analyze code")
else:
st.error("β Fine-tuned model not available")
st.error("π Check the import error above to fix the issue")
# Main content
st.markdown("---")
# Code input
code_input = st.text_area(
"π Enter your code here:",
height=200,
placeholder="def hello_world():\n print('Hello, World!')\n return 'success'",
help="Paste your Python code here for analysis"
)
if st.button("π Analyze Code", type="primary"):
if not code_input.strip():
st.warning("β οΈ Please enter some code to analyze")
return
with st.spinner("π€ Analyzing your code..."):
try:
if model_option == "Use Fine-tuned Model" and MODEL_AVAILABLE:
# Check if model is already loaded
if 'ai_tutor' not in st.session_state:
with st.spinner("π Loading fine-tuned model (this may take 5-10 minutes on HF Spaces)..."):
try:
# Use Hugging Face Model Hub
# Replace with your actual model name
model_path = "FaroukTomori/codellama-7b-programming-education"
# Using public model - no authentication required
st.info(
"π Using public model - no authentication required")
st.info(
f"π Attempting to load model from: {model_path}")
ai_tutor = ProgrammingEducationAI(model_path)
st.success(
"β
Model class instantiated successfully")
ai_tutor.load_model()
st.session_state['ai_tutor'] = ai_tutor
st.success(
"β
Fine-tuned model loaded successfully!")
except Exception as e:
st.error(f"β Error loading model: {e}")
st.error("π Full error details:")
st.code(str(e), language="text")
st.info(
"π‘ Check the error above to fix the model loading issue")
return # Stop here and show the error
if 'ai_tutor' in st.session_state:
# Use fine-tuned model
try:
feedback = st.session_state['ai_tutor'].generate_comprehensive_feedback(
code_input, student_level)
st.success(
"β
Feedback generated using fine-tuned model!")
except Exception as e:
st.error(f"β Error generating feedback: {e}")
st.error("π Full error details:")
st.code(str(e), language="text")
st.info(
"π‘ Check the error above to fix the feedback generation issue")
return
else:
# Model failed to load - show error instead of falling back
st.error(
"β Model failed to load - cannot generate feedback")
st.info("π‘ Fix the model loading error above first")
return
else:
# Model not available or not selected - show error
if not MODEL_AVAILABLE:
st.error("β Fine-tuned model components not available")
st.error("π Check the import error in the sidebar")
return
else:
st.error(
"β Please select 'Use Fine-tuned Model' to analyze with AI")
st.info("π‘ The model is available but not selected")
return
# Display AI feedback in tabs
tab1, tab2, tab3, tab4, tab5, tab6, tab7 = st.tabs([
"β
Strengths", "β Weaknesses", "π¨ Issues",
"π Improvements", "π Learning", "β Questions", "π§ Code Fix"
])
with tab1:
st.subheader("β
Code Strengths")
for strength in feedback.strengths:
st.markdown(f"β’ {strength}")
with tab2:
st.subheader("β Areas for Improvement")
for weakness in feedback.weaknesses:
st.markdown(f"β’ {weakness}")
with tab3:
st.subheader("π¨ Issues to Address")
for issue in feedback.issues:
st.markdown(f"β’ {issue}")
with tab4:
st.subheader("π Step-by-Step Improvements")
for i, step in enumerate(feedback.step_by_step_improvement, 1):
st.markdown(f"**Step {i}:** {step}")
with tab5:
st.subheader("π Key Learning Points")
for point in feedback.learning_points:
st.markdown(f"β’ {point}")
with tab6:
st.subheader("β Comprehension Questions")
st.markdown(
f"**Question:** {feedback.comprehension_question}")
st.markdown(f"**Answer:** {feedback.comprehension_answer}")
st.markdown(f"**Explanation:** {feedback.explanation}")
with tab7:
st.subheader("π§ Improved Code")
st.code(feedback.improved_code, language="python")
st.markdown("**What Changed:**")
st.info(feedback.fix_explanation)
st.success(
"β
Analysis complete! Review each tab for comprehensive feedback.")
except Exception as e:
st.error(f"β Error during analysis: {e}")
st.error("π Full error details:")
st.code(str(e), language="text")
st.info("π‘ Check the error above to understand what went wrong")
if __name__ == "__main__":
try:
main()
except Exception as e:
st.error(f"β Application error: {e}")
st.info("π‘ Please refresh the page and try again")
|