File size: 4,392 Bytes
c045b61
f18ee53
c045b61
f18ee53
 
c045b61
f18ee53
 
c045b61
d1f8c20
f18ee53
d1f8c20
 
 
 
 
 
f18ee53
d1f8c20
 
c045b61
 
f18ee53
 
 
 
 
 
 
 
 
 
 
c045b61
 
f18ee53
 
 
 
 
c045b61
 
f18ee53
 
 
 
c045b61
 
d1f8c20
f18ee53
c045b61
f18ee53
 
 
c045b61
f18ee53
 
c045b61
f18ee53
c045b61
f18ee53
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c045b61
 
f18ee53
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import gradio as gr
from transformers import pipeline

# Load Arabic NLP model for intent classification
intent_classifier = pipeline("text-classification", model="aubmindlab/bert-base-arabertv02")

# Load language detection model
language_detector = pipeline("text-classification", model="papluca/xlm-roberta-base-language-detection")

# Omdurman National Bank-specific guidelines
ONB_GUIDELINES = {
    "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]."
}

# Map intents to responses
INTENT_TO_RESPONSE = {
    "balance": "balance",
    "lost_card": "lost_card",
    "loan": "loan",
    "transfer": "transfer",
    "new_account": "new_account",
    "interest_rates": "interest_rates",
    "branches": "branches",
    "working_hours": "working_hours",
    "contact": "contact"
}

def detect_language(text):
    # Use Hugging Face language detection model
    result = language_detector(text)
    language = result[0]['label']
    return language

def classify_intent(message: str):
    # Use NLP model to classify the user's intent
    result = intent_classifier(message)
    intent = result[0]['label']
    return INTENT_TO_RESPONSE.get(intent, "unknown")

def respond(message: str):
    # Detect language
    language = detect_language(message)
    
    # If the language is not Arabic, return a default response
    if language != "ar":
        return "عذرًا، هذا المساعد يدعم اللغة العربية فقط. الرجاء إعادة الصياغة بالعربية."
    
    # Classify the user's intent using NLP
    intent = classify_intent(message)
    
    # If intent is recognized, return the corresponding response
    if intent != "unknown":
        return ONB_GUIDELINES.get(intent, "عذرًا، لم يتم التعرف على الخيار المحدد.")
    
    # Fallback to keyword matching if NLP doesn't recognize the intent
    for keyword, key in INTENT_TO_RESPONSE.items():
        if keyword in message:
            return ONB_GUIDELINES.get(key, "عذرًا، لم يتم التعرف على الخيار المحدد.")
    
    # Default response if no intent or keyword is matched
    return "عذرًا، لم أفهم سؤالك. الرجاء إعادة الصياغة أو اختيار أحد الخيارات التالية: " + ", ".join(INTENT_TO_RESPONSE.keys())

# Chat interface
with gr.Blocks(css=".gradio-container {direction: rtl;}") as demo:
    gr.Markdown("# <center>بنك أم درمان الوطني - المساعد المصرفي</center>")
    
    with gr.Tab("المحادثة"):
        gr.Markdown("## اكتب سؤالك هنا:")
        
        # Text input
        text_input = gr.Textbox(label="السؤال")
        
        # Submit button
        submit_btn = gr.Button("إرسال")
        
        # Output textbox for responses
        output = gr.Textbox(label="الرد", interactive=False)
        
        # Link inputs and button to response function
        submit_btn.click(
            fn=respond,
            inputs=text_input,
            outputs=output
        )

if __name__ == "__main__":
    demo.launch(
        server_name="0.0.0.0",
        server_port=7860,
        share=True  # Enable public link
    )