import streamlit as st from transformers import pipeline import re # Load models emotion_classifier = pipeline("text-classification", model="bhadresh-savani/distilbert-base-uncased-emotion", top_k=1) intent_classifier = pipeline("zero-shot-classification", model="facebook/bart-large-mnli") text_generator = pipeline("text2text-generation", model="google/flan-t5-base", max_new_tokens=100) # Candidate intents candidate_tasks = [ "change mobile plan", "top up balance", "report service outage", "ask for billing support", "reactivate service", "cancel subscription", "check account status", "upgrade device" ] # Emotion scoring urgent_emotions = {"anger", "annoyance", "disgust", "frustration", "sadness"} moderate_emotions = {"confusion", "concern", "nervousness", "fear"} def get_emotion_score(emotion): if emotion in urgent_emotions: return 1.0 elif emotion in moderate_emotions: return 0.6 else: return 0.2 def get_content_score(text, top_intents): score = 0.0 trigger_words = ["out of service", "urgent", "not working", "stopped", "can't", "immediately"] if any(kw in text.lower() for kw in trigger_words): score += 0.3 if any(label in ["top up balance", "reactivate service", "report service outage"] for label in top_intents): score += 0.4 if any(label in ["change mobile plan", "ask for billing support"] for label in top_intents): score += 0.2 return min(score + 0.1, 1.0) def generate_reply(input_text, intent): prompt = f"Generate a polite and helpful customer service reply to this intent: '{intent}'. Customer said: '{input_text}'" return text_generator(prompt)[0]['generated_text'] # UI st.set_page_config(page_title="Customer Support Assistant", layout="centered") st.title("๐Ÿ“ž Smart Customer Support Assistant (for Agents Only)") user_input = st.text_area("Enter customer's message or complaint:", height=150) if st.button("Analyze Message"): if user_input.strip() == "": st.warning("Please enter a customer message.") else: with st.spinner("Processing..."): # Emotion detection emotion_result = emotion_classifier(user_input) emotion_label = emotion_result[0]['label'] emotion_score = get_emotion_score(emotion_label) # Intent detection intent_result = intent_classifier(user_input, candidate_tasks) top_intents = [label for label, score in zip(intent_result['labels'], intent_result['scores']) if score > 0.2] # Content score content_score = get_content_score(user_input, top_intents) # Final decision score final_score = (0.5 * emotion_score) + (0.5 * content_score) st.subheader("๐Ÿงพ System Summary") if final_score < 0.5: st.markdown("### ๐ŸŸข This message was handled automatically.") if top_intents: auto_intent = top_intents[0] auto_reply = generate_reply(user_input, auto_intent) st.markdown("#### ๐Ÿค– Auto-Response Sent to User:") st.success(auto_reply) else: st.info("No clear intent detected. A general auto-reply was used.") else: st.markdown("### ๐Ÿ”ด Human Support Required") # Customer Profile Summary st.markdown("#### ๐Ÿ‘ค Customer Status:") st.write(f"- **Emotion detected**: {emotion_label.capitalize()}") st.write(f"- **Tone**: {'Urgent' if emotion_score > 0.8 else 'Concerned' if emotion_score > 0.5 else 'Calm'}") if top_intents: st.markdown("#### ๐Ÿงฉ Detected Customer Needs:") for intent in top_intents: reply = generate_reply(user_input, intent) st.markdown(f"**โ€ข {intent.capitalize()}**") st.write(f"Recommended Action: {reply}") else: st.warning("No clear intent detected. Manual review recommended.")