Canstralian's picture
Update app.py
b7568e1 verified
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(
"""
<style>
.reportview-container .main .block-container {
padding-top: 1rem;
padding-bottom: 1rem;
max-width: 1200px;
}
.stTextArea {
font-size: 14px;
}
</style>
""",
unsafe_allow_html=True
)