feature : multiagent breakup recovery
This commit is contained in:
parent
842b1740de
commit
c9369baacd
3 changed files with 236 additions and 0 deletions
42
ai_agent_tutorials/ai_breakup_recovery_agent/.gitignore
vendored
Normal file
42
ai_agent_tutorials/ai_breakup_recovery_agent/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
# Python-related
|
||||||
|
__pycache__/
|
||||||
|
*.pyc
|
||||||
|
*.pyo
|
||||||
|
*.pyd
|
||||||
|
*.db
|
||||||
|
*.sqlite3
|
||||||
|
*.log
|
||||||
|
*.json
|
||||||
|
|
||||||
|
# Environment and secrets
|
||||||
|
.env
|
||||||
|
*.env
|
||||||
|
|
||||||
|
# Streamlit cache and temporary files
|
||||||
|
.streamlit/
|
||||||
|
.history/
|
||||||
|
.cache/
|
||||||
|
*.stcache
|
||||||
|
.stcache/
|
||||||
|
|
||||||
|
# Logs and temp files
|
||||||
|
*.log
|
||||||
|
*.out
|
||||||
|
*.err
|
||||||
|
|
||||||
|
# IDE and editor config files
|
||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*.bak
|
||||||
|
*.tmp
|
||||||
|
|
||||||
|
# System files
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# OCR and image processing cache (if any)
|
||||||
|
~/.EasyOCR/
|
||||||
|
*.easyocr
|
||||||
|
*.txt
|
||||||
122
ai_agent_tutorials/ai_breakup_recovery_agent/agents.py
Normal file
122
ai_agent_tutorials/ai_breakup_recovery_agent/agents.py
Normal file
|
|
@ -0,0 +1,122 @@
|
||||||
|
from agno.agent import Agent
|
||||||
|
from agno.team.team import Team
|
||||||
|
from agno.models.openai import OpenAIChat
|
||||||
|
from agno.tools.duckduckgo import DuckDuckGoTools
|
||||||
|
from PIL import Image
|
||||||
|
import easyocr
|
||||||
|
|
||||||
|
# --- Therapist Agent ---
|
||||||
|
def create_therapist_agent():
|
||||||
|
return Agent(
|
||||||
|
name="Therapist Agent",
|
||||||
|
role="You are a therapist who validates feelings and encourages reflection without judgment.",
|
||||||
|
instructions=[
|
||||||
|
"Listen to the user's feelings with empathy and compassion.",
|
||||||
|
"Ask reflective questions to help them explore their emotions.",
|
||||||
|
"Offer coping strategies without being dismissive.",
|
||||||
|
"Validate their experiences and provide emotional support.",
|
||||||
|
],
|
||||||
|
model=OpenAIChat(id="gpt-4o-mini"),
|
||||||
|
tools=[DuckDuckGoTools()],
|
||||||
|
add_datetime_to_instructions=True, # Add timestamp context
|
||||||
|
show_tool_calls=True,
|
||||||
|
markdown=True
|
||||||
|
)
|
||||||
|
|
||||||
|
# --- Closure Agent ---
|
||||||
|
def create_closure_agent():
|
||||||
|
return Agent(
|
||||||
|
name="Closure Agent",
|
||||||
|
role="You write emotional closure messages the user *should not* send.",
|
||||||
|
instructions=[
|
||||||
|
"Create emotional messages that express raw, honest feelings.",
|
||||||
|
"The messages should NOT be sent — they are only for emotional release.",
|
||||||
|
"Format the output clearly with a header: **Message Drafts You Shouldn’t Send**",
|
||||||
|
"Ensure the tone is heartfelt, authentic, and honest.",
|
||||||
|
],
|
||||||
|
model=OpenAIChat(id="gpt-4o-mini"),
|
||||||
|
tools=[DuckDuckGoTools()],
|
||||||
|
add_datetime_to_instructions=True, # Add timestamp context
|
||||||
|
show_tool_calls=True,
|
||||||
|
markdown=True
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# --- Routine Planner Agent ---
|
||||||
|
def create_routine_agent():
|
||||||
|
"""Creates the Routine Planner Agent with recovery routines."""
|
||||||
|
return Agent(
|
||||||
|
name="Routine Planner Agent",
|
||||||
|
role="Create a realistic daily routine to help someone emotionally recover after a breakup.",
|
||||||
|
instructions=[
|
||||||
|
"Suggest a balanced daily routine with healthy habits.",
|
||||||
|
"Include time for self-reflection, creative outlets, and physical activities.",
|
||||||
|
"Suggest social interactions, like reconnecting with friends or family.",
|
||||||
|
"Include healthy distractions, such as hobbies, reading, or new experiences.",
|
||||||
|
"Format the output clearly with a header: **Daily Recovery Routine**",
|
||||||
|
],
|
||||||
|
model=OpenAIChat(id="gpt-4o-mini"),
|
||||||
|
tools=[DuckDuckGoTools()],
|
||||||
|
add_datetime_to_instructions=True,
|
||||||
|
show_tool_calls=True,
|
||||||
|
markdown=True
|
||||||
|
)
|
||||||
|
|
||||||
|
# --- Brutal Honesty Agent ---
|
||||||
|
def create_honesty_agent():
|
||||||
|
"""Creates the Brutal Honesty Agent with no-nonsense, direct responses."""
|
||||||
|
return Agent(
|
||||||
|
name="Brutal Honesty Agent",
|
||||||
|
role="Be brutally honest and objective about what went wrong and why the user needs to move on. No sugar-coating.",
|
||||||
|
instructions=[
|
||||||
|
"Give raw, direct, and objective feedback about the breakup.",
|
||||||
|
"Explain why the relationship failed with clear, straightforward reasoning.",
|
||||||
|
"Use blunt, factual language. No sugar-coating or emotional cushioning.",
|
||||||
|
"Include reasons why the user should move on, based on the situation.",
|
||||||
|
"Format the output clearly with a header: **Brutal Honesty**",
|
||||||
|
],
|
||||||
|
model=OpenAIChat(id="gpt-4o-mini"),
|
||||||
|
tools=[DuckDuckGoTools()],
|
||||||
|
add_datetime_to_instructions=True,
|
||||||
|
show_tool_calls=True,
|
||||||
|
markdown=True
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# # --- Texts Analyzer Agent (Updated with easyocr) ---
|
||||||
|
# def extract_text_with_easyocr(image):
|
||||||
|
# """Extract text from image using EasyOCR."""
|
||||||
|
# reader = easyocr.Reader(['en']) # Specify language
|
||||||
|
# results = reader.readtext(image)
|
||||||
|
|
||||||
|
# # Extract and combine text
|
||||||
|
# extracted_text = " ".join([result[1] for result in results])
|
||||||
|
# return extracted_text
|
||||||
|
|
||||||
|
# --- Team Leader (Breakup Recovery Team) ---
|
||||||
|
def create_breakup_team():
|
||||||
|
return Team(
|
||||||
|
name="Breakup Recovery Team",
|
||||||
|
mode="coordinate", # Team execution mode: coordinate or parallel
|
||||||
|
model=OpenAIChat(id="gpt-4o-mini"),
|
||||||
|
members=[
|
||||||
|
create_therapist_agent(),
|
||||||
|
create_closure_agent(),
|
||||||
|
create_routine_agent(), # Added Routine Planner Agent
|
||||||
|
create_honesty_agent(), # Added Brutal Honesty Agent
|
||||||
|
# extract_text_with_easyocr()
|
||||||
|
],
|
||||||
|
description="You are a team helping someone recover from a breakup.",
|
||||||
|
instructions=[
|
||||||
|
"First, ask the Therapist Agent to help the user explore their emotions.",
|
||||||
|
"Then, ask the Closure Agent to create unsent emotional messages.",
|
||||||
|
"Next, ask the Routine Planner Agent to suggest a healthy daily routine.",
|
||||||
|
"Finally, ask the Brutal Honesty Agent to give direct and objective feedback.",
|
||||||
|
"Summarize and refine all responses into a personalized recovery guide.",
|
||||||
|
"Ensure the responses are supportive, encouraging, and insightful.",
|
||||||
|
"Use markdown formatting for clear, readable output.",
|
||||||
|
],
|
||||||
|
add_datetime_to_instructions=True, # Add timestamp context
|
||||||
|
show_members_responses=True, # Display individual agent responses
|
||||||
|
markdown=True,
|
||||||
|
)
|
||||||
72
ai_agent_tutorials/ai_breakup_recovery_agent/app.py
Normal file
72
ai_agent_tutorials/ai_breakup_recovery_agent/app.py
Normal file
|
|
@ -0,0 +1,72 @@
|
||||||
|
import streamlit as st
|
||||||
|
from agents import create_breakup_team
|
||||||
|
from PIL import Image
|
||||||
|
|
||||||
|
# --- Streamlit Layout ---
|
||||||
|
st.title("💔 Breakup Recovery Agent Team")
|
||||||
|
st.write("Receive support and emotional outlet messages from specialized AI agents.")
|
||||||
|
|
||||||
|
# --- API Keys Input ---
|
||||||
|
openai_api_key = st.sidebar.text_input("OpenAI API Key", type="password")
|
||||||
|
submit_button = st.sidebar.button("Submit")
|
||||||
|
|
||||||
|
# --- Store API Keys ---
|
||||||
|
if submit_button:
|
||||||
|
if openai_api_key:
|
||||||
|
st.session_state["openai_api_key"] = openai_api_key
|
||||||
|
st.success("API keys saved successfully!")
|
||||||
|
else:
|
||||||
|
st.error("Please enter both API keys!")
|
||||||
|
|
||||||
|
# --- User Input ---
|
||||||
|
user_input = st.text_area("Describe how you're feeling...")
|
||||||
|
print(user_input)
|
||||||
|
|
||||||
|
# --- Image Upload ---
|
||||||
|
uploaded_image = st.file_uploader("Upload a chat screenshot (optional)", type=["png", "jpg", "jpeg"])
|
||||||
|
|
||||||
|
# --- Display Uploaded Image ---
|
||||||
|
extracted_text = ""
|
||||||
|
if uploaded_image:
|
||||||
|
image = Image.open(uploaded_image)
|
||||||
|
st.image(image, caption="Uploaded Screenshot", use_column_width=True)
|
||||||
|
|
||||||
|
# # ✅ Extract text from the image
|
||||||
|
# extracted_text = extract_text_with_easyocr(image)
|
||||||
|
# st.text_area("Extracted Text from Image:", extracted_text)
|
||||||
|
|
||||||
|
# --- Execute Agent Team ---
|
||||||
|
if st.button("Get Recovery Support"):
|
||||||
|
with st.spinner("Agents are processing..."):
|
||||||
|
if not user_input and not uploaded_image:
|
||||||
|
st.error("Please enter what you feel.")
|
||||||
|
else:
|
||||||
|
breakup_team = create_breakup_team()
|
||||||
|
|
||||||
|
# Set environment variables
|
||||||
|
import os
|
||||||
|
os.environ["OPENAI_API_KEY"] = st.session_state.get("openai_api_key", "")
|
||||||
|
# os.environ["AGNO_API_KEY"] = st.session_state.get("agno_api_key", "")
|
||||||
|
|
||||||
|
# Prepare the input
|
||||||
|
input_data = user_input
|
||||||
|
if uploaded_image:
|
||||||
|
input_data += "\n\n[Attached Image Included]" # Add image indicator
|
||||||
|
|
||||||
|
# Execute the team
|
||||||
|
response = breakup_team.run(user_input)
|
||||||
|
|
||||||
|
# Display responses
|
||||||
|
st.subheader("💡 Team's Responses")
|
||||||
|
|
||||||
|
# Display individual agent responses
|
||||||
|
if response.member_responses:
|
||||||
|
for member_response in response.member_responses:
|
||||||
|
st.markdown(f"### 🛡️ {member_response.agent_id}")
|
||||||
|
st.write(member_response.content)
|
||||||
|
else:
|
||||||
|
st.warning("⚠️ No individual agent responses received. Showing team leader's summary only.")
|
||||||
|
|
||||||
|
# Display team leader's final summary
|
||||||
|
st.subheader("📜 Team Leader's Summary")
|
||||||
|
st.write(response.content)
|
||||||
Loading…
Reference in a new issue