Spaces:
Sleeping
Sleeping
| 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() | |
| # Dropdown to select the type of question | |
| st.subheader("Select Question Type") | |
| question_type = st.selectbox( | |
| "Choose the type of questions to generate:", | |
| ["Logical Questions", "Interview-Based Questions", "Code Analysis Questions"] | |
| ) | |
| # 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.text_area("Execution Output", output, height=600, max_chars=None) | |
| except Exception as e: | |
| st.error(f"Error: {e}") | |
| logger.error(f"Code execution error: {e}") | |
| with col2: | |
| if st.button("Generate Questions"): | |
| logger.info(f"Generating {question_type.lower()}.") | |
| try: | |
| # Generate questions based on user selection | |
| generated_questions = generate_questions(code_input, question_type) | |
| st.subheader(f"π€ Model-Generated {question_type}") | |
| st.write(generated_questions) | |
| except Exception as e: | |
| st.error(f"Error: Could not generate questions: {e}") | |
| logger.error(f"Question generation error: {e}") | |
| 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, "question_type": question_type}) | |
| 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( | |
| """ | |
| <style> | |
| .reportview-container .main .block-container { | |
| padding-top: 1rem; | |
| padding-bottom: 1rem; | |
| max-width: 1200px; | |
| } | |
| .stTextArea { | |
| font-size: 14px; | |
| } | |
| </style> | |
| """, | |
| unsafe_allow_html=True | |
| ) | |