from agno.agent import Agent from agno.models.google import Gemini from agno.media import Image as AgnoImage from agno.tools.duckduckgo import DuckDuckGoTools import streamlit as st from typing import List, Optional import logging from pathlib import Path import tempfile import os # Configure logging for errors only logging.basicConfig(level=logging.ERROR) logger = logging.getLogger(__name__) def initialize_agents(api_key: str) -> tuple[Agent, Agent, Agent, Agent]: try: model = Gemini(id="gemini-2.0-flash-exp", api_key=api_key) therapist_agent = Agent( model=model, name="Therapist Agent", instructions=[ "You are an empathetic therapist that:", "1. Listens with empathy and validates feelings", "2. Uses gentle humor to lighten the mood", "3. Shares relatable breakup experiences", "4. Offers comforting words and encouragement", "5. Analyzes both text and image inputs for emotional context", "Be supportive and understanding in your responses" ], markdown=True ) closure_agent = Agent( model=model, name="Closure Agent", instructions=[ "You are a closure specialist that:", "1. Creates emotional messages for unsent feelings", "2. Helps express raw, honest emotions", "3. Formats messages clearly with headers", "4. Ensures tone is heartfelt and authentic", "Focus on emotional release and closure" ], markdown=True ) routine_planner_agent = Agent( model=model, name="Routine Planner Agent", instructions=[ "You are a recovery routine planner that:", "1. Designs 7-day recovery challenges", "2. Includes fun activities and self-care tasks", "3. Suggests social media detox strategies", "4. Creates empowering playlists", "Focus on practical recovery steps" ], markdown=True ) brutal_honesty_agent = Agent( model=model, name="Brutal Honesty Agent", tools=[DuckDuckGoTools()], instructions=[ "You are a direct feedback specialist that:", "1. Gives raw, objective feedback about breakups", "2. Explains relationship failures clearly", "3. Uses blunt, factual language", "4. Provides reasons to move forward", "Focus on honest insights without sugar-coating" ], markdown=True ) return therapist_agent, closure_agent, routine_planner_agent, brutal_honesty_agent except Exception as e: st.error(f"Error initializing agents: {str(e)}") return None, None, None, None # Set page config and UI elements st.set_page_config( page_title="💔 Breakup Recovery Squad", page_icon="💔", layout="wide" ) # Sidebar for API key input with st.sidebar: st.header("🔑 API Configuration") if "api_key_input" not in st.session_state: st.session_state.api_key_input = "" api_key = st.text_input( "Enter your Gemini API Key", value=st.session_state.api_key_input, type="password", help="Get your API key from Google AI Studio", key="api_key_widget" ) if api_key != st.session_state.api_key_input: st.session_state.api_key_input = api_key if api_key: st.success("API Key provided! ✅") else: st.warning("Please enter your API key to proceed") st.markdown(""" To get your API key: 1. Go to [Google AI Studio](https://makersuite.google.com/app/apikey) 2. Enable the Generative Language API in your [Google Cloud Console](https://console.developers.google.com/apis/api/generativelanguage.googleapis.com) """) # Main content st.title("💔 Breakup Recovery Squad") st.markdown(""" ### Your AI-powered breakup recovery team is here to help! Share your feelings and chat screenshots, and we'll help you navigate through this tough time. """) # Input section col1, col2 = st.columns(2) with col1: st.subheader("Share Your Feelings") user_input = st.text_area( "How are you feeling? What happened?", height=150, placeholder="Tell us your story..." ) with col2: st.subheader("Upload Chat Screenshots") uploaded_files = st.file_uploader( "Upload screenshots of your chats (optional)", type=["jpg", "jpeg", "png"], accept_multiple_files=True, key="screenshots" ) if uploaded_files: for file in uploaded_files: st.image(file, caption=file.name, use_container_width=True) # Process button and API key check if st.button("Get Recovery Plan 💝", type="primary"): if not st.session_state.api_key_input: st.warning("Please enter your API key in the sidebar first!") else: therapist_agent, closure_agent, routine_planner_agent, brutal_honesty_agent = initialize_agents(st.session_state.api_key_input) if all([therapist_agent, closure_agent, routine_planner_agent, brutal_honesty_agent]): if user_input or uploaded_files: try: st.header("Your Personalized Recovery Plan") def process_images(files): processed_images = [] for file in files: try: temp_dir = tempfile.gettempdir() temp_path = os.path.join(temp_dir, f"temp_{file.name}") with open(temp_path, "wb") as f: f.write(file.getvalue()) agno_image = AgnoImage(filepath=Path(temp_path)) processed_images.append(agno_image) except Exception as e: logger.error(f"Error processing image {file.name}: {str(e)}") continue return processed_images all_images = process_images(uploaded_files) if uploaded_files else [] # Therapist Analysis with st.spinner("🤗 Getting empathetic support..."): therapist_prompt = f""" Analyze the emotional state and provide empathetic support based on: User's message: {user_input} Please provide a compassionate response with: 1. Validation of feelings 2. Gentle words of comfort 3. Relatable experiences 4. Words of encouragement """ response = therapist_agent.run( message=therapist_prompt, images=all_images ) st.subheader("🤗 Emotional Support") st.markdown(response.content) # Closure Messages with st.spinner("✍️ Crafting closure messages..."): closure_prompt = f""" Help create emotional closure based on: User's feelings: {user_input} Please provide: 1. Template for unsent messages 2. Emotional release exercises 3. Closure rituals 4. Moving forward strategies """ response = closure_agent.run( message=closure_prompt, images=all_images ) st.subheader("✍️ Finding Closure") st.markdown(response.content) # Recovery Plan with st.spinner("📅 Creating your recovery plan..."): routine_prompt = f""" Design a 7-day recovery plan based on: Current state: {user_input} Include: 1. Daily activities and challenges 2. Self-care routines 3. Social media guidelines 4. Mood-lifting music suggestions """ response = routine_planner_agent.run( message=routine_prompt, images=all_images ) st.subheader("📅 Your Recovery Plan") st.markdown(response.content) # Honest Feedback with st.spinner("💪 Getting honest perspective..."): honesty_prompt = f""" Provide honest, constructive feedback about: Situation: {user_input} Include: 1. Objective analysis 2. Growth opportunities 3. Future outlook 4. Actionable steps """ response = brutal_honesty_agent.run( message=honesty_prompt, images=all_images ) st.subheader("💪 Honest Perspective") st.markdown(response.content) except Exception as e: logger.error(f"Error during analysis: {str(e)}") st.error("An error occurred during analysis. Please check the logs for details.") else: st.warning("Please share your feelings or upload screenshots to get help.") else: st.error("Failed to initialize agents. Please check your API key.") # Footer st.markdown("---") st.markdown("""
Made with ❤️ by the Breakup Recovery Squad
Share your recovery journey with #BreakupRecoverySquad