JoyStroy / app.py
Rathapoom's picture
Update app.py
dfb26ce verified
raw
history blame
6.12 kB
import streamlit as st
import openai
import datetime
import json
# Set your OpenAI API key
openai.api_key = 'YOUR_OPENAI_API_KEY'
# Set up the Streamlit page configuration
st.set_page_config(
page_title="JoyStory - Interactive Story Adventure",
page_icon=":book:",
layout="wide",
initial_sidebar_state="collapsed",
)
# Initialize session state variables
if 'story' not in st.session_state:
st.session_state.story = []
if 'achievements' not in st.session_state:
st.session_state.achievements = []
if 'level' not in st.session_state:
st.session_state.level = 'Beginner'
if 'unique_words' not in st.session_state:
st.session_state.unique_words = set()
if 'total_words' not in st.session_state:
st.session_state.total_words = 0
if 'badges' not in st.session_state:
st.session_state.badges = []
# Function to generate AI response
def generate_ai_response(user_input, level):
prompt = f"Continue the story in a way that is engaging and suitable for a {level.lower()} English learner.\n\nStory so far:\n{''.join(st.session_state.story)}\nUser input: {user_input}\nAI continuation:"
response = openai.Completion.create(
engine='gpt-4o-mini'
prompt=prompt,
max_tokens=100,
temperature=0.7,
)
ai_output = response.choices[0].text.strip()
return ai_output
# Function to get vocabulary suggestions
def get_vocabulary_suggestions():
suggestions = openai.Completion.create(
engine='gpt-4o-mini',
prompt=f"Provide 3 interesting words suitable for a {st.session_state.level.lower()} English learner to use in the next part of the story.",
max_tokens=20,
n=1,
stop=None,
temperature=0.5,
)
words = suggestions.choices[0].text.strip().split(', ')
return words
# Function to get creative prompts
def get_creative_prompt():
prompt = openai.Completion.create(
engine='gpt-4o-mini',
prompt="Ask an open-ended question to inspire the next part of the story.",
max_tokens=30,
n=1,
stop=None,
temperature=0.7,
)
question = prompt.choices[0].text.strip()
return question
# Function to provide feedback
def get_feedback(user_input):
feedback_prompt = f"Provide one positive, simple feedback on the following sentence for a {st.session_state.level.lower()} English learner:\n\n{user_input}"
feedback = openai.Completion.create(
engine='gpt-4o-mini',
prompt=feedback_prompt,
max_tokens=50,
temperature=0.5,
)
return feedback.choices[0].text.strip()
# Function to update achievements
def update_achievements(user_input):
words = set(user_input.lower().split())
st.session_state.unique_words.update(words)
st.session_state.total_words += len(words)
# Example achievement: Use 50 unique words
if len(st.session_state.unique_words) >= 50 and '50 Unique Words' not in st.session_state.badges:
st.session_state.badges.append('50 Unique Words')
st.success("Achievement Unlocked: 50 Unique Words!")
# Layout the UI
st.title("πŸ“– JoyStory - Interactive Story Adventure")
col1, col2 = st.columns([3, 1])
with col1:
# Story Display Box
st.header("Story So Far")
story_display = st.empty()
if st.session_state.story:
story_display.markdown('\n\n'.join(st.session_state.story))
else:
st.info("Your story will appear here as you write it.")
# User Input Box
st.header("Your Turn to Write")
user_input = st.text_area("Continue the story:", height=100)
if st.button("Submit"):
if user_input.strip() == "":
st.warning("Please enter some text to continue the story.")
else:
st.session_state.story.append(f"**You:** {user_input}")
update_achievements(user_input)
feedback = get_feedback(user_input)
st.session_state.story.append(f"**Feedback:** {feedback}")
ai_response = generate_ai_response(user_input, st.session_state.level)
st.session_state.story.append(f"**AI:** {ai_response}")
story_display.markdown('\n\n'.join(st.session_state.story))
with col2:
# Help and Suggestions Box
st.header("Need Some Help?")
if st.button("Get Vocabulary Suggestions"):
vocab_suggestions = get_vocabulary_suggestions()
st.write("Try using these words in your next sentence:")
for word in vocab_suggestions:
st.write(f"- {word}")
if st.button("Get a Creative Prompt"):
creative_prompt = get_creative_prompt()
st.write(creative_prompt)
# Rewards and Progress Box
st.header("Achievements")
if st.session_state.badges:
for badge in st.session_state.badges:
st.success(f"πŸ† {badge}")
else:
st.write("No achievements yet. Keep writing to earn badges!")
# Story Saving
if st.button("Save Story"):
story_data = {
'level': st.session_state.level,
'date': datetime.datetime.now().isoformat(),
'story': st.session_state.story,
'achievements': st.session_state.badges,
'total_words': st.session_state.total_words,
'unique_words': list(st.session_state.unique_words),
}
story_json = json.dumps(story_data, indent=4)
st.download_button(
label="Download Story",
data=story_json,
file_name='joystory.json',
mime='application/json',
)
# Sidebar for selecting language level
with st.sidebar:
st.header("Settings")
level = st.radio(
"Select your English level:",
('Beginner', 'Intermediate', 'Advanced'),
index=['Beginner', 'Intermediate', 'Advanced'].index(st.session_state.level)
)
st.session_state.level = level
if st.button("Start New Story"):
st.session_state.story = []
st.session_state.achievements = []
st.session_state.unique_words = set()
st.session_state.total_words = 0
st.session_state.badges = []
st.experimental_rerun()