Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import tempfile | |
| import json | |
| import random | |
| from crewai_flashcard import generate_flashcards | |
| # --- Set up the Streamlit app --- | |
| st.title("Study Companion: Flashcard Generator") | |
| # Create two tabs: one to generate flashcards from a PDF, and one to practice them. | |
| #tab_gen = st.tabs(["Generate Flashcards"]) | |
| #tab_gen, tab_practice = st.tabs(["Generate Flashcards", "Practice Flashcards"]) | |
| # Initialize session state for flashcards and flashcard practice | |
| if "flashcards" not in st.session_state: | |
| st.session_state.flashcards = [] # List of generated flashcards (JSON objects) | |
| if "current_card" not in st.session_state: | |
| st.session_state.current_card = 0 | |
| if "score" not in st.session_state: | |
| st.session_state.score = 0 | |
| if "show_answer" not in st.session_state: | |
| st.session_state.show_answer = False | |
| # --- Tab 1: Generate Flashcards from PDF --- | |
| #with tab_gen: | |
| st.header("Generate Flashcards from PDF") | |
| uploaded_file = st.file_uploader("Upload PDF file", type="pdf") | |
| #page_range = st.text_input("Enter page range to extract (e.g., '1-5' or '1'):") | |
| flashcard_count = st.number_input("Number of flashcards to generate:", min_value=1, max_value=5, value=3, step=1) | |
| if uploaded_file is not None:# and page_range: | |
| # Save the uploaded file to a temporary location | |
| with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as tmp: | |
| tmp.write(uploaded_file.read()) | |
| pdf_file_path = tmp.name | |
| st.success("PDF uploaded successfully!") | |
| if st.button("Generate Flashcards"): | |
| with st.spinner("Generating flashcards..."): | |
| # This function runs the CrewAI system and writes flashcards to JSON output | |
| flashcards_json = generate_flashcards(pdf_file_path, flashcard_count)#generate_flashcards(pdf_file_path, page_range, flashcard_count) | |
| #st.markdown(flashcards_json) | |
| try: | |
| # Parse the JSON output and save it in session state | |
| st.session_state.flashcards = json.loads(flashcards_json) | |
| st.success("Flashcards generated successfully!") | |
| # Reset practice state | |
| st.session_state.current_card = 0 | |
| st.session_state.score = 0 | |
| st.session_state.show_answer = False | |
| except Exception as e: | |
| st.error(f"Error parsing flashcards: {e}") | |
| # --- Tab 2: Practice Flashcards --- | |
| #with tab_practice: | |
| st.header("Practice Flashcards") | |
| if st.session_state.flashcards: | |
| total_cards = len(st.session_state.flashcards) | |
| # Check if we've completed all flashcards | |
| if st.session_state.current_card >= total_cards: | |
| st.success(f"You've completed all flashcards! Final Score: {st.session_state.score} / {total_cards}") | |
| st.info("Restart the practice session or generate new flashcards.") | |
| else: | |
| # Safe access: ensure current_card is valid | |
| current_card = st.session_state.flashcards[st.session_state.current_card] | |
| st.write(f"**Question:** {current_card.get('question', 'No question provided')}") | |
| # Answer reveal button | |
| if st.button("Show Answer"): | |
| st.session_state.show_answer = True | |
| # If answer is revealed, show it and provide feedback options | |
| if st.session_state.show_answer: | |
| st.write(f"**Answer:** {current_card.get('answer', 'No answer provided')}") | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| if st.button("Correct"): | |
| st.session_state.score += 1 | |
| st.success("Correct!") | |
| with col2: | |
| if st.button("Wrong"): | |
| st.error("Incorrect!") | |
| if st.button("Next Card"): | |
| st.session_state.current_card += 1 | |
| st.session_state.show_answer = False | |
| st.rerun() | |
| st.write(f"**Current Score:** {st.session_state.score}/{total_cards}") | |
| else: | |
| st.info("No flashcards available. Please generate flashcards first.") | |
| # # --- Tab 2: Practice Flashcards --- | |
| # with tab_practice: | |
| # st.header("Practice Flashcards") | |
| # if st.session_state.flashcards: | |
| # # Optionally, randomize flashcard order on first run | |
| # if "shuffled" not in st.session_state: | |
| # random.shuffle(st.session_state.flashcards) | |
| # st.session_state.shuffled = True | |
| # current_card = st.session_state.flashcards[st.session_state.current_card] | |
| # st.write(f"**Question:** {current_card.get('question', 'No question provided')}") | |
| # # Button to reveal the answer | |
| # if st.button("Show Answer"): | |
| # st.session_state.show_answer = True | |
| # # If answer is revealed, show answer and feedback options | |
| # if st.session_state.show_answer: | |
| # st.write(f"**Answer:** {current_card.get('answer', 'No answer provided')}") | |
| # col1, col2 = st.columns(2) | |
| # with col1: | |
| # if st.button("Correct"): | |
| # st.session_state.score += 1 | |
| # st.success("Correct!") | |
| # with col2: | |
| # if st.button("Wrong"): | |
| # st.error("Incorrect!") | |
| # # Navigation: if this is the last card, show final score; otherwise, go to next card. | |
| # if st.button("Next Card"): | |
| # st.session_state.current_card += 1 | |
| # st.session_state.show_answer = False | |
| # #st.experimental_rerun() | |
| # st.write(f"**Current Score:** {st.session_state.score}/{len(st.session_state.flashcards)}") | |
| # else: | |
| # st.info("No flashcards available. Please generate flashcards first.") | |
| # # if st.button("Next Card"): | |
| # # st.session_state.current_card = (st.session_state.current_card + 1) % len(st.session_state.flashcards) | |
| # # st.session_state.show_answer = False | |
| # # st.experimental_rerun() | |
| # # st.write(f"**Current Score:** {st.session_state.score}/{len(st.session_state.flashcards)}") | |
| # # else: | |
| # # st.info("No flashcards available. Please generate flashcards first.") | |