Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import random | |
| from langchain.chat_models import ChatOpenAI | |
| from langchain.schema import HumanMessage, SystemMessage | |
| import os | |
| from dotenv import load_dotenv | |
| import pandas as pd | |
| from datetime import datetime | |
| import plotly.express as px | |
| import json | |
| import tempfile | |
| import time | |
| import numpy as np | |
| import threading | |
| #import sounddevice as sd | |
| #from playsound import playsound | |
| #import pygame | |
| #from scipy.io import wavfile | |
| #pygame.mixer.init() | |
| # Load environment variables | |
| load_dotenv() | |
| AI71_BASE_URL = "https://api.ai71.ai/v1/" | |
| AI71_API_KEY = os.getenv('AI71_API_KEY') | |
| # Initialize the Falcon model | |
| chat = ChatOpenAI( | |
| model="tiiuae/falcon-180B-chat", | |
| api_key=AI71_API_KEY, | |
| base_url=AI71_BASE_URL, | |
| streaming=True, | |
| ) | |
| # Expanded Therapy techniques | |
| THERAPY_TECHNIQUES = { | |
| "CBT": "Use Cognitive Behavioral Therapy techniques to help the user identify and change negative thought patterns.", | |
| "Mindfulness": "Guide the user through mindfulness exercises to promote present-moment awareness and reduce stress.", | |
| "Solution-Focused": "Focus on the user's strengths and resources to help them find solutions to their problems.", | |
| "Emotion-Focused": "Help the user identify, experience, and regulate their emotions more effectively.", | |
| "Psychodynamic": "Explore the user's past experiences and unconscious patterns to gain insight into current issues.", | |
| "ACT": "Use Acceptance and Commitment Therapy to help the user accept their thoughts and feelings while committing to positive changes.", | |
| "DBT": "Apply Dialectical Behavior Therapy techniques to help the user manage intense emotions and improve relationships.", | |
| "Gestalt": "Use Gestalt therapy techniques to focus on the present moment and increase self-awareness.", | |
| "Existential": "Explore existential themes such as meaning, freedom, and responsibility to help the user find purpose.", | |
| "Narrative": "Use storytelling and narrative techniques to help the user reframe their life experiences and create new meaning.", | |
| } | |
| def get_ai_response(user_input, buddy_config, therapy_technique=None): | |
| system_message = f"You are {buddy_config['name']}, an AI companion with the following personality: {buddy_config['personality']}. " | |
| system_message += f"Additional details about you: {buddy_config['details']}. " | |
| if therapy_technique: | |
| system_message += f"In this conversation, {THERAPY_TECHNIQUES[therapy_technique]}" | |
| messages = [ | |
| SystemMessage(content=system_message), | |
| HumanMessage(content=user_input) | |
| ] | |
| response = chat.invoke(messages).content | |
| return response | |
| #def play_sound_loop(sound_file, stop_event): | |
| # while not stop_event.is_set(): | |
| # playsound(sound_file) | |
| # | |
| #def play_sound_for_duration(sound_file, duration): | |
| # start_time = time.time() | |
| # while time.time() - start_time < duration: | |
| # playsound(sound_file, block=False) | |
| # time.sleep(0.1) # Short sleep to prevent excessive CPU usage | |
| # # Ensure the sound stops after the duration | |
| # pygame.mixer.quit() | |
| # | |
| #def get_sound_files(directory): | |
| # return [f for f in os.listdir(directory) if f.endswith('.mp3')] | |
| # | |
| #def get_sound_file_path(sound_name, sound_dir): | |
| # # Convert the sound name to a filename | |
| # filename = f"{sound_name.lower().replace(' ', '_')}.mp3" | |
| # return os.path.join(sound_dir, filename) | |
| # | |
| #SOUND_OPTIONS = [ | |
| # "Gentle Rain", "Ocean Waves", "Forest Ambience", "Soft Wind Chimes", | |
| # "Tibetan Singing Bowls", "Humming Song", "Crackling Fireplace", | |
| # "Birdsong", "White Noise", "Zen River", "Heartbeat", "Deep Space", | |
| # "Whale Songs", "Bamboo Flute", "Thunderstorm", "Cat Purring", | |
| # "Campfire", "Windchimes", "Waterfall", "Beach Waves", "Cicadas", | |
| # "Coffee Shop Ambience", "Grandfather Clock", "Rainstorm on Tent", | |
| # "Tropical Birds", "Subway Train", "Washing Machine", "Fan White Noise", | |
| # "Tibetan Bells", "Wind in Trees", "Meditation Bowl", "Meditation Bowl2", "Birds Singing Rainy Day" | |
| #] | |
| # | |
| #def show_meditation_timer(): | |
| # st.subheader("π§ββοΈ Enhanced Meditation Timer") | |
| # | |
| # sound_dir = os.path.join(os.path.dirname(__file__), "..", "sounds") | |
| # | |
| # col1, col2 = st.columns(2) | |
| # | |
| # with col1: | |
| # duration = st.slider("Select duration (minutes)", 1, 60, 5) | |
| # background_sound = st.selectbox("Background Sound", SOUND_OPTIONS) | |
| # | |
| # with col2: | |
| # interval_options = ["None", "Every 5 minutes", "Every 10 minutes"] | |
| # interval_reminder = st.selectbox("Interval Reminders", interval_options) | |
| # end_sound = st.selectbox("End of Session Sound", SOUND_OPTIONS) | |
| # | |
| # if st.button("Start Meditation", key="start_meditation"): | |
| # progress_bar = st.progress(0) | |
| # status_text = st.empty() | |
| # | |
| # # Initialize pygame mixer | |
| # pygame.mixer.init() | |
| # | |
| # # Load background sound | |
| # background_sound_file = get_sound_file_path(background_sound, sound_dir) | |
| # if not os.path.exists(background_sound_file): | |
| # st.error(f"Background sound file not found: {background_sound_file}") | |
| # return | |
| # | |
| # # Load end of session sound | |
| # end_sound_file = get_sound_file_path(end_sound, sound_dir) | |
| # if not os.path.exists(end_sound_file): | |
| # st.error(f"End sound file not found: {end_sound_file}") | |
| # return | |
| # | |
| # # Play background sound on loop | |
| # pygame.mixer.music.load(background_sound_file) | |
| # pygame.mixer.music.play(-1) # -1 means loop indefinitely | |
| # | |
| # start_time = time.time() | |
| # end_time = start_time + (duration * 60) | |
| # | |
| # try: | |
| # while time.time() < end_time: | |
| # elapsed_time = time.time() - start_time | |
| # progress = elapsed_time / (duration * 60) | |
| # progress_bar.progress(progress) | |
| # | |
| # remaining_time = end_time - time.time() | |
| # mins, secs = divmod(int(remaining_time), 60) | |
| # status_text.text(f"Time remaining: {mins:02d}:{secs:02d}") | |
| # | |
| # if interval_reminder != "None": | |
| # interval = 5 if interval_reminder == "Every 5 minutes" else 10 | |
| # if int(elapsed_time) > 0 and int(elapsed_time) % (interval * 60) == 0: | |
| # st.toast(f"{interval} minutes passed", icon="β°") | |
| # | |
| # # Check if 10 seconds remaining | |
| # if remaining_time <= 10 and remaining_time > 9: | |
| # pygame.mixer.music.stop() # Stop background sound | |
| # pygame.mixer.Sound(end_sound_file).play() # Play end sound | |
| # | |
| # if remaining_time <= 0: | |
| # break | |
| # | |
| # time.sleep(0.1) # Update more frequently for smoother countdown | |
| # finally: | |
| # # Stop all sounds | |
| # pygame.mixer.quit() | |
| # | |
| # # Ensure the progress bar is full and time remaining shows 00:00 | |
| # progress_bar.progress(1.0) | |
| # status_text.text("Time remaining: 00:00") | |
| # | |
| # st.success("Meditation complete!") | |
| # st.balloons() | |
| # | |
| # if 'achievements' not in st.session_state: | |
| # st.session_state.achievements = set() | |
| # st.session_state.achievements.add("Zen Master") | |
| # st.success("Achievement Unlocked: Zen Master π§ββοΈ") | |
| def show_personalized_recommendations(): | |
| st.subheader("π― Personalized Recommendations") | |
| recommendation_categories = [ | |
| "Mental Health", | |
| "Physical Health", | |
| "Personal Development", | |
| "Relationships", | |
| "Career", | |
| "Hobbies", | |
| ] | |
| selected_category = st.selectbox("Choose a category", recommendation_categories) | |
| recommendations = { | |
| "Mental Health": [ | |
| "Practice daily gratitude journaling", | |
| "Try a guided meditation for stress relief", | |
| "Explore cognitive behavioral therapy techniques", | |
| "Start a mood tracking journal", | |
| "Learn about mindfulness practices", | |
| ], | |
| "Physical Health": [ | |
| "Start a 30-day yoga challenge", | |
| "Try intermittent fasting", | |
| "Begin a couch to 5K running program", | |
| "Experiment with new healthy recipes", | |
| "Create a sleep hygiene routine", | |
| ], | |
| "Personal Development": [ | |
| "Start learning a new language", | |
| "Read personal development books", | |
| "Take an online course in a subject you're interested in", | |
| "Practice public speaking", | |
| "Start a daily writing habit", | |
| ], | |
| "Relationships": [ | |
| "Practice active listening techniques", | |
| "Plan regular date nights or friend meetups", | |
| "Learn about love languages", | |
| "Practice expressing gratitude to loved ones", | |
| "Join a local community or interest group", | |
| ], | |
| "Career": [ | |
| "Update your resume and LinkedIn profile", | |
| "Network with professionals in your industry", | |
| "Set SMART career goals", | |
| "Learn a new skill relevant to your field", | |
| "Start a side project or freelance work", | |
| ], | |
| "Hobbies": [ | |
| "Start a garden or learn about plant care", | |
| "Try a new art form like painting or sculpting", | |
| "Learn to play a musical instrument", | |
| "Start a DIY home improvement project", | |
| "Explore photography or videography", | |
| ], | |
| } | |
| st.write("Here are some personalized recommendations for you:") | |
| for recommendation in recommendations[selected_category]: | |
| st.markdown(f"- {recommendation}") | |
| if st.button("Get More Recommendations"): | |
| st.write("More tailored recommendations:") | |
| additional_recs = random.sample(recommendations[selected_category], 3) | |
| for rec in additional_recs: | |
| st.markdown(f"- {rec}") | |
| #def generate_binaural_beat(freq1, freq2, duration_seconds, sample_rate=44100): | |
| # t = np.linspace(0, duration_seconds, int(sample_rate * duration_seconds), False) | |
| # left_channel = np.sin(2 * np.pi * freq1 * t) | |
| # right_channel = np.sin(2 * np.pi * freq2 * t) | |
| # stereo_audio = np.vstack((left_channel, right_channel)).T | |
| # return (stereo_audio * 32767).astype(np.int16) | |
| # | |
| #def get_binary_file_downloader_html(bin_file, file_label='File'): | |
| # b64 = base64.b64encode(bin_file).decode() | |
| # return f'<a href="data:application/octet-stream;base64,{b64}" download="{file_label}.wav" class="download-link">Download {file_label}</a>' | |
| # | |
| #def show_binaural_beats(): | |
| # st.subheader("π΅ Binaural Beats Generator") | |
| # | |
| # st.markdown(""" | |
| # <style> | |
| # .stButton>button { | |
| # background-color: #4CAF50; | |
| # color: white; | |
| # font-weight: bold; | |
| # } | |
| # .download-link { | |
| # background-color: #008CBA; | |
| # color: white; | |
| # padding: 10px 15px; | |
| # text-align: center; | |
| # text-decoration: none; | |
| # display: inline-block; | |
| # font-size: 16px; | |
| # margin: 4px 2px; | |
| # cursor: pointer; | |
| # border-radius: 4px; | |
| # } | |
| # .stop-button { | |
| # background-color: #f44336; | |
| # color: white; | |
| # font-weight: bold; | |
| # } | |
| # </style> | |
| # """, unsafe_allow_html=True) | |
| # | |
| # st.write("Binaural beats are created when two slightly different frequencies are played in each ear, potentially influencing brainwave activity.") | |
| # | |
| # preset_beats = { | |
| # "Deep Relaxation (Delta)": {"base": 100, "beat": 2}, | |
| # "Meditation (Theta)": {"base": 150, "beat": 6}, | |
| # "Relaxation (Alpha)": {"base": 200, "beat": 10}, | |
| # "Light Focus (Low Beta)": {"base": 250, "beat": 14}, | |
| # "High Focus (Mid Beta)": {"base": 300, "beat": 20}, | |
| # "Alertness (High Beta)": {"base": 350, "beat": 30}, | |
| # "Gamma Consciousness": {"base": 400, "beat": 40}, | |
| # "Lucid Dreaming": {"base": 180, "beat": 3}, | |
| # "Memory Enhancement": {"base": 270, "beat": 12}, | |
| # "Creativity Boost": {"base": 220, "beat": 8}, | |
| # "Pain Relief": {"base": 130, "beat": 4}, | |
| # "Mood Elevation": {"base": 315, "beat": 18} | |
| # } | |
| # | |
| # col1, col2 = st.columns(2) | |
| # | |
| # with col1: | |
| # beat_type = st.selectbox("Choose a preset or custom:", ["Custom"] + list(preset_beats.keys())) | |
| # | |
| # with col2: | |
| # duration = st.slider("Duration (minutes):", 1, 60, 15) | |
| # | |
| # if beat_type == "Custom": | |
| # col3, col4 = st.columns(2) | |
| # with col3: | |
| # base_freq = st.slider("Base Frequency (Hz):", 100, 500, 200) | |
| # with col4: | |
| # beat_freq = st.slider("Desired Beat Frequency (Hz):", 1, 40, 10) | |
| # else: | |
| # base_freq = preset_beats[beat_type]["base"] | |
| # beat_freq = preset_beats[beat_type]["beat"] | |
| # st.info(f"Base Frequency: {base_freq} Hz, Beat Frequency: {beat_freq} Hz") | |
| # | |
| # if 'audio_playing' not in st.session_state: | |
| # st.session_state.audio_playing = False | |
| # | |
| # if 'start_time' not in st.session_state: | |
| # st.session_state.start_time = None | |
| # | |
| # if 'end_time' not in st.session_state: | |
| # st.session_state.end_time = None | |
| # | |
| # # Create persistent placeholders for UI elements | |
| # progress_bar = st.empty() | |
| # status_text = st.empty() | |
| # stop_button = st.empty() | |
| # | |
| # generate_button = st.button("Generate and Play Binaural Beat") | |
| # | |
| # if generate_button: | |
| # try: | |
| # # Stop any currently playing audio | |
| # if st.session_state.audio_playing: | |
| # pygame.mixer.music.stop() | |
| # st.session_state.audio_playing = False | |
| # | |
| # audio_data = generate_binaural_beat(base_freq, base_freq + beat_freq, duration * 60) | |
| # | |
| # # Save the generated audio to a temporary file | |
| # with tempfile.NamedTemporaryFile(delete=False, suffix='.wav') as temp_file: | |
| # temp_filename = temp_file.name | |
| # wavfile.write(temp_filename, 44100, audio_data) | |
| # | |
| # # Initialize pygame mixer | |
| # pygame.mixer.init(frequency=44100, size=-16, channels=2) | |
| # | |
| # # Load and play the audio | |
| # pygame.mixer.music.load(temp_filename) | |
| # pygame.mixer.music.play() | |
| # st.session_state.audio_playing = True | |
| # | |
| # st.session_state.start_time = time.time() | |
| # st.session_state.end_time = st.session_state.start_time + (duration * 60) | |
| # | |
| # except Exception as e: | |
| # st.error(f"An error occurred: {str(e)}") | |
| # st.info("Please try again or contact support if the issue persists.") | |
| # | |
| # if st.session_state.audio_playing: | |
| # stop_button_active = stop_button.button("Stop Binaural Beat", key="stop_binaural", type="primary") | |
| # current_time = time.time() | |
| # | |
| # if stop_button_active: | |
| # pygame.mixer.music.stop() | |
| # st.session_state.audio_playing = False | |
| # st.session_state.start_time = None | |
| # st.session_state.end_time = None | |
| # | |
| # elif current_time < st.session_state.end_time: | |
| # elapsed_time = current_time - st.session_state.start_time | |
| # progress = elapsed_time / (st.session_state.end_time - st.session_state.start_time) | |
| # progress_bar.progress(progress) | |
| # | |
| # remaining_time = st.session_state.end_time - current_time | |
| # mins, secs = divmod(int(remaining_time), 60) | |
| # status_text.text(f"Time remaining: {mins:02d}:{secs:02d}") | |
| # else: | |
| # pygame.mixer.music.stop() | |
| # st.session_state.audio_playing = False | |
| # st.session_state.start_time = None | |
| # st.session_state.end_time = None | |
| # progress_bar.empty() | |
| # status_text.text("Binaural beat session complete!") | |
| # | |
| # # Offer download of the generated audio | |
| # if not st.session_state.audio_playing and 'audio_data' in locals(): | |
| # with io.BytesIO() as buffer: | |
| # wavfile.write(buffer, 44100, audio_data) | |
| # st.markdown(get_binary_file_downloader_html(buffer.getvalue(), f"binaural_beat_{base_freq}_{beat_freq}Hz"), unsafe_allow_html=True) | |
| # | |
| # # Ensure the app updates every second | |
| # if st.session_state.audio_playing: | |
| # time.sleep(1) | |
| # st.experimental_rerun() | |
| def main(): | |
| st.set_page_config(page_title="S.H.E.R.L.O.C.K. AI Buddy", page_icon="π΅οΈ", layout="wide") | |
| # Custom CSS for improved styling | |
| st.markdown(""" | |
| <style> | |
| .stApp { | |
| background-color: #f0f2f6; | |
| } | |
| .stButton>button { | |
| background-color: #4CAF50; | |
| color: white; | |
| font-weight: bold; | |
| } | |
| .stTextInput>div>div>input { | |
| background-color: #ffffff; | |
| } | |
| </style> | |
| """, unsafe_allow_html=True) | |
| st.title("π΅οΈ S.H.E.R.L.O.C.K. AI Buddy") | |
| st.markdown("Your personalized AI companion for conversation, therapy, and personal growth.") | |
| # Initialize session state | |
| if 'buddy_name' not in st.session_state: | |
| st.session_state.buddy_name = "Sherlock" | |
| if 'buddy_personality' not in st.session_state: | |
| st.session_state.buddy_personality = "Friendly, empathetic, and insightful" | |
| if 'buddy_details' not in st.session_state: | |
| st.session_state.buddy_details = "Knowledgeable about various therapy techniques and always ready to listen" | |
| if 'messages' not in st.session_state: | |
| st.session_state.messages = [] | |
| # Sidebar for AI Buddy configuration and additional features | |
| with st.sidebar: | |
| st.header("π€ Configure Your AI Buddy") | |
| st.session_state.buddy_name = st.text_input("Name your AI Buddy", value=st.session_state.buddy_name) | |
| st.session_state.buddy_personality = st.text_area("Describe your buddy's personality", value=st.session_state.buddy_personality) | |
| st.session_state.buddy_details = st.text_area("Additional details about your buddy", value=st.session_state.buddy_details) | |
| st.header("π§ Therapy Session") | |
| therapy_mode = st.checkbox("Enable Therapy Mode") | |
| if therapy_mode: | |
| therapy_technique = st.selectbox("Select Therapy Technique", list(THERAPY_TECHNIQUES.keys())) | |
| else: | |
| therapy_technique = None | |
| st.markdown("---") | |
| st.subheader("π Todo List") | |
| if 'todos' not in st.session_state: | |
| st.session_state.todos = [] | |
| new_todo = st.text_input("Add a new todo:") | |
| if st.button("Add Todo", key="add_todo"): | |
| if new_todo: | |
| st.session_state.todos.append({"task": new_todo, "completed": False}) | |
| st.success("Todo added successfully!") | |
| else: | |
| st.warning("Please enter a todo item.") | |
| for i, todo in enumerate(st.session_state.todos): | |
| col1, col2, col3 = st.columns([0.05, 0.8, 0.15]) | |
| with col1: | |
| todo['completed'] = st.checkbox("", todo['completed'], key=f"todo_{i}") | |
| with col2: | |
| st.write(todo['task'], key=f"todo_text_{i}") | |
| with col3: | |
| if st.button("ποΈ", key=f"delete_{i}", help="Delete todo"): | |
| st.session_state.todos.pop(i) | |
| st.experimental_rerun() | |
| st.subheader("β±οΈ Pomodoro Timer") | |
| pomodoro_duration = st.slider("Pomodoro Duration (minutes)", 1, 60, 25) | |
| if st.button("Start Pomodoro"): | |
| progress_bar = st.progress(0) | |
| for i in range(pomodoro_duration * 60): | |
| time.sleep(1) | |
| progress_bar.progress((i + 1) / (pomodoro_duration * 60)) | |
| st.success("Pomodoro completed!") | |
| if 'achievements' not in st.session_state: | |
| st.session_state.achievements = set() | |
| st.session_state.achievements.add("Consistent Learner") | |
| st.markdown("---") | |
| st.markdown("Powered by Falcon-180B and Streamlit") | |
| st.markdown("---") | |
| st.header("π Daily Journal") | |
| journal_entry = st.text_area("Write your thoughts for today") | |
| if st.button("Save Journal Entry"): | |
| if 'journal_entries' not in st.session_state: | |
| st.session_state.journal_entries = [] | |
| st.session_state.journal_entries.append({ | |
| 'date': datetime.now().strftime("%Y-%m-%d %H:%M:%S"), | |
| 'entry': journal_entry | |
| }) | |
| st.success("Journal entry saved!") | |
| st.toast("Journal entry saved successfully!", icon="β ") | |
| if 'journal_entries' in st.session_state and st.session_state.journal_entries: | |
| st.subheader("Previous Entries") | |
| for entry in st.session_state.journal_entries[-5:]: # Show last 5 entries | |
| st.text(entry['date']) | |
| st.write(entry['entry']) | |
| st.markdown("---") | |
| # Main content area | |
| tab1, tab2 = st.tabs(["Chat", "Tools"]) | |
| with tab1: | |
| # Chat interface | |
| st.header("π¨οΈ Chat with Your AI Buddy") | |
| # Display chat history | |
| chat_container = st.container() | |
| with chat_container: | |
| for message in st.session_state.messages: | |
| with st.chat_message(message["role"]): | |
| st.markdown(message["content"]) | |
| # User input | |
| prompt = st.chat_input("What's on your mind?") | |
| # Clear chat history button | |
| if st.button("Clear Chat History"): | |
| st.session_state.messages = [] | |
| st.experimental_rerun() | |
| if prompt: | |
| st.session_state.messages.append({"role": "user", "content": prompt}) | |
| with st.chat_message("user"): | |
| st.markdown(prompt) | |
| buddy_config = { | |
| "name": st.session_state.buddy_name, | |
| "personality": st.session_state.buddy_personality, | |
| "details": st.session_state.buddy_details | |
| } | |
| with st.chat_message("assistant"): | |
| message_placeholder = st.empty() | |
| full_response = "" | |
| for chunk in chat.stream(get_ai_response(prompt, buddy_config, therapy_technique)): | |
| full_response += chunk.content | |
| message_placeholder.markdown(full_response + "β") | |
| message_placeholder.markdown(full_response) | |
| st.session_state.messages.append({"role": "assistant", "content": full_response}) | |
| # Force a rerun to update the chat history immediately | |
| st.experimental_rerun() | |
| with tab2: | |
| tool_choice = st.selectbox("Select a tool", ["Meditation Timer", "Binaural Beats", "Recommendations"]) | |
| if tool_choice == "Meditation Timer": | |
| show_meditation_timer() | |
| elif tool_choice == "Recommendations": | |
| show_personalized_recommendations() | |
| elif tool_choice == "Binaural Beats": | |
| show_binaural_beats() | |
| # Mood tracker | |
| st.sidebar.markdown("---") | |
| st.sidebar.header("π Mood Tracker") | |
| mood = st.sidebar.slider("How are you feeling today?", 1, 10, 5) | |
| if st.sidebar.button("Log Mood"): | |
| st.sidebar.success(f"Mood logged: {mood}/10") | |
| st.balloons() | |
| # Resources and Emergency Contact | |
| st.sidebar.markdown("---") | |
| st.sidebar.header("π Resources") | |
| st.sidebar.info("If you're in crisis, please reach out for help:") | |
| st.sidebar.markdown("- [Mental Health Resources](https://www.mentalhealth.gov/get-help/immediate-help)") | |
| st.sidebar.markdown("- Emergency Contact: 911 or your local emergency number") | |
| # Inspiration Quote | |
| st.sidebar.markdown("---") | |
| st.sidebar.header("π‘ Daily Inspiration") | |
| if st.sidebar.button("Get Inspirational Quote"): | |
| quotes = [ | |
| "The only way to do great work is to love what you do. - Steve Jobs", | |
| "Believe you can and you're halfway there. - Theodore Roosevelt", | |
| "The future belongs to those who believe in the beauty of their dreams. - Eleanor Roosevelt", | |
| "Strive not to be a success, but rather to be of value. - Albert Einstein", | |
| "The only limit to our realization of tomorrow will be our doubts of today. - Franklin D. Roosevelt", | |
| "Do not wait to strike till the iron is hot; but make it hot by striking. - William Butler Yeats", | |
| "What lies behind us and what lies before us are tiny matters compared to what lies within us. - Ralph Waldo Emerson", | |
| "Success is not final, failure is not fatal: It is the courage to continue that counts. - Winston Churchill", | |
| "Life is what happens when you're busy making other plans. - John Lennon", | |
| "You miss 100% of the shots you don't take. - Wayne Gretzky", | |
| "The best way to predict the future is to create it. - Peter Drucker", | |
| "It is not the strongest of the species that survive, nor the most intelligent, but the one most responsive to change. - Charles Darwin", | |
| "Whether you think you can or you think you can't, you're right. - Henry Ford", | |
| "The only place where success comes before work is in the dictionary. - Vidal Sassoon", | |
| "Do what you can, with what you have, where you are. - Theodore Roosevelt", | |
| "The purpose of our lives is to be happy. - Dalai Lama", | |
| "Success usually comes to those who are too busy to be looking for it. - Henry David Thoreau", | |
| "Your time is limited, so don't waste it living someone else's life. - Steve Jobs", | |
| "Don't be afraid to give up the good to go for the great. - John D. Rockefeller", | |
| "I find that the harder I work, the more luck I seem to have. - Thomas Jefferson", | |
| "Success is not the key to happiness. Happiness is the key to success. - Albert Schweitzer", | |
| "It does not matter how slowly you go, as long as you do not stop. - Confucius", | |
| "If you set your goals ridiculously high and it's a failure, you will fail above everyone else's success. - James Cameron", | |
| "Don't watch the clock; do what it does. Keep going. - Sam Levenson", | |
| "Hardships often prepare ordinary people for an extraordinary destiny. - C.S. Lewis", | |
| "Don't count the days, make the days count. - Muhammad Ali", | |
| "The best revenge is massive success. - Frank Sinatra", | |
| "The only impossible journey is the one you never begin. - Tony Robbins", | |
| "Act as if what you do makes a difference. It does. - William James", | |
| "You are never too old to set another goal or to dream a new dream. - C.S. Lewis", | |
| "If you're going through hell, keep going. - Winston Churchill", | |
| "Dream big and dare to fail. - Norman Vaughan", | |
| "In the middle of every difficulty lies opportunity. - Albert Einstein", | |
| "What we achieve inwardly will change outer reality. - Plutarch", | |
| "I have not failed. I've just found 10,000 ways that won't work. - Thomas Edison", | |
| "It always seems impossible until it's done. - Nelson Mandela", | |
| "The future depends on what you do today. - Mahatma Gandhi", | |
| "Don't wait. The time will never be just right. - Napoleon Hill", | |
| "Quality is not an act, it is a habit. - Aristotle", | |
| "Your life does not get better by chance, it gets better by change. - Jim Rohn", | |
| "The only thing standing between you and your goal is the story you keep telling yourself as to why you can't achieve it. - Jordan Belfort", | |
| "Challenges are what make life interesting; overcoming them is what makes life meaningful. - Joshua J. Marine", | |
| "Opportunities don't happen, you create them. - Chris Grosser", | |
| "I can't change the direction of the wind, but I can adjust my sails to always reach my destination. - Jimmy Dean", | |
| "Start where you are. Use what you have. Do what you can. - Arthur Ashe", | |
| "The secret of getting ahead is getting started. - Mark Twain", | |
| "You donβt have to be great to start, but you have to start to be great. - Zig Ziglar", | |
| "Keep your eyes on the stars, and your feet on the ground. - Theodore Roosevelt", | |
| "The only way to achieve the impossible is to believe it is possible. - Charles Kingsleigh" | |
| ] | |
| random_quote = random.choice(quotes) | |
| st.sidebar.success(random_quote) | |
| # Chat Export | |
| st.sidebar.markdown("---") | |
| if st.sidebar.button("Export Chat History"): | |
| chat_history = "\n".join([f"{msg['role']}: {msg['content']}" for msg in st.session_state.messages]) | |
| st.sidebar.download_button( | |
| label="Download Chat History", | |
| data=chat_history, | |
| file_name="ai_buddy_chat_history.txt", | |
| mime="text/plain" | |
| ) | |
| st.sidebar.success("Chat history ready for download!") | |
| # Display achievements | |
| if 'achievements' in st.session_state and st.session_state.achievements: | |
| st.sidebar.markdown("---") | |
| st.sidebar.header("π Achievements") | |
| for achievement in st.session_state.achievements: | |
| st.sidebar.success(f"Unlocked: {achievement}") | |
| if __name__ == "__main__": | |
| main() |