File size: 6,115 Bytes
e046fa6 dfb26ce e046fa6 dfb26ce e046fa6 dfb26ce e046fa6 dfb26ce e046fa6 |
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 |
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()
|