waleedmohd's picture
Update app.py
d1f8c20 verified
raw
history blame
11 kB
import gradio as gr
import re
import json
import time
from datetime import datetime
# Simple language detection function
def simple_detect_language(text):
arabic_pattern = re.compile(r'[\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF]+')
if arabic_pattern.search(text):
return "ar"
return "en"
# Try to import transformers for Arabic NLP
try:
from transformers import pipeline
arabic_nlp = pipeline("text-classification", model="papluca/xlm-roberta-base-language-detection")
ARABIC_NLP_AVAILABLE = True
def detect_language_with_nlp(text):
result = arabic_nlp(text)
return result[0]['label']
except ImportError:
ARABIC_NLP_AVAILABLE = False
# Import customer service enhancements
try:
from customer_service_enhancements import (
ENHANCED_CUSTOMER_SERVICE_PHRASES_AR,
ENHANCED_CUSTOMER_SERVICE_PHRASES_EN,
BANKING_FAQS_AR,
BANKING_FAQS_EN,
BANKING_GLOSSARY_AR,
BANKING_GLOSSARY_EN,
get_enhanced_response,
handle_banking_faq,
offer_satisfaction_survey,
get_banking_term_definition
)
CUSTOMER_SERVICE_ENHANCEMENTS_AVAILABLE = True
except ImportError:
CUSTOMER_SERVICE_ENHANCEMENTS_AVAILABLE = False
ENHANCED_CUSTOMER_SERVICE_PHRASES_AR = {
"greeting": ["مرحبًا بك في بنك أم درمان الوطني! كيف يمكنني مساعدتك اليوم؟"],
"thanks": ["شكرًا لتواصلك مع بنك أم درمان الوطني!"],
"follow_up": ["هل هناك خدمة أخرى يمكنني مساعدتك بها؟"]
}
ENHANCED_CUSTOMER_SERVICE_PHRASES_EN = {
"greeting": ["Welcome to Omdurman National Bank! How may I assist you today?"],
"thanks": ["Thank you for contacting Omdurman National Bank!"],
"follow_up": ["Is there anything else I can help you with?"]
}
# Omdurman National Bank-specific guidelines
ONB_GUIDELINES_AR = {
"balance": "يمكنك التحقق من رصيدك عبر الإنترنت أو عبر تطبيق الهاتف الخاص ببنك أم درمان الوطني.",
"lost_card": "في حالة فقدان البطاقة، اتصل بالرقم 249-123-456-789 فورًا.",
"loan": "شروط القرض تشمل الحد الأدنى للدخل (5000 جنيه سوداني) وتاريخ ائتماني جيد.",
"transfer": "لتحويل الأموال، استخدم تطبيق الهاتف أو الخدمة المصرفية عبر الإنترنت.",
"new_account": "لفتح حساب جديد، قم بزيارة أقرب فرع مع جواز سفرك أو هويتك الوطنية.",
"interest_rates": "أسعار الفائدة على الودائع تتراوح بين 5% إلى 10% سنويًا.",
"branches": "فروعنا موجودة في أم درمان، الخرطوم، وبورتسودان.",
"working_hours": "ساعات العمل من 8 صباحًا إلى 3 مساءً من الأحد إلى الخميس.",
"contact": "الاتصال بنا على الرقم 249-123-456-789 أو عبر البريد الإلكتروني [email protected]."
}
ONB_GUIDELINES_EN = {
"balance": "You can check your balance online or via the ONB mobile app.",
"lost_card": "In case of a lost card, call 249-123-456-789 immediately.",
"loan": "Loan requirements include minimum income (5000 SDG) and good credit history.",
"transfer": "To transfer funds, use the mobile app or online banking service.",
"new_account": "To open a new account, visit your nearest branch with your passport or national ID.",
"interest_rates": "Interest rates on deposits range from 5% to 10% annually.",
"branches": "Our branches are located in Omdurman, Khartoum, and Port Sudan.",
"working_hours": "Working hours are from 8 AM to 3 PM, Sunday to Thursday.",
"contact": "Contact us at 249-123-456-789 or via email at [email protected]."
}
# Quick action buttons
QUICK_ACTIONS_AR = [
{"text": "تحقق من الرصيد", "intent": "balance"},
{"text": "الإبلاغ عن بطاقة مفقودة", "intent": "lost_card"},
{"text": "معلومات القرض", "intent": "loan"},
{"text": "تحويل الأموال", "intent": "transfer"},
{"text": "فتح حساب جديد", "intent": "new_account"},
{"text": "أسعار الفائدة", "intent": "interest_rates"},
{"text": "مواقع الفروع", "intent": "branches"},
{"text": "ساعات العمل", "intent": "working_hours"},
{"text": "اتصل بنا", "intent": "contact"}
]
QUICK_ACTIONS_EN = [
{"text": "Check Balance", "intent": "balance"},
{"text": "Report Lost Card", "intent": "lost_card"},
{"text": "Loan Information", "intent": "loan"},
{"text": "Transfer Funds", "intent": "transfer"},
{"text": "Open New Account", "intent": "new_account"},
{"text": "Interest Rates", "intent": "interest_rates"},
{"text": "Branch Locations", "intent": "branches"},
{"text": "Working Hours", "intent": "working_hours"},
{"text": "Contact Us", "intent": "contact"}
]
# Function to get a random phrase
def get_random_phrase(category, language):
import random
if language == "ar":
return random.choice(ENHANCED_CUSTOMER_SERVICE_PHRASES_AR[category])
else:
return random.choice(ENHANCED_CUSTOMER_SERVICE_PHRASES_EN[category])
def classify_intent(message: str):
menu_keywords = ["menu", "options", "help", "قائمة", "خيارات", "مساعدة"]
message_lower = message.lower()
for keyword in menu_keywords:
if keyword in message_lower:
return "menu"
for intent_key, keywords in INTENT_KEYWORDS.items():
for keyword in keywords:
if keyword.lower() in message_lower:
return intent_key
return "unknown"
# Function to log customer interactions
def log_interaction(user_message, bot_response, intent, language):
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
log_entry = {
"timestamp": timestamp,
"user_message": user_message,
"bot_response": bot_response,
"intent": intent,
"language": language
}
try:
with open("interaction_logs.jsonl", "a") as f:
f.write(json.dumps(log_entry) + "\n")
except Exception as e:
print(f"Error logging interaction: {e}")
# Function to generate responses
def respond(message: str):
if not message.strip():
return {
"ar": "الرجاء كتابة سؤالك.",
"en": "Please type your question."
}
# Detect language
if ARABIC_NLP_AVAILABLE:
language = detect_language_with_nlp(message)
if language != "ar" and language != "en":
language = "en"
else:
language = simple_detect_language(message)
# Classify intent
intent = classify_intent(message)
# Prepare responses
responses = {
"ar": "",
"en": ""
}
# Handle menu request
if intent == "menu":
responses["ar"] = MENU_AR
responses["en"] = MENU_EN
log_interaction(message, responses[language], "menu", language)
return responses
# Handle banking FAQ
if CUSTOMER_SERVICE_ENHANCEMENTS_AVAILABLE:
faq_answer = handle_banking_faq(message, language)
if faq_answer:
responses["ar"] = f"{get_random_phrase('greeting', 'ar')}<br><br>{faq_answer}<br><br>{get_random_phrase('follow_up', 'ar')}"
responses["en"] = f"{get_random_phrase('greeting', 'en')}<br><br>{faq_answer}<br><br>{get_random_phrase('follow_up', 'en')}"
log_interaction(message, responses[language], "faq", language)
return responses
# Handle banking term definition
if CUSTOMER_SERVICE_ENHANCEMENTS_AVAILABLE:
term_definition = get_banking_term_definition(message, language)
if term_definition:
responses["ar"] = f"{get_random_phrase('greeting', 'ar')}<br><br>{term_definition}<br><br>{get_random_phrase('follow_up', 'ar')}"
responses["en"] = f"{get_random_phrase('greeting', 'en')}<br><br>{term_definition}<br><br>{get_random_phrase('follow_up', 'en')}"
log_interaction(message, responses[language], "term", language)
return responses
# Handle recognized intents
if intent != "unknown":
if CUSTOMER_SERVICE_ENHANCEMENTS_AVAILABLE:
responses["ar"] = get_enhanced_response(intent, "ar")
responses["en"] = get_enhanced_response(intent, "en")
else:
responses["ar"] = f"{get_random_phrase('greeting', 'ar')}<br><br>{ONB_GUIDELINES_AR.get(intent, 'عذرًا، لم يتم التعرف على الخيار المحدد.')}<br><br>{get_random_phrase('follow_up', 'ar')}"
responses["en"] = f"{get_random_phrase('greeting', 'en')}<br><br>{ONB_GUIDELINES_EN.get(intent, 'Sorry, the selected option was not recognized.')}<br><br>{get_random_phrase('follow_up', 'en')}"
else:
responses["ar"] = "عذرًا، لم أفهم سؤالك. إليك قائمة بالخدمات المتاحة:" + MENU_AR
responses["en"] = "Sorry, I didn't understand your question. Here's a menu of available services:" + MENU_EN
log_interaction(message, responses[language], intent, language)
return responses
# Gradio Interface
with gr.Blocks() as demo:
selected_lang = gr.State(value="ar")
user_name = gr.State(value=None)
with gr.Row():
gr.Markdown("# Omdurman National Bank Virtual Assistant")
with gr.Row():
language_btn = gr.Radio(["العربية", "English"], value="العربية", label="Language")
chatbot = gr.Chatbot(height=400)
with gr.Row():
text_input = gr.Textbox(placeholder="Type your question here", label="")
submit_btn = gr.Button("Send", variant="primary")
with gr.Row():
menu_btn = gr.Button("Show Menu")
live_agent_btn = gr.Button("Connect to Live Agent")
survey_btn = gr.Button("Feedback")
# Link inputs and buttons to response functions
submit_btn.click(
fn=on_submit,
inputs=[text_input, chatbot, selected_lang, user_name],
outputs=[text_input, chatbot, user_name]
)
menu_btn.click(
fn=show_menu,
inputs=[chatbot, selected_lang],
outputs=[chatbot]
)
live_agent_btn.click(
fn=connect_to_live_agent,
inputs=[chatbot, selected_lang],
outputs=[chatbot]
)
survey_btn.click(
fn=show_satisfaction_survey,
inputs=[chatbot, selected_lang],
outputs=[chatbot]
)
# Initialize chat
demo.load(
fn=init_chat,
inputs=[],
outputs=[chatbot]
)
if __name__ == "__main__":
demo.launch(server_name="0.0.0.0", server_port=7860, share=True)