Shresthh03's picture
Update app.py
d80a2d0 verified
raw
history blame
5.15 kB
import os
import json
import requests
from datetime import datetime
from flask import Flask, request, jsonify, send_from_directory
from transformers import pipeline
from openai import OpenAI
# Initialize Flask
app = Flask(__name__)
# Initialize OpenAI client
api_key = os.getenv("OPENAI_API_KEY")
if not api_key:
print("Warning: OPENAI_API_KEY not set. Fallback responses will be used.")
client = OpenAI(api_key=api_key) if api_key else None
# Emotion analysis model
try:
emotion_model = pipeline("text-classification", model="j-hartmann/emotion-english-distilroberta-base")
except Exception as e:
print(f"Emotion model error: {e}. Using fallback.")
emotion_model = None
# Load or create user data
USER_FILE = "user_data.json"
if not os.path.exists(USER_FILE):
with open(USER_FILE, "w") as f:
json.dump({"name": None, "age": None, "mood": None, "last_interaction": None, "missed_days": 0, "mode": "emotional_support", "conversation_history": [], "ip": None}, f)
def load_user():
with open(USER_FILE, "r") as f:
return json.load(f)
def save_user(data):
with open(USER_FILE, "w") as f:
json.dump(data, f)
# Helpline data
HELPLINES = {
"US": "National Suicide Prevention Lifeline: 988",
"UK": "Samaritans: 116 123",
"IN": "AASRA: 91-9820466726",
"CA": "Canada Suicide Prevention Service: 988",
"AU": "Lifeline: 13 11 14",
"DE": "Telefonseelsorge: 0800 111 0 111",
"FR": "SOS Amitié: 09 72 39 40 50",
"default": "Please contact a local crisis hotline or emergency services."
}
def get_country_from_ip(ip):
try:
response = requests.get(f"http://ipapi.co/{ip}/country/")
if response.status_code == 200:
return response.text.upper()
except:
pass
return "default"
def detect_critical_situation(message):
keywords = ["suicide", "kill myself", "end my life", "self harm", "hurt myself", "crisis", "emergency", "harm others", "panic attack", "overdose"]
return any(keyword in message.lower() for keyword in keywords)
def get_fallback_reply(mode, emotion):
if mode == "emotional_support":
return "I hear you. You're not alone—let's talk more." if emotion == "sadness" else "That sounds tough. I'm here to support you."
else:
return "For knowledge, ask a specific question. I'm here to help."
@app.route("/chat", methods=["POST"])
def chat():
try:
data = request.get_json()
user_message = data.get("message", "")
mode = data.get("mode", "emotional_support")
voice_tone = data.get("voice_tone", "neutral tone")
user_ip = request.remote_addr
user = load_user()
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
user["last_interaction"] = now
user["mode"] = mode
user["ip"] = user_ip
user["conversation_history"].append({"role": "user", "content": user_message, "timestamp": now})
emotion = "neutral"
if emotion_model:
try:
emotion = emotion_model(user_message)[0]["label"]
except Exception as e:
print(f"Emotion analysis error: {e}")
user["mood"] = emotion
if detect_critical_situation(user_message):
country = get_country_from_ip(user_ip)
helpline = HELPLINES.get(country, HELPLINES["default"])
reply = f"I'm concerned. Call {helpline} now. Talk to someone."
user["conversation_history"].append({"role": "assistant", "content": reply, "timestamp": now})
save_user(user)
return jsonify({"reply": reply, "emotion": emotion})
history = user["conversation_history"][-10:]
system_prompt = f"You are a supportive friend. Respond briefly, accurately, and calmly. In emotional_support mode: empathize and motivate gently. In knowledge mode: give short, factual answers. Avoid repetition. Current mood: {emotion}. Mode: {mode}. Voice tone: {voice_tone}."
messages = [{"role": "system", "content": system_prompt}] + history
if client:
try:
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=messages,
max_tokens=80,
temperature=0.5
)
reply = response.choices[0].message.content.strip()
except Exception as e:
print(f"OpenAI API error: {e}. Using fallback.")
reply = get_fallback_reply(mode, emotion)
else:
reply = get_fallback_reply(mode, emotion)
user["conversation_history"].append({"role": "assistant", "content": reply, "timestamp": now})
save_user(user)
return jsonify({"reply": reply, "emotion": emotion})
except Exception as e:
print(f"General error: {e}")
return jsonify({"reply": "Something went wrong. Please check your setup and try again.", "emotion": "neutral"}), 500
@app.route("/")
def index():
return send_from_directory(".", "index.html")
if __name__ == "__main__":
app.run(host="0.0.0.0", port=7860)