import streamlit as st from Backend import get_correction_and_comments, generate_questions from logger import logger from pymongo import MongoClient, errors import interpreter from dotenv import load_dotenv import os load_dotenv() # Configure the page st.set_page_config(page_title="Interactive Code Assistant", layout="wide") st.title("✨ Interactive Code Assistant with Python Interpreter ✨") # Initialize session state for feedback to persist data if "helpful" not in st.session_state: st.session_state.helpful = None # Initialize feedback as None # Set up MongoDB connection try: client = MongoClient(os.getenv("MONGO_URI"), serverSelectionTimeoutMS=5000) client.server_info() # Trigger an exception if MongoDB is not reachable db = client["Capstone"] feedback_collection = db["Feedback"] except errors.ServerSelectionTimeoutError: st.error("Error: Could not connect to MongoDB. Please ensure MongoDB is running.") # Create two expanded columns for wider side-by-side text areas colu1, colu2 = st.columns([1, 1]) # Both columns have equal width # Text area in the first column for entering code with colu1: st.subheader("Code Input") code_input = st.text_area("Enter Your Python Code:", height=400, max_chars=10000) # Text area in the second column to display the output from Google Gemini with colu2: st.subheader("Corrected Output") gemini_output = st.empty() # Buttons for different functionalities col1, col2, col3 = st.columns([0.3, 0.3, 0.3]) with col1: if st.button("Run Code"): try: output = interpreter.run_code(code_input) st.subheader("✨ Code Output ✨") st.write(output) except Exception as e: st.error(f"Error: {e}") logger.error(f"Code execution error: {e}") with col2: if st.button("Generate Questions"): # Generate questions automatically, displayed below the text boxes generated_questions = generate_questions(code_input) st.subheader("🤖 Model-Generated Questions") st.write(f"Raw Response: {generated_questions}") with col3: if st.button("Corrected Code"): logger.info("User requested code correction.") corrected_code = get_correction_and_comments(code_input) gemini_output.code(corrected_code, language="python") # Feedback form (outside of the columns, after all content) st.subheader("Feedback") st.session_state.helpful = st.radio("Were the questions helpful?", ("Yes", "No")) if st.button("Submit Feedback"): if st.session_state.helpful is not None: try: feedback_collection.insert_one({"helpful": st.session_state.helpful}) st.success("Feedback submitted successfully.") except Exception as e: st.error(f"Failed to submit feedback: {e}") # Hide Streamlit's default menu and style adjustments for a cleaner look st.markdown( """ """, unsafe_allow_html=True )