louiecerv's picture
sync with remote
b385ac2
raw
history blame
4.46 kB
import streamlit as st
import os
import google.generativeai as genai
import json
from PIL import Image
import re
import json
# Define constants
TEXT_PROMPT = """Use the provided document. Read the list of quadratic equations.
Return your response as a JSON list. Do not include any extra text, explanations, or backslashes.
Example JSON output:
[
"x^2 - 5x + 6 = 0",
"2x^2 + 3x - 1 = 0",
"x^2 - 9 = 0",
"3x^2 - 2x + 4 = 0",
"x^2 + 8x + 15 = 0"
]
"""
MODEL_ID = "gemini-2.0-flash-exp" # Keep the model ID as is
try:
api_key = os.getenv("GEMINI_API_KEY")
model_id = MODEL_ID
genai.configure(api_key=api_key)
except Exception as e:
st.error(f"Error: {e}")
st.stop()
model = genai.GenerativeModel(MODEL_ID)
chat = model.start_chat()
def get_local_file_path(img_file="problem1.png"):
"""
Returns the path to the local PDF file.
"""
try:
file_path = os.path.join("problems", img_file)
if not os.path.exists(file_path):
raise FileNotFoundError(f"{file_path} does not exist.")
return file_path
except Exception as e:
st.error(f"Failed to find the local file: {e}")
st.stop() # Stop if the file is not found
# Initialize conversation history in Streamlit session state
if "conversation_history" not in st.session_state:
st.session_state.conversation_history = []
if "uploaded_file_part" not in st.session_state: # Store the file *part*
st.session_state.uploaded_file_part = None
if "uploaded_pdf_path" not in st.session_state:
st.session_state.uploaded_pdf_path = get_local_file_path()
def multimodal_prompt(pdf_path, text_prompt, file_type="PDF"):
"""
Sends a multimodal prompt to Gemini, handling file uploads efficiently.
Args:
pdf_path: The path to the file (PDF or image).
text_prompt: The text prompt for the model.
file_type: "PDF" or "image" to specify the file type.
Returns:
The model's response as a string, or an error message.
"""
try:
if file_type == "PDF":
mime_type = "application/pdf"
elif file_type == "image":
import mimetypes
mime_type, _ = mimetypes.guess_type(pdf_path)
if mime_type is None:
return "Could not determine MIME type for image. Please check the file path or type."
else:
return "Invalid file_type. Must be 'PDF' or 'image'."
if st.session_state.get("uploaded_file_part") is None: # First time, upload
pdf_part = genai.upload_file(pdf_path, mime_type=mime_type)
st.session_state.uploaded_file_part = pdf_part
prompt = [text_prompt, pdf_part] # First turn includes the actual file
else: # Subsequent turns, reference the file
prompt = [text_prompt, st.session_state.uploaded_file_part] # Subsequent turns include the file reference
response = chat.send_message(prompt)
# Update conversation history
st.session_state.conversation_history.append({"role": "user", "content": text_prompt, "has_file": True})
st.session_state.conversation_history.append({"role": "assistant", "content": response.text})
return response.text
except Exception as e:
return f"An error occurred: {e}"
# --- Main Page ---
st.title("📚❓Problem Solving Tutor")
about = """
**How to use this App**
Replace this placeholder with the actual text.
"""
with st.spinner("Loading the problem..."):
if st.session_state.get("uploaded_pdf_path") is None:
st.session_state.uploaded_pdf_path = get_local_file_path("problem1.png")
filepath = st.session_state.uploaded_pdf_path
response = multimodal_prompt(filepath, TEXT_PROMPT, file_type="image")
# --- Display the image ---
st.image(filepath, caption="Problem Image", use_container_width=True)
# Remove the ```json and ``` and extra spaces.
try:
json_string = response.replace('```json', '').replace('```', '').strip()
# Parse the JSON string into a Python list.
problems_list = json.loads(json_string)
# Iterate over the list and print each item using st.write().
for item in problems_list:
st.write(item)
except json.JSONDecodeError:
st.write("Error: Invalid JSON format in the response.")
except Exception as e:
st.write(f"An unexpected error occurred: {e}")
st.markdown("Visit our Hugging Face Space!")
st.markdown("© 2025 WVSU AI Dev Team 🤖 ✨")