Untitled
unknown
python
a year ago
9.1 kB
9
Indexable
import streamlit as st
import json
from langchain_groq import ChatGroq
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
import ast
# Load your API key (replace with your actual API key)
api_key = "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"
# Initialize ChatGroq
llm = ChatGroq(api_key=api_key)
def generate_lesson_content(subject):
prompt_template = PromptTemplate(
input_variables=["subject"],
template="""
Create a detailed lesson plan on the subject of {subject}.
Provide the following:
1. Two lesson titles
2. For each lesson, two page titles
3. For each page, three subtitles
4. For each page, a brief content summary (at least 2-3 sentences)
Format your response EXACTLY as follows, including all brackets and colons:
{{
"subject_name": "{subject}",
"lessons": [
{{
"lesson_title": "Lesson 1 Title",
"pages": [
{{
"page_title": "Page 1 Title",
"page_subtitles": ["Subtitle 1", "Subtitle 2", "Subtitle 3"],
"page_content": "Detailed content for Page 1 (2-3 sentences)"
}},
{{
"page_title": "Page 2 Title",
"page_subtitles": ["Subtitle 1", "Subtitle 2", "Subtitle 3"],
"page_content": "Detailed content for Page 2 (2-3 sentences)"
}}
]
}},
{{
"lesson_title": "Lesson 2 Title",
"pages": [
{{
"page_title": "Page 1 Title",
"page_subtitles": ["Subtitle 1", "Subtitle 2", "Subtitle 3"],
"page_content": "Detailed content for Page 1 (2-3 sentences)"
}},
{{
"page_title": "Page 2 Title",
"page_subtitles": ["Subtitle 1", "Subtitle 2", "Subtitle 3"],
"page_content": "Detailed content for Page 2 (2-3 sentences)"
}}
]
}}
]
}}
Ensure the content is informative, relevant to the subject of {subject}, and follows this EXACT JSON structure.
"""
)
chain = LLMChain(llm=llm, prompt=prompt_template)
result = chain.invoke({"subject": subject})
return result['text']
def handle_user_input(json_content):
if not json_content.get("lessons"):
st.warning("No lessons available. Please generate content first.")
return json_content
# Get the current lesson and page
lesson_titles = [lesson.get("lesson_title", f"Lesson {i+1}") for i, lesson in enumerate(json_content["lessons"])]
lesson_title = st.selectbox("Select a lesson", lesson_titles)
lesson_index = lesson_titles.index(lesson_title)
lesson = json_content["lessons"][lesson_index]
if not lesson or not lesson.get("pages"):
st.warning(f"No pages available for lesson: {lesson_title}")
return json_content
page_titles = [page.get("page_title", f"Page {i+1}") for i, page in enumerate(lesson["pages"])]
page_title = st.selectbox("Select a page", page_titles)
page_index = page_titles.index(page_title)
page = lesson["pages"][page_index]
if not page:
st.warning(f"Page not found: {page_title}")
return json_content
# Get the current page content and subtitles
page_content = page.get("page_content", "No content available.")
page_subtitles = page.get("page_subtitles", [])
# Display the original content
st.subheader("Original Content")
st.write(page_content)
# Display subtitles
if page_subtitles:
st.subheader("Subtitles")
for subtitle in page_subtitles:
st.write(f"- {subtitle}")
# Ask the user what to do with the content
action = st.selectbox("What would you like to do with the content?", ["Accept", "Expand", "Summarize"])
# Handle the user's action
if action == "Accept":
st.write("Content accepted without changes.")
elif action == "Expand":
# Ask the user to select a subtitle to expand
if page_subtitles:
subtitle = st.selectbox("Select a subtitle to expand", page_subtitles)
prompt = PromptTemplate(
input_variables=["subtitle", "page_title", "content"],
template="Expand on '{subtitle}' in the context of {page_title}. Original content: {content}"
)
chain = LLMChain(llm=llm, prompt=prompt)
expanded_content = chain.invoke({
"subtitle": subtitle,
"page_title": page_title,
"content": page_content
})
st.subheader("Expanded Content")
st.write(expanded_content['text'])
page["page_content"] = expanded_content['text']
else:
st.warning("No subtitles available for expansion.")
elif action == "Summarize":
# Ask the user to select a length for the summary
summary_length = st.selectbox("Select a summary length", ["Short", "Medium", "Long"])
prompt = PromptTemplate(
input_variables=["page_title", "summary_length", "content"],
template="Summarize the content about {page_title} in a {summary_length} summary. Original content: {content}"
)
chain = LLMChain(llm=llm, prompt=prompt)
summarized_content = chain.invoke({
"page_title": page_title,
"summary_length": summary_length.lower(),
"content": page_content
})
st.subheader("Summarized Content")
st.write(summarized_content['text'])
page["page_content"] = summarized_content['text']
return json_content
import re
def preprocess_json(json_string):
# Remove any leading/trailing whitespace
json_string = json_string.strip()
# Use ast.literal_eval to safely evaluate the string as a Python literal
try:
parsed_data = ast.literal_eval(json_string)
if isinstance(parsed_data, dict) and "lessons" in parsed_data:
return parsed_data
else:
return {"subject_name": "", "lessons": []}
except:
# If ast.literal_eval fails, return an empty structure
return {"subject_name": "", "lessons": []}
def main():
st.title("Interactive Lesson Content Editor")
# Initialize empty JSON content if not exists
if 'json_content' not in st.session_state:
st.session_state.json_content = {
"subject_name": "",
"lessons": []
}
# Input for subject
subject = st.text_input("Enter the subject for the lesson content:")
if subject and subject != st.session_state.json_content.get("subject_name", ""):
with st.spinner("Generating lesson content..."):
try:
generated_content = generate_lesson_content(subject)
# st.write("Debug - Generated Content:", generated_content) # Debugging step
if generated_content:
# Preprocess the generated content
processed_content = preprocess_json(generated_content)
# st.write("Debug - Processed Content:", processed_content) # Debugging step
if processed_content:
st.session_state.json_content = processed_content
st.success("Lesson content generated successfully!")
else:
st.error("Failed to process the generated content. Please try again.")
else:
st.error("Failed to generate content. Please try again.")
except Exception as e:
st.error(f"An error occurred: {str(e)}. Please try again.")
if st.session_state.json_content.get("lessons"):
# Handle user input
updated_content = handle_user_input(st.session_state.json_content)
if updated_content != st.session_state.json_content:
st.session_state.json_content = updated_content
st.success("Content updated successfully!")
# Option to save the updated JSON
if st.button("Save Changes"):
with open(f'{subject.replace(" ", "_").lower()}_lesson_content.json', 'w') as f:
json.dump(st.session_state.json_content, f, indent=2)
st.success(f"Changes saved successfully to {subject.replace(' ', '_').lower()}_lesson_content.json!")
# Debug: Display current JSON content
if st.checkbox("Show current JSON content"):
st.json(st.session_state.json_content)
if __name__ == "__main__":
main()
Editor is loading...
Leave a Comment