|
|
""" |
|
|
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 |
|
|
|
|
|
|
|
|
st.set_page_config( |
|
|
page_title="AI Programming Tutor", |
|
|
page_icon="π€", |
|
|
layout="wide" |
|
|
) |
|
|
|
|
|
|
|
|
try: |
|
|
from fine import ProgrammingEducationAI, ComprehensiveFeedback |
|
|
MODEL_AVAILABLE = True |
|
|
except Exception as e: |
|
|
MODEL_AVAILABLE = False |
|
|
|
|
|
|
|
|
HF_TOKEN = None |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def main(): |
|
|
st.title("π€ AI Programming Tutor") |
|
|
st.markdown("### Enhancing Programming Education with Generative AI") |
|
|
|
|
|
|
|
|
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 |
|
|
""") |
|
|
|
|
|
|
|
|
if MODEL_AVAILABLE: |
|
|
st.success("β
Fine-tuned model available") |
|
|
st.success("π Using public model - no authentication required") |
|
|
|
|
|
|
|
|
st.info(f"π Model path: FaroukTomori/codellama-7b-programming-education") |
|
|
|
|
|
|
|
|
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") |
|
|
|
|
|
|
|
|
st.markdown("---") |
|
|
|
|
|
|
|
|
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: |
|
|
|
|
|
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: |
|
|
|
|
|
|
|
|
model_path = "FaroukTomori/codellama-7b-programming-education" |
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
if 'ai_tutor' in st.session_state: |
|
|
|
|
|
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: |
|
|
|
|
|
st.error( |
|
|
"β Model failed to load - cannot generate feedback") |
|
|
st.info("π‘ Fix the model loading error above first") |
|
|
return |
|
|
else: |
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
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") |
|
|
|