Spaces:
Sleeping
Sleeping
File size: 5,860 Bytes
fd59f22 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 | import streamlit as st
import json
from openai_llm import LessonPlanGenerator
# Page configuration
st.set_page_config(
page_title="Lesson Plan Generator",
# page_icon="๐",
layout="wide"
)
# Custom CSS with corrected container styling
st.markdown("""
<style>
/* Main container */
.main-container {
background-color: white;
border-radius: 8px;
padding: 25px;
margin: 20px 0;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
/* Section styling */
.section {
margin: 15px 0;
padding: 10px 0;
border-bottom: 1px solid #eee;
}
/* Header styling */
.section-header {
color: #1a237e;
font-size: 18px;
font-weight: 600;
margin-bottom: 10px;
}
/* Content styling */
.section-content {
color: #333;
margin-left: 20px;
}
/* List item styling */
.list-item {
margin: 5px 0;
color: #333;
}
/* Nested content */
.nested-content {
margin-left: 20px;
padding-left: 10px;
border-left: 2px solid #e8eaf6;
}
</style>
""", unsafe_allow_html=True)
# Initialize generator
@st.cache_resource
def get_generator():
return LessonPlanGenerator()
generator = get_generator()
# 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., Introduction to Photosynthesis")
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
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
proficiency_options = ["Beginner", "Intermediate", "Advanced", "Other"]
proficiency_selection = st.selectbox("Proficiency Level", 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("Technology Requirements", 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 = '<div class="main-container">'
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'<div class="section-content">{value}</div>'
def process_dict(d, level):
content = ""
for key, value in d.items():
formatted_key = key.replace("_", " ").title()
content += f'<div class="section">'
content += f'<div class="section-header">{formatted_key}</div>'
content += process_value(value, level + 1)
content += '</div>'
return content
def process_list(lst, level):
content = '<div class="section-content">'
for item in lst:
if isinstance(item, dict):
content += process_dict(item, level + 1)
else:
content += f'<div class="list-item">โข {item}</div>'
content += '</div>'
return content
html_content += process_dict(data, 0)
html_content += '</div>'
return html_content
# 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..."):
detailed_prompt = f"""
Create a lesson plan for teaching '{topic}' to {age_group} students.
Duration: {duration}
Proficiency Level: {proficiency}
Technology Requirements: {', '.join(tech_usage) if tech_usage else 'None'}
"""
try:
result = generator.generate_lesson_plan(detailed_prompt)
st.success("Lesson plan generated successfully!")
# Create tabs for different views
tab1, tab2 = st.tabs(["Formatted View", "Raw JSON"])
with tab1:
if isinstance(result, dict):
# Display formatted content in white container
st.markdown(format_content(result), unsafe_allow_html=True)
else:
st.error("Invalid response format")
with tab2:
st.json(result)
# Download button
st.download_button(
label="Download Lesson Plan",
data=json.dumps(result, indent=2),
file_name="lesson_plan.json",
mime="application/json"
)
except Exception as e:
st.error(f"An error occurred: {str(e)}")
# Footer
st.markdown("---")
|