valiant21's picture
Update app.py
8084291 verified
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
)