import streamlit as st import json from openai_llm import LessonPlanGenerator # Page configuration st.set_page_config( page_title="WizLab Lesson Plan Generator", page_icon="📚", layout="wide" ) # Custom CSS with improved styling st.markdown(""" """, unsafe_allow_html=True) # Initialize generator #@st.cache_resource #def get_generator(): #return LessonPlanGenerator() generator = LessonPlanGenerator() # Header st.title("WizLab Lesson Plan Generator") st.markdown("We help you generate lesson plans tailored to your needs.") # Input section st.header("Input Your Requirements") # Create two columns for input fields col1, col2 = st.columns(2) with col1: topic = st.text_input("Topic", placeholder="e.g., Lesson Plan to teach Spanish numbers as third language to English Speaking students ") age_group_options = ["Elementary (6-11)", "Middle School (12-14)", "High School (15-18)", "Adult Learners", "Other"] age_group_selection = st.selectbox("Target Age Group", age_group_options) if age_group_selection == "Other": age_group = st.text_input("Specify Age Group") else: age_group = age_group_selection language_options = [ "English", "日本語 (Japanese)", "中文 (Mandarin Chinese)", "Español (Spanish)", "हिंदी (Hindi)", "한국어 (Korean)", "Deutsch (German)", "Français (French)", "Português (Portuguese)", "العربية (Arabic)", "Русский (Russian)", "Other" ] language_selection = st.selectbox("Select Output Language", language_options) LANGUAGE_MAPPING = { "日本語 (Japanese)": "Japanese", "中文 (Mandarin Chinese)": "Mandarin Chinese", "Español (Spanish)": "Spanish", "हिंदी (Hindi)": "Hindi", "한국어 (Korean)": "Korean", "Deutsch (German)": "German", "Français (French)": "French", "Português (Portuguese)": "Portuguese", "العربية (Arabic)": "Arabic", "Русский (Russian)": "Russian" } # Then in your language selection code: if language_selection == "Other": language = st.text_input("Specify Language") else: # Use mapping if available, otherwise use the base language name language = LANGUAGE_MAPPING.get(language_selection, language_selection) #if language_selection == "Other": # language = st.text_input("Specify Language") # else: # Extract the base language name without the native script # language = language_selection.split(" (")[0] if " (" in language_selection else language_selection with col2: #duration_options = ["30 minutes", "45 minutes", "60 minutes", "90 minutes", "Other"] #duration_selection = st.selectbox("Lesson Duration", duration_options) #if duration_selection == "Other": # duration = st.text_input("Specify Duration") #else: # duration = duration_selection duration = st.text_input("Duration [in minutes]", placeholder = "e.g., 25 minutes") proficiency_options = ["Beginner [A1]", "Elementary [A2]", "Intermediate[B1, B2]", "Advanced[C1]", "Proficient [C2]", "Other"] proficiency_selection = st.selectbox("Proficiency Level [CEFR]", proficiency_options) if proficiency_selection == "Other": proficiency = st.text_input("Specify Proficiency Level") else: proficiency = proficiency_selection tech_options = ["Interactive Whiteboard", "Computers/Laptops", "Mobile Devices", "Internet Access", "None", "Other"] tech_selection = st.multiselect("Accessible Tech Resources", tech_options) if "Other" in tech_selection: other_tech = st.text_input("Specify Other Technology Requirements") tech_usage = [tech for tech in tech_selection if tech != "Other"] + [other_tech] else: tech_usage = tech_selection def format_content(data): html_content = '
' def format_key(key): """Format key string to be more readable""" # Handle camelCase key = ''.join(' ' + char if char.isupper() else char for char in key).strip() # Replace underscores and normalize spaces key = key.replace('_', ' ').title() return key def process_value(value, level=0): if isinstance(value, dict): return process_dict(value, level) elif isinstance(value, list): return process_list(value, level) else: return f'
{value}
' def process_dict(d, level): content = "" for key, value in d.items(): formatted_key = format_key(key) section_class = "section-level-" + str(level) content += f'
' if level == 0: content += f'
{formatted_key}
' else: content += f'
{formatted_key}
' if isinstance(value, dict) and any(isinstance(v, (dict, list)) for v in value.values()): content += process_value(value, level + 1) elif isinstance(value, list) and any(isinstance(item, dict) for item in value): content += process_value(value, level + 1) else: content += process_value(value, level + 1) content += '
' return content def process_list(lst, level): content = '
' for item in lst: if isinstance(item, dict): content += process_dict(item, level + 1) else: content += f'
{item}
' content += '
' return content html_content += process_dict(data, 0) html_content += '
' return html_content # Generate button # Generate button if st.button("Generate Lesson Plan", type="primary"): if not topic: st.error("Please enter a topic for the lesson plan.") else: with st.spinner("Generating your lesson plan..."): # Set default values if not provided if not duration: duration = "30 minutes" if not proficiency: proficiency = "Intermediate [B1, B2]" if not age_group: age_group = "Elementary (6-11)" if not tech_usage: tech_usage = ["White Board", "Internet Access"] if not language: language = "English" detailed_prompt = f""" Create a lesson plan for teaching '{topic}' to {age_group} students. Duration: {duration} minutes, Proficiency Level [CEFR]: {proficiency}, Technology Requirements: {', '.join(tech_usage) if tech_usage else 'None'}, Generate response in {language} Language. """ try: # Pass both the prompt and language result = generator.generate_lesson_plan(detailed_prompt, language) # Consistent parsing regardless of language if isinstance(result, dict): if "lessonPlan" in result: lesson_content = result["lessonPlan"] else: lesson_content = result st.success("Lesson plan generated successfully!") # Create tabs for different views tab1, tab2 = st.tabs(["Formatted View", "Raw JSON"]) with tab1: st.markdown(format_content(lesson_content), unsafe_allow_html=True) with tab2: st.json(lesson_content) # Download button st.download_button( label="Download Lesson Plan", data=json.dumps(lesson_content, indent=2, ensure_ascii=False), # ensure_ascii=False for proper Unicode handling file_name=f"lesson_plan_{language}.json", mime="application/json" ) else: st.error("Invalid response format") except Exception as e: st.error(f"An error occurred: {str(e)}") # Footer st.markdown("---")