282 lines
No EOL
11 KiB
Python
282 lines
No EOL
11 KiB
Python
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("""
|
|
<div style='text-align: center'>
|
|
<p>Made with ❤️ by the Breakup Recovery Squad</p>
|
|
<p>Share your recovery journey with #BreakupRecoverySquad</p>
|
|
</div>
|
|
""", unsafe_allow_html=True) |