import streamlit as st import sqlite3 from Backend import get_correction_and_comments, generate_questions from logger import logger 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 SQLite connection def init_sqlite(): conn = sqlite3.connect("feedback.db") cursor = conn.cursor() # Create table if it doesn't exist cursor.execute(""" CREATE TABLE IF NOT EXISTS Feedback ( id INTEGER PRIMARY KEY AUTOINCREMENT, helpful TEXT NOT NULL, question_type TEXT NOT NULL ) """) conn.commit() return conn # 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]) # Using context manager for database connection with init_sqlite() as conn: 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 executing code: {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.") try: corrected_code = get_correction_and_comments(code_input) gemini_output.code(corrected_code, language="python") except Exception as e: st.error(f"Error: Could not generate corrected code: {e}") logger.error(f"Code correction error: {e}") # Feedback form (outside of the columns, after all content) st.subheader("Feedback") if st.session_state.helpful is None: st.session_state.helpful = "No" # default to No if not selected 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: cursor = conn.cursor() cursor.execute("INSERT INTO Feedback (helpful, question_type) VALUES (?, ?)", (st.session_state.helpful, question_type)) conn.commit() 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 )