parthvishaht's picture
Updated prompt in app.py
898d4db
import logging
import os
import random
from openai import OpenAI
from gtts import gTTS
import gradio as gr
# Configure logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
# Initialize OpenAI client with environment variable
try:
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
if not os.environ["OPENAI_API_KEY"]:
raise ValueError("OPENAI_API_KEY environment variable not set!")
client = OpenAI()
except Exception as e:
logger.error(f"Failed to initialize OpenAI client: {e}")
raise
# Helper functions
def read_chat_file(chat_file):
"""Read the uploaded chat file and return its lines."""
try:
with open(chat_file.name, "r", encoding="utf-8") as f:
return f.readlines()
except Exception as e:
logger.error(f"Error reading chat file: {e}")
raise
def sample_messages(lines):
"""Sample up to 100 random lines from the chat."""
if len(lines) >= 100:
start_index = random.randint(0, len(lines) - 100)
return lines[start_index:start_index + 100]
return lines
def summarize_chat(messages_text, name):
"""Generate a summary of the chat using OpenAI."""
prompt = f"""Summarize the following WhatsApp conversation in 2–3 sentences, focusing only on notable events, emotional states, and meaningful interactions between 'You' ({name}) and the other user.
Highlight specific events involving {name}—especially any related to health, job, mental health, or finances.
If no major event is present, capture any noteworthy daily moments (e.g., cooking, commuting, funny moments).
Describe how {name} is feeling and what they are going through, using the format: {name} is feeling [emotion] and going through [event].
Always include the name of the other user {name} is talking to.
Exclude all sexual content.
Do not mention if "no major event" occurred—just describe what's there.
If a funny joke or banter is present, include that specific message in quotes for potential reuse.
Conversation:
{messages_text}"""
try:
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "You are a helpful assistant that summarizes concisely about how the user is feeling and what interactions are happening."},
{"role": "user", "content": prompt}
],
max_tokens=500,
temperature=0.8
)
return response.choices[0].message.content.strip()
except Exception as e:
logger.error(f"Error generating summary: {e}")
raise
def extract_story(messages_text):
"""Extract a happy interaction from the chat."""
prompt = f"""Review the following conversation and extract **one clear, HAPPY & exciting interaction** between participants (e.g., playful plans like "can’t wait to see you" or "let’s cook together","you got this").
- Choose only **one uplifting moment** from the chat and summarize it in maximum 15 words about why they said it.
- **Exclude all sexual or suggestive content.**
Conversation:
{messages_text}"""
try:
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "You are a cute friend finding light-hearted, heartwarming, and positive messages."},
{"role": "user", "content": prompt}
],
max_tokens=100,
temperature=0.5
)
return response.choices[0].message.content.strip()
except Exception as e:
logger.error(f"Error generating story: {e}")
raise
def generate_motivation(summary, story, name):
"""Generate a motivational message about running."""
prompt = prompt = f"""
Using this summary: '{summary}'
And this interaction: '{story}'
Craft a short, personal, upbeat motivational message for {name} about running.
**Guidelines**:
- Mention the other user by name and highlight the moments they shared together.
- Emphasize how the other user brings energy and small transformations to daily life—and so does running!
- Summarize the interactive story and why it was so uplifiting., include it *exactly as it appears* and tie it to the moment and to running.
- Acknowledge the entire SUMMARY.
*IMPORTANT*
- If the summary or story includes *sadness, worry, or feeling overwhelmed*:
- Acknowledge the feeling with compassion.
- Show excitement that they overcame it!!!
- If the memory is lighthearted or happy:
- Use a tone that is FUNNY, EXCITING, and full of JOY 🎉
- Add a playful or empowering motivational quote.
**Constraints**:
- Word limit: 50 words max.
- Must include the other user's name in the message.
- End the message with: ({name})
"""
try:
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "You are a motivational coach using personal events and stories from a user's life."},
{"role": "user", "content": prompt}
],
max_tokens=100,
temperature=0.7
)
return response.choices[0].message.content.strip()
except Exception as e:
logger.error(f"Error generating motivation: {e}")
raise
def create_audio(motivation):
"""Generate and save audio from the motivation text."""
try:
tts = gTTS(motivation, lang="en")
audio_file = "motivation.mp3"
tts.save(audio_file)
return audio_file
except Exception as e:
logger.error(f"Error generating audio: {e}")
raise
# Main processing function
def motivate_me(chat_file, name):
"""Process the chat and return summary, story, motivation, and audio."""
if not name:
logger.warning("No name provided")
return "Please enter your name!", "", "", None
if not chat_file:
logger.warning("No chat file uploaded")
return "Please upload a WhatsApp chat file!", "", "", None
try:
lines = read_chat_file(chat_file)
messages = sample_messages(lines)
messages_text = "".join(messages)
logger.info(f"Selected random 500 lines, last 5: {messages[-5:]}")
if not messages:
return "No messages found in the selected 500 lines!", "", "", None
summary = summarize_chat(messages_text, name)
story = extract_story(messages_text)
motivation = generate_motivation(summary, story, name)
audio_file = create_audio(motivation)
return summary, story, motivation, audio_file
except Exception as e:
logger.error(f"Error processing chat: {e}")
return f"Error: {str(e)}", "", "", None
# Gradio interface
interface = gr.Interface(
fn=motivate_me,
inputs=[
gr.File(label="Upload WhatsApp Chat (_chat.txt)"),
gr.Textbox(label="Your Name", value="", placeholder="Enter your name (e.g., Jamie)")
],
outputs=[
gr.Textbox(label="Conversation Summary"),
gr.Textbox(label="Wholesome Interaction"),
gr.Textbox(label="Your Motivation"),
gr.Audio(label="Listen Up!")
],
title="Run Buddy: Your Personal Motivator",
description="Upload your WhatsApp chat (_chat.txt) and enter your name to get a summary, a happy moment, and a running pep talk from 500 random messages! Try the sample below or download it [here](https://huggingface.co/spaces/justlearningin2025/RunBuddyMotivator/raw/main/sample_chat.txt).",
examples=[["sample_chat.txt", "Jamie"]],
theme="soft"
)
if __name__ == "__main__":
interface.launch()